Showing preview only (8,347K chars total). Download the full file or copy to clipboard to get everything.
Repository: ueberdosis/tiptap
Branch: main
Commit: 3b306eebc8a4
Files: 1936
Total size: 7.6 MB
Directory structure:
gitextract_m6860ykr/
├── .changeset/
│ ├── README.md
│ └── config.json
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .github/
│ ├── CODEOWNERS
│ ├── DISCUSSION_TEMPLATE/
│ │ ├── community-extensions.yml
│ │ ├── feature-requests.yml
│ │ └── showcase.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── bug_report_pro.yml
│ │ ├── config.yml
│ │ └── documentation.yml
│ ├── dependabot.yml
│ ├── instructions/
│ │ ├── PR.instructions.md
│ │ ├── changeset.instructions.md
│ │ └── tiptap.instructions.md
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build.yml
│ ├── notify-discord.yml
│ └── publish.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .npmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── babel.config.js
├── commitlint.config.mjs
├── demos/
│ ├── CHANGELOG.md
│ ├── dedupeDeps.txt
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.cjs
│ ├── preview/
│ │ ├── Demo.vue
│ │ ├── DemoFrame.vue
│ │ ├── Shiki.vue
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── index.vue
│ │ ├── shiki.worker.js
│ │ └── style.css
│ ├── public/
│ │ └── _redirects
│ ├── setup/
│ │ ├── helper.ts
│ │ ├── js.ts
│ │ ├── react.ts
│ │ ├── style.scss
│ │ ├── svelte.ts
│ │ └── vue.ts
│ ├── src/
│ │ ├── Commands/
│ │ │ ├── Cut/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ ├── InsertContent/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ ├── InsertContentApplyingRules/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ └── SetContent/
│ │ │ └── React/
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── index.spec.js
│ │ │ └── styles.scss
│ │ ├── Demos/
│ │ │ ├── CollaborationSplitPane/
│ │ │ │ └── React/
│ │ │ │ ├── Editor.jsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ └── SingleRoomCollab/
│ │ │ └── React/
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── index.spec.js
│ │ │ └── styles.scss
│ │ ├── Dev/
│ │ │ └── .gitkeep
│ │ ├── Examples/
│ │ │ ├── Accessibility/
│ │ │ │ └── React/
│ │ │ │ ├── InsertMenu.tsx
│ │ │ │ ├── MenuBar.tsx
│ │ │ │ ├── TextMenu.tsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.scss
│ │ │ │ └── useMenubarNav.ts
│ │ │ ├── AutolinkValidation/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Book/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ ├── Vue/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── index.vue
│ │ │ │ └── content.js
│ │ │ ├── CSSModules/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.module.css
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.module.css
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CodeBlockLanguage/
│ │ │ │ ├── React/
│ │ │ │ │ ├── CodeBlockComponent.jsx
│ │ │ │ │ ├── CodeBlockComponent.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── CodeBlockComponent.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CollaborativeEditing/
│ │ │ │ ├── React/
│ │ │ │ │ ├── MenuBar.jsx
│ │ │ │ │ ├── MenuBar.scss
│ │ │ │ │ ├── MenuItem.jsx
│ │ │ │ │ ├── MenuItem.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── MenuBar.vue
│ │ │ │ ├── MenuItem.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Community/
│ │ │ │ ├── React/
│ │ │ │ │ ├── MentionList.jsx
│ │ │ │ │ ├── MentionList.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── suggestion.js
│ │ │ │ └── Vue/
│ │ │ │ ├── MentionList.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.vue
│ │ │ │ └── suggestion.js
│ │ │ ├── CustomDocument/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CustomParagraph/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Paragraph.jsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Default/
│ │ │ │ ├── React/
│ │ │ │ │ ├── MenuBar.tsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── menuBarState.ts
│ │ │ │ │ └── styles.scss
│ │ │ │ ├── Svelte/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.svelte
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Drawing/
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Paper.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── EnterShortcuts/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Formatting/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Images/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── InteractivityComponent/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Component.jsx
│ │ │ │ │ ├── Extension.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── InteractivityComponentContent/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Component.jsx
│ │ │ │ │ ├── Extension.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── InteractivityComponentProvideInject/
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Editor.vue
│ │ │ │ ├── Extension.js
│ │ │ │ ├── ValidateInject.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── JSX/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Paragraph.tsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── Paragraph.tsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── MarkdownShortcuts/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Menus/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Minimal/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── MultiMention/
│ │ │ │ ├── React/
│ │ │ │ │ ├── MentionList.jsx
│ │ │ │ │ ├── MentionList.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── suggestions.js
│ │ │ │ └── Vue/
│ │ │ │ ├── MentionList.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.vue
│ │ │ │ └── suggestions.js
│ │ │ ├── NodePos/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ ├── Performance/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ ├── ResizableImages/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── ResizableNodes/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Savvy/
│ │ │ │ ├── React/
│ │ │ │ │ ├── ColorHighlighter.ts
│ │ │ │ │ ├── SmilieReplacer.ts
│ │ │ │ │ ├── findColors.ts
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── ColorHighlighter.ts
│ │ │ │ ├── SmilieReplacer.ts
│ │ │ │ ├── findColors.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── StaticRendering/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── StaticRenderingAdvanced/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.tsx
│ │ │ ├── Tables/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Tasks/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TextDirection/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── TransformPastedHTML/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ └── Transition/
│ │ │ └── Vue/
│ │ │ ├── Extension.js
│ │ │ ├── ParentComponent.vue
│ │ │ ├── VueComponent.vue
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.vue
│ │ ├── Experiments/
│ │ │ ├── All/
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── CollaborationAnnotation/
│ │ │ │ └── Vue/
│ │ │ │ ├── extension/
│ │ │ │ │ ├── AnnotationItem.ts
│ │ │ │ │ ├── AnnotationPlugin.ts
│ │ │ │ │ ├── AnnotationState.ts
│ │ │ │ │ ├── collaboration-annotation.ts
│ │ │ │ │ └── index.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CollaborationMappingPerformance/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── Commands/
│ │ │ │ └── Vue/
│ │ │ │ ├── CommandsList.vue
│ │ │ │ ├── commands.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.vue
│ │ │ │ └── suggestion.js
│ │ │ ├── DestroyingEditor/
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Embeds/
│ │ │ │ └── Vue/
│ │ │ │ ├── iframe.ts
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── ExtensionStorage/
│ │ │ │ ├── React/
│ │ │ │ │ ├── CustomExtension.ts
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── CustomExtension.ts
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Figure/
│ │ │ │ └── Vue/
│ │ │ │ ├── figure.ts
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── GenericFigure/
│ │ │ │ └── Vue/
│ │ │ │ ├── figcaption.ts
│ │ │ │ ├── figure.ts
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── GlobalDragHandle/
│ │ │ │ └── Vue/
│ │ │ │ ├── DragHandle.js
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── IsolatingClear/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── content.ts
│ │ │ ├── Linter/
│ │ │ │ └── Vue/
│ │ │ │ ├── extension/
│ │ │ │ │ ├── Linter.ts
│ │ │ │ │ ├── LinterPlugin.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── plugins/
│ │ │ │ │ ├── BadWords.ts
│ │ │ │ │ ├── HeadingLevel.ts
│ │ │ │ │ └── Punctuation.ts
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── MultipleEditorStyles/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ └── index.tsx
│ │ │ ├── MultipleEditors/
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── OnDelete/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── OnUpdateRerender/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── TiptapComponent.vue
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ └── Tailwind/
│ │ │ └── JS/
│ │ │ └── index.html
│ │ ├── Extensions/
│ │ │ ├── BackgroundColor/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── BubbleMenu/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── CharacterCount/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Collaboration/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CollaborationCaret/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CollaborationMapPositions/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── CollaborationWithMenus/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Color/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── DragHandle/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.vue
│ │ │ │ └── style.css
│ │ │ ├── DragHandleWithNodeViews/
│ │ │ │ └── React/
│ │ │ │ ├── extensions/
│ │ │ │ │ └── recommendation/
│ │ │ │ │ ├── Recommendation.jsx
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── views/
│ │ │ │ │ ├── RecommendationView.jsx
│ │ │ │ │ └── index.jsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ └── styles.scss
│ │ │ ├── Dropcursor/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── FileHandler/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── FloatingMenu/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Focus/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── FontFamily/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── FontSize/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── index.spec.js
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Gapcursor/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── InvisibleCharacters/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── LineHeight/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.vue
│ │ │ │ └── styles.scss
│ │ │ ├── ListKeymap/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ └── styles.scss
│ │ │ ├── Mathematics/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Placeholder/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Selection/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TableOfContents/
│ │ │ │ ├── React/
│ │ │ │ │ ├── ToC.jsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ ├── Vue/
│ │ │ │ │ ├── ToC.vue
│ │ │ │ │ ├── ToCEmptyState.vue
│ │ │ │ │ ├── ToCItem.vue
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── index.vue
│ │ │ │ └── content.js
│ │ │ ├── TextAlign/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TrailingNode/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Typography/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TypographyWithOverrides/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── index.spec.js
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── UndoRedo/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── UniqueID/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ └── UniqueIDWithYdoc/
│ │ │ └── React/
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ ├── index.spec.js
│ │ │ └── styles.scss
│ │ ├── GuideContent/
│ │ │ ├── ExportHTML/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── ExportJSON/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── GenerateHTML/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── GenerateJSON/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── index.spec.js
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── GenerateText/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── index.spec.js
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── ReadOnly/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── StaticRenderHTML/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ └── StaticRenderReact/
│ │ │ └── React/
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.tsx
│ │ ├── GuideGettingStarted/
│ │ │ └── VModel/
│ │ │ └── Vue/
│ │ │ ├── Editor.vue
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.vue
│ │ ├── GuideMarkViews/
│ │ │ ├── ReactComponent/
│ │ │ │ └── React/
│ │ │ │ ├── Component.tsx
│ │ │ │ ├── Extension.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ └── VueComponent/
│ │ │ └── Vue/
│ │ │ ├── Component.vue
│ │ │ ├── Extension.ts
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.vue
│ │ ├── GuideNodeViews/
│ │ │ ├── DragHandle/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Component.jsx
│ │ │ │ │ ├── DraggableItem.js
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── DraggableItem.js
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── JavaScript/
│ │ │ │ └── Vue/
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── JavaScriptContent/
│ │ │ │ └── Vue/
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── ReactComponent/
│ │ │ │ └── React/
│ │ │ │ ├── Component.tsx
│ │ │ │ ├── Extension.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── ReactComponentContent/
│ │ │ │ └── React/
│ │ │ │ ├── Component.jsx
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ └── styles.scss
│ │ │ ├── ReactComponentContext/
│ │ │ │ └── React/
│ │ │ │ ├── Component.tsx
│ │ │ │ ├── Context.ts
│ │ │ │ ├── Extension.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── VueComponent/
│ │ │ │ └── Vue/
│ │ │ │ ├── Component.vue
│ │ │ │ ├── Extension.js
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ └── VueComponentContent/
│ │ │ └── Vue/
│ │ │ ├── Component.vue
│ │ │ ├── Extension.js
│ │ │ ├── index.html
│ │ │ └── index.vue
│ │ ├── Markdown/
│ │ │ ├── CustomSyntax/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ └── styles.scss
│ │ │ ├── Full/
│ │ │ │ └── React/
│ │ │ │ ├── content.ts
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ └── styles.scss
│ │ │ ├── Parse/
│ │ │ │ └── React/
│ │ │ │ ├── index.html
│ │ │ │ └── index.jsx
│ │ │ └── Serialize/
│ │ │ └── React/
│ │ │ ├── index.html
│ │ │ ├── index.jsx
│ │ │ └── styles.scss
│ │ ├── Marks/
│ │ │ ├── Bold/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Code/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Highlight/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Italic/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Link/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Strike/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Subscript/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Superscript/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TextStyle/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ └── Underline/
│ │ │ ├── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ └── Vue/
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.vue
│ │ ├── Nodes/
│ │ │ ├── Audio/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Blockquote/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── BulletList/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CodeBlock/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── CodeBlockLowlight/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ ├── Details/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Document/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Emoji/
│ │ │ │ ├── React/
│ │ │ │ │ ├── EmojiList.jsx
│ │ │ │ │ ├── EmojiList.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── suggestion.js
│ │ │ │ └── Vue/
│ │ │ │ ├── EmojiList.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.vue
│ │ │ │ └── suggestion.js
│ │ │ ├── HardBreak/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Heading/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── HorizontalRule/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Image/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── ListItem/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Mention/
│ │ │ │ ├── React/
│ │ │ │ │ ├── MentionList.jsx
│ │ │ │ │ ├── MentionList.scss
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── suggestion.js
│ │ │ │ └── Vue/
│ │ │ │ ├── MentionList.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── index.vue
│ │ │ │ └── suggestion.js
│ │ │ ├── OrderedList/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Paragraph/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Table/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TaskItem/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── TaskList/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Text/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ ├── index.spec.js
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.spec.js
│ │ │ │ └── index.vue
│ │ │ ├── Twitch/
│ │ │ │ ├── React/
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.jsx
│ │ │ │ │ └── styles.scss
│ │ │ │ └── Vue/
│ │ │ │ ├── index.html
│ │ │ │ └── index.vue
│ │ │ └── Youtube/
│ │ │ ├── React/
│ │ │ │ ├── index.html
│ │ │ │ ├── index.jsx
│ │ │ │ ├── index.spec.js
│ │ │ │ └── styles.scss
│ │ │ └── Vue/
│ │ │ ├── index.html
│ │ │ ├── index.spec.js
│ │ │ └── index.vue
│ │ ├── Overview/
│ │ │ └── Installation/
│ │ │ └── Vue/
│ │ │ ├── index.html
│ │ │ └── index.vue
│ │ ├── Tutorials/
│ │ │ ├── 1-1-textarea/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Note.tsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── types.ts
│ │ │ │ └── Vue/
│ │ │ │ ├── Note.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.vue
│ │ │ │ ├── styles.scss
│ │ │ │ └── types.ts
│ │ │ ├── 1-2-tiptap/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Note.tsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── types.ts
│ │ │ │ └── Vue/
│ │ │ │ ├── Note.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.vue
│ │ │ │ ├── styles.scss
│ │ │ │ └── types.ts
│ │ │ ├── 1-2-tiptap_lexical/
│ │ │ │ └── Lexical-React/
│ │ │ │ ├── Note.tsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.css
│ │ │ │ └── types.ts
│ │ │ ├── 1-3-yjs/
│ │ │ │ ├── React/
│ │ │ │ │ ├── Note.tsx
│ │ │ │ │ ├── index.html
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ ├── styles.scss
│ │ │ │ │ └── types.ts
│ │ │ │ └── Vue/
│ │ │ │ ├── Note.vue
│ │ │ │ ├── index.html
│ │ │ │ ├── index.vue
│ │ │ │ ├── styles.scss
│ │ │ │ └── types.ts
│ │ │ ├── 1-3-yjs_lexical/
│ │ │ │ └── Lexical-React/
│ │ │ │ ├── Note.tsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.css
│ │ │ │ └── types.ts
│ │ │ └── 1-4-collab/
│ │ │ ├── React/
│ │ │ │ ├── Note.tsx
│ │ │ │ ├── index.html
│ │ │ │ ├── index.tsx
│ │ │ │ ├── styles.scss
│ │ │ │ └── types.ts
│ │ │ └── Vue/
│ │ │ ├── Note.vue
│ │ │ ├── index.html
│ │ │ ├── index.vue
│ │ │ ├── styles.scss
│ │ │ └── types.ts
│ │ └── variables.js
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── vite.config.ts
├── env.d.ts
├── package.json
├── packages/
│ ├── core/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── can.spec.ts
│ │ │ ├── createNodeFromContent.spec.ts
│ │ │ ├── dispatchTransaction.spec.ts
│ │ │ ├── editorProps.spec.ts
│ │ │ ├── extendExtensions.spec.ts
│ │ │ ├── extendMarkRange.spec.ts
│ │ │ ├── extensionOptions.spec.ts
│ │ │ ├── extensionStorage.spec.ts
│ │ │ ├── fromString.spec.ts
│ │ │ ├── generateHTML.spec.ts
│ │ │ ├── generateJSON.spec.ts
│ │ │ ├── generateText.spec.ts
│ │ │ ├── getAttributesFromExtensions.spec.ts
│ │ │ ├── getMarkRange.spec.ts
│ │ │ ├── getTextContentFromNodes.spec.ts
│ │ │ ├── isActive.spec.ts
│ │ │ ├── isNodeEmpty.spec.ts
│ │ │ ├── mergeAttributes.spec.ts
│ │ │ ├── mergeDeep.spec.ts
│ │ │ ├── nodePos.spec.ts
│ │ │ ├── onContentError.spec.ts
│ │ │ ├── requiredAttributes.spec.ts
│ │ │ └── unmounted.spec.ts
│ │ ├── jsx-dev-runtime/
│ │ │ ├── index.cjs
│ │ │ ├── index.d.cts
│ │ │ ├── index.d.ts
│ │ │ └── index.js
│ │ ├── jsx-runtime/
│ │ │ ├── index.cjs
│ │ │ ├── index.d.cts
│ │ │ ├── index.d.ts
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── CommandManager.ts
│ │ │ ├── Editor.ts
│ │ │ ├── EventEmitter.ts
│ │ │ ├── Extendable.ts
│ │ │ ├── Extension.ts
│ │ │ ├── ExtensionManager.ts
│ │ │ ├── InputRule.ts
│ │ │ ├── Mark.ts
│ │ │ ├── MarkView.ts
│ │ │ ├── Node.ts
│ │ │ ├── NodePos.ts
│ │ │ ├── NodeView.ts
│ │ │ ├── PasteRule.ts
│ │ │ ├── Tracker.ts
│ │ │ ├── __tests__/
│ │ │ │ └── transformPastedHTML.test.ts
│ │ │ ├── commands/
│ │ │ │ ├── blur.ts
│ │ │ │ ├── clearContent.ts
│ │ │ │ ├── clearNodes.ts
│ │ │ │ ├── command.ts
│ │ │ │ ├── createParagraphNear.ts
│ │ │ │ ├── cut.ts
│ │ │ │ ├── deleteCurrentNode.ts
│ │ │ │ ├── deleteNode.ts
│ │ │ │ ├── deleteRange.ts
│ │ │ │ ├── deleteSelection.ts
│ │ │ │ ├── enter.ts
│ │ │ │ ├── exitCode.ts
│ │ │ │ ├── extendMarkRange.ts
│ │ │ │ ├── first.ts
│ │ │ │ ├── focus.ts
│ │ │ │ ├── forEach.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── insertContent.ts
│ │ │ │ ├── insertContentAt.ts
│ │ │ │ ├── join.ts
│ │ │ │ ├── joinItemBackward.ts
│ │ │ │ ├── joinItemForward.ts
│ │ │ │ ├── joinTextblockBackward.ts
│ │ │ │ ├── joinTextblockForward.ts
│ │ │ │ ├── keyboardShortcut.ts
│ │ │ │ ├── lift.ts
│ │ │ │ ├── liftEmptyBlock.ts
│ │ │ │ ├── liftListItem.ts
│ │ │ │ ├── newlineInCode.ts
│ │ │ │ ├── resetAttributes.ts
│ │ │ │ ├── scrollIntoView.ts
│ │ │ │ ├── selectAll.ts
│ │ │ │ ├── selectNodeBackward.ts
│ │ │ │ ├── selectNodeForward.ts
│ │ │ │ ├── selectParentNode.ts
│ │ │ │ ├── selectTextblockEnd.ts
│ │ │ │ ├── selectTextblockStart.ts
│ │ │ │ ├── setContent.ts
│ │ │ │ ├── setMark.ts
│ │ │ │ ├── setMeta.ts
│ │ │ │ ├── setNode.ts
│ │ │ │ ├── setNodeSelection.ts
│ │ │ │ ├── setTextDirection.ts
│ │ │ │ ├── setTextSelection.ts
│ │ │ │ ├── sinkListItem.ts
│ │ │ │ ├── splitBlock.ts
│ │ │ │ ├── splitListItem.ts
│ │ │ │ ├── toggleList.ts
│ │ │ │ ├── toggleMark.ts
│ │ │ │ ├── toggleNode.ts
│ │ │ │ ├── toggleWrap.ts
│ │ │ │ ├── undoInputRule.ts
│ │ │ │ ├── unsetAllMarks.ts
│ │ │ │ ├── unsetMark.ts
│ │ │ │ ├── unsetTextDirection.ts
│ │ │ │ ├── updateAttributes.ts
│ │ │ │ ├── wrapIn.ts
│ │ │ │ └── wrapInList.ts
│ │ │ ├── extensions/
│ │ │ │ ├── clipboardTextSerializer.ts
│ │ │ │ ├── commands.ts
│ │ │ │ ├── delete.ts
│ │ │ │ ├── drop.ts
│ │ │ │ ├── editable.ts
│ │ │ │ ├── focusEvents.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── keymap.ts
│ │ │ │ ├── paste.ts
│ │ │ │ ├── tabindex.ts
│ │ │ │ └── textDirection.ts
│ │ │ ├── helpers/
│ │ │ │ ├── MappablePosition.ts
│ │ │ │ ├── combineTransactionSteps.ts
│ │ │ │ ├── createChainableState.ts
│ │ │ │ ├── createDocument.ts
│ │ │ │ ├── createNodeFromContent.ts
│ │ │ │ ├── defaultBlockAt.ts
│ │ │ │ ├── findChildren.ts
│ │ │ │ ├── findChildrenInRange.ts
│ │ │ │ ├── findParentNode.ts
│ │ │ │ ├── findParentNodeClosestToPos.ts
│ │ │ │ ├── flattenExtensions.ts
│ │ │ │ ├── generateHTML.ts
│ │ │ │ ├── generateJSON.ts
│ │ │ │ ├── generateText.ts
│ │ │ │ ├── getAttributes.ts
│ │ │ │ ├── getAttributesFromExtensions.ts
│ │ │ │ ├── getChangedRanges.ts
│ │ │ │ ├── getDebugJSON.ts
│ │ │ │ ├── getExtensionField.ts
│ │ │ │ ├── getHTMLFromFragment.ts
│ │ │ │ ├── getMarkAttributes.ts
│ │ │ │ ├── getMarkRange.ts
│ │ │ │ ├── getMarkType.ts
│ │ │ │ ├── getMarksBetween.ts
│ │ │ │ ├── getNodeAtPosition.ts
│ │ │ │ ├── getNodeAttributes.ts
│ │ │ │ ├── getNodeType.ts
│ │ │ │ ├── getRenderedAttributes.ts
│ │ │ │ ├── getSchema.ts
│ │ │ │ ├── getSchemaByResolvedExtensions.ts
│ │ │ │ ├── getSchemaTypeByName.ts
│ │ │ │ ├── getSchemaTypeNameByName.ts
│ │ │ │ ├── getSplittedAttributes.ts
│ │ │ │ ├── getText.ts
│ │ │ │ ├── getTextBetween.ts
│ │ │ │ ├── getTextContentFromNodes.ts
│ │ │ │ ├── getTextSerializersFromSchema.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── injectExtensionAttributesToParseRule.ts
│ │ │ │ ├── isActive.ts
│ │ │ │ ├── isAtEndOfNode.ts
│ │ │ │ ├── isAtStartOfNode.ts
│ │ │ │ ├── isExtensionRulesEnabled.ts
│ │ │ │ ├── isList.ts
│ │ │ │ ├── isMarkActive.ts
│ │ │ │ ├── isNodeActive.ts
│ │ │ │ ├── isNodeEmpty.ts
│ │ │ │ ├── isNodeSelection.ts
│ │ │ │ ├── isTextSelection.ts
│ │ │ │ ├── posToDOMRect.ts
│ │ │ │ ├── resolveExtensions.ts
│ │ │ │ ├── resolveFocusPosition.ts
│ │ │ │ ├── rewriteUnknownContent.ts
│ │ │ │ ├── selectionToInsertionEnd.ts
│ │ │ │ ├── sortExtensions.ts
│ │ │ │ └── splitExtensions.ts
│ │ │ ├── index.ts
│ │ │ ├── inputRules/
│ │ │ │ ├── index.ts
│ │ │ │ ├── markInputRule.ts
│ │ │ │ ├── nodeInputRule.ts
│ │ │ │ ├── textInputRule.ts
│ │ │ │ ├── textblockTypeInputRule.ts
│ │ │ │ └── wrappingInputRule.ts
│ │ │ ├── jsx-runtime.ts
│ │ │ ├── lib/
│ │ │ │ ├── ResizableNodeView.ts
│ │ │ │ └── index.ts
│ │ │ ├── pasteRules/
│ │ │ │ ├── index.ts
│ │ │ │ ├── markPasteRule.ts
│ │ │ │ ├── nodePasteRule.ts
│ │ │ │ └── textPasteRule.ts
│ │ │ ├── style.ts
│ │ │ ├── types.ts
│ │ │ └── utilities/
│ │ │ ├── callOrReturn.ts
│ │ │ ├── canInsertNode.ts
│ │ │ ├── createStyleTag.ts
│ │ │ ├── deleteProps.ts
│ │ │ ├── elementFromString.ts
│ │ │ ├── escapeForRegEx.ts
│ │ │ ├── findDuplicates.ts
│ │ │ ├── fromString.ts
│ │ │ ├── index.ts
│ │ │ ├── isAndroid.ts
│ │ │ ├── isEmptyObject.ts
│ │ │ ├── isFirefox.ts
│ │ │ ├── isFunction.ts
│ │ │ ├── isMacOS.ts
│ │ │ ├── isNumber.ts
│ │ │ ├── isPlainObject.ts
│ │ │ ├── isRegExp.ts
│ │ │ ├── isSafari.ts
│ │ │ ├── isString.ts
│ │ │ ├── isiOS.ts
│ │ │ ├── markdown/
│ │ │ │ ├── attributeUtils.ts
│ │ │ │ ├── createAtomBlockMarkdownSpec.ts
│ │ │ │ ├── createBlockMarkdownSpec.ts
│ │ │ │ ├── createInlineMarkdownSpec.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── parseIndentedBlocks.ts
│ │ │ │ └── renderNestedMarkdownContent.ts
│ │ │ ├── mergeAttributes.ts
│ │ │ ├── mergeDeep.ts
│ │ │ ├── minMax.ts
│ │ │ ├── objectIncludes.ts
│ │ │ └── removeDuplicates.ts
│ │ └── tsup.config.ts
│ ├── extension-audio/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── audio.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── audio.ts
│ │ │ ├── index.ts
│ │ │ └── utils.ts
│ │ └── tsup.config.ts
│ ├── extension-blockquote/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── blockquote.tsx
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-bold/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── bold.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── bold.tsx
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-bubble-menu/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── bubble-menu-plugin.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── bubble-menu-plugin.ts
│ │ │ ├── bubble-menu.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-bullet-list/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-code/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── code.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-code-block/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── code-block.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-code-block-lowlight/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── codeBlockLowlight.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── code-block-lowlight.ts
│ │ │ ├── index.ts
│ │ │ └── lowlight-plugin.ts
│ │ └── tsup.config.ts
│ ├── extension-collaboration/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── collaboration.ts
│ │ │ ├── helpers/
│ │ │ │ ├── CollaborationMappablePosition.ts
│ │ │ │ ├── isChangeOrigin.ts
│ │ │ │ └── yRelativePosition.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-collaboration-caret/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── collaboration-caret.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── collaboration-caret.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-color/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-details/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── content/
│ │ │ │ ├── details-content.ts
│ │ │ │ └── index.ts
│ │ │ ├── details.ts
│ │ │ ├── helpers/
│ │ │ │ ├── findClosestVisibleNode.ts
│ │ │ │ ├── isNodeVisible.ts
│ │ │ │ └── setGapCursor.ts
│ │ │ ├── index.ts
│ │ │ └── summary/
│ │ │ ├── details-summary.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-document/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── document.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-drag-handle/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── defaultRules.spec.ts
│ │ │ ├── drag-handle.spec.ts
│ │ │ ├── edgeDetection.spec.ts
│ │ │ ├── findBestDragTarget.spec.ts
│ │ │ ├── normalizeOptions.spec.ts
│ │ │ └── scoring.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── drag-handle-plugin.ts
│ │ │ ├── drag-handle.ts
│ │ │ ├── helpers/
│ │ │ │ ├── cloneElement.ts
│ │ │ │ ├── defaultRules.ts
│ │ │ │ ├── dragHandler.ts
│ │ │ │ ├── edgeDetection.ts
│ │ │ │ ├── findBestDragTarget.ts
│ │ │ │ ├── findNextElementFromCursor.ts
│ │ │ │ ├── getComputedStyle.ts
│ │ │ │ ├── getInnerCoords.ts
│ │ │ │ ├── getOuterNode.ts
│ │ │ │ ├── minMax.ts
│ │ │ │ ├── normalizeOptions.ts
│ │ │ │ ├── removeNode.ts
│ │ │ │ └── scoring.ts
│ │ │ ├── index.ts
│ │ │ └── types/
│ │ │ ├── options.ts
│ │ │ └── rules.ts
│ │ └── tsup.config.ts
│ ├── extension-drag-handle-react/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── DragHandle.tsx
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-drag-handle-vue-2/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── DragHandle.ts
│ │ │ ├── Vue.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-drag-handle-vue-3/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── DragHandle.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-emoji/
│ │ ├── CHANGELOG.md
│ │ ├── __tests__/
│ │ │ └── emoji.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── data.ts
│ │ │ ├── emoji.ts
│ │ │ ├── generate.ts
│ │ │ ├── helpers/
│ │ │ │ ├── emojiToShortcode.ts
│ │ │ │ ├── removeDuplicates.ts
│ │ │ │ ├── removeVariationSelector.ts
│ │ │ │ └── shortcodeToEmoji.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-file-handler/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── FileHandlePlugin.ts
│ │ │ ├── fileHandler.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ └── tsup.config.ts
│ ├── extension-floating-menu/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── floating-menu-plugin.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── floating-menu-plugin.ts
│ │ │ ├── floating-menu.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-font-family/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-hard-break/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── hard-break.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-heading/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── heading.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-highlight/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── highlight.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-horizontal-rule/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── horizontalRule.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── horizontal-rule.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-image/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── image.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-invisible-characters/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── invisible-characters.ts
│ │ │ ├── plugin/
│ │ │ │ ├── InvisibleCharacter.ts
│ │ │ │ ├── InvisibleCharactersPlugin.ts
│ │ │ │ ├── InvisibleNode.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── invisible-characters/
│ │ │ │ │ ├── hardBreak.ts
│ │ │ │ │ ├── paragraph.ts
│ │ │ │ │ └── space.ts
│ │ │ │ ├── reducers.ts
│ │ │ │ ├── style.ts
│ │ │ │ └── utils/
│ │ │ │ ├── create-decoration-widget.ts
│ │ │ │ ├── create-style-tag.ts
│ │ │ │ ├── get-updated-ranges.ts
│ │ │ │ └── text-between.ts
│ │ │ └── types.ts
│ │ └── tsup.config.ts
│ ├── extension-italic/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── italic.ts
│ │ └── tsup.config.ts
│ ├── extension-link/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── link.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── helpers/
│ │ │ │ ├── autolink.ts
│ │ │ │ ├── clickHandler.ts
│ │ │ │ ├── pasteHandler.ts
│ │ │ │ └── whitespace.ts
│ │ │ ├── index.ts
│ │ │ └── link.ts
│ │ └── tsup.config.ts
│ ├── extension-list/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── taskItem.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── bullet-list/
│ │ │ │ ├── bullet-list.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── item/
│ │ │ │ ├── index.ts
│ │ │ │ └── list-item.ts
│ │ │ ├── keymap/
│ │ │ │ ├── index.ts
│ │ │ │ ├── list-keymap.ts
│ │ │ │ └── listHelpers/
│ │ │ │ ├── findListItemPos.ts
│ │ │ │ ├── getNextListDepth.ts
│ │ │ │ ├── handleBackspace.ts
│ │ │ │ ├── handleDelete.ts
│ │ │ │ ├── hasListBefore.ts
│ │ │ │ ├── hasListItemAfter.ts
│ │ │ │ ├── hasListItemBefore.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── listItemHasSubList.ts
│ │ │ │ ├── nextListIsDeeper.ts
│ │ │ │ └── nextListIsHigher.ts
│ │ │ ├── kit/
│ │ │ │ └── index.ts
│ │ │ ├── ordered-list/
│ │ │ │ ├── index.ts
│ │ │ │ ├── ordered-list.ts
│ │ │ │ └── utils.ts
│ │ │ ├── task-item/
│ │ │ │ ├── index.ts
│ │ │ │ └── task-item.ts
│ │ │ └── task-list/
│ │ │ ├── index.ts
│ │ │ └── task-list.ts
│ │ └── tsup.config.ts
│ ├── extension-mathematics/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── extensions/
│ │ │ │ ├── BlockMath.ts
│ │ │ │ ├── InlineMath.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── mathematics.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── tsup.config.ts
│ ├── extension-mention/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── mention.ts
│ │ │ └── utils/
│ │ │ └── get-default-suggestion-attributes.ts
│ │ └── tsup.config.ts
│ ├── extension-node-range/
│ │ ├── CHANGELOG.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── helpers/
│ │ │ │ ├── NodeRangeBookmark.ts
│ │ │ │ ├── NodeRangeSelection.ts
│ │ │ │ ├── getNodeRangeDecorations.ts
│ │ │ │ ├── getSelectionRanges.ts
│ │ │ │ └── isNodeRangeSelection.ts
│ │ │ ├── index.ts
│ │ │ └── node-range.ts
│ │ └── tsup.config.ts
│ ├── extension-ordered-list/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-paragraph/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── paragraph.ts
│ │ └── tsup.config.ts
│ ├── extension-strike/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── strike.ts
│ │ └── tsup.config.ts
│ ├── extension-subscript/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── subscript.ts
│ │ └── tsup.config.ts
│ ├── extension-superscript/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── superscript.ts
│ │ └── tsup.config.ts
│ ├── extension-table/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── tableCell.spec.ts
│ │ │ └── tableHeader.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── cell/
│ │ │ │ ├── index.ts
│ │ │ │ └── table-cell.ts
│ │ │ ├── header/
│ │ │ │ ├── index.ts
│ │ │ │ └── table-header.ts
│ │ │ ├── index.ts
│ │ │ ├── kit/
│ │ │ │ └── index.ts
│ │ │ ├── row/
│ │ │ │ ├── index.ts
│ │ │ │ └── table-row.ts
│ │ │ ├── table/
│ │ │ │ ├── TableView.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── table.ts
│ │ │ │ └── utilities/
│ │ │ │ ├── colStyle.ts
│ │ │ │ ├── createCell.ts
│ │ │ │ ├── createColGroup.ts
│ │ │ │ ├── createTable.ts
│ │ │ │ ├── deleteTableWhenAllCellsSelected.ts
│ │ │ │ ├── getTableNodeTypes.ts
│ │ │ │ ├── isCellSelection.ts
│ │ │ │ └── markdown.ts
│ │ │ └── types.ts
│ │ └── tsup.config.ts
│ ├── extension-table-of-contents/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── plugin.ts
│ │ │ ├── tableOfContents.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── tsup.config.ts
│ ├── extension-text/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── text.ts
│ │ └── tsup.config.ts
│ ├── extension-text-align/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── text-align.ts
│ │ └── tsup.config.ts
│ ├── extension-text-style/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── background-color.spec.ts
│ │ │ └── color.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── background-color/
│ │ │ │ ├── background-color.ts
│ │ │ │ └── index.ts
│ │ │ ├── color/
│ │ │ │ ├── color.ts
│ │ │ │ └── index.ts
│ │ │ ├── font-family/
│ │ │ │ ├── font-family.ts
│ │ │ │ └── index.ts
│ │ │ ├── font-size/
│ │ │ │ ├── font-size.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── line-height/
│ │ │ │ ├── index.ts
│ │ │ │ └── line-height.ts
│ │ │ ├── text-style/
│ │ │ │ └── index.ts
│ │ │ └── text-style-kit/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-twitch/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── twitch.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── twitch.ts
│ │ │ └── utils.ts
│ │ └── tsup.config.ts
│ ├── extension-typography/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── typography.ts
│ │ └── tsup.config.ts
│ ├── extension-underline/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── underline.ts
│ │ └── tsup.config.ts
│ ├── extension-unique-id/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── unique-id-collab.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── generate-unique-ids.ts
│ │ │ ├── helpers/
│ │ │ │ └── findDuplicates.ts
│ │ │ ├── index.ts
│ │ │ └── unique-id.ts
│ │ └── tsup.config.ts
│ ├── extension-youtube/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── youtube.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── utils.ts
│ │ │ └── youtube.ts
│ │ └── tsup.config.ts
│ ├── extensions/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ └── placeholder.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── character-count/
│ │ │ │ ├── character-count.ts
│ │ │ │ └── index.ts
│ │ │ ├── drop-cursor/
│ │ │ │ ├── drop-cursor.ts
│ │ │ │ └── index.ts
│ │ │ ├── focus/
│ │ │ │ ├── focus.ts
│ │ │ │ └── index.ts
│ │ │ ├── gap-cursor/
│ │ │ │ ├── gap-cursor.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── placeholder/
│ │ │ │ ├── index.ts
│ │ │ │ └── placeholder.ts
│ │ │ ├── selection/
│ │ │ │ ├── index.ts
│ │ │ │ └── selection.ts
│ │ │ ├── trailing-node/
│ │ │ │ ├── index.ts
│ │ │ │ └── trailing-node.ts
│ │ │ └── undo-redo/
│ │ │ ├── index.ts
│ │ │ └── undo-redo.ts
│ │ └── tsup.config.ts
│ ├── html/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── generateHTML.spec.ts
│ │ │ ├── generateJSON.spec.ts
│ │ │ └── server-with-jsdom.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── generateHTML.ts
│ │ │ ├── generateJSON.ts
│ │ │ ├── getHTMLFromFragment.ts
│ │ │ ├── index.ts
│ │ │ └── server/
│ │ │ ├── generateHTML.ts
│ │ │ ├── generateJSON.ts
│ │ │ ├── getHTMLFromFragment.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── markdown/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── conversion-files/
│ │ │ │ ├── bullet-list.ts
│ │ │ │ ├── custom-atom.ts
│ │ │ │ ├── custom-block.ts
│ │ │ │ ├── custom-inline.ts
│ │ │ │ ├── hard-break-marks.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── link-with-title.ts
│ │ │ │ ├── link-without-title.ts
│ │ │ │ ├── mixed-list-types.ts
│ │ │ │ ├── nested-nodes.ts
│ │ │ │ ├── ordered-list-separated-by-bullet.ts
│ │ │ │ ├── ordered-list-with-bullet-list.ts
│ │ │ │ ├── ordered-list.ts
│ │ │ │ ├── soft-break-marks.ts
│ │ │ │ ├── task-list.ts
│ │ │ │ └── trailing-whitespace-marks.ts
│ │ │ ├── conversion.spec.ts
│ │ │ ├── extensions/
│ │ │ │ └── blockquote.spec.ts
│ │ │ ├── inline-marks-punctuation.spec.ts
│ │ │ ├── manager.spec.ts
│ │ │ ├── mixed-html.spec.ts
│ │ │ ├── overlapping-marks.spec.ts
│ │ │ ├── paragraph.spec.ts
│ │ │ ├── server-side-parsing.spec.ts
│ │ │ └── utilities.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── Extension.ts
│ │ │ ├── MarkdownManager.ts
│ │ │ ├── index.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ └── tsup.config.ts
│ ├── pm/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── changeset/
│ │ │ └── index.ts
│ │ ├── collab/
│ │ │ └── index.ts
│ │ ├── commands/
│ │ │ └── index.ts
│ │ ├── dropcursor/
│ │ │ └── index.ts
│ │ ├── gapcursor/
│ │ │ └── index.ts
│ │ ├── history/
│ │ │ └── index.ts
│ │ ├── inputrules/
│ │ │ └── index.ts
│ │ ├── keymap/
│ │ │ └── index.ts
│ │ ├── markdown/
│ │ │ └── index.ts
│ │ ├── menu/
│ │ │ └── index.ts
│ │ ├── model/
│ │ │ └── index.ts
│ │ ├── package.json
│ │ ├── schema-basic/
│ │ │ └── index.ts
│ │ ├── schema-list/
│ │ │ └── index.ts
│ │ ├── state/
│ │ │ └── index.ts
│ │ ├── tables/
│ │ │ └── index.ts
│ │ ├── trailing-node/
│ │ │ └── index.ts
│ │ ├── transform/
│ │ │ └── index.ts
│ │ ├── tsup.config.ts
│ │ └── view/
│ │ └── index.ts
│ ├── react/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── Context.tsx
│ │ │ ├── Editor.ts
│ │ │ ├── EditorContent.tsx
│ │ │ ├── NodeViewContent.tsx
│ │ │ ├── NodeViewWrapper.tsx
│ │ │ ├── ReactMarkViewRenderer.tsx
│ │ │ ├── ReactNodeViewRenderer.tsx
│ │ │ ├── ReactRenderer.tsx
│ │ │ ├── Tiptap.tsx
│ │ │ ├── index.ts
│ │ │ ├── menus/
│ │ │ │ ├── BubbleMenu.spec.ts
│ │ │ │ ├── BubbleMenu.tsx
│ │ │ │ ├── FloatingMenu.spec.ts
│ │ │ │ ├── FloatingMenu.tsx
│ │ │ │ ├── getAutoPluginKey.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── useMenuElementProps.ts
│ │ │ ├── types.ts
│ │ │ ├── useEditor.ts
│ │ │ ├── useEditorState.ts
│ │ │ └── useReactNodeView.ts
│ │ └── tsup.config.ts
│ ├── starter-kit/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ └── starter-kit.ts
│ │ └── tsup.config.ts
│ ├── static-renderer/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── __tests__/
│ │ │ ├── json-string.spec.ts
│ │ │ ├── md-string.spec.ts
│ │ │ └── react-string.spec.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── helpers.ts
│ │ │ ├── index.ts
│ │ │ ├── json/
│ │ │ │ ├── html-string/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── string.ts
│ │ │ │ ├── react/
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── react.ts
│ │ │ │ └── renderer.ts
│ │ │ └── pm/
│ │ │ ├── extensionRenderer.ts
│ │ │ ├── html-string/
│ │ │ │ ├── html-string.ts
│ │ │ │ └── index.ts
│ │ │ ├── markdown/
│ │ │ │ ├── index.ts
│ │ │ │ └── markdown.ts
│ │ │ └── react/
│ │ │ ├── index.ts
│ │ │ └── react.ts
│ │ └── tsup.config.ts
│ ├── suggestion/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── __tests__/
│ │ │ │ └── suggestion.test.ts
│ │ │ ├── findSuggestionMatch.ts
│ │ │ ├── index.ts
│ │ │ └── suggestion.ts
│ │ └── tsup.config.ts
│ ├── vue-2/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── Editor.ts
│ │ │ ├── EditorContent.ts
│ │ │ ├── NodeViewContent.ts
│ │ │ ├── NodeViewWrapper.ts
│ │ │ ├── Vue.ts
│ │ │ ├── VueNodeViewRenderer.ts
│ │ │ ├── VueRenderer.ts
│ │ │ ├── index.ts
│ │ │ └── menus/
│ │ │ ├── BubbleMenu.ts
│ │ │ ├── FloatingMenu.ts
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ └── vue-3/
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── __tests__/
│ │ ├── VueMarkViewRenderer.spec.ts
│ │ └── VueRenderer.spec.ts
│ ├── package.json
│ ├── src/
│ │ ├── Editor.ts
│ │ ├── EditorContent.ts
│ │ ├── NodeViewContent.ts
│ │ ├── NodeViewWrapper.ts
│ │ ├── VueMarkViewRenderer.ts
│ │ ├── VueNodeViewRenderer.ts
│ │ ├── VueRenderer.ts
│ │ ├── index.ts
│ │ ├── menus/
│ │ │ ├── BubbleMenu.ts
│ │ │ ├── FloatingMenu.ts
│ │ │ └── index.ts
│ │ └── useEditor.ts
│ └── tsup.config.ts
├── packages-deprecated/
│ ├── .gitkeep
│ ├── extension-character-count/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ ├── tsconfig.json
│ │ └── tsup.config.ts
│ ├── extension-dropcursor/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-focus/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-gapcursor/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-history/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-list-item/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-list-keymap/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-placeholder/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-table-cell/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-table-header/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-table-row/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ ├── extension-task-item/
│ │ ├── CHANGELOG.md
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── src/
│ │ │ └── index.ts
│ │ └── tsup.config.ts
│ └── extension-task-list/
│ ├── CHANGELOG.md
│ ├── README.md
│ ├── package.json
│ ├── src/
│ │ └── index.ts
│ └── tsup.config.ts
├── patches/
│ └── @changesets__assemble-release-plan.patch
├── pnpm-workspace.yaml
├── scripts/
│ ├── aggregate-changeset.js
│ ├── check-package-dists.sh
│ └── make-demo.sh
├── skills/
│ └── tiptap/
│ └── SKILL.md
├── tests/
│ ├── cypress/
│ │ ├── fixtures/
│ │ │ └── example.json
│ │ ├── integration/
│ │ │ └── core/
│ │ │ ├── pluginOrder.spec.ts
│ │ │ └── transformPastedHTML.spec.ts
│ │ ├── plugins/
│ │ │ └── index.js
│ │ ├── support/
│ │ │ ├── commands.js
│ │ │ └── e2e.js
│ │ └── tsconfig.json
│ ├── cypress.config.js
│ └── package.json
├── tsconfig.build.json
├── tsconfig.json
├── turbo.json
└── vitest.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .changeset/README.md
================================================
# Changesets
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
================================================
FILE: .changeset/config.json
================================================
{
"$schema": "https://unpkg.com/@changesets/config@3.0.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [["@tiptap/*"]],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
}
}
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org
root = true
[*]
end_of_line = lf
charset = utf-8
insert_final_newline = true
max_line_length = 100
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
================================================
FILE: .eslintignore
================================================
**/dist/**
================================================
FILE: .eslintrc.js
================================================
module.exports = {
parserOptions: {
parser: '@typescript-eslint/parser',
sourceType: 'module',
},
env: {
es6: true,
node: true,
},
overrides: [
{
files: ['./**/*.ts', './**/*.tsx', './**/*.js', './**/*.jsx'],
extends: ['plugin:react-hooks/recommended'],
},
{
files: ['./**/*.ts', './**/*.tsx', './**/*.js', './**/*.jsx', './**/*.vue'],
plugins: ['html', 'cypress', '@typescript-eslint', 'simple-import-sort'],
env: {
'cypress/globals': true,
},
globals: {
document: false,
window: false,
},
extends: [
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:vue/vue3-strongly-recommended',
'airbnb-base',
'prettier',
],
rules: {
curly: ['error', 'all'],
'no-continue': 'off',
'no-alert': 'off',
'no-console': ['warn', { allow: ['warn', 'error'] }],
semi: ['error', 'never'],
'import/order': 'off',
'import/extensions': ['error', 'ignorePackages'],
'no-restricted-imports': [
'error',
{
paths: [
{
name: '..',
message: 'Import from ../index.js instead.',
},
{
name: '.',
message: 'Import from ./index.js instead.',
},
],
},
],
'import/no-extraneous-dependencies': 'off',
'import/no-unresolved': 'off',
'import/no-dynamic-require': 'off',
'arrow-parens': ['error', 'as-needed'],
'padded-blocks': 'off',
'class-methods-use-this': 'off',
'global-require': 'off',
'func-names': ['error', 'never'],
'arrow-body-style': 'off',
'max-len': 'off',
'no-return-assign': 'off',
'vue/one-component-per-file': 'off',
'vue/this-in-template': ['error', 'never'],
'vue/multi-word-component-names': 'off',
'vue/singleline-html-element-content-newline': 'off',
'no-param-reassign': 'off',
'import/prefer-default-export': 'off',
'consistent-return': 'off',
'prefer-destructuring': 'off',
'no-redeclare': 'off',
'@typescript-eslint/no-redeclare': ['error'],
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true, argsIgnorePattern: '^_' }],
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': ['error'],
'no-dupe-class-members': 'off',
'@typescript-eslint/no-dupe-class-members': ['error'],
'lines-between-class-members': 'off',
'no-shadow': 'off',
'@typescript-eslint/no-shadow': ['error'],
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/explicit-module-boundary-type': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/consistent-type-imports': ['error', { disallowTypeAnnotations: false }],
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
},
},
],
}
================================================
FILE: .github/CODEOWNERS
================================================
# LICENSE
LICENSE.md @philipisik
================================================
FILE: .github/DISCUSSION_TEMPLATE/community-extensions.yml
================================================
title: 'Community Extension: '
body:
- type: markdown
attributes:
value: |
Hey! Thanks for your time and effort to create a new community extension! Please make sure to fill out the form below.
- type: textarea
id: description
attributes:
label: Description
description: Please describe how your extension works and what it does.
placeholder: 'My extension does …'
validations:
required: true
- type: textarea
id: installation
attributes:
label: Installation
description: Please describe how users can install your extension.
placeholder: 'npm install …'
validations:
required: true
- type: textarea
id: usage
attributes:
label: Usage
description: Please describe how users can use your extension in their editor.
placeholder: 'To use my extension you have to …'
validations:
required: true
- type: dropdown
id: type
attributes:
label: Type
description: Please select the type of this extension.
options:
- 'Node'
- 'Mark'
- 'Prosemirror plugin'
- 'Package or Kit'
- 'Other'
validations:
required: true
- type: textarea
id: other
attributes:
label: Other
description: Feel free to add any other information about your extension.
placeholder: 'I hope you like …'
validations:
required: false
================================================
FILE: .github/DISCUSSION_TEMPLATE/feature-requests.yml
================================================
title: 'Feature Request: '
labels:
- 'Type: Feature Request'
body:
- type: markdown
attributes:
value: |
Thanks for your time to create a new feature request! Please make sure to fill out the form below.
- type: textarea
id: description
attributes:
label: Description
description: Please describe the feature you would like to see in Tiptap.
placeholder: 'I wish there was an extension for …'
validations:
required: true
- type: textarea
id: use-case
attributes:
label: Use Case
description: Please describe the use case for this feature.
placeholder: 'I want to use this feature for …'
validations:
required: true
- type: dropdown
id: type
attributes:
label: Type
description: Please select the type of this feature.
options:
- 'New extension'
- 'New feature'
- 'New Tiptap API'
- 'Other'
validations:
required: true
================================================
FILE: .github/DISCUSSION_TEMPLATE/showcase.yml
================================================
title: 'Community Extension: '
body:
- type: markdown
attributes:
value: |
Hey! Thanks for using Tiptap in your project. We hope you had a great experience. Please take a moment to share your project with us. We would love to see what you built with Tiptap.
- type: textarea
id: description
attributes:
label: Description
description: Please describe what your project is about
placeholder: 'My project is about …'
validations:
required: true
- type: input
id: url
attributes:
label: URL
description: If possible share the URL of your project.
placeholder: 'https://example.com'
validations:
required: false
- type: textarea
id: about
attributes:
label: About
description: Feel free to talk about how you used Tiptap in your project, what you liked about it, what you didn't like about it, and what you would like to see in the future.
placeholder: 'If used Tiptap to …'
validations:
required: true
- type: dropdown
id: type
attributes:
label: Type
description: Please select the type of your project.
options:
- 'Chat Application'
- 'Commenting Application'
- 'Content Management System'
- 'Document Editor'
- 'Document Editor with Collaboration'
- 'Other'
validations:
required: true
- type: textarea
id: other
attributes:
label: Other
description: Feel free to add any other information about your project.
placeholder: 'I hope you like …'
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Found a bug in the editor core or one of the extensions? Report it here to help us improve.
labels: ["Open Source", "Needs Triage"]
type: "Bug"
body:
- type: markdown
attributes:
value: '### Please provide details to help us diagnose the bug.'
- type: input
id: packages
attributes:
label: Affected Packages
description: List the packages you were using when the bug occurred.
placeholder: core, extension-mention, react
validations:
required: true
- type: input
id: version
attributes:
label: Version(s)
description: Specify the version(s) of the affected packages.
placeholder: 2.0.0
validations:
required: true
- type: textarea
id: problem
attributes:
label: Bug Description
description: Provide a clear and concise description of what the bug is.
placeholder: 'The issue occurs when...'
validations:
required: true
- type: dropdown
id: browser
attributes:
label: Browser Used
description: Select the browser where the bug was observed.
options:
- Chrome
- Firefox
- Safari
- Edge
- Other
validations:
required: true
- type: markdown
attributes:
value: |
### CodeSandbox templates
Please use the appropriate template below to provide a code example:
* JavaScript: [JS Template](https://codesandbox.io/s/tiptap-js-fv1lyo)
* React: [React Template](https://codesandbox.io/s/tiptap-react-qidlsv)
* Vue 2: [Vue 2 Template](https://codesandbox.io/s/tiptap-vue-2-25nq3g)
* Vue 3: [Vue 3 Template](https://codesandbox.io/p/sandbox/tiptap-vue-3-ci7q9h)
- type: input
id: sandbox
attributes:
label: Code Example URL
description: 'Link a CodeSandbox, Stackblitz, GitHub repository, or similar to help us reproduce the issue faster.'
placeholder: https://codesandbox.io/s/example
validations:
required: false
- type: textarea
id: expectation
attributes:
label: Expected Behavior
description: Describe what you expected to happen.
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context (Optional)
description: 'Add any other context about the problem here, such as screenshots or videos.'
- type: checkboxes
attributes:
label: Dependency Updates
description: 'Have you updated your dependencies? This can often resolve issues.'
options:
- label: Yes, I've updated all my dependencies.
required: true
- type: markdown
attributes:
value: 'Thank you for helping us improve our open-source projects by reporting this issue!'
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_pro.yml
================================================
name: Bug Report (Tiptap Pro)
description: If you've encountered a bug with Tiptap Pro features, please report it here.
labels: ["Pro", "Needs Triage"]
type: "Bug"
body:
- type: markdown
attributes:
value: '### Please ensure this issue is for Tiptap Pro features only. Provide as much detail as possible to help us identify the issue quickly.'
- type: input
id: packages
attributes:
label: Affected Packages
description: List all Tiptap Pro packages where you experienced the bug.
placeholder: core, extension-mention, react
validations:
required: true
- type: input
id: version
attributes:
label: Version(s)
description: Specify the version(s) of the affected packages.
placeholder: 2.0.0
validations:
required: true
- type: textarea
id: problem
attributes:
label: Description of the Bug
description: Provide a clear and concise description of what the bug is.
placeholder: 'The issue occurs when...'
validations:
required: true
- type: dropdown
id: browser
attributes:
label: Browser Used
description: Select the browser where the bug was observed.
options:
- Chrome
- Firefox
- Safari
- Edge
- Other
validations:
required: true
- type: markdown
attributes:
value: '### Helpful Code Examples'
- type: markdown
attributes:
value: 'Providing a CodeSandbox link is crucial for diagnosing issues faster. Below are templates you might use:'
- type: markdown
attributes:
value: |
- JavaScript: [Template](https://codesandbox.io/s/tiptap-js-fv1lyo)
- React: [Template](https://codesandbox.io/s/tiptap-react-qidlsv)
- Vue 2: [Template](https://codesandbox.io/s/tiptap-vue-2-25nq3g)
- Vue 3: [Template](https://codesandbox.io/p/sandbox/tiptap-vue-3-ci7q9h)
- type: input
id: sandbox
attributes:
label: Code Example (Preferred)
description: 'Provide a link to a CodeSandbox or other code repository to help us reproduce the issue.'
placeholder: https://codesandbox.io/s/example
validations:
required: false
- type: textarea
id: expectation
attributes:
label: Expected Behavior
description: Describe what you expected to happen.
validations:
required: true
- type: textarea
id: context
attributes:
label: Additional Context (Optional)
description: 'Add any other context about the problem here, like screenshots or videos.'
- type: checkboxes
attributes:
label: Dependency Updates
description: 'Have you updated your dependencies? It can often resolve issues.'
options:
- label: Yes, I've updated all my dependencies.
required: true
- type: markdown
attributes:
value: 'Thank you for contributing to Tiptap Pro by reporting this issue!'
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: New Feature Request
url: https://github.com/ueberdosis/tiptap/discussions/new?category=feature-requests
about: Interested in proposing a new feature for Tiptap? Submit your feature request here.
- name: Help & Support
url: https://github.com/ueberdosis/tiptap/discussions/new?category=questions-help
about: Require assistance or have inquiries about using Tiptap? Ask your questions here.
- name: Join our Discord
url: https://discord.gg/WtJ49jGshW
about: Interested in engaging with the Tiptap community? Join our Discord server.
- name: Present your project
url: https://github.com/ueberdosis/tiptap/discussions/new?category=showcase
about: Developed something impressive using Tiptap? Share your project with the community here.
- name: Present your Tiptap extensions
url: https://github.com/ueberdosis/tiptap/discussions/new?category=community-extensions
about: Created a Tiptap extension? Showcase your work to the community here.
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yml
================================================
name: Documentation feedback
description: Share what we need to explain better.
title: '[Documentation]: '
labels:
- 'Type: Documentation'
- 'Category: Open Source'
- 'Status: New'
body:
- type: input
id: url
attributes:
label: What’s the URL to the page you’re sending feedback for?
placeholder: https://tiptap.dev/example
validations:
required: true
- type: textarea
id: part-of-the-documentation
attributes:
label: What part of the documentation needs improvement?
placeholder: 'I’ve read the following page of the documentation …'
validations:
required: true
- type: textarea
id: good-parts
attributes:
label: What is helpful about that part?
placeholder: 'I think this part is really good: …'
validations:
required: true
- type: textarea
id: bad-parts
attributes:
label: What is hard to understand, missing or misleading?
placeholder: 'But you really need to improve …'
validations:
required: true
- type: textarea
id: context
attributes:
label: Anything to add? (optional)
description: 'Add any other context or screenshots here.'
- type: markdown
attributes:
value: |
Thanks for taking the time to send us feedback!
================================================
FILE: .github/dependabot.yml
================================================
# Dependabot creates pull requests to keep your dependencies secure and up-to-date.
# Documentation: https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
open-pull-requests-limit: 10
schedule:
interval: 'weekly'
day: 'monday'
reviewers:
- 'bdbch'
================================================
FILE: .github/instructions/PR.instructions.md
================================================
---
applyTo: '**'
---
When asked to write a pull request description, use the following template:
```
## Changes Overview
<!-- Briefly describe your changes. -->
## Implementation Approach
<!-- Describe your approach to implementing these changes. Keep it concise. -->
## Testing Done
<!-- Explain how you tested these changes. Link to test scenarios or specs if relevant. -->
## Verification Steps
<!-- Describe steps reviewers can take to verify the functionality of your changes. -->
## Additional Notes
<!-- Add any other notes or screenshots about the PR here. -->
## Checklist
- [ ] I have created a [changeset](https://github.com/changesets/changesets) for this PR if necessary.
- [ ] My changes do not break the library.
- [ ] I have added tests where applicable.
- [ ] I have followed the project guidelines.
- [ ] I have fixed any lint issues.
## Related Issues
<!-- Link any related issues here -->
```
When generating the pull request description, ensure it is clear, concise, and follows the provided template. Focus on the key aspects of the changes made, how they were implemented, and how they can be verified.
Make it as minimal as possible to convey the necessary information effectively without causing to much noise and making it hard to read.
================================================
FILE: .github/instructions/changeset.instructions.md
================================================
---
applyTo: '**'
---
When a user asks for a changeset to be generated, follow the following rules:
Create a good changeset file for the changes in the diff. Don't include non-frontfacing changes, as the changeset file will be used for the changelog. Our users don't care about deep logic that they'll not interact with so we only want to generate changelog entries for front-facing/user-facing changes and API changes our users will need to know about.
Make sure that the changeset file stays minimal and short but includes important information that may be important for our users to understand what actually changed.
================================================
FILE: .github/instructions/tiptap.instructions.md
================================================
---
applyTo: '**'
---
# Tiptap
This document explains how to work on the Tiptap monorepo in VS Code. It covers repo layout, local dev, linting and formatting, tests, docs, and release workflow. It is written to be friendly for both humans and AI coding assistants.
---
## What is Tiptap
Tiptap is a headless rich text editor toolkit built on ProseMirror. It ships a small Core and many opt-in Extensions so you can compose exactly the editor you need for React, Vue, or vanilla apps. The project is optimized for user experience and developer experience. APIs are predictable, behavior is testable, and everything should be documented with JSDoc and runnable examples so we can generate API docs automatically.
Key points for AI assistants:
* Treat Tiptap as a collection of focused packages that together form an editor system.
* Do not assume a single framework. Many packages are framework agnostic, with separate bindings for React and Vue.
* Favor small pure utilities and deterministic code. Side effects should be explicit.
---
## Repository layout
```
.
├─ packages/ # Core and all first-party extensions
│ ├─ core/ # Editor core (@tiptap/core)
│ ├─ extension-*/ # Individual extensions
│ ├─ pm/ # ProseMirror related internals and helpers
│ └─ ... # Shared utilities, framework bindings, etc.
├─ demos/ # Vite app for live examples
│ ├─ react/ # React demos
│ └─ vue/ # Vue demos
├─ tests/ # Cypress e2e tests that run against the demos
├─ .changeset/ # Changesets for versioning and changelogs
└─ .github/ # Workflows and docs like this file
```
Notes:
* All packages we publish or use live under `packages/*`.
* The `demos/` folder contains a Vite app. It automatically discovers and parses React and Vue demos so they appear in the UI without manual wiring.
* Cypress tests in `tests/` expect the demos to be available on `http://localhost:3000`.
## NPM scripts
Scripts defined at the repo root:
* `pnpm dev` - start the demos on port 3000
* `pnpm build` - build all packages via Turborepo
* `pnpm lint` - run eslint checks
* `pnpm lint:fix` - run prettier + eslint fix
* `pnpm test:open` - open Cypress against `tests/`
* `pnpm test:run` - run Cypress in headless mode
* `pnpm test` - build then run all tests
* `pnpm serve` - build and serve the demos on port 3000
* `pnpm publish` - build and publish with Changesets
* `pnpm reset` - remove caches, build artifacts, and reinstall deps
---
## Linting & formatting
* ESLint config is at **`.eslintrc.js`** in the repo root.
* Prettier config is at **`.prettierrc`** (or `prettier.config.json`).
* Husky and lint-staged run automatically on commits.
Run manually:
```bash
pnpm lint
pnpm lint:fix
```
---
## Demos
* Demos are a Vite app in `demos/`.
* React and Vue examples live in `demos/react` and `demos/vue`. They are automatically parsed into the app.
* Start in dev mode:
```bash
pnpm dev
```
* Build static output and serve locally:
```bash
pnpm serve
```
When adding a demo, keep it small and self-contained, with imports from published package names (`@tiptap/...`).
---
## Testing with Cypress
* Cypress lives in `tests/` and drives the demos in a browser.
* Tests assume the app is running on `http://localhost:3000`.
Workflow:
```bash
pnpm dev # terminal A
pnpm test:open # terminal B
```
or for headless CI runs:
```bash
pnpm test:run
```
---
## Documentation style
We focus heavily on **User Experience** and **Developer Experience**. Every public API must be documented with JSDoc, including:
* `@param` and `@returns` annotations
* Argument descriptions
* At least one runnable example
This ensures our automated API docs are complete and examples are usable without extra context.
Example:
````ts
/**
* Toggle bold mark on the current selection.
*
* Example
* ```ts
* editor.chain().focus().toggleBold().run()
* ```
*
* @param editor - The editor instance
* @returns true if the command was applied
*/
export function toggleBold(editor: Editor): boolean {
// ...
}
````
---
## Versioning and releases with Changesets
* Run `pnpm changeset` to create a new changeset (choose packages + bump type).
* Run `pnpm version` to update versions and changelogs.
* Maintainers publish with `pnpm publish`.
Changelogs must describe **user-facing changes**. Avoid internal noise.
---
## Cleaning and resetting
* `pnpm run clean:packages` - remove build artifacts
* `pnpm run clean:packs` - remove generated tarballs
* `pnpm reset` - full reset of caches, node\_modules, and lockfiles
---
## Principles
* Keep packages modular and framework-agnostic where possible.
* Breaking changes require a major bump and a clear migration path.
* Always add or update demos and tests when introducing a feature.
* Code should be deterministic, documented, and tested.
---
## Extra guidance (short additions)
To make these instructions easier for automated agents and new contributors, the sections below add a few operational details and guardrails that speed up safe, repeatable changes.
### Environment
- Recommended Node version: >=18.x. Use a node version manager (nvm, fnm) or Corepack to pin a runtime.
- Recommended package manager: pnpm (use the repo's lockfile). If you see unexpected errors, run `pnpm reset`.
### Where to edit packages
Packages live under `packages/*`. Public entry points are typically `packages/<name>/src/index.ts` and are referenced by the package's `package.json` (`main`/`module`/`exports`). Prefer editing `src/` files and keep package diffs focused. For framework bindings check `packages/react/` and `packages/vue-2/` or `packages/vue-3/`.
### Demos auto-discovery rules
The demos app discovers examples automatically. When adding a demo:
- Keep demo files small and self-contained. Import from published package names (for example `@tiptap/extension-foo`).
- Name demo files clearly; follow existing naming conventions in `demos/`.
### Validation checklist (run locally before opening a PR)
Run the following to validate changes quickly:
```bash
pnpm lint
pnpm build
pnpm test # runs unit and/or cypress where configured
pnpm dev # optionally run the demos and open http://localhost:3000
```
If a single package is failing types, run a targeted build for that package (e.g. `pnpm -w -F @tiptap/core build`), or run `pnpm build` at the repo root.
### PR checklist
- All checks pass (lint/build/tests).
- Changeset added for user-facing changes (`pnpm changeset`).
- Demo added/updated for UI-visible changes.
- Short, clear PR description and changelog entry that explains why the change is needed.
### Guidance for automated agents and AI assistants
- Make single-purpose, small diffs. Avoid sweeping changes in one PR.
- Always run the validation checklist above after edits.
- Add or update a demo and tests for user-visible behavior. For deterministic behaviour, favour unit tests over fragile e2e tests where possible.
- Add a Changeset for any user-facing change. Do not change public APIs without a major bump; document migration steps in the PR description.
### Troubleshooting notes
- If CI fails with dependency or lockfile errors, run `pnpm reset` locally and re-run the build.
- For flaky Cypress tests, run the demo locally with `pnpm dev` and reproduce the failing test in `pnpm test:open`.
---
These additions are intentionally short so they are easy to follow and scriptable by tools and agents. If you'd like, I can apply a slightly different tone or expand any section into more detail (for example, exact node/pnpm version pinning or demo naming patterns).
================================================
FILE: .github/pull_request_template.md
================================================
## Changes Overview
<!-- Briefly describe your changes. -->
## Implementation Approach
<!-- Describe your approach to implementing these changes. Keep it concise. -->
## Testing Done
<!-- Explain how you tested these changes. Link to test scenarios or specs if relevant. -->
## Verification Steps
<!-- Describe steps reviewers can take to verify the functionality of your changes. -->
## Additional Notes
<!-- Add any other notes or screenshots about the PR here. -->
## Checklist
- [ ] I have created a [changeset](https://github.com/changesets/changesets) for this PR if necessary.
- [ ] My changes do not break the library.
- [ ] I have added tests where applicable.
- [ ] I have followed the project guidelines.
- [ ] I have fixed any lint issues.
## Related Issues
<!-- Link any related issues here -->
================================================
FILE: .github/workflows/build.yml
================================================
name: Verify
env:
NODE_VERSION: 24
PNPM_VERSION: 9.15.4
PNPM_STORE_DIR: .pnpm-store
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches:
- main
- next
- release/*
pull_request:
branches:
- main
- next
- release/*
jobs:
install-node-dependencies:
name: Install node dependencies
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Configure pnpm store
run: pnpm config set store-dir ${{ github.workspace }}/${{ env.PNPM_STORE_DIR }}
- name: Install dependencies
run: pnpm install --frozen-lockfile --strict-peer-dependencies
- name: Install Cypress binary
run: pnpm exec cypress install
- name: Pack dependency artifacts
run: |
tar -czf /tmp/pnpm-store.tar.gz ${{ env.PNPM_STORE_DIR }}
tar -czf /tmp/cypress-cache.tar.gz -C "$HOME/.cache" Cypress
- name: Upload dependency artifacts
uses: actions/upload-artifact@v4.6.2
with:
name: node-dependencies
path: |
/tmp/pnpm-store.tar.gz
/tmp/cypress-cache.tar.gz
retention-days: 1
check-linting-formatting:
name: Check linting & formatting
runs-on: ubuntu-latest
needs: build-packages
timeout-minutes: 15
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Configure pnpm store
run: pnpm config set store-dir ${{ github.workspace }}/${{ env.PNPM_STORE_DIR }}
- name: Download dependency artifacts
uses: actions/download-artifact@v4.3.0
with:
name: node-dependencies
path: /tmp/node-dependencies
- name: Restore pnpm store
run: tar -xzf /tmp/node-dependencies/pnpm-store.tar.gz
- name: Restore dependencies
run: pnpm install --offline --frozen-lockfile --strict-peer-dependencies
- name: Run linting and formatting checks
run: pnpm run lint
build-packages:
name: Build packages
runs-on: ubuntu-latest
needs: install-node-dependencies
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Configure pnpm store
run: pnpm config set store-dir ${{ github.workspace }}/${{ env.PNPM_STORE_DIR }}
- name: Download dependency artifacts
uses: actions/download-artifact@v4.3.0
with:
name: node-dependencies
path: /tmp/node-dependencies
- name: Restore pnpm store
run: tar -xzf /tmp/node-dependencies/pnpm-store.tar.gz
- name: Restore dependencies
run: pnpm install --offline --frozen-lockfile --strict-peer-dependencies
- name: Build packages
run: pnpm run build && pnpm run build:demos
- name: Pack build artifacts
run: tar -czf /tmp/build-output.tar.gz packages/*/dist packages-deprecated/*/dist demos/dist
- name: Upload build artifacts
uses: actions/upload-artifact@v4.6.2
with:
name: build-output
path: /tmp/build-output.tar.gz
retention-days: 1
run-unit-tests:
name: Run unit tests
runs-on: ubuntu-latest
needs: build-packages
timeout-minutes: 20
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Configure pnpm store
run: pnpm config set store-dir ${{ github.workspace }}/${{ env.PNPM_STORE_DIR }}
- name: Download dependency artifacts
uses: actions/download-artifact@v4.3.0
with:
name: node-dependencies
path: /tmp/node-dependencies
- name: Restore pnpm store
run: tar -xzf /tmp/node-dependencies/pnpm-store.tar.gz
- name: Restore dependencies
run: pnpm install --offline --frozen-lockfile --strict-peer-dependencies
- name: Download build artifacts
uses: actions/download-artifact@v4.3.0
with:
name: build-output
path: /tmp/build-output
- name: Restore build output
run: tar -xzf /tmp/build-output/build-output.tar.gz
- name: Run unit tests
run: pnpm run test:unit
run-e2e-tests:
name: Run e2e tests
runs-on: ubuntu-latest
needs: build-packages
timeout-minutes: 45
strategy:
fail-fast: false
matrix:
test-spec:
- { id: integration, name: Integration, spec: './tests/cypress/integration/**/*.spec.{js,ts}' }
- { id: demos-commands, name: 'Demos/Commands', spec: './demos/src/Commands/**/*.spec.{js,ts}' }
- { id: demos-examples, name: 'Demos/Examples', spec: './demos/src/Examples/**/*.spec.{js,ts}' }
- { id: demos-experiments, name: 'Demos/Experiments', spec: './demos/src/Experiments/**/*.spec.{js,ts}' }
- { id: demos-extensions, name: 'Demos/Extensions', spec: './demos/src/Extensions/**/*.spec.{js,ts}' }
- { id: demos-guidecontent, name: 'Demos/GuideContent', spec: './demos/src/GuideContent/**/*.spec.{js,ts}' }
- { id: demos-guidegettingstarted, name: 'Demos/GuideGettingStarted', spec: './demos/src/GuideGettingStarted/**/*.spec.{js,ts}' }
- { id: demos-marks, name: 'Demos/Marks', spec: './demos/src/Marks/**/*.spec.{js,ts}' }
- { id: demos-nodes, name: 'Demos/Nodes', spec: './demos/src/Nodes/**/*.spec.{js,ts}' }
steps:
- uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Configure pnpm store
run: pnpm config set store-dir ${{ github.workspace }}/${{ env.PNPM_STORE_DIR }}
- name: Download dependency artifacts
uses: actions/download-artifact@v4.3.0
with:
name: node-dependencies
path: /tmp/node-dependencies
- name: Restore pnpm store
run: tar -xzf /tmp/node-dependencies/pnpm-store.tar.gz
- name: Restore dependencies
run: pnpm install --offline --frozen-lockfile --strict-peer-dependencies
- name: Restore Cypress cache
run: mkdir -p "$HOME/.cache" && tar -xzf /tmp/node-dependencies/cypress-cache.tar.gz -C "$HOME/.cache"
- name: Download build artifacts
uses: actions/download-artifact@v4.3.0
with:
name: build-output
path: /tmp/build-output
- name: Restore build output
run: tar -xzf /tmp/build-output/build-output.tar.gz
- name: Test ${{ matrix.test-spec.name }}
uses: cypress-io/github-action@v6.10.2
with:
install: false
start: pnpm exec http-server ./demos/dist -s -p 3000
wait-on: http://localhost:3000
spec: ${{ matrix.test-spec.spec }}
project: ./tests
browser: chrome
quiet: true
- name: Export screenshots (on failure only)
uses: actions/upload-artifact@v4.6.2
if: failure()
with:
name: cypress-screenshots-${{ matrix.test-spec.id }}
path: tests/cypress/screenshots
retention-days: 7
- name: Export screen recordings (on failure only)
uses: actions/upload-artifact@v4.6.2
if: failure()
with:
name: cypress-videos-${{ matrix.test-spec.id }}
path: tests/cypress/videos
retention-days: 7
================================================
FILE: .github/workflows/notify-discord.yml
================================================
name: Notify Discord on Release
on:
release:
types: [published]
jobs:
discord_notify:
name: Send release to Discord
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Post release to Discord (tsickert/discord-webhook)
uses: tsickert/discord-webhook@v7.0.0
with:
webhook-url: ${{ secrets.DISCORD_RELEASES_STABLE_WEBHOOK }}
embed-title: ${{ github.event.release.name || github.event.release.tag_name }}
embed-description: ${{ github.event.release.body }}
embed-url: ${{ github.event.release.html_url }}
wait: true
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish
env:
NODE_VERSION: 24
PNPM_VERSION: 9.15.4
on:
push:
branches:
- main
- next
- 'release/*'
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref_name }}
cancel-in-progress: true
jobs:
build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile --strict-peer-dependencies
- name: Run build
run: pnpm run build && pnpm run build:demos
- name: Archive package dist artifacts
run: tar -cf package-dist-artifacts.tar packages/*/dist packages-deprecated/*/dist
- name: Upload package dist artifacts
uses: actions/upload-artifact@v4
with:
name: package-dist-artifacts
if-no-files-found: error
path: package-dist-artifacts.tar
release:
name: Bump Versions OR Release to Registry
runs-on: ubuntu-latest
timeout-minutes: 30
needs: build
permissions:
id-token: write
contents: write
pull-requests: write
outputs:
dist_tag: ${{ steps.resolve_dist_tag.outputs.dist_tag }}
release_kind: ${{ steps.resolve_dist_tag.outputs.release_kind }}
published: ${{ steps.changesets.outputs.published }}
steps:
- name: Checkout repo
uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Update npm for trusted publishing
run: npm install -g npm@11.6.2
- name: Install dependencies
run: pnpm install --frozen-lockfile --strict-peer-dependencies
- name: Download package dist artifacts
uses: actions/download-artifact@v4
with:
name: package-dist-artifacts
path: .
- name: Restore package dist artifacts
run: tar -xf package-dist-artifacts.tar
- name: Verify package dist artifacts
run: bash ./scripts/check-package-dists.sh
- name: Resolve npm dist-tag
id: resolve_dist_tag
run: |
branch="${{ github.ref_name }}"
if [ "$branch" = 'main' ]; then
echo 'NPM_DIST_TAG=latest' >> "$GITHUB_ENV"
echo 'dist_tag=latest' >> "$GITHUB_OUTPUT"
echo 'release_kind=stable' >> "$GITHUB_OUTPUT"
elif [ "$branch" = 'next' ]; then
echo 'NPM_DIST_TAG=next' >> "$GITHUB_ENV"
echo 'dist_tag=next' >> "$GITHUB_OUTPUT"
echo 'release_kind=prerelease' >> "$GITHUB_OUTPUT"
else
release_tag="${branch#release/}"
echo "NPM_DIST_TAG=${release_tag}-latest" >> "$GITHUB_ENV"
echo "dist_tag=${release_tag}-latest" >> "$GITHUB_OUTPUT"
echo 'release_kind=prerelease' >> "$GITHUB_OUTPUT"
fi
- name: Run changesets release flow
id: changesets
uses: changesets/action@v1
with:
createGithubReleases: false
version: pnpm run version
publish: pnpm changeset publish --tag $NPM_DIST_TAG
title: ${{ github.ref_name == 'main' && 'Publish a new stable version' || 'Publish a new release version' }}
commit: '${{ github.ref_name == ''main'' && ''chore(release): publish a new stable version'' || ''chore(release): publish a new release version'' }}'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_CONFIG_PROVENANCE: true
NPM_CONFIG_ACCESS: public
notify-slack:
name: Send notification to Slack
runs-on: ubuntu-latest
needs: release
if: needs.release.outputs.published == 'true'
timeout-minutes: 5
permissions: {}
steps:
- name: Send Slack notification
uses: slackapi/slack-github-action@v2.1.1
with:
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
{
"message": "[Tiptap Editor ${{ needs.release.outputs.release_kind == 'stable' && 'Release' || 'Pre-release' }}]: Published packages from branch ${{ github.ref_name }} with npm tag ${{ needs.release.outputs.dist_tag }}."
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
notify-slack-failure:
name: Send failure notification to Slack
runs-on: ubuntu-latest
needs: release
if: always() && needs.release.result == 'failure'
timeout-minutes: 5
permissions: {}
steps:
- name: Send Slack failure notification
uses: slackapi/slack-github-action@v2.1.1
with:
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
{
"message": "[Tiptap Editor Release]: There was an issue publishing packages from branch ${{ github.ref_name }}. Logs: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .gitignore
================================================
*.log
.cache
.DS_Store
.temp
node_modules
dist
.env
.env.*
.eslintcache
.instructions
.agent
docs
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# parcel-bundler cache (https://parceljs.org/)
.cache
# Turbo cache
.turbo
.rpt2_cache
.rts2_cache
.rts2_cache_cjs
.rts2_cache_es
.rts2_cache_umd
tests/cypress/videos
/tests/cypress/screenshots
# Ignore intellij project files
.idea
# packaged files
packages/**/*.tgz
packages-deprecated/**/*.tgz
demos/*.tgz
# demo directories
demos/src/Dev/**
!demos/src/Dev/.gitkeep
# instructions
.github/instructions/*
!.github/instructions/tiptap.instructions.md
!.github/instructions/changeset.instructions.md
!.github/instructions/PR.instructions.md
================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm run lint:staged
================================================
FILE: .npmrc
================================================
link-workspace-packages=deep
prefer-workspace-packages=true
================================================
FILE: .prettierignore
================================================
**/.git
**/.svn
**/.hg
**/node_modules
.turbo
.changeset
.github/**/*
demos/dist/**/*
demos/node_modules/**/*
pnpm-lock.yaml
================================================
FILE: .prettierrc
================================================
{
"trailingComma": "all",
"tabWidth": 2,
"semi": false,
"singleQuote": true,
"arrowParens": "avoid",
"printWidth": 120
}
================================================
FILE: .vscode/launch.json
================================================
{
"configurations": [
{
"name": "Launch Tiptap demos in Google Chrome",
"request": "launch",
"type": "chrome",
"url": "http://localhost:3000",
"webRoot": "${workspaceFolder}"
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"typescript.tsdk": "node_modules/typescript/lib",
"conventionalCommits.scopes": [
"ci",
"docs",
"maintainment",
"tests",
"core",
"extension/blockquote",
"extension/bold",
"extension/bubble-menu",
"extension/bullet-list",
"extension/character-count",
"extension/code",
"extension/code-block",
"extension/code-block-lowlight",
"extension/collaboration",
"extension/collaboration-caret",
"extension/color",
"extension/document",
"extension/dropcursor",
"extension/floating-menu",
"extension/focus",
"extension/font-family",
"extension/font-size",
"extension/gapcursor",
"extension/hard-break",
"extension/heading",
"extension/highlight",
"extension/history",
"extension/horizontal-rule",
"extension/image",
"extension/italic",
"extension/link",
"extension/list-item",
"extension/mention",
"extension/ordered-list",
"extension/paragraph",
"extension/placeholder",
"extension/strike",
"extension/subscript",
"extension/table",
"extension/table-cell",
"extension/table-header",
"extension/table-row",
"extension/task-item",
"extension/task-list",
"extension/text",
"extension/text-align",
"extension/text-style",
"extension/typography",
"extension/underline",
"extension/youtube",
"html",
"react",
"starter-kit",
"suggestion",
"vue-2",
"vue-3"
],
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
================================================
FILE: CHANGELOG.md
================================================
# Releases
## v3.20.4
### @tiptap/core
#### Patch Changes
- Fixed Tiptap not publishing with build dist artifacts
## v3.20.3
### @tiptap/react
#### Patch Changes
- Forward BubbleMenu and FloatingMenu HTML props to the actual menu element so attributes like `className`, `style`, `data-*`, and event handlers bind to the positioned menu container.
- Generate a stable per-instance menu plugin key automatically when `pluginKey` is omitted, so multiple BubbleMenu or FloatingMenu components can be mounted without colliding.
### @tiptap/vue-2
#### Patch Changes
- Forward BubbleMenu and FloatingMenu HTML props to the actual menu element so attributes like `className`, `style`, `data-*`, and event handlers bind to the positioned menu container.
- Generate a stable per-instance menu plugin key automatically when `pluginKey` is omitted, so multiple BubbleMenu or FloatingMenu components can be mounted without colliding.
### @tiptap/core
#### Patch Changes
- Fixed `isNodeEmpty()` so multi-line text with non-whitespace content is no longer treated as empty when `ignoreWhitespace` is enabled.
- Fixed overlapping bold and italic markdown serialization and round-tripping.
### @tiptap/extension-unique-id
#### Patch Changes
- Fixed a bug where empty paragraphs accumulated in the document on every page reload when using the UniqueID extension with the Collaboration extension and an externally created Yjs provider.
### @tiptap/extension-youtube
#### Patch Changes
- Export missing `getEmbedUrlFromYoutubeUrl` and `isValidYoutubeUrl` embed URL utility functions
### @tiptap/vue-3
#### Patch Changes
- Generate a stable per-instance menu plugin key automatically when `pluginKey` is omitted, so multiple BubbleMenu or FloatingMenu components can be mounted without colliding.
### @tiptap/extension-placeholder
#### Patch Changes
- Skip placeholder decorations on non-textblock nodes when `includeChildren` is enabled to prevent duplicate placeholders on wrapper nodes like lists.
### @tiptap/extension-bold
#### Patch Changes
- Fixed overlapping bold and italic markdown serialization and round-tripping.
### @tiptap/extension-italic
#### Patch Changes
- Fixed overlapping bold and italic markdown serialization and round-tripping.
### @tiptap/markdown
#### Patch Changes
- Fixed overlapping bold and italic markdown serialization and round-tripping.
## v3.20.2
### @tiptap/core
#### Patch Changes
- Improved markdown empty-paragraph roundtripping across top-level and nested block content. Empty paragraphs now serialize with natural blank-line spacing for the first paragraph in a run and ` ` markers for subsequent empty paragraphs at the same level, while parsing preserves those empty paragraphs when converting markdown back to JSON.
### @tiptap/extension-blockquote
#### Patch Changes
- Improved markdown empty-paragraph roundtripping across top-level and nested block content. Empty paragraphs now serialize with natural blank-line spacing for the first paragraph in a run and ` ` markers for subsequent empty paragraphs at the same level, while parsing preserves those empty paragraphs when converting markdown back to JSON.
### @tiptap/extension-list
#### Patch Changes
- Improved markdown empty-paragraph roundtripping across top-level and nested block content. Empty paragraphs now serialize with natural blank-line spacing for the first paragraph in a run and ` ` markers for subsequent empty paragraphs at the same level, while parsing preserves those empty paragraphs when converting markdown back to JSON.
### @tiptap/extension-paragraph
#### Patch Changes
- Improved markdown empty-paragraph roundtripping across top-level and nested block content. Empty paragraphs now serialize with natural blank-line spacing for the first paragraph in a run and ` ` markers for subsequent empty paragraphs at the same level, while parsing preserves those empty paragraphs when converting markdown back to JSON.
### @tiptap/markdown
#### Patch Changes
- Improved markdown empty-paragraph roundtripping across top-level and nested block content. Empty paragraphs now serialize with natural blank-line spacing for the first paragraph in a run and ` ` markers for subsequent empty paragraphs at the same level, while parsing preserves those empty paragraphs when converting markdown back to JSON.
## v3.20.1
### @tiptap/extension-code-block
#### Patch Changes
- Fix tilde-fenced code blocks (`~~~`) being silently dropped when parsing markdown
### @tiptap/extension-drag-handle
#### Patch Changes
- Fix Drag event listener is removed when a plugin is registered after the DragHandle plugin.
### @tiptap/extension-unique-id
#### Patch Changes
- Add support for `types: 'all'` in `UniqueID` to target every node type except `doc` and `text`.
### @tiptap/core
#### Patch Changes
- Fix inline `style` parsing in `mergeAttributes` for values containing `:` or `;` (e.g. `url(https://...)` or `url(data:...;charset=...,)`) and skip incomplete declarations
## v3.20.0
### @tiptap/core
#### Minor Changes
- Add `transformPastedHTML` extension API that allows extensions to transform pasted HTML content before it's parsed into the editor, enabling cleanup of styles, removal of dangerous content, and modification of pasted HTML through a chainable transform system.
#### Patch Changes
- Fix checking if mark is active and toggling off marks when part of the selection does not allow the mark (e.g. a code block)
- Global attributes now support shorthand string values for `types`: use `'*'` to apply to all nodes and marks, `'nodes'` for all nodes (excluding text), or `'marks'` for all marks.
- Fixed a typo in the documentation of `editor.view`
### @tiptap/extension-drag-handle
#### Patch Changes
- Fix drag handle not appearing for atom/leaf nodes like images in both nested and non-nested modes
- Add table structure rules to prevent drag handle on table rows, cells, and headers, and fix ghost table rows when dragging tables
- Fix drag position resolving outside the document when dragging an empty text node at the end of the document
### @tiptap/markdown
#### Patch Changes
- Fixed getMarkdown() returning ` ` instead of empty string when editor is empty
### @tiptap/extension-bubble-menu
#### Patch Changes
- Fix `BubbleMenu`/`FloatingMenu` to use `pluginKey` as the transaction meta key so that multiple instances can be updated independently without affecting each other
### @tiptap/extension-floating-menu
#### Patch Changes
- Fix `BubbleMenu`/`FloatingMenu` to use `pluginKey` as the transaction meta key so that multiple instances can be updated independently without affecting each other
### @tiptap/react
#### Minor Changes
- Moved BubbleMenu and FloatingMenu to separate `@tiptap/react/menus` entrypoint to keep floating-ui optional
- Simplified Tiptap component API with guaranteed non-null editor instance from useTiptap hook
#### Patch Changes
- Fix `BubbleMenu`/`FloatingMenu` to use `pluginKey` as the transaction meta key so that multiple instances can be updated independently without affecting each other
### @tiptap/extension-code-block-lowlight
#### Patch Changes
- Fixed a runtime error when initializing `CodeBlockLowlight` by switching the `CodeBlock` import to a named export. This prevents `extend is not a function` errors caused by ESM/CJS interop issues.
### @tiptap/extension-invisible-characters
#### Patch Changes
- Added missing storage typings
## v3.19.0
### @tiptap/extension-link
#### Patch Changes
- Add `title` attribute to Link extension. The title can now be set via `setLink` and `toggleLink` commands and is rendered as an HTML title attribute.
- Add title attribute support for markdown rendering. Links with titles are now serialized to markdown format `[text](url "title")`.
### @tiptap/react
#### Minor Changes
- Moved BubbleMenu and FloatingMenu to separate `@tiptap/react/menus` entrypoint to keep floating-ui optional
- Simplified Tiptap component API with guaranteed non-null editor instance from useTiptap hook
## v3.18.0
### @tiptap/extension-bubble-menu
#### Patch Changes
- Fix BubbleMenu and FloatingMenu props not updating after initialization
### @tiptap/extension-floating-menu
#### Patch Changes
- Fix BubbleMenu and FloatingMenu props not updating after initialization
### @tiptap/react
#### Minor Changes
- Introduce a new, optional React integration that provides a declarative `<Tiptap />` component for setting up editors in React apps.
Summary
- Add a new, ergonomic way to initialize and use Tiptap editors in React via `<Tiptap />` components. This is an additive change and does not remove or change existing APIs.
Why this change
- Improves ergonomics for React users by offering a component-first API that pairs well with React patterns (hooks, JSX composition and props-driven configuration).
Migration and usage
- The old programmatic setup remains supported for this major version — nothing breaks. We encourage consumers to try the new `<Tiptap />` component and migrate when convenient.
Example
```tsx
import { Tiptap, useEditor } from '@tiptap/react'
function MyEditor() {
const editor = useEditor({ extensions: [StarterKit], content: '<h1>Hello from Tiptap</h1>' })
return (
<Tiptap instance={editor}>
<Tiptap.Content />
<Tiptap.BubbleMenu>My Bubble Menu</Tiptap.BubbleMenu>
<Tiptap.FloatingMenu>My Floating Menu</Tiptap.FloatingMenu>
<MenuBar /> {/* MenuBar can use the new `useTiptap` hook to read the editor instance from context */}
</Tiptap>
)
}
```
Deprecation plan
- The old imperative setup will remain fully backward-compatible for this major release. We plan to deprecate (and remove) the legacy setup in the next major version — a deprecation notice and migration guide will be published ahead of that change.
#### Patch Changes
- Fix BubbleMenu and FloatingMenu props not updating after initialization
- Fixed extension storage not updating in React and Vue node views
### @tiptap/vue-3
#### Patch Changes
- Fixed extension storage not updating in React and Vue node views
### @tiptap/markdown
#### Patch Changes
- Upgrade marked.js from v15.0.12 to v17.0.1. Note that `**)**` requires whitespace when adjacent to alphanumeric text per CommonMark specification.
### @tiptap/extensions
#### Patch Changes
- Added a new `dataAttribute` to the extension option to control which attribute name will be used for the placeholder label.
## v3.17.1
### @tiptap/extension-paragraph
#### Patch Changes
- Fixed markdown serialization doubling newlines and parsing collapsing multiple blank lines
### @tiptap/markdown
#### Patch Changes
- Fixed markdown serialization doubling newlines and parsing collapsing multiple blank lines
- Fixed markdown HTML parsing when window object is unavailable in server-side environments
- Fixed ordered list numbering when list has a non-default start value
### @tiptap/vue-3
#### Patch Changes
- Fixed IME input (Chinese, Japanese, Korean) in Vue 3 mark views by preventing DOM element destruction during composition events
### @tiptap/extension-collaboration-caret
#### Patch Changes
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
### @tiptap/extension-collaboration
#### Patch Changes
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
### @tiptap/extension-drag-handle
#### Patch Changes
- Fixed CollaborationCaret crash with "Cannot read properties of undefined (reading 'doc')" error by updating to @tiptap/y-tiptap@3.0.2, which includes a guard against undefined state during editor initialization. This issue affected editors initialized with HTML content, particularly when using tables.
### @tiptap/html
#### Patch Changes
- Fixed server-side HTML parsing crash when content contains link, script, or style tags with resource references.
- Fixed server exports failing in Node.js test environments with jsdom/happy-dom
### @tiptap/extension-bubble-menu
#### Patch Changes
- Fixed bubble and floating menus to properly handle hide middleware data, hiding menus when reference element is scrolled out of view
### @tiptap/extension-floating-menu
#### Patch Changes
- Fixed bubble and floating menus to properly handle hide middleware data, hiding menus when reference element is scrolled out of view
### @tiptap/core
#### Patch Changes
- Fixed `$nodes()` method to correctly return inline nodes (like text, mention, etc.) by fixing the `children` getter in `NodePos` class
- Fixed ResizableNodeView contentDOM getter to return null instead of undefined for proper TypeScript compatibility
### @tiptap/extension-list
#### Patch Changes
- Fixed ordered list numbering when list has a non-default start value
## v3.17.0
### @tiptap/extension-bubble-menu
#### Patch Changes
- Added a safeguard to avoid `TypeError: Cannot read properties of null (reading 'domFromPos')` being thrown when the editor was being destroyed
### @tiptap/extension-drag-handle
#### Minor Changes
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
#### Patch Changes
- Fixed Firefox bug where the text caret becomes invisible after drag and drop.
### @tiptap/core
#### Patch Changes
- Added `isFirefox` utility to core
### @tiptap/extension-drag-handle-react
#### Minor Changes
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
### @tiptap/extension-drag-handle-vue-2
#### Minor Changes
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
### @tiptap/extension-drag-handle-vue-3
#### Minor Changes
- Added nested drag handle support, allowing drag handles to appear for nested content like list items and blockquotes with configurable edge detection and custom rules.
## v3.16.0
### @tiptap/extension-audio
#### Minor Changes
- Add a native audio extension with demos and tests.
### @tiptap/markdown
#### Patch Changes
- Fix incorrect Markdown output when underline is mixed with bold or italic and their ranges do not fully overlap.
- Fix overlapping underline/bold/italic serialization and add tests
### @tiptap/extension-link
#### Patch Changes
- Fixed an issue where clicking on non-link elements (like images) required multiple clicks to select them. The link click handler now properly returns early when the clicked element is not a link, allowing other node handlers to process the click event.
### @tiptap/extension-floating-menu
#### Minor Changes
- Add updateEvent support for FloatingMenu to allow programmatic position updates via `setMeta('floatingMenu', 'updatePosition')`
### @tiptap/react
#### Minor Changes
- Add updateEvent support for FloatingMenu to allow programmatic position updates via `setMeta('floatingMenu', 'updatePosition')`
### @tiptap/vue-2
#### Minor Changes
- Add updateEvent support for FloatingMenu to allow programmatic position updates via `setMeta('floatingMenu', 'updatePosition')`
### @tiptap/vue-3
#### Minor Changes
- Add updateEvent support for FloatingMenu to allow programmatic position updates via `setMeta('floatingMenu', 'updatePosition')`
### @tiptap/extension-unique-id
#### Patch Changes
- Improved `findDuplicates` helper performance from O(n²) to O(n) by using Set-based lookups instead of Array.indexOf
## v3.15.3
### @tiptap/core
#### Patch Changes
- Fix Safari scrolling to top when using editor.chain().focus() commands
## v3.15.2
### @tiptap/extension-link
#### Patch Changes
- Prevent auto-linking of bare hostnames (e.g., `localhost`) and IP addresses without a protocol prefix
### @tiptap/extension-list
#### Patch Changes
- Fix lost HTML attributes in TaskItem node view updates
### @tiptap/vue-2
#### Patch Changes
- Fix Vue prop validation warning for `appendTo` prop in BubbleMenu and FloatingMenu
### @tiptap/vue-3
#### Patch Changes
- Fix Vue prop validation warning for `appendTo` prop in BubbleMenu and FloatingMenu
### @tiptap/extension-youtube
#### Patch Changes
- Fix YouTube Shorts embed URLs using incorrect query parameter separator
### @tiptap/react
#### Patch Changes
- Fix race conditions in ReactRenderer causing destroyed renderers to be re-added in Strict Mode
## v3.15.1
### @tiptap/suggestion
#### Patch Changes
- Add a new `shouldShow` callback to the `Suggestion` utility. This allows developers to filter when suggestions are displayed, which is especially useful for collaborative environments to prevent suggestions from popping open for remote users.
## v3.15.0
### @tiptap/core
#### Minor Changes
- Add a new `dispatchTransaction` hook to extensions, allowing developers to intercept, modify, or block transactions before they are applied to the editor state.
### @tiptap/extension-unique-id
#### Patch Changes
- Fix unique ID assignment when handling empty nodes by checking next node's attribute state in the transaction document before modifying it, preventing incorrect ID assignments.
## v3.14.0
### @tiptap/extension-twitch
#### Minor Changes
- Add new Twitch extension for embedding Twitch videos, clips, and live channels in the editor. Supports customizable parameters like autoplay, muted, and start time, with attribute-level overrides for per-embed configuration.
### @tiptap/react
#### Patch Changes
- Append all children of editors parent node to element
Fixes a regression introduced by #6972, that resulted in elements that got appended to the editors parent node staying detached. E.g. the drag handle plugin is affected by this regression.
### @tiptap/vue-2
#### Patch Changes
- Append all children of editors parent node to element
Fixes a regression introduced by #6972, that resulted in elements that got appended to the editors parent node staying detached. E.g. the drag handle plugin is affected by this regression.
### @tiptap/vue-3
#### Patch Changes
- Append all children of editors parent node to element
Fixes a regression introduced by #6972, that resulted in elements that got appended to the editors parent node staying detached. E.g. the drag handle plugin is affected by this regression.
### @tiptap/extension-drag-handle
#### Patch Changes
- Fix `findElementNextToCoords` to resolve the parent when `nodeAt(pos)` is null
(e.g., inside an atom node that allows inline content)
## v3.13.0
### @tiptap/extension-drag-handle
#### Patch Changes
- Added `data-dragging` attribute to drag handle elements to track drag state.
### @tiptap/extension-drag-handle-react
#### Patch Changes
- Added `data-dragging` attribute to drag handle elements to track drag state.
### @tiptap/extension-drag-handle-vue-2
#### Patch Changes
- Added `data-dragging` attribute to drag handle elements to track drag state.
### @tiptap/extension-drag-handle-vue-3
#### Patch Changes
- Added `data-dragging` attribute to drag handle elements to track drag state.
### @tiptap/extension-link
#### Patch Changes
- Ensure `enableClickSelection` works regardless of the `openOnClick` option by always registering the link click handler plugin.
### @tiptap/extension-table-of-contents
#### Patch Changes
- Skip the table of contents update logic during IME input method composition to avoid interference with input.
### @tiptap/markdown
#### Patch Changes
- Fixed trailing and leading whitespace handling in markdown serialization for inline marks
### @tiptap/extension-mention
#### Patch Changes
- Add 'mentionSuggestionChar' to allowedAttributes for Markdown serialization in multi-mention setups. The attribute is only serialized when it differs from the default '@' character, keeping markdown output clean for single-mention users.
### @tiptap/core
#### Minor Changes
- 1. **Added** an optional `createCustomHandle` callback to `ResizableNodeView`, allowing developers to fully customize resize handles. When provided, it replaces the default handle creation and bypasses the built-in `positionHandle` logic, giving complete control over markup, styling, and positioning while preserving backward compatibility.
2. **Removed** predefined inline styles from the `wrapper` element to better support dynamic alignment. This eliminates the need for `!important` overrides in user styles.
3. **Added** an editor `update` event listener to dynamically attach or remove resize handles based on the editor’s editable state. The implementation tracks the previous editable state to avoid unnecessary re-renders.
#### Patch Changes
- Add 'mentionSuggestionChar' to allowedAttributes for Markdown serialization in multi-mention setups. The attribute is only serialized when it differs from the default '@' character, keeping markdown output clean for single-mention users.
### @tiptap/extension-image
#### Minor Changes
- 1. **Added** an optional `createCustomHandle` callback to `ResizableNodeView`, allowing developers to fully customize resize handles. When provided, it replaces the default handle creation and bypasses the built-in `positionHandle` logic, giving complete control over markup, styling, and positioning while preserving backward compatibility.
2. **Removed** predefined inline styles from the `wrapper` element to better support dynamic alignment. This eliminates the need for `!important` overrides in user styles.
3. **Added** an editor `update` event listener to dynamically attach or remove resize handles based on the editor’s editable state. The implementation tracks the previous editable state to avoid unnecessary re-renders.
## v3.12.1
### @tiptap/extension-table-of-contents
#### Patch Changes
- Fixed a bug that mutated the ProseMirror document during server-side rendering, which could cause "Invalid content for node doc" errors.
## v3.12.0
### @tiptap/extension-collaboration
#### Minor Changes
- Implement position mapping using the `MappablePosition` class. This enables position mapping in collaborative editing scenarios.
- Introduce `MappablePosition` class in core with `position`, `fromJSON`, and `toJSON` methods
- Add `editor.utils` property with `getUpdatedPosition(position, transaction)` and `createMappablePosition()` methods
- Create `CollaborationMappablePosition` subclass that extends `MappablePosition` with Y.js relative position support
### @tiptap/core
#### Minor Changes
- Implement position mapping using the `MappablePosition` class. This enables position mapping in collaborative editing scenarios.
- Introduce `MappablePosition` class in core with `position`, `fromJSON`, and `toJSON` methods
- Add `editor.utils` property with `getUpdatedPosition(position, transaction)` and `createMappablePosition()` methods
- Create `CollaborationMappablePosition` subclass that extends `MappablePosition` with Y.js relative position support
### @tiptap/extension-collaboration-caret
#### Patch Changes
- Avoid mutating `this.options` in the `updateUser` command. `this.options` can be a getter and is not writable; the command now updates the provider awareness directly so user updates are applied correctly.
### @tiptap/react
#### Minor Changes
- Replaced unmaintained `fast-deep-equal` dependency with maintained `fast-equals`
#### Patch Changes
- Fix a bug where React node views could receive invalid positions from `this.getPos()` when ProseMirror and React render cycles got out of sync, which could cause errors during updates.
## v3.11.1
### @tiptap/core
#### Patch Changes
- Improve TypeScript generics for Node.extend
The Node.extend method's TypeScript signature was updated so that ExtendedConfig can extend NodeConfig and MarkConfig,
improving type inference when extending Node and Mark classes with additional config properties.
This is a type-only change — there are no runtime behavior changes.
### @tiptap/extensions
#### Patch Changes
- Fixed a bug where the TrailingNode extension would not use the node option to assume the default node type
## v3.11.0
### @tiptap/core
#### Minor Changes
- Add native text direction support for RTL and bidirectional content. The editor now includes a `textDirection` option that can be set to `'ltr'`, `'rtl'`, or `'auto'` to control the direction of all content globally. Additionally, new `setTextDirection` and `unsetTextDirection` commands allow for granular control of text direction on specific nodes. This enables proper rendering of right-to-left languages like Arabic and Hebrew, as well as bidirectional text mixing multiple languages.
## v3.10.8
### @tiptap/core
#### Patch Changes
- Fixed a bug that caused extra characters to be inserted after a parsed, nestable content block by accounting for leading newlines
- Add documentation comments to Tiptap JSON types
- allow `undefined` as a value for the `default` attribute key
- Fix `updateAttributes` and `resetAttributes` commands to return accurate results when used with `.can()`. Previously, these commands would always return `true` even when they couldn't perform the operation. Now they correctly return `false` when no matching nodes or marks are found in the selection.
### @tiptap/extension-text-align
#### Patch Changes
- Fix `setTextAlign` and `unsetTextAlign` commands to work correctly with `.can()` checks. Changed logic from `.every()` to `.some()` to return `true` when at least one configured node type matches, rather than requiring all types to match.
### @tiptap/static-renderer
#### Patch Changes
- Fix static HTML renderer incorrectly generating self-closing tags for HTML elements that require proper closing tags (iframe, script, style, etc.).
### @tiptap/markdown
#### Patch Changes
- Fixed CommonJS compatibility by downgrading `marked` dependency from v16 to v15.
## v3.10.7
### @tiptap/vue-2
#### Patch Changes
- Fix BubbleMenu plugin registration not triggering due to missing element reference during component initialization.
## v3.10.6
### @tiptap/vue-2
#### Patch Changes
- Fix BubbleMenu and FloatingMenu component runtime errors in Vue 2.
## v3.10.5
### @tiptap/extension-collaboration
#### Patch Changes
- Fixed collaborative editing errors with certain emoji combinations (like 🔴🟢, 😎🐈, 🟣🔵) by updating `@tiptap/y-tiptap` to stable v3.0.0.
### @tiptap/extension-collaboration-caret
#### Patch Changes
- Fixed collaborative editing errors with certain emoji combinations (like 🔴🟢, 😎🐈, 🟣🔵) by updating `@tiptap/y-tiptap` to stable v3.0.0.
### @tiptap/extension-drag-handle
#### Patch Changes
- Fixed collaborative editing errors with certain emoji combinations (like 🔴🟢, 😎🐈, 🟣🔵) by updating `@tiptap/y-tiptap` to stable v3.0.0.
### @tiptap/core
#### Patch Changes
- Fixed ProseMirror schema generation to properly respect `isRequired` attribute configuration. Previously, attributes marked with `isRequired: true` were incorrectly treated as optional because a `default` property was always included in the schema specification. ProseMirror determines attribute requirements by the absence of the `default` property, so now the `default` is only included when the attribute is not required and a default value is explicitly defined.
### @tiptap/extension-unique-id
#### Patch Changes
- Fixed infinite transaction loop that caused browser tabs to freeze when using UniqueID and TrailingNode extensions together.
### @tiptap/extensions
#### Patch Changes
- Fixed infinite transaction loop that caused browser tabs to freeze when using UniqueID and TrailingNode extensions together.
## v3.10.4
### @tiptap/core
#### Patch Changes
- Fix autofocus behavior to prevent unwanted scrolling when disabled
### @tiptap/extension-blockquote
#### Patch Changes
- Fixed nested blockquote markdown serialization to properly handle multi-level nesting
## v3.10.3
### @tiptap/markdown
#### Patch Changes
- Fix markdown serialization to prevent marks from continuing after hard breaks. Previously, marks like bold would incorrectly persist across hard breaks in the markdown output.
- Fixed a bug where marks were resolved in incorrect orders, breaking markdown rendering for nested marks.
- Fix parsing of mixed bullet lists and task lists. Previously, Marked.js would group consecutive bullet list items and task list items into a single list token, causing incorrect parsing. Now the parser detects mixed lists and splits them into separate bulletList and taskList nodes.
## v3.10.2
### @tiptap/markdown
#### Patch Changes
- Fix parsing of mixed inline HTML within Markdown content so that inline HTML fragments are parsed correctly.
### @tiptap/extension-table
#### Patch Changes
- Allow setting custom table widths by respecting user-provided `style` attributes instead of always overriding them with calculated widths.
## v3.10.1
### @tiptap/core
#### Patch Changes
- Use correct `ResizableNodeView` class name
## v3.10.0
### @tiptap/core
#### Minor Changes
- Add a new ResizableNodeview NodeView to core that wraps elements (images, videos, iframes) with configurable resize handles. It provides live onResize/onCommit callbacks, min/max constraints, aspect-ratio support, and styling hooks (class names + data attributes) to improve UX when resizing media inside the editor.
- the addNodeView function can now return `null` to dynamically disable rendering of a node view
While this should not directly cause any issues, it's noteworthy as it still could affect some behavior in some edge cases.
### @tiptap/extension-image
#### Minor Changes
- Added a new `resize` option that allows images to be resized. The option adds resize handlers to images allowing users to manually resize images via drag and drop or touch
## v3.9.1
### @tiptap/extension-table
#### Patch Changes
- Add a `renderWrapper` option to the Table extension so consumers can customize whether the table wrapper for the resizable node view should be rendered in non-editable mode as well.
## v3.9.0
### @tiptap/vue-3
#### Patch Changes
- Fix attribute forwarding for BubbleMenu and FloatingMenu Vue 3 components to allow setting z-index and other HTML attributes
### @tiptap/extension-hard-break
#### Patch Changes
- Ensure that markdown hard breaks (two spaces followed by a newline) are parsed so they render as line breaks (`<br>`) in the editor when using `contentType: 'markdown'`.
Fixes #7107
### @tiptap/extension-unique-id
#### Minor Changes
- Add `updateDocument` option to disable document updates caused by the Unique ID extension.
### @tiptap/core
#### Patch Changes
- Only remove injected CSS on unmount if no other editors are in the document (fixes #6836)
### @tiptap/extension-drag-handle
#### Patch Changes
- Replace DOM traversal with browser's native elementsFromPoint for better performance.
- Use elementsFromPoint instead of querySelectorAll
- Add clampToContent helper for coordinate boundary validation
- Add findClosestTopLevelBlock helper for efficient block lookup
- Future-proof for root-level mousemove listeners
### @tiptap/react
#### Patch Changes
- Prevent Bubble Menu plugin from re-loading every time the BubbleMenu component re-renders. Reverts a regression introduced in v3.6.3, in PR #7028.
## v3.8.0
### @tiptap/extension-unique-id
#### Minor Changes
- Add `updateDocument` option to disable document updates caused by the Unique ID extension.
### @tiptap/react
#### Patch Changes
- Prevent Bubble Menu plugin from re-loading every time the BubbleMenu component re-renders. Reverts a regression introduced in v3.6.3, in PR #7028.
## v3.7.2
### @tiptap/html
#### Patch Changes
- Fix [CVE-2025-62410](https://www.cve.org/CVERecord?id=CVE-2025-62410) by updating happy-dom to ^20.0.2
## v3.7.1
### @tiptap/markdown
#### Patch Changes
- Editors will not throw an error anymore when `content` is an empty string and `contentType` is `markdown`
- Remove invalid server configuration from package.json
## v3.7.0
### @tiptap/core
#### Minor Changes
- All commands and their corresponding TypeScript types are now exported from `@tiptap/core` so they can be imported and referenced directly by consumers. This makes it easier to build typed helpers, extensions, and tests that depend on the command signatures.
Why:
- Previously some command option types were only available as internal types or scattered across files, which made it awkward for downstream users to import and reuse them.
```ts
import { commands } from '@tiptap/core'
```
Notes:
- This is a non-breaking, additive change. It improves ergonomics for TypeScript consumers.
- If you rely on previously private/internal types, prefer the exported types from `@tiptap/core` going forward.
- Add comprehensive bidirectional markdown support to Tiptap through a new `@tiptap/markdown` package and Markdown utilities in `@tiptap/core`.
**New Package: `@tiptap/markdown`** - A new official extension that provides full Markdown parsing and serialization capabilities using [MarkedJS](https://marked.js.org) as the underlying Markdown parser.
**Core Features:**
**Extension API**
- **`Markdown` Extension**: Main extension that adds Markdown support to your editor
- **`MarkdownManager`**: Core engine for parsing and serializing Markdown
- Parse Markdown strings to Tiptap JSON: `editor.markdown.parse(markdown)`
- Serialize Tiptap JSON to Markdown: `editor.markdown.serialize(json)`
- Access to underlying marked.js instance: `editor.markdown.instance`
#### Editor Methods
- **`editor.getMarkdown()`**: Serialize current editor content to Markdown string
- **`editor.markdown`**: Access to MarkdownManager instance for advanced operations
**Editor Options:**
- **`contentType`**: Control the type of content that is inserted into the editor. Can be `json`, `html` or `markdown` - defaults to `json` and will automatically detect invalid content types (like JSON when it is actually Markdown).
```typescript
new Editor({
content: '# Hello World',
contentType: 'markdown',
})
```
**Command Options:** All content commands now support an `contentType` option:
- **`setContent(markdown, { contentType: 'markdown' })`**: Replace editor content with markdown
- **`insertContent(markdown, { contentType: 'markdown' })`**: Insert markdown at cursor position
- **`insertContentAt(position, markdown, { contentType: 'markdown' })`**: Insert Markdown at specific position
For more, check [the documentation](https://tiptap.dev/docs/editor/markdown).
#### Patch Changes
- The extension manager now provides a new property `baseExtensions` that contains an unflattened array of extensions
### @tiptap/markdown
#### Minor Changes
- Add comprehensive bidirectional markdown support to Tiptap through a new `@tiptap/markdown` package and Markdown utilities in `@tiptap/core`.
**New Package: `@tiptap/markdown`** - A new official extension that provides full Markdown parsing and serialization capabilities using [MarkedJS](https://marked.js.org) as the underlying Markdown parser.
**Core Features:**
**Extension API**
- **`Markdown` Extension**: Main extension that adds Markdown support to your editor
- **`MarkdownManager`**: Core engine for parsing and serializing Markdown
- Parse Markdown strings to Tiptap JSON: `editor.markdown.parse(markdown)`
- Serialize Tiptap JSON to Markdown: `editor.markdown.serialize(json)`
- Access to underlying marked.js instance: `editor.markdown.instance`
#### Editor Methods
- **`editor.getMarkdown()`**: Serialize current editor content to Markdown string
- **`editor.markdown`**: Access to MarkdownManager instance for advanced operations
**Editor Options:**
- **`contentType`**: Control the type of content that is inserted into the editor. Can be `json`, `html` or `markdown` - defaults to `json` and will automatically detect invalid content types (like JSON when it is actually Markdown).
```typescript
new Editor({
content: '# Hello World',
contentType: 'markdown',
})
```
**Command Options:** All content commands now support an `contentType` option:
- **`setContent(markdown, { contentType: 'markdown' })`**: Replace editor content with markdown
- **`insertContent(markdown, { contentType: 'markdown' })`**: Insert markdown at cursor position
- **`insertContentAt(position, markdown, { contentType: 'markdown' })`**: Insert Markdown at specific position
For more, check [the documentation](https://tiptap.dev/docs/editor/markdown).
### @tiptap/extension-link
#### Patch Changes
- Paste Handlers and onPaste plugin now respect shouldAutoLink/validate options
### @tiptap/extensions
#### Patch Changes
- Make the `TrailingNode` extension's `node` option optional and derive the
default node type from the editor schema when available.
Previously the extension used a hard-coded `'paragraph'` default and the
`node` option was required in the TypeScript definitions. This change:
- makes `node` optional in the options type,
- prefers the editor schema's top node default type when resolving the
trailing node, and
- falls back to the configured option or `'paragraph'` as a last resort.
This fixes cases where projects use a different top-level default node and
prevents the extension from inserting an incorrect trailing node type.
## v3.6.7
### @tiptap/html
#### Patch Changes
- Fix CVE-2025-61927 by bumping happy-dom to 20.0.0
Bumps the transitive/dev dependency happy-dom from ^18.0.1 → ^20.0.0 in @tiptap/html to address CVE-2025-61927. This is a dependency/security-only change and does not modify any public APIs.
Why:
- happy-dom released a security fix for CVE-2025-61927; updating prevents the vulnerability being pulled into consumers that depend on @tiptap/html.
## v3.6.6
### @tiptap/extension-floating-menu
#### Patch Changes
- Fixed a problem where the position of a menu is not updated on creation when shouldShow is true
### @tiptap/extension-bubble-menu
#### Patch Changes
- Fixed a problem where the position of a menu is not updated on creation when shouldShow is true
### @tiptap/vue-3
#### Patch Changes
- Fixed a bug that caused conditionally rendered bubble menus not to be attached to the DOM correctly
## v3.6.5
### @tiptap/extension-horizontal-rule
#### Patch Changes
- Added nextNodeType option to horizontal-rule extension, allowing users to specify which node type should be inserted after a horizontal rule
### @tiptap/html
#### Patch Changes
- Fix: Clean up happy-dom window instance fixing a memory leak caused by unclosed happy-dom windows
### @tiptap/core
#### Patch Changes
- Editors can now emit `transaction` and `update` events before being mounted.
This means smoother state handling and instant feedback from editors, even when they're not in the DOM.
## v3.6.4
### @tiptap/html
#### Patch Changes
- Fix: Clean up happy-dom window instance fixing a memory leak caused by unclosed happy-dom windows
## v3.6.3
### @tiptap/react
#### Patch Changes
- Updated the React `FloatingMenu` plugin hook dependencies to match the `BubbleMenu` behavior.
The FloatingMenu will now respond to changes in `appendTo`, `pluginKey`, `shouldShow`, and `options`.
- Resolved an issue where the React BubbleMenu did not update when FloatingUI option props changed after initial mount. The BubbleMenu now correctly responds to updated option props.
- Improved the BubbleMenu's usability by ensuring the `appendTo` prop passed to the React BubbleMenu component is now correctly forwarded to the underlying bubble menu plugin. This fix allows developers to customize where the BubbleMenu is attached in the DOM, helping resolve issues with positioning and portal setups in React apps.
### @tiptap/extensions
#### Patch Changes
- The Selection extension now uses the correct SelectionOptions type, providing accurate typings for its options.
### @tiptap/extension-code-block
#### Patch Changes
- Configuration options for the CodeBlock extension now support `null` and `undefined` values.
This makes custom setups more flexible and avoids unnecessary type errors when omitting optional overrides.
All existing default values and fallback logic remain in place - no breaking changes for existing code.
### @tiptap/core
#### Patch Changes
- Refined the `JSONContent.attrs` definition to exactly mirror the structure returned by `editor.getJSON()`. This ensures strict type safety and consistency between the editor output and the expected type, eliminating errors caused by mismatched attribute signatures.
### @tiptap/extension-table-of-contents
#### Patch Changes
- Improve typings by inferring the storage type for the Table of Contents extension
### @tiptap/extension-floating-menu
#### Patch Changes
- You can now pass a callback to the `appendTo` option in the floating and bubble menu
extensions. The callback must return an element synchronously,
so menus can be appended to elements that are created dynamically.
### @tiptap/extension-bubble-menu
#### Patch Changes
- You can now pass a callback to the `appendTo` option in the floating and bubble menu
extensions. The callback must return an element synchronously,
so menus can be appended to elements that are created dynamically.
## v3.6.2
### @tiptap/extension-bubble-menu
#### Patch Changes
- Fix a bug where the bubble menu could throw an error if the editor was destroyed
while the plugin was cleaning up.
## v3.6.1
### @tiptap/react
#### Patch Changes
- Hotfix: Fix a crash in the React package that could occur during mounting/unmounting when the editor wasn't fully initialized. This prevents a runtime error and improves stability.
## v3.6.0
### @tiptap/core
#### Patch Changes
- Improve typing and docs for `EditorOptions.element` to reflect all supported mounting modes and align behavior across adapters.
- `element` now accepts:
- `Element`: the editor is appended inside the given element.
- `{ mount: HTMLElement }`: the editor is mounted directly to `mount` (no extra wrapper).
- `(editorEl: HTMLElement) => void`: a function that receives the editor element so you can place it anywhere in the DOM.
- `null`: no automatic mounting.
### @tiptap/extension-table
#### Patch Changes
- Parse cell `colwidth` from nearest `<colgroup>` when missing on the cell
When importing HTML, table column widths are often declared on a surrounding `<colgroup>` rather than on each `<td>`. Previously, `tableCell` only read the `colwidth` attribute from the cell itself and would lose width information in that case. The implementation now falls back to reading the corresponding `<col>`'s `width` from the table's `<colgroup>` using the cell's index.
This is a non-breaking bugfix that preserves layout information when HTML uses `<colgroup>`. Consider adding a small demo or unit test to assert colwidth is preserved for cells when only the `<colgroup>` contains width attributes.
- Fixes table wrapper replacement and lost selections when `resizable: true`.
TableView.ignoreMutation now ignores attribute/childList/characterData mutations that occur inside the table wrapper but outside the editable `contentDOM`, preventing wrapper re-creation during resize interactions so selections (e.g. `mergeCells()`) are preserved.
No API or breaking changes.
### @tiptap/extension-bubble-menu
#### Patch Changes
- Remove recently added `updateBubbleMenuPosition` method because it would not work in the React and Vue versions of the BubbleMenu, only in the vanilla extension. And that would confuse developers.
Write the `transactionHandler` method as an arrow function because arrow functions have no `this`, so the `this` remains the instance of the `BubbleMenuView` class.
### @tiptap/extension-unique-id
#### Minor Changes
- Create a utility to add unique IDs to a document in the server
The utility is called `generateUniqueIds` and is exported from the `@tiptap/extension-unique-id` package.
It has the same functionality as the `UniqueID` extension, but without the need to create an `Editor` instance. This lets you add unique IDs to the document in the server.
It takes the following parameters:
- `doc`: The Tiptap JSON document to add unique IDs to.
- `extensions`: The extensions to use. Must include the `UniqueID` extension.
It returns the updated Tiptap JSON document, with the unique IDs added to the nodes.
### @tiptap/vue-3
#### Minor Changes
- Pass `attrs` through Vue 3 menus
## v3.5.3
### @tiptap/extension-text-style
#### Patch Changes
- Merge nested span styles only for immediate child spans and guard style values.
- Replace non-standard/fragile selector approach and avoid re-processing nested `<span>` elements.
- Read parent style once, merge with child style only when present, and remove empty `style` attributes.
- Improves parsing performance and robustness in browsers, Node/JSDOM and tests.
This change fixes a bug that could cause exponential work when parsing deeply
nested `<span>` elements - in extreme cases that could make the tab unresponsive
or crash the renderer. It is a bugfix / performance improvement with no public API
changes.
## v3.5.2
### @tiptap/react
#### Patch Changes
- Tiptap will now correctly insert a React MarkViews' content into the correct element within `MarkViewContent` component
## v3.5.1
### @tiptap/extension-floating-menu
#### Patch Changes
- Add `appendTo` support to `FloatingMenu` and pass it through in React/Vue 2/Vue 3 for both `BubbleMenu` and `FloatingMenu` to allow fixing clipping/z-index issues.
### @tiptap/react
#### Patch Changes
- Add `appendTo` support to `FloatingMenu` and pass it through in React/Vue 2/Vue 3 for both `BubbleMenu` and `FloatingMenu` to allow fixing clipping/z-index issues.
### @tiptap/vue-2
#### Patch Changes
- Add `appendTo` support to `FloatingMenu` and pass it through in React/Vue 2/Vue 3 for both `BubbleMenu` and `FloatingMenu` to allow fixing clipping/z-index issues.
### @tiptap/vue-3
#### Patch Changes
- Add `appendTo` support to `FloatingMenu` and pass it through in React/Vue 2/Vue 3 for both `BubbleMenu` and `FloatingMenu` to allow fixing clipping/z-index issues.
# [2.4.0](https://github.com/ueberdosis/tiptap/compare/v2.3.2...v2.4.0) (2024-05-14)
### Bug Fixes
- **core:** configure should use the parent of the current instance, to avoid duplication ([#5147](https://github.com/ueberdosis/tiptap/issues/5147)) ([4db463c](https://github.com/ueberdosis/tiptap/commit/4db463c6bbcc3a17ee8eb591bea8e357120ecb35))
- fix ts error for BubbleMenu and FloatingMenu in @tiptap/react ([#5126](https://github.com/ueberdosis/tiptap/issues/5126)) ([baff4af](https://github.com/ueberdosis/tiptap/commit/baff4af39e2b8970d7cab99859ece41228643f9d))
### Features
- added jsdocs ([#4356](https://github.com/ueberdosis/tiptap/issues/4356)) ([b941eea](https://github.com/ueberdosis/tiptap/commit/b941eea6daba09d48a5d18ccc1b9a1d84b2249dd))
## [2.3.2](https://github.com/ueberdosis/tiptap/compare/v2.3.1...v2.3.2) (2024-05-08)
### Bug Fixes
- NodePos querySelectorAll function ([#5094](https://github.com/ueberdosis/tiptap/issues/5094)) ([4900a27](https://github.com/ueberdosis/tiptap/commit/4900a27c5389d9a2d0d69f407ca3db0155304315))
## [2.3.1](https://github.com/ueberdosis/tiptap/compare/v2.3.0...v2.3.1) (2024-04-30)
**Note:** Version bump only for package tiptap
# [2.3.0](https://github.com/ueberdosis/tiptap/compare/v2.2.6...v2.3.0) (2024-04-09)
### Bug Fixes
- **core:** fix nodepos child lookup ([#5038](https://github.com/ueberdosis/tiptap/issues/5038)) ([22ced31](https://github.com/ueberdosis/tiptap/commit/22ced318723003365fbfd8f59b8dac79c7563017))
### Features
- **core:** apply input and paste rules when using insertContent methods ([#5046](https://github.com/ueberdosis/tiptap/issues/5046)) ([96b6abc](https://github.com/ueberdosis/tiptap/commit/96b6abcf6edbc6cac03a391130d9feebb6de3a04))
## [2.2.6](https://github.com/ueberdosis/tiptap/compare/v2.2.5...v2.2.6) (2024-04-06)
### Bug Fixes
- unexpected renderText() for contentful nodes ([#3410](https://github.com/ueberdosis/tiptap/issues/3410)) ([d6c71a8](https://github.com/ueberdosis/tiptap/commit/d6c71a838d590f78fdff15c805d93f43c8a5a1a5))
## [2.2.5](https://github.com/ueberdosis/tiptap/compare/v2.2.4...v2.2.5) (2024-04-05)
### Bug Fixes
- Disallow only whitespace between markdown shortcuts delimiters ([#4866](https://github.com/ueberdosis/tiptap/issues/4866)) ([aa029fe](https://github.com/ueberdosis/tiptap/commit/aa029fe2242aeadc38555b2832df6ae1614c7d1d))
- **extension-link:** Avoid auto-linking partial text for invalid TLDs ([#4865](https://github.com/ueberdosis/tiptap/issues/4865)) ([4474d05](https://github.com/ueberdosis/tiptap/commit/4474d056daf9280ebb10b31f98bb000e953132e5))
## [2.2.4](https://github.com/ueberdosis/tiptap/compare/v2.2.3...v2.2.4) (2024-02-23)
### Bug Fixes
- mark nocookie youtube url as valid when parsing html ([#4883](https://github.com/ueberdosis/tiptap/issues/4883)) ([099e10d](https://github.com/ueberdosis/tiptap/commit/099e10df923d851dd866354e9abca331d995b65c))
- typecheck drag and clipboard events for testing environments ([bbee9a3](https://github.com/ueberdosis/tiptap/commit/bbee9a3c3090fa40bf366591682b42a3f6ec5f91))
## [2.2.3](https://github.com/ueberdosis/tiptap/compare/v2.2.2...v2.2.3) (2024-02-15)
### Bug Fixes
- fix test path ([21aa96d](https://github.com/ueberdosis/tiptap/commit/21aa96dee8deab1f439b7f655b8ed266a516a4cd))
## [2.2.2](https://github.com/ueberdosis/tiptap/compare/v2.2.1...v2.2.2) (2024-02-07)
### Bug Fixes
- **react:** use ref instead of state in useEditor to prevent rerenders ([#4856](https://github.com/ueberdosis/tiptap/issues/4856)) ([56a5737](https://github.com/ueberdosis/tiptap/commit/56a5737ed102ee75ec72f9cc2847e3c977f431bd))
## [2.2.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0...v2.2.1) (2024-01-31)
**Note:** Version bump only for package tiptap
# [2.2.0](https://github.com/ueberdosis/tiptap/compare/v2.1.16...v2.2.0) (2024-01-29)
### Bug Fixes
- **core:** fix new lines being added via elementFromString ([#4767](https://github.com/ueberdosis/tiptap/issues/4767)) ([b7a2504](https://github.com/ueberdosis/tiptap/commit/b7a2504f16f46563537c890930cb2c332c256175))
- fix bug [#4785](https://github.com/ueberdosis/tiptap/issues/4785) ([#4836](https://github.com/ueberdosis/tiptap/issues/4836)) ([f3cba1e](https://github.com/ueberdosis/tiptap/commit/f3cba1e0b0288156c1427437e5a0b9e03cd67e63))
- fix imports, fix demos, unpin y-prosemirror ([681aa57](https://github.com/ueberdosis/tiptap/commit/681aa577bff500015c3f925e300c55a71c73efaf))
- fix newline stripping via insertContent ([8954007](https://github.com/ueberdosis/tiptap/commit/8954007b2b92b040d69b26a0866ae58fabf5e512))
# [2.2.0-rc.8](https://github.com/ueberdosis/tiptap/compare/v2.1.14...v2.2.0-rc.8) (2024-01-08)
### Bug Fixes
- **core:** fix options now being empty ([fc67cb1](https://github.com/ueberdosis/tiptap/commit/fc67cb1b7166c1ab6b6e0174539c9e29c364eace))
# [2.2.0-rc.7](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.6...v2.2.0-rc.7) (2023-11-27)
### Bug Fixes
- **core:** set defaultOptions to undefined by default ([448b433](https://github.com/ueberdosis/tiptap/commit/448b433ee7847bfba4cd803d8c8820763ceedafc))
# [2.2.0-rc.6](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.5...v2.2.0-rc.6) (2023-11-23)
### Reverts
- Revert "fix/react-renderer-node-attrs (#4321)" ([a4af83c](https://github.com/ueberdosis/tiptap/commit/a4af83ca52c8e020f88990af53981591559205a9)), closes [#4321](https://github.com/ueberdosis/tiptap/issues/4321)
- Revert "autolink improvement" ([ef10ae5](https://github.com/ueberdosis/tiptap/commit/ef10ae53b2a3854fceefc2999e166ed1fe4e9b32))
# [2.2.0-rc.4](https://github.com/ueberdosis/tiptap/compare/v2.1.11...v2.2.0-rc.4) (2023-10-10)
### Bug Fixes
- add missing attributes in extension-link ([#4429](https://github.com/ueberdosis/tiptap/issues/4429)) ([0578265](https://github.com/ueberdosis/tiptap/commit/0578265bfe548a7f574cdbe055ef07b9029d8797))
- **history:** use correct shortcuts for undo/redo ([520ce79](https://github.com/ueberdosis/tiptap/commit/520ce790c3dff2d0774211fe30fdce1905655b09))
### Features
- **extension/youtube:** Allow youtube shorts urls to be embedded ([4d79cb8](https://github.com/ueberdosis/tiptap/commit/4d79cb85c93353cdb5ead518da63cf8f9fa71497))
# [2.2.0-rc.3](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.2...v2.2.0-rc.3) (2023-08-18)
# [2.2.0-rc.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.0...v2.2.0-rc.1) (2023-08-18)
# [2.2.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.2.0-rc.0) (2023-08-18)
### Features
- **placeholder:** allow editor-is-empty class on any node ([#4335](https://github.com/ueberdosis/tiptap/issues/4335)) ([ff929b1](https://github.com/ueberdosis/tiptap/commit/ff929b179de930619005a773bb4186ae2aa2ec58))
## [2.1.16](https://github.com/ueberdosis/tiptap/compare/v2.1.15...v2.1.16) (2024-01-10)
### Bug Fixes
- **core:** fix new lines being added via elementFromString ([#4767](https://github.com/ueberdosis/tiptap/issues/4767)) ([2235908](https://github.com/ueberdosis/tiptap/commit/2235908c28f388eda041d1d5d017554d513fe909))
### Reverts
- Revert "fix(extension-link): fix link not being kept when pasting url with link (#3975)" ([1b34271](https://github.com/ueberdosis/tiptap/commit/1b34271edfdd6e81f670f9ddb15cd6838d986e9f)), closes [#3975](https://github.com/ueberdosis/tiptap/issues/3975)
## [2.1.15](https://github.com/ueberdosis/tiptap/compare/v2.1.14...v2.1.15) (2024-01-08)
### Bug Fixes
- **core:** fix insertContentAt keeping new lines in html content ([#4465](https://github.com/ueberdosis/tiptap/issues/4465)) ([135a12f](https://github.com/ueberdosis/tiptap/commit/135a12f7aa2df839a0b619704110a360b980c738))
- **link:** fix tests ([d495d92](https://github.com/ueberdosis/tiptap/commit/d495d92a1f7b1c51e09ac8f4934e15a2d1cf070d))
### Reverts
- Revert "update package-lock" ([faead69](https://github.com/ueberdosis/tiptap/commit/faead6987337ea8471619fdc3124437954772a1a))
## [2.1.14](https://github.com/ueberdosis/tiptap/compare/v2.1.13...v2.1.14) (2024-01-08)
### Bug Fixes
- **typography:** require spaces after divisions to not break date formats ([#4696](https://github.com/ueberdosis/tiptap/issues/4696)) ([f6d7e00](https://github.com/ueberdosis/tiptap/commit/f6d7e00a746a67fa440a3fa0f5362295959873d2))
## [2.1.13](https://github.com/ueberdosis/tiptap/compare/v2.1.12...v2.1.13) (2023-11-30)
### Bug Fixes
- **react:** fix performance regression because of select/deselect ([#4661](https://github.com/ueberdosis/tiptap/issues/4661)) ([ad7f659](https://github.com/ueberdosis/tiptap/commit/ad7f659ed08a6a7c57056b78edbded014549f2dc))
## [2.1.12](https://github.com/ueberdosis/tiptap/compare/v2.1.11...v2.1.12) (2023-10-11)
### Bug Fixes
- **link:** restore pasteHandler and add existing url check ([#4523](https://github.com/ueberdosis/tiptap/issues/4523)) ([1a7b428](https://github.com/ueberdosis/tiptap/commit/1a7b4280d2f9c334d14b16016c29e9f4862716a0))
## [2.1.11](https://github.com/ueberdosis/tiptap/compare/v2.1.10...v2.1.11) (2023-09-20)
### Reverts
- Revert "v2.2.11" ([6aa755a](https://github.com/ueberdosis/tiptap/commit/6aa755a04b9955fc175c7ab33dee527d0d5deef0))
## [2.1.10](https://github.com/ueberdosis/tiptap/compare/v2.1.9...v2.1.10) (2023-09-15)
**Note:** Version bump only for package tiptap
## [2.1.9](https://github.com/ueberdosis/tiptap/compare/v2.1.8...v2.1.9) (2023-09-14)
### Bug Fixes
- add missing attributes in extension-link ([#4429](https://github.com/ueberdosis/tiptap/issues/4429)) ([74b6444](https://github.com/ueberdosis/tiptap/commit/74b644438829d6ee9b0795bc70c55f2755d7438c))
## [2.1.8](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.7...v2.1.8) (2023-09-04)
**Note:** Version bump only for package tiptap
## [2.1.7](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.6...v2.1.7) (2023-09-04)
### Bug Fixes
- **horizontal-rule:** fix insertion being broken on empty docs ([#4375](https://github.com/ueberdosis/tiptap-workspace/issues/4375)) ([2a83166](https://github.com/ueberdosis/tiptap-workspace/commit/2a83166a46f97a9fc42ae23ce5367bb58bcdab74))
## [2.1.6](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.1.6) (2023-08-18)
### Bug Fixes
- **core:** fix broken export ([4227f32](https://github.com/ueberdosis/tiptap/commit/4227f324a5bfd4f0905c70ac8ea68903352f911b))
## [2.1.5](https://github.com/ueberdosis/tiptap/compare/v2.1.4...v2.1.5) (2023-08-18)
### Bug Fixes
- **list-key-map:** fix broken imports ([#4350](https://github.com/ueberdosis/tiptap/issues/4350)) ([e40ac25](https://github.com/ueberdosis/tiptap/commit/e40ac2584e813893a61c91a456bdcd2cf6652b50))
## [2.1.4](https://github.com/ueberdosis/tiptap/compare/v2.1.3...v2.1.4) (2023-08-18)
### Bug Fixes
- replace the whole node in nodeInputRule ([#4341](https://github.com/ueberdosis/tiptap/issues/4341)) ([ffeefe2](https://github.com/ueberdosis/tiptap/commit/ffeefe21ff3c1f951a5a4f9ae9697317ddd1c5ad))
## [2.1.3](https://github.com/ueberdosis/tiptap/compare/v2.1.2...v2.1.3) (2023-08-18)
### Bug Fixes
- fix autolink when code is not enabled for editor ([#4344](https://github.com/ueberdosis/tiptap/issues/4344)) ([f2ac7b9](https://github.com/ueberdosis/tiptap/commit/f2ac7b90912a78b90216a7d7d084c86f0c0eef48))
## [2.1.2](https://github.com/ueberdosis/tiptap/compare/v2.1.1...v2.1.2) (2023-08-17)
### Bug Fixes
- **core:** fix error when merging class attributes ([#4340](https://github.com/ueberdosis/tiptap/issues/4340)) ([a251946](https://github.com/ueberdosis/tiptap/commit/a2519468589e2baa44901a66a3a06b24dc8626d6))
## [2.1.1](https://github.com/ueberdosis/tiptap/compare/v2.1.0...v2.1.1) (2023-08-16)
**Note:** Version bump only for package tiptap
# [2.1.0](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.14...v2.1.0) (2023-08-16)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.14](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.13...v2.1.0-rc.14) (2023-08-11)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.13](https://github.com/ueberdosis/tiptap-workspace/compare/v2.0.4...v2.1.0-rc.13) (2023-08-11)
### Bug Fixes
- **demos:** add missing extensions ([6383fd5](https://github.com/ueberdosis/tiptap-workspace/commit/6383fd54080b2ad555286cd0e7c4ad880200200f))
- **demos:** update deps ([05a2edf](https://github.com/ueberdosis/tiptap-workspace/commit/05a2edfc16e297effa86d1583fb1680be0320f25))
- **link:** Fix autolinking and pasting ([#4292](https://github.com/ueberdosis/tiptap-workspace/issues/4292)) ([a2ce734](https://github.com/ueberdosis/tiptap-workspace/commit/a2ce734d681039fd61d402987e0842ddef6af595))
- **strikethrough:** update strikethrough shortcut ([#4288](https://github.com/ueberdosis/tiptap-workspace/issues/4288)) ([fd35db4](https://github.com/ueberdosis/tiptap-workspace/commit/fd35db4d090d9fdfef1196fb1f6f858f13cf53d1))
# [2.1.0-rc.12](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.11...v2.1.0-rc.12) (2023-07-14)
# [2.1.0-rc.11](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.10...v2.1.0-rc.11) (2023-07-07)
### Bug Fixes
- **core:** fix cut and insertContentAt functions ([#4187](https://github.com/ueberdosis/tiptap-workspace/issues/4187)) ([6b65af8](https://github.com/ueberdosis/tiptap-workspace/commit/6b65af8fc31ffbbcf79b89bfdaceee7aadbf3f27))
- **tests:** fix link rel tests ([c1d1854](https://github.com/ueberdosis/tiptap-workspace/commit/c1d18543b03b1fb6b99a2f3546aa5da10c919920))
# [2.1.0-rc.10](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.9...v2.1.0-rc.10) (2023-07-07)
### Bug Fixes
- do not use window.open for links in readonly mode ([#4073](https://github.com/ueberdosis/tiptap-workspace/issues/4073)) ([4bca77e](https://github.com/ueberdosis/tiptap-workspace/commit/4bca77e4e9c96596d584cf71b8d831dc2ab0a421))
- **extension-link:** fixes link going to wrong url ([#4078](https://github.com/ueberdosis/tiptap-workspace/issues/4078)) ([3053865](https://github.com/ueberdosis/tiptap-workspace/commit/30538654752ab3ded6e56c869745ccacc8cdeabc))
- **link:** Prevent auto-linking when typing URL inside inline code mark ([#4160](https://github.com/ueberdosis/tiptap-workspace/issues/4160)) ([b24df3a](https://github.com/ueberdosis/tiptap-workspace/commit/b24df3aa4c2f3fdb2ed6122d2d32fb7c4e07f2af))
- **react:** check props.clientRect before creating ReactRenderer ([#4138](https://github.com/ueberdosis/tiptap-workspace/issues/4138)) ([d710846](https://github.com/ueberdosis/tiptap-workspace/commit/d710846ecb6a3059dfbc21300b9a4b887a8defa3))
- **react:** update select state when text selection is around node ([#4148](https://github.com/ueberdosis/tiptap-workspace/issues/4148)) ([5bd5bd4](https://github.com/ueberdosis/tiptap-workspace/commit/5bd5bd4ecdbe1f952b23d5f5efad16b6ed5cc44f))
### Features
- **docs:** added cdn installation guide ([#4045](https://github.com/ueberdosis/tiptap-workspace/issues/4045)) ([8536508](https://github.com/ueberdosis/tiptap-workspace/commit/853650885b7c4f2217a4b37bc42ee65b4cd6026a))
# [2.1.0-rc.9](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.8...v2.1.0-rc.9) (2023-06-15)
# [2.1.0-rc.8](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.7...v2.1.0-rc.8) (2023-05-25)
# [2.1.0-rc.7](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.6...v2.1.0-rc.7) (2023-05-25)
# [2.1.0-rc.5](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.4...v2.1.0-rc.5) (2023-05-25)
### Bug Fixes
- **extension-link:** fix paste handling ([d19267e](https://github.com/ueberdosis/tiptap-workspace/commit/d19267ecefabf08e4bd27c52424ed83991ce7270))
- typo in commands.md ([a2a9822](https://github.com/ueberdosis/tiptap-workspace/commit/a2a9822f240df2301932a67225d9adcac2f18807))
### Features
- add tiptap class ([614fc80](https://github.com/ueberdosis/tiptap-workspace/commit/614fc8082c376bf3c40a05c23ceda6b4a6fbf8d0))
# [2.1.0-rc.4](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.3...v2.1.0-rc.4) (2023-04-27)
### Bug Fixes
- **link:** fix links autolinking when not needed ([#3989](https://github.com/ueberdosis/tiptap-workspace/issues/3989)) ([71946c1](https://github.com/ueberdosis/tiptap-workspace/commit/71946c18accf8a2e8192951de870f84e25f58ed5))
# [2.1.0-rc.3](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.2...v2.1.0-rc.3) (2023-04-26)
### Bug Fixes
- **core:** remove configure from extend functionality ([4af54da](https://github.com/ueberdosis/tiptap-workspace/commit/4af54da3e09c69c0b5326f9952d456436855914d))
# [2.1.0-rc.2](https://github.com/ueberdosis/tiptap-workspace/compare/v2.0.3...v2.1.0-rc.2) (2023-04-26)
### Bug Fixes
- **extension-link:** fix link not being kept when pasting url with link ([#3975](https://github.com/ueberdosis/tiptap-workspace/issues/3975)) ([e7d7d49](https://github.com/ueberdosis/tiptap-workspace/commit/e7d7d496376c8c11e24c342e20bd179a6ea7dcee))
# [2.1.0-rc.1](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.0...v2.1.0-rc.1) (2023-04-12)
### Bug Fixes
- **bubble-menu:** fix debounce not working with collab/collaboration cursor ([#3956](https://github.com/ueberdosis/tiptap-workspace/issues/3956)) ([e8cef04](https://github.com/ueberdosis/tiptap-workspace/commit/e8cef0404b5039ec2657536976b8b31931afd337))
# [2.1.0-rc.0](https://github.com/ueberdosis/tiptap-workspace/compare/v2.0.2...v2.1.0-rc.0) (2023-04-05)
### Bug Fixes
- clear nodes when cursor at start of empty isolating parent ([#3943](https://github.com/ueberdosis/tiptap-workspace/issues/3943)) ([7278ee2](https://github.com/ueberdosis/tiptap-workspace/commit/7278ee2b05de2f96efddf3b1dc3bfd3d52262cbb))
- **list-item:** improve delete behaviour ([09782a5](https://github.com/ueberdosis/tiptap-workspace/commit/09782a5b066b2f9f52f0ef1d8701d6e5b063dc63))
- **lists:** improve list behaviour ([684e48a](https://github.com/ueberdosis/tiptap-workspace/commit/684e48a4a7778a0140c94f0c5345db868174ad81))
- Update peerDependencies to fix lerna version tasks ([#3914](https://github.com/ueberdosis/tiptap-workspace/issues/3914)) ([0c1bba3](https://github.com/ueberdosis/tiptap-workspace/commit/0c1bba3137b535776bcef95ff3c55e13f5a2db46))
# [2.1.0-rc.12](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.11...v2.1.0-rc.12) (2023-07-14)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.11](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.10...v2.1.0-rc.11) (2023-07-07)
### Bug Fixes
- **core:** fix cut and insertContentAt functions ([#4187](https://github.com/ueberdosis/tiptap/issues/4187)) ([6b65af8](https://github.com/ueberdosis/tiptap/commit/6b65af8fc31ffbbcf79b89bfdaceee7aadbf3f27))
- **tests:** fix link rel tests ([c1d1854](https://github.com/ueberdosis/tiptap/commit/c1d18543b03b1fb6b99a2f3546aa5da10c919920))
# [2.1.0-rc.10](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.9...v2.1.0-rc.10) (2023-07-07)
### Bug Fixes
- do not use window.open for links in readonly mode ([#4073](https://github.com/ueberdosis/tiptap/issues/4073)) ([4bca77e](https://github.com/ueberdosis/tiptap/commit/4bca77e4e9c96596d584cf71b8d831dc2ab0a421))
- **extension-link:** fixes link going to wrong url ([#4078](https://github.com/ueberdosis/tiptap/issues/4078)) ([3053865](https://github.com/ueberdosis/tiptap/commit/30538654752ab3ded6e56c869745ccacc8cdeabc))
- **link:** Prevent auto-linking when typing URL inside inline code mark ([#4160](https://github.com/ueberdosis/tiptap/issues/4160)) ([b24df3a](https://github.com/ueberdosis/tiptap/commit/b24df3aa4c2f3fdb2ed6122d2d32fb7c4e07f2af))
- **react:** check props.clientRect before creating ReactRenderer ([#4138](https://github.com/ueberdosis/tiptap/issues/4138)) ([d710846](https://github.com/ueberdosis/tiptap/commit/d710846ecb6a3059dfbc21300b9a4b887a8defa3))
- **react:** update select state when text selection is around node ([#4148](https://github.com/ueberdosis/tiptap/issues/4148)) ([5bd5bd4](https://github.com/ueberdosis/tiptap/commit/5bd5bd4ecdbe1f952b23d5f5efad16b6ed5cc44f))
### Features
- **docs:** added cdn installation guide ([#4045](https://github.com/ueberdosis/tiptap/issues/4045)) ([8536508](https://github.com/ueberdosis/tiptap/commit/853650885b7c4f2217a4b37bc42ee65b4cd6026a))
# [2.1.0-rc.9](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.8...v2.1.0-rc.9) (2023-06-15)
### Bug Fixes
- **list-item:** improve delete behaviour ([09782a5](https://github.com/ueberdosis/tiptap/commit/09782a5b066b2f9f52f0ef1d8701d6e5b063dc63))
- **lists:** improve list behaviour ([684e48a](https://github.com/ueberdosis/tiptap/commit/684e48a4a7778a0140c94f0c5345db868174ad81))
# [2.1.0-rc.8](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.7...v2.1.0-rc.8) (2023-05-25)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.7](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.6...v2.1.0-rc.7) (2023-05-25)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.6](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.5...v2.1.0-rc.6) (2023-05-25)
**Note:** Version bump only for package tiptap
# [2.1.0-rc.5](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.4...v2.1.0-rc.5) (2023-05-25)
### Bug Fixes
- **extension-link:** fix paste handling ([d19267e](https://github.com/ueberdosis/tiptap/commit/d19267ecefabf08e4bd27c52424ed83991ce7270))
- typo in commands.md ([a2a9822](https://github.com/ueberdosis/tiptap/commit/a2a9822f240df2301932a67225d9adcac2f18807))
### Features
- add tiptap class ([614fc80](https://github.com/ueberdosis/tiptap/commit/614fc8082c376bf3c40a05c23ceda6b4a6fbf8d0))
# [2.1.0-rc.4](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.3...v2.1.0-rc.4) (2023-04-27)
### Bug Fixes
- **link:** fix links autolinking when not needed ([#3989](https://github.com/ueberdosis/tiptap/issues/3989)) ([71946c1](https://github.com/ueberdosis/tiptap/commit/71946c18accf8a2e8192951de870f84e25f58ed5))
# [2.1.0-rc.3](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.2...v2.1.0-rc.3) (2023-04-26)
### Bug Fixes
- **core:** remove configure from extend functionality ([4af54da](https://github.com/ueberdosis/tiptap/commit/4af54da3e09c69c0b5326f9952d456436855914d))
# [2.1.0-rc.2](https://github.com/ueberdosis/tiptap/compare/v2.0.3...v2.1.0-rc.2) (2023-04-26)
### Bug Fixes
- **extension-link:** fix link not being kept when pasting url with link ([#3975](https://github.com/ueberdosis/tiptap/issues/3975)) ([e7d7d49](https://github.com/ueberdosis/tiptap/commit/e7d7d496376c8c11e24c342e20bd179a6ea7dcee))
# [2.1.0-rc.1](https://github.com/ueberdosis/tiptap/compare/v2.1.0-rc.0...v2.1.0-rc.1) (2023-04-12)
### Bug Fixes
- **bubble-menu:** fix debounce not working with collab/collaboration cursor ([#3956](https://github.com/ueberdosis/tiptap/issues/3956)) ([e8cef04](https://github.com/ueberdosis/tiptap/commit/e8cef0404b5039ec2657536976b8b31931afd337))
# [2.1.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.0.2...v2.1.0-rc.0) (2023-04-05)
### Bug Fixes
- clear nodes when cursor at start of empty isolating parent ([#3943](https://github.com/ueberdosis/tiptap/issues/3943)) ([7278ee2](https://github.com/ueberdosis/tiptap/commit/7278ee2b05de2f96efddf3b1dc3bfd3d52262cbb))
- Update peerDependencies to fix lerna version tasks ([#3914](https://github.com/ueberdosis/tiptap/issues/3914)) ([0c1bba3](https://github.com/ueberdosis/tiptap/commit/0c1bba3137b535776bcef95ff3c55e13f5a2db46))
# [2.1.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.0.2...v2.1.0-rc.0) (2023-04-05)
### Bug Fixes
- clear nodes when cursor at start of empty isolating parent ([#3943](https://github.com/ueberdosis/tiptap/issues/3943)) ([7278ee2](https://github.com/ueberdosis/tiptap/commit/7278ee2b05de2f96efddf3b1dc3bfd3d52262cbb))
- Update peerDependencies to fix lerna version tasks ([#3914](https://github.com/ueberdosis/tiptap/issues/3914)) ([0c1bba3](https://github.com/ueberdosis/tiptap/commit/0c1bba3137b535776bcef95ff3c55e13f5a2db46))
- **bubble-menu:** fix debounce not working with collab/collaboration cursor ([#3956](https://github.com/ueberdosis/tiptap/issues/3956)) ([a78f8cd](https://github.com/ueberdosis/tiptap/commit/a78f8cd9646008e4db938fa3c22b0714c8bb5849))
## [2.0.3](https://github.com/ueberdosis/tiptap/compare/v2.0.2...v2.0.3) (2023-04-13)
### Bug Fixes
- **bubble-menu:** fix debounce not working with collab/collaboration cursor ([#3956](https://github.com/ueberdosis/tiptap/issues/3956)) ([e8cef04](https://github.com/ueberdosis/tiptap/commit/e8cef0404b5039ec2657536976b8b31931afd337))
## [2.0.2](https://github.com/ueberdosis/tiptap/compare/v2.0.1...v2.0.2) (2023-04-03)
### Bug Fixes
- **react:** fix rebinding events not overwriting editor.on ([#3935](https://github.com/ueberdosis/tiptap/issues/3935)) ([64ab357](https://github.com/ueberdosis/tiptap/commit/64ab3570c1e86a65f5022793acb0292d8972dcd7))
### Features
- add box-shadow to collab demo ([c5496c1](https://github.com/ueberdosis/tiptap/commit/c5496c1b27783150dafb5ebdf6bda43648a46316))
- landingpage demo ([#3925](https://github.com/ueberdosis/tiptap/issues/3925)) ([958925f](https://github.com/ueberdosis/tiptap/commit/958925f2560ca786cd0cf52b83b7ae51deb7dd77))
- Tiptap collab demo styling ([87840b0](https://github.com/ueberdosis/tiptap/commit/87840b0f0821ca65d9f104d9c90512021aa70113))
## [2.0.1](https://github.com/ueberdosis/tiptap/compare/v2.0.0...v2.0.1) (2023-03-30)
### Bug Fixes
- Update peerDependencies to fix lerna version tasks ([#3914](https://github.com/ueberdosis/tiptap/issues/3914)) ([0534f76](https://github.com/ueberdosis/tiptap/commit/0534f76401bf5399c01ca7f39d87f7221d91b4f7))
## [2.0.0](https://github.com/ueberdosis/tiptap/compare/tiptap@1.32.2...v2.0.0) (2023-03-29)
## What's Changed
- Fix sending of emptystring class for Prosemirror decoration by @ascott18 in https://github.com/ueberdosis/tiptap/pull/1004
- build(deps): bump actions/cache from v2.1.4 to v2.1.5 by @dependabot in https://github.com/ueberdosis/tiptap/pull/1024
- build(deps): bump actions/upload-artifact from v2.2.2 to v2.2.3 by @dependabot in https://github.com/ueberdosis/tiptap/pull/1025
- Add install instructions by @MarcelloTheArcane in https://github.com/ueberdosis/tiptap/pull/1196
- Fix a small typo by @swanson in https://github.com/ueberdosis/tiptap/pull/1211
- Add missing word by @swanson in https://github.com/ueberdosis/tiptap/pull/1216
- Clarify table header documentation by @swanson in https://github.com/ueberdosis/tiptap/pull/1215
- Typo fix by @swanson in https://github.com/ueberdosis/tiptap/pull/1217
- Make Horizontal Rule compatible with Typography extension by @chrisarmstrong in https://github.com/ueberdosis/tiptap/pull/1241
- Fix returning true/false in can().chain().run() by @Markario in https://github.com/ueberdosis/tiptap/pull/1252
- [Docs] Improve example integration with Laravel Livewire by @iksaku in https://github.com/ueberdosis/tiptap/pull/1255
- feat: better types for Vue 2 by @zcuric in https://github.com/ueberdosis/tiptap/pull/1253
- Fix typo by @DannyFeliz in https://github.com/ueberdosis/tiptap/pull/1262
- HorizontalRule is included in defaultExtensions by @Duncank in https://github.com/ueberdosis/tiptap/pull/1267
- VueRenderer's ref is undefined when in production mode by @thechrisoshow in https://github.com/ueberdosis/tiptap/pull/1271
- feat: expose node helpers by @zcuric in https://github.com/ueberdosis/tiptap/pull/1278
- New Feature: Generate JSON from HTML by @hanspagel in https://github.com/ueberdosis/tiptap/pull/1273
- feat: export mark helpers by @zcuric in https://github.com/ueberdosis/tiptap/pull/1301
- When text align is default, don't add a style attribute by @robguthrie in https://github.com/ueberdosis/tiptap/pull/1251
- docs: complete list of extensions with changed name by @Deckluhm in https://github.com/ueberdosis/tiptap/pull/1305
- fix(core): Increment `i` in `defaultBlockAt` by @andreavaccari in https://github.com/ueberdosis/tiptap/pull/1315
- Fix text-align extension url by @ralbear in https://github.com/ueberdosis/tiptap/pull/1325
- docs: fix typo by @Priestch in https://github.com/ueberdosis/tiptap/pull/1339
- Allow passing of DependencyList to useEditor by @YousefED in https://github.com/ueberdosis/tiptap/pull/1376
- a small clerical error? by @akirarika in https://github.com/ueberdosis/tiptap/pull/1380
- Make HTML in docs valid by @MoPaMo in https://github.com/ueberdosis/tiptap/pull/1381
- Wording improvement by @jonathanmach in https://github.com/ueberdosis/tiptap/pull/1389
- Prevent tiptap from creating duplicate style tags when injecting css by @mmachatschek in https://github.com/ueberdosis/tiptap/pull/1399
- Adding type definition for result and removing the ts-nocheck by @sereneinserenade in https://github.com/ueberdosis/tiptap/pull/1419
- Fix name of FloatingMenu by @shadow-light in https://github.com/ueberdosis/tiptap/pull/1429
- New extensions: add subscript and superscript extensions (including docs and tests) by @hanspagel in https://github.com/ueberdosis/tiptap/pull/1404
- Exclude superscript from subscript, and vice versa. by @BrianHung in https://github.com/ueberdosis/tiptap/pull/1436
- Add keyboard shortcuts to toggle superscript and subscript marks. by @BrianHung in https://github.com/ueberdosis/tiptap/pull/1437
- Make drop cursor default to regular caret color by @shadow-light in https://github.com/ueberdosis/tiptap/pull/1444
- use forwardRef for react wrappers by @YousefED in https://github.com/ueberdosis/tiptap/pull/1452
- Mention: Add text attribute by @tomhrtly in https://github.com/ueberdosis/tiptap/pull/1322
- Fix removal of textStyle mark when any style resets by @bttger in https://github.com/ueberdosis/tiptap/pull/1465
- Fix parsing of mention nodes by @shadow-light in https://github.com/ueberdosis/tiptap/pull/1471
- Correct default for dropcursor color in docs by @shadow-light in https://github.com/ueberdosis/tiptap/pull/1479
- Improve gapcursor docs by @carlobeltrame in https://github.com/ueberdosis/tiptap/pull/1497
- VueRenderer documentation with version 3 by @Tazi0 in https://github.com/ueberdosis/tiptap/pull/1491
- Update introduction.md by @phillduffy in https://github.com/ueberdosis/tiptap/pull/1509
- Link to contribution guidelines in CONTRIBUTING.md by @robertvanhoesel in https://github.com/ueberdosis/tiptap/pull/1541
- build(deps): bump actions/setup-node from 2.1.5 to 2.2.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/1544
- export createTable by @YousefED in https://github.com/ueberdosis/tiptap/pull/1469
- doc update: onSelection → onSelectionUpdate by @forresto in https://github.com/ueberdosis/tiptap/pull/1555
- update task-item.ts nodeview to update data-checked by @BrianHung in https://github.com/ueberdosis/tiptap/pull/1567
- Fix typo by @JavierMartinz in https://github.com/ueberdosis/tiptap/pull/1587
- Replace node-sass with dart sass and fix deprecation warning by @mmachatschek in https://github.com/ueberdosis/tiptap/pull/1590
- Readd russian history shortcuts by @mmachatschek in https://github.com/ueberdosis/tiptap/pull/1589
- Fix custom start for ordered lists by @mmachatschek in https://github.com/ueberdosis/tiptap/pull/1594
- Doc fix: Remove braces from isEmpty & isEditable by @WilliamIPark in https://github.com/ueberdosis/tiptap/pull/1599
- Export NodeViewRendererOptions by @sibiraj-s in https://github.com/ueberdosis/tiptap/pull/1607
- Update hostic-dom to fix style attributes by @sibiraj-s in https://github.com/ueberdosis/tiptap/pull/1618
- fix: export text align extension options by @iamursky in https://github.com/ueberdosis/tiptap/pull/1592
- fix: export starter kit extension options by @iamursky in https://github.com/ueberdosis/tiptap/pull/1593
- Adding types to Linter and making the structure a bit easier by @sereneinserenade in https://github.com/ueberdosis/tiptap/pull/1492
- Additional input rules for typography by @arthurmcgregor in https://github.com/ueberdosis/tiptap/pull/1624
- chore: add repository for all packages.json by @iamandrewluca in https://github.com/ueberdosis/tiptap/pull/1628
- Fix typo by @ValentaTomas in https://github.com/ueberdosis/tiptap/pull/1634
- Change TextAlignOptions to interface (not type) by @arthurmcgregor in https://github.com/ueberdosis/tiptap/pull/1623
- Allow a rule to be skipped from the getAttributes callback by @joevallender in https://github.com/ueberdosis/tiptap/pull/1625
- Fix multi character suggest by @flaviouk in https://github.com/ueberdosis/tiptap/pull/1620
- Provide more context to update function to enable fewer re-renders by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1648
- Examples: Syntax highlighting for React by @hanspagel in https://github.com/ueberdosis/tiptap/pull/1583
- Apply the correct regex in markPasteRule by @joevallender in https://github.com/ueberdosis/tiptap/pull/1671
- Fix typo by @Spone in https://github.com/ueberdosis/tiptap/pull/1693
- build(deps): bump actions/setup-node from 2.2.0 to 2.4.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/1697
- fix: use correct state when doc changed externally by @dkrym in https://github.com/ueberdosis/tiptap/pull/1646
- ✨ Add CreateNodeFromContentOptions to insertContent by @castroCrea in https://github.com/ueberdosis/tiptap/pull/1678
- Use correct reference for options.editorProps by @robertvanhoesel in https://github.com/ueberdosis/tiptap/pull/1540
- ✨ Add typography trademark by @castroCrea in https://github.com/ueberdosis/tiptap/pull/1699
- Menu improvements by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1714
- Docs: Disable history demo buttons when commands are not available by @domnantas in https://github.com/ueberdosis/tiptap/pull/1721
- fix some react focus issues by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1724
- Update alpine docs by @sibiraj-s in https://github.com/ueberdosis/tiptap/pull/1733
- Packages: Add a new `Color` extension to set the text color by @hanspagel in https://github.com/ueberdosis/tiptap/pull/1744
- docs: add color picker to color extension demo by @domnantas in https://github.com/ueberdosis/tiptap/pull/1790
- Fix Editor Reactivity by @nVitius in https://github.com/ueberdosis/tiptap/pull/1804
- Add missing comma in example by @carlobeltrame in https://github.com/ueberdosis/tiptap/pull/1849
- Allow triggering suggestions without prefix space by @jkosir in https://github.com/ueberdosis/tiptap/pull/1826
- fix: change `this.value` to `value` in the vue examples with v-model by @MiloLug in https://github.com/ueberdosis/tiptap/pull/1813
- Fix: Don’t initialize tippy on requestAnimationFrame to avoid race conditions by @enriquecastl in https://github.com/ueberdosis/tiptap/pull/1820
- ✨ Follow Ref on ForwardRef component in reactRenderer by @castroCrea in https://github.com/ueberdosis/tiptap/pull/1690
- feat: add extendEmptyMarkRange option to mark commands by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1859
- Include children in placeholder plugin by @nickdbush in https://github.com/ueberdosis/tiptap/pull/1416
- Horizontal rule demo: add selected style by @cadars in https://github.com/ueberdosis/tiptap/pull/1848
- feat: add getText() and generateText() methods (fix #1428) by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1875
- Fix usage example of CollaborationCursor by @carlobeltrame in https://github.com/ueberdosis/tiptap/pull/1911
- Add type for async items on suggestions (fix TS strict types complain) by @d8vjork in https://github.com/ueberdosis/tiptap/pull/1912
- Fix: code-block-lowlight child extensions do not highlight code by @enriquecastl in https://github.com/ueberdosis/tiptap/pull/1917
- Use pasteRegex in addPasteRules by @jvissers in https://github.com/ueberdosis/tiptap/pull/1922
- Docs: Clear up Prosemirror EditorProps usage by @domnantas in https://github.com/ueberdosis/tiptap/pull/1918
- Add enableCoreExtensions flag by @flaviouk in https://github.com/ueberdosis/tiptap/pull/1923
- Docs: Update command names in upgrade guide by @jakedolan in https://github.com/ueberdosis/tiptap/pull/1906
- Fix: nodeInputRule() support for group match by @nokola in https://github.com/ueberdosis/tiptap/pull/1574
- Fix "destory" method in view plugins. by @KaneCohen in https://github.com/ueberdosis/tiptap/pull/1882
- Fix 'Edit on Github' link url for examples in docs by @mmachatschek in https://github.com/ueberdosis/tiptap/pull/1929
- New example for custom documents (to force a heading on the top) by @hanspagel in https://github.com/ueberdosis/tiptap/pull/1948
- Added better types for event emitter by @HuiiBuh in https://github.com/ueberdosis/tiptap/pull/1959
- Use ref to move contentDOM by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1960
- fix: compatibility with lowlight v2 by @fengzilong in https://github.com/ueberdosis/tiptap/pull/1939
- build(deps): bump actions/setup-node from 2.4.0 to 2.4.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/1978
- Fix typo in hard-break.md by @davidkrijgsman in https://github.com/ueberdosis/tiptap/pull/1988
- Added Next.js installation guide & express setup for React by @alb in https://github.com/ueberdosis/tiptap/pull/1984
- Fixed typo in React installation guide by @alb in https://github.com/ueberdosis/tiptap/pull/1989
- docs: update styling by @hzpeng57 in https://github.com/ueberdosis/tiptap/pull/1998
- React collaboration demo by @svenadlung in https://github.com/ueberdosis/tiptap/pull/1991
- Integrate input rules and paste rules into the core by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/1997
- Changing use of InputRule to textInputRule for Savvy example by @jakedolan in https://github.com/ueberdosis/tiptap/pull/2007
- docs: correct the wording by @mittalyashu in https://github.com/ueberdosis/tiptap/pull/2012
- Fix #2016 Image input rule by @nokola in https://github.com/ueberdosis/tiptap/pull/2020
- Improve `ReactRenderer` types by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2011
- Add `editor` dependency when registering `BubbleMenuPlugin` by @ValentaTomas in https://github.com/ueberdosis/tiptap/pull/2018
- Allow to use commands within InputRule and PasteRule by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2035
- build(deps): bump actions/checkout from 2.3.4 to 2.3.5 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2051
- Add extension storage by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2069
- Separate drags from drops in stopEvent by @thatsjonsense in https://github.com/ueberdosis/tiptap/pull/2070
- Add editor to items prop in suggestion plugin by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2082
- Check node type above custom update fn by @thatsjonsense in https://github.com/ueberdosis/tiptap/pull/2081
- Add savvy example tests by @donovanglover in https://github.com/ueberdosis/tiptap/pull/2043
- Add unit tests for demos/src/Examples/Minimal/Vue by @AlexandruValeanu in https://github.com/ueberdosis/tiptap/pull/2047
- Added tests for Menus example by @alb in https://github.com/ueberdosis/tiptap/pull/2052
- Docs: Fixing onUpdate example by @chris-sev in https://github.com/ueberdosis/tiptap/pull/2084
- Fix menu example in doc by @phoenixgao in https://github.com/ueberdosis/tiptap/pull/2089
- Replace `defaultOptions` with `addOptions` by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2088
- docs: fix typo by @Deckluhm in https://github.com/ueberdosis/tiptap/pull/2093
- Use the new storage feature for the `CollaborationCursor` extension by @hanspagel in https://github.com/ueberdosis/tiptap/pull/2096
- Improve behavior when using insertContent by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2147
- build(deps): bump actions/checkout from 2.3.5 to 2.4.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2145
- Switch from hostic dom to zeed dom by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2151
- fix typo in events.md by @millerrafi in https://github.com/ueberdosis/tiptap/pull/2152
- update getJSON return type to JSONContent by @lecstor in https://github.com/ueberdosis/tiptap/pull/2153
- Update image.md by @georgemandis in https://github.com/ueberdosis/tiptap/pull/2154
- update zeed dom by @floriankrueger in https://github.com/ueberdosis/tiptap/pull/2155
- Floating menu - remove composition check by @dkrym in https://github.com/ueberdosis/tiptap/pull/2137
- Remove console.log statement from codeblock-lowlight-plugin file by @enriquecastl in https://github.com/ueberdosis/tiptap/pull/2168
- Ignore iOS mutations when unfocused by @thatsjonsense in https://github.com/ueberdosis/tiptap/pull/2170
- feat: Allow array of extensions for `enableInputRules` and `enablePasteRules` by @aguingand in https://github.com/ueberdosis/tiptap/pull/2119
- Export type ColorOptions by @apaar97 in https://github.com/ueberdosis/tiptap/pull/2180
- Split vue and react variant for interactivity demo by @svenadlung in https://github.com/ueberdosis/tiptap/pull/2186
- Add `setEditable` to the Editor documentation by @floriankrueger in https://github.com/ueberdosis/tiptap/pull/2199
- Bump actions/cache from 2.1.5 to 2.1.7 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2207
- Bump actions/setup-node from 2.4.1 to 2.5.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2208
- feat(ReactNodeViewRenderer): Add `as` option and pass through to ReactRenderer by @jessicalc in https://github.com/ueberdosis/tiptap/pull/2213
- Add support for autolink by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2226
- initialize autofocus selection in `createView` by @BrianHung in https://github.com/ueberdosis/tiptap/pull/2212
- Use named exports instead of default exports by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2238
- Svelte Example: remove wrong `type="context"` tag by @duruer in https://github.com/ueberdosis/tiptap/pull/2240
- A brand new `CharacterCount` extension by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2256
- join lists on toggleList by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2260
- build(deps): bump actions/upload-artifact from 2.2.3 to 2.3.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2269
- fix: show FloatingMenu by default only if focused by @jaulz in https://github.com/ueberdosis/tiptap/pull/2275
- Improve backspace handling by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2284
- Make sure editor is available on first render by @ryanto in https://github.com/ueberdosis/tiptap/pull/2282
- fix typo in floating menu docs by @nucleartux in https://github.com/ueberdosis/tiptap/pull/2290
- Add setup for plain js demos by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2288
- build(deps): bump actions/upload-artifact from 2.3.0 to 2.3.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2300
- Remove `element.current` from `useEffect` in `BubbleMenu` and `FloatingMenu` by @ValentaTomas in https://github.com/ueberdosis/tiptap/pull/2297
- Using vue 2 and 3 when passing props to VueRenderer in Mention plugin by @domstrueboy in https://github.com/ueberdosis/tiptap/pull/2319
- Fix typo in readme by @stijndcl in https://github.com/ueberdosis/tiptap/pull/2333
- Fix typos in typescript.md by @hatefrad in https://github.com/ueberdosis/tiptap/pull/2339
- typo in docs/api/editor.md by @milahu in https://github.com/ueberdosis/tiptap/pull/2338
- Added setup script syntax to Vue 3 install docs by @NuroDev in https://github.com/ueberdosis/tiptap/pull/2324
- build(deps): bump actions/setup-node from 2.5.0 to 2.5.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2343
- change reactrenderer component type definition by @lukesmurray in https://github.com/ueberdosis/tiptap/pull/2327
- Export type FontFamilyOptions by @apaar97 in https://github.com/ueberdosis/tiptap/pull/2345
- Update vue3.md Grammar Error In Docs by @Aiyush-G in https://github.com/ueberdosis/tiptap/pull/2349
- Fix typo in contributing.md by @webri in https://github.com/ueberdosis/tiptap/pull/2352
- Vue3 CLI doesn't have "npm run dev" by @Aiyush-G in https://github.com/ueberdosis/tiptap/pull/2350
- fix: export type `Level` for external use by @webri in https://github.com/ueberdosis/tiptap/pull/2354
- add way to cancel inputrules and pasterules by @philippkuehn in https://github.com/ueberdosis/tiptap/pull/2368
- Mark `@tiptap/react` and `@tiptap/core` as side effect free by @dcastil in https://github.com/ueberdosis/tiptap/pull/2361
- Nuxt specific corrections by @gsqrt2 in https://github.com/ueberdosis/tiptap/pull/2410
- build(deps): bump nanoid from 3.1.30 to 3.2.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2419
- build(deps): bump node-fetch from 2.6.6 to 2.6.7 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2424
- fix: use toggleHeader from prosemirror-tables by @jpobley in https://github.com/ueberdosis/tiptap/pull/2412
- docs(nodes/image/react): remove v-if by @strdr4605 in https://github.com/ueberdosis/tiptap/pull/2461
- Fix: Typo in Focus Command Documentation of Editor by @AngadSethi in https://github.com/ueberdosis/tiptap/pull/2476
- expose hasAnchor to custom placeholder function by @YousefED in https://github.com/ueberdosis/tiptap/pull/2470
- Add key bindings for uppercase letters for bold, italic and underline by @mejo- in https://github.com/ueberdosis/tiptap/pull/2478
- Allow individual Typography rules to be disabled by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2449
- Docs/toc undo fix by @codemzy in https://github.com/ueberdosis/tiptap/pull/2484
- build(deps): bump nanoid from 3.1.30 to 3.2.0 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/2480
- chore: added visual studio code debugging launch options by @bdbch in https://github.com/ueberdosis/tiptap/pull/2695
- fix: don't override behaviour of Home / End in pc keymap by @scottsidwell in https://github.com/ueberdosis/tiptap/pull/2691
- fix: Mark the bubble/floating menu extensions as side effect free by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2677
- build(deps-dev): bump minimist from 1.2.5 to 1.2.6 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2667
- build(deps): bump minimist from 1.2.5 to 1.2.6 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/2672
- fix: prevent suggestions from being active when editor is readonly by @scottsidwell in https://github.com/ueberdosis/tiptap/pull/2692
- fix: Allow tippyOptions.getReferenceClientRect in bubble menu to be overridden by @fleon in https://github.com/ueberdosis/tiptap/pull/2668
- fix: allow [] as a prefix for task items by @bdbch in https://github.com/ueberdosis/tiptap/pull/2698
- fix: improve Vue nodeViewProps typing by @DanSnow in https://github.com/ueberdosis/tiptap/pull/2681
- fix: remove extension-text-style from character-cout peer dependencies by @pradel in https://github.com/ueberdosis/tiptap/pull/2696
- fix(extension-link): prevent parsing `javascript:` pseudo-protocol by @phenax in https://github.com/ueberdosis/tiptap/pull/2646
- build(deps): bump actions/cache from 2.1.7 to 3.0.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2701
- build(deps): bump actions/checkout from 2.4.0 to 3.0.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2699
- build(deps): bump actions/upload-artifact from 2.3.1 to 3.0.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2700
- build(deps): bump actions/setup-node from 2.5.1 to 3.1.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2705
- Add support for React 18 by @dcastil in https://github.com/ueberdosis/tiptap/pull/2676
- fix broken GuideContent demos not rendering because of unexpected use… by @bdbch in https://github.com/ueberdosis/tiptap/pull/2709
- Docs: fix file names in PHP installation by @aguingand in https://github.com/ueberdosis/tiptap/pull/2644
- Add support for CSS Modules by @XAHTEP26 in https://github.com/ueberdosis/tiptap/pull/2723
- Use vitejs/plugin-react and include react dependencies by @svenadlung in https://github.com/ueberdosis/tiptap/pull/2732
- build(deps-dev): bump minimist from 1.2.5 to 1.2.6 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2725
- build(deps): bump actions/checkout from 3.0.0 to 3.0.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2727
- feat: Add `onBeforeStart` and `onBeforeUpdate` handlers to the render function by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2628
- feat: Add a generic type for suggestion items by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2610
- Reduce bundle size of @tiptap/extension-table package by @enriquecastl in https://github.com/ueberdosis/tiptap/pull/2622
- Update Suggestion package.json by @dphuang2 in https://github.com/ueberdosis/tiptap/pull/2739
- fix: Support inline nodes with content in @tiptap/suggestion by @thatsjonsense in https://github.com/ueberdosis/tiptap/pull/2648
- Allow class attribute through setLink() by @Ken-vdE in https://github.com/ueberdosis/tiptap/pull/2758
- update people by @patrickbaber in https://github.com/ueberdosis/tiptap/pull/2776
- fix: properly calculate setDragImage position by @dilizarov in https://github.com/ueberdosis/tiptap/pull/2768
- Ensure VueNodeViewRenderer will use Editor's Global Vue Instance by @ralphschindler in https://github.com/ueberdosis/tiptap/pull/2604
- refactor(global): remove yarn in favor for npm by @bdbch in https://github.com/ueberdosis/tiptap/pull/2775
- add support for CSP nonces in createStyleTag by @fekle in https://github.com/ueberdosis/tiptap/pull/2601
- add validate option to link extension by @bdbch in https://github.com/ueberdosis/tiptap/pull/2781
- Cypress tests for examples by @bdbch in https://github.com/ueberdosis/tiptap/pull/2777
- build(deps): bump actions/setup-node from 3.1.1 to 3.2.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2793
- fix: extendMarkRange doesn't work when cursor is at end of mark, despite isActive() returning true for that mark by @JDinABox in https://github.com/ueberdosis/tiptap/pull/2717
- Expose "range" to textSerializer. Used in "getTextBetween" by @panta82 in https://github.com/ueberdosis/tiptap/pull/2684
- Export `getTextSerializersFromSchema` helper, and fix typo in its name by @sjdemartini in https://github.com/ueberdosis/tiptap/pull/2750
- fix: disable broken tests for experiements with further todo message by @bdbch in https://github.com/ueberdosis/tiptap/pull/2808
- Add `className` option and pass through to ReactRenderer by @anton-liubushkin in https://github.com/ueberdosis/tiptap/pull/2794
- Fix InputRule regex matcher ignoring non-text leaflets in textBefore by @bdbch in https://github.com/ueberdosis/tiptap/pull/2807
- Add option to allow task items to be checkable (uncontrolled) by @kaspnilsson in https://github.com/ueberdosis/tiptap/pull/2474
- feat: Required attributes by @thatsjonsense in https://github.com/ueberdosis/tiptap/pull/2640
- Update team by @montapro in https://github.com/ueberdosis/tiptap/pull/2791
- fix: Only trigger image input rule at the start or with a preceding space by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2830
- In Vue 2 VueRenderer, only Vue.extend() non-VueConstructor arguments by @ralphschindler in https://github.com/ueberdosis/tiptap/pull/2824
- fix(suggestion): :bug: make clientrect prop optional by @bdbch in https://github.com/ueberdosis/tiptap/pull/2813
- build(deps): bump actions/cache from 3.0.2 to 3.0.3 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2851
- Fixed(vue-2): `Avoid mutating a prop directly` error message to reproduce by @HondryTravis in https://github.com/ueberdosis/tiptap/pull/2834
- Add support for custom protocols in extension-link by @shaunabanana in https://github.com/ueberdosis/tiptap/pull/2832
- fix(textStyle): Null-safe parseHTML getting no color/fontFamily from HTMLElement styles by @d8vjork in https://github.com/ueberdosis/tiptap/pull/2825
- build(deps): bump actions/upload-artifact from 3.0.0 to 3.1.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2820
- Declare lowlight as a peerDependency in `@tiptap/extension-code-block-lowlight` by @enriquecastl in https://github.com/ueberdosis/tiptap/pull/2625
- add precommit hook for linting and automatic eslint fixes + update eslint packages by @bdbch in https://github.com/ueberdosis/tiptap/pull/2862
- Adding missing extensions to docs in https://tiptap.dev/api/extensions by @Lior539 in https://github.com/ueberdosis/tiptap/pull/2856
- docs(docs): add missing documentation for commands by @bdbch in https://github.com/ueberdosis/tiptap/pull/2861
- refactor: use index files for imports to simplify the export flow by @bdbch in https://github.com/ueberdosis/tiptap/pull/2870
- feat(extension/youtube): :sparkles: new youtube embed extension by @bdbch in https://github.com/ueberdosis/tiptap/pull/2814
- build(deps): bump actions/cache from 3.0.3 to 3.0.4 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2877
- build(deps): bump actions/setup-node from 3.2.0 to 3.3.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2878
- chore: migrate to new versions of prosemirror packages by @bdbch in https://github.com/ueberdosis/tiptap/pull/2854
- docs: improve docs for youtube extension by @svenadlung in https://github.com/ueberdosis/tiptap/pull/2902
- Allow setting `whiteSpace` style for `NodeViewWrapper` & `NodeViewContent` by @EvitanRelta in https://github.com/ueberdosis/tiptap/pull/2884
- refactor(maintainment): set dependency versions for prosemirror and y… by @bdbch in https://github.com/ueberdosis/tiptap/pull/2904
- feat: Allow multiple prefix characters to trigger a suggestion by @rfgamaral in https://github.com/ueberdosis/tiptap/pull/2896
- fix: editor don't has contentComponent attribute when suggestion onUp… by @Young6118 in https://github.com/ueberdosis/tiptap/pull/2916
- Fix state update after component unmounted by @SavKS in https://github.com/ueberdosis/tiptap/pull/2857
- docs: fix livewire attribute by @ccchapman in https://github.com/ueberdosis/tiptap/pull/2928
- build(deps): bump parse-url from 6.0.0 to 6.0.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2961
- fix(core): only respect text of node before current position (#2937) by @svenadlung in https://github.com/ueberdosis/tiptap/pull/2941
- chore: lint only staged files by @ahhshm in https://github.com/ueberdosis/tiptap/pull/2957
- fix(core): dont use selection for setContent replacement by @bdbch in https://github.com/ueberdosis/tiptap/pull/2934
- refactor: remove duplicated function by @ahhshm in https://github.com/ueberdosis/tiptap/pull/2956
- docs(figure): pass an object to `nodeInputRule` by @ahhshm in https://github.com/ueberdosis/tiptap/pull/2954
- docs: update alpine installation by @patrickbaber in https://github.com/ueberdosis/tiptap/pull/3081
- docs(extensions): mention community extensions and discussion thread by @sereneinserenade in https://github.com/ueberdosis/tiptap/pull/2991
- build(deps-dev): bump svelte from 3.48.0 to 3.49.0 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/2992
- build(deps-dev): bump svelte from 3.48.0 to 3.49.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2993
- fix(core): isNodeSelection, isTextSelection not always false by @kivikakk in https://github.com/ueberdosis/tiptap/pull/3089
- build(deps): bump actions/setup-node from 3.3.0 to 3.4.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/2998
- build(deps): bump terser from 5.14.1 to 5.14.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3009
- build(deps): bump actions/cache from 3.0.4 to 3.0.7 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3087
- Fix pasteRulesPlugin always adding one extra character to text range by @Billiam in https://github.com/ueberdosis/tiptap/pull/2968
- fix: let StarterKit be imported as common js module via named import by @sipec in https://github.com/ueberdosis/tiptap/pull/2967
- fix(core): createCan command props shouldn't try dispatch (#3025) by @kivikakk in https://github.com/ueberdosis/tiptap/pull/3026
- build(deps): bump actions/cache from 3.0.7 to 3.0.8 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3112
- fix(core): setNodeSelection should not clamp pos by Selection.atStart/atEnd by @kivikakk in https://github.com/ueberdosis/tiptap/pull/3091
- Make Suggestion extension use view.dom instead of document by @Faleij in https://github.com/ueberdosis/tiptap/pull/3093
- fix(core): make setEditable trigger onUpdate function by @bdbch in https://github.com/ueberdosis/tiptap/pull/2935
- fix: fix React Node View render problem in React 18 by @Darmody in https://github.com/ueberdosis/tiptap/pull/2985
- feature(core): add exit handling for marks by @bdbch in https://github.com/ueberdosis/tiptap/pull/2925
- build(deps-dev): bump vite from 2.9.12 to 2.9.13 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/3141
- build(deps-dev): bump vite from 2.9.12 to 2.9.13 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3145
- fix: vue inject grammar warning by @zhxqc in https://github.com/ueberdosis/tiptap/pull/3144
- fix(core): make setEditable trigger all 'update' listeners by @Rhys-T in https://github.com/ueberdosis/tiptap/pull/3140
- fix: Typo by @NagariaHussain in https://github.com/ueberdosis/tiptap/pull/3132
- docs: fix naming by @masl in https://github.com/ueberdosis/tiptap/pull/3151
- Include bubble menu element when checking if the editor view still has focus by @StefKors in https://github.com/ueberdosis/tiptap/pull/3150
- Fix typo in docs by @carlobeltrame in https://github.com/ueberdosis/tiptap/pull/3162
- fix(extension-code-block-lowlight): Bump lowlight to 2.7.0, remove outdated @types by @tarngerine in https://github.com/ueberdosis/tiptap/pull/3002
- fix(core): insert PasteRule Node at matched position (#2942) by @edlb in https://github.com/ueberdosis/tiptap/pull/2943
- add-empty-editor-class-to-root-div by @BrianHung in https://github.com/ueberdosis/tiptap/pull/2665
- build(deps): bump parse-path from 4.0.4 to 5.0.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3178
- fix: move React `flushSync` to microtask by @sampi in https://github.com/ueberdosis/tiptap/pull/3188
- Fix bubble menu and floating menu being available when editor is not editable by @bdbch in https://github.com/ueberdosis/tiptap/pull/3195
- feat: Add alias condition to code-block-lowlight by @dngwoodo in https://github.com/ueberdosis/tiptap/pull/3155
- feat(extension-typography): add servicemark input rule by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3220
- fix(types): fix link and table type errors by @johnfraney in https://github.com/ueberdosis/tiptap/pull/3208
- test: fix failing test by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3230
- feat(extension-link): Change autolink to only apply after breaking a word by @C-Hess in https://github.com/ueberdosis/tiptap/pull/3232
- chore(maintainment): :rocket: update prosemirror packages by @bdbch in https://github.com/ueberdosis/tiptap/pull/3237
- fix(core): Can() does not work for setting marks by @C-Hess in https://github.com/ueberdosis/tiptap/pull/3223
- Ensure text blocks exist before referencing them by @ScopeyNZ in https://github.com/ueberdosis/tiptap/pull/3251
- fix(core): InputRules does not work for ranges containing multiple text nodes by @hamflx in https://github.com/ueberdosis/tiptap/pull/3205
- fix(core) - support attributes being null/undefined by @albertogiunta in https://github.com/ueberdosis/tiptap/pull/3245
- fix: set default allowedPrefixes null by @Matrixbirds in https://github.com/ueberdosis/tiptap/pull/3239
- fix(extension/link): fix last word value being undefined by @bdbch in https://github.com/ueberdosis/tiptap/pull/3258
- build(deps): bump d3-color from 3.0.1 to 3.1.0 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/3260
- docs: link YouTube node docs to proper GitHub url by @nielslanting in https://github.com/ueberdosis/tiptap/pull/3283
- fix: typo in docs by @danielyuenhx in https://github.com/ueberdosis/tiptap/pull/3265
- Fixed dragged text not being deleted after drop on another editor by @LuchoCateura in https://github.com/ueberdosis/tiptap/pull/3279
- Fixed using both color and highlight together by @nkonev in https://github.com/ueberdosis/tiptap/pull/3311
- Cleanup linkifyjs when the editor is destroyed by @educastellano in https://github.com/ueberdosis/tiptap/pull/3316
- Feature/youtube parameters by @LuchoCateura in https://github.com/ueberdosis/tiptap/pull/3307
- Fix installation and examples link by @catalinmiron in https://github.com/ueberdosis/tiptap/pull/3298
- fix(docs): typo by @Calvein in https://github.com/ueberdosis/tiptap/pull/3362
- fix(extension/placeholder): Resolve placeholder performance issues by @C-Hess in https://github.com/ueberdosis/tiptap/pull/3361
- build(deps): bump parse-url from 7.0.2 to 8.1.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3384
- refactor(extension/bubble-menu): add debounce to bubble menu updates by @bdbch in https://github.com/ueberdosis/tiptap/pull/3385
- build(deps): bump actions/setup-node from 3.4.1 to 3.5.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3318
- docs: Fix typos in CHANGELOG.md by @rvrvrv in https://github.com/ueberdosis/tiptap/pull/3328
- build(deps): bump actions/cache from 3.0.8 to 3.0.11 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3317
- fix: remove blur event listener from tippy element (#3365) by @MihirGH in https://github.com/ueberdosis/tiptap/pull/3366
- fixes typo in suggestion.ts by @alejandrogarciasalas in https://github.com/ueberdosis/tiptap/pull/3386
- docs(svelte): fix link to get started with svelte by @taismassaro in https://github.com/ueberdosis/tiptap/pull/3396
- build(deps): bump loader-utils from 2.0.2 to 2.0.3 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3395
- Update jobs.md by @montapro in https://github.com/ueberdosis/tiptap/pull/3432
- extension/table: Fix prosemirror-tables dependency not using a correct namespace by @bdbch in https://github.com/ueberdosis/tiptap/pull/3448
- typo: custom-extensions.md completely by @williamsk91 in https://github.com/ueberdosis/tiptap/pull/3447
- Fix #3435 - CommonJS and ESM loading confusion by @tomi-bigpi in https://github.com/ueberdosis/tiptap/pull/3436
- build(deps): bump loader-utils from 2.0.3 to 2.0.4 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3426
- Fix cursor not following to new node when using a react node view by @ruipserra in https://github.com/ueberdosis/tiptap/pull/3331
- fix(core): implement deleteCurrentNode command & fix node joining on Delete key by @bdbch in https://github.com/ueberdosis/tiptap/pull/3192
- fix(link): allow to unset target attribute by @dargmuesli in https://github.com/ueberdosis/tiptap/pull/3425
- feat(commands): add joinUp and joinDown command & refactor join command code by @bdbch in https://github.com/ueberdosis/tiptap/pull/3455
- docs: rotate demo rooms by @patrickbaber in https://github.com/ueberdosis/tiptap/pull/3475
- Draft: Moves all prosemirror deps to peerDependencies & devDependencies by @janthurau in https://github.com/ueberdosis/tiptap/pull/3487
- fix(extension-bubble-menu): don't debounce without valid selection by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3501
- refactor(extension-youtube): rename utility function name by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3498
- Check if url is valid before creating YouTube player by @umgustavo in https://github.com/ueberdosis/tiptap/pull/3484
- Fix docs menus.md missing word by @kandros in https://github.com/ueberdosis/tiptap/pull/3457
- build(deps): bump minimatch from 3.0.4 to 3.1.2 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/3489
- Fix: custom text serializers should override text serializers defined in the schema by @tovaschreier in https://github.com/ueberdosis/tiptap/pull/3546
- Update sink-list-item.md by @vuau in https://github.com/ueberdosis/tiptap/pull/3629
- 🧹 Allow `editor.setEditable` to omit updates by @ZaymonFC in https://github.com/ueberdosis/tiptap/pull/3301
- Change Build Process to Lerna + tsup & prepare for prosemirror-meta package by @bdbch in https://github.com/ueberdosis/tiptap/pull/3555
- fix(typo): typescript.md by @N0N1m3 in https://github.com/ueberdosis/tiptap/pull/3657
- Update schema.md by @matrei in https://github.com/ueberdosis/tiptap/pull/3645
- New Feature: Prosemirror Meta Package by @bdbch in https://github.com/ueberdosis/tiptap/pull/3556
- Added CSS Required for Setup by @james-william-r in https://github.com/ueberdosis/tiptap/pull/3711
- Update installation guides by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3698
- Make y-prosemirror a peer dependency (extension-collaboration) by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3697
- Remove lodash types, replace pm deps (extension-bubble-menu) by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3696
- Remove lodash dependencies in extension-floating-menu by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3695
- build(deps): bump cypress-io/github-action from 4.2.0 to 5.0.8 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3707
- build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3687
- Move back from tsup/esbuild to rollup by @bdbch in https://github.com/ueberdosis/tiptap/pull/3720
- fix: Draggable nodes should respect drag handles by @matthewmullin01 in https://github.com/ueberdosis/tiptap/pull/3677
- build(deps): bump actions/cache from 3.0.11 to 3.2.5 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3741
- build(deps): bump act10ns/slack from 1 to 2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3404
- build(deps): bump json5 from 1.0.1 to 1.0.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3605
- build(deps): bump json5 from 2.2.1 to 2.2.3 in /demos by @dependabot in https://github.com/ueberdosis/tiptap/pull/3607
- build(deps): bump actions/checkout from 3.0.2 to 3.3.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3609
- build(deps): bump actions/upload-artifact from 3.1.0 to 3.1.2 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3610
- build(deps): bump actions/setup-node from 3.5.1 to 3.6.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3613
- Update regex to exclude channel URL unfurling by @JustMaier in https://github.com/ueberdosis/tiptap/pull/3750
- Fix type for BubbleMenu prop pluginKey by @rumbcam in https://github.com/ueberdosis/tiptap/pull/3678
- Extend `nodePasteRule` `find` type to most generic `PasteRuleFinder` by @jiegillet in https://github.com/ueberdosis/tiptap/pull/3759
- fix(extension-link): Click handler opens selected link instead of clicked link by @jmtaber129 in https://github.com/ueberdosis/tiptap/pull/3732
- fix(typography): dont create fractions in the middle of a string by @bdbch in https://github.com/ueberdosis/tiptap/pull/3762
- Use Tailwind CDN direclty? by @RicoTrevisan in https://github.com/ueberdosis/tiptap/pull/3643
- fix: override schema text serializers if provided in getText options by @harrisonlo in https://github.com/ueberdosis/tiptap/pull/3672
- chore: add eslintcache by @Simon-He95 in https://github.com/ueberdosis/tiptap/pull/3525
- document removing or overriding link attributes by @epelc in https://github.com/ueberdosis/tiptap/pull/3576
- Add onFirstRender callback option by @Flamenco in https://github.com/ueberdosis/tiptap/pull/3600
- Add Plugin Key to placeholder component. by @tazirahmb in https://github.com/ueberdosis/tiptap/pull/3652
- Export `createNodeFromContent` and other missing helpers by @jacksleight in https://github.com/ueberdosis/tiptap/pull/3558
- fix: Queue flushSync call by @kylealwyn in https://github.com/ueberdosis/tiptap/pull/3533
- build(deps): bump cypress-io/github-action from 5.0.8 to 5.0.9 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3766
- feat: #3540 Ability to preserve marks on lists by @gethari in https://github.com/ueberdosis/tiptap/pull/3541
- Move y-prosemirror to peer-deps by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3763
- fix: #3773 - Array for content breaks editor by @gethari in https://github.com/ueberdosis/tiptap/pull/3786
- Docs Update for Installation instructions for PHP Livewire by @peterfox in https://github.com/ueberdosis/tiptap/pull/3618
- add optionalSlashSlash to protocol options by @taras-turchenko-moc in https://github.com/ueberdosis/tiptap/pull/3675
- fix(core): allow insertContentAt and insertContent text node arrays by @bdbch in https://github.com/ueberdosis/tiptap/pull/3790
- chore: allow new ReactComponentContent components to be created by @bdbch in https://github.com/ueberdosis/tiptap/pull/3782
- fix(react): reset initialized when editorcontent is unmounting by @bdbch in https://github.com/ueberdosis/tiptap/pull/3781
- docs: add extension cli note to contributing docs by @bdbch in https://github.com/ueberdosis/tiptap/pull/3793
- fix: update typings for node view decorations by @bdbch in https://github.com/ueberdosis/tiptap/pull/3783
- build(deps): bump actions/cache from 3.2.5 to 3.2.6 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3795
- Fix destroyed view causing errors on dispatchTransaction by @bdbch in https://github.com/ueberdosis/tiptap/pull/3799
- Only allow left mouse button to open links by @thecodrr in https://github.com/ueberdosis/tiptap/pull/3777
- Optimize empty document detection in `documentClear` plugin by @thecodrr in https://github.com/ueberdosis/tiptap/pull/3778
- fix: use prose-base class for sm screens by @cstrnt in https://github.com/ueberdosis/tiptap/pull/3810
- Adds attributes to toggleList by @katerlouis in https://github.com/ueberdosis/tiptap/pull/3776
- fix(tests): add assertion for each valid/invalid link by @bdbch in https://github.com/ueberdosis/tiptap/pull/3815
- feat(react): allow html attrs in react renderer by @bdbch in https://github.com/ueberdosis/tiptap/pull/3812
- fix(react): allow updating event handlers on editor by @bdbch in https://github.com/ueberdosis/tiptap/pull/3811
- Improve Cypress Test runner performance with parallelization by @bdbch in https://github.com/ueberdosis/tiptap/pull/3817
- build(deps): bump cypress-io/github-action from 5.0.9 to 5.2.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3835
- fix: Ordered list start support broke in #3541 by @gethari in https://github.com/ueberdosis/tiptap/pull/3833
- Refactor typings (extension-youtube) by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3842
- build(deps): bump actions/checkout from 3.3.0 to 3.4.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3864
- build(deps): bump cypress-io/github-action from 5.2.0 to 5.5.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3863
- build(deps-dev): bump webpack from 5.73.0 to 5.76.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3855
- Docs: consistent naming of Tiptap by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3882
- [PROPOSAL] dynamic default attributes by @mylesj in https://github.com/ueberdosis/tiptap/pull/3379
- style(core): fix linting issues by @bdbch in https://github.com/ueberdosis/tiptap/pull/3884
- Handle NodeViews in BubbleMenu positioning by @bdbch in https://github.com/ueberdosis/tiptap/pull/3881
- chore: add Dev demo folder by @bdbch in https://github.com/ueberdosis/tiptap/pull/3887
- CI: Remove slack notifications by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3885
- Docs: Update nodes and extensions lists by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3886
- Docs: Remove pro extension callout from collab docs by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3883
- Fixing reoccurring issue #3331 and improving related PR #3533 by @KentoMoriwaki in https://github.com/ueberdosis/tiptap/pull/3862
- Release Candidate Preparation by @bdbch in https://github.com/ueberdosis/tiptap/pull/3890
- chore: add new release and prerelease actions by @bdbch in https://github.com/ueberdosis/tiptap/pull/3836
- Updates @hocuspocus/provider, moves demo to TiptapCollab by @janthurau in https://github.com/ueberdosis/tiptap/pull/3895
- Merge pull request #3895 from ueberdosis/feature/ttCollabProvider by @janthurau in https://github.com/ueberdosis/tiptap/pull/3897
- Collaboration: Fix history after late-registering plugins by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3901
- ci: remove slack notifications by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3898
- build(deps): bump actions/checkout from 3.4.0 to 3.5.0 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3889
- build(deps): bump cypress-io/github-action from 5.5.0 to 5.5.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3888
- build(deps): bump actions/cache from 3.2.6 to 3.3.1 by @dependabot in https://github.com/ueberdosis/tiptap/pull/3846
- docs: prepare for stable release by @svenadlung in https://github.com/ueberdosis/tiptap/pull/3892
- New Issue & Discussion Templates by @bdbch in https://github.com/ueberdosis/tiptap/pull/3907
- feat(core): add editor to this context in schema functions by @bdbch in https://github.com/ueberdosis/tiptap/pull/3909
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
Contributions are **welcome** and will be fully **credited**.
Please read and understand the [contribution guide](https://www.tiptap.dev/overview/contributing/) before creating an issue or pull request.
## Etiquette
This project is open source, and as such, the maintainers give their free time to build and maintain the source code
held within. They make the code freely available in the hope that it will be of use to other developers. It would be
extremely unfair for them to suffer abuse or anger for their hard work.
Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the
world that developers are civilized and selfless people.
It's the duty of the maintainer to ensure that all submissions to the project are of sufficient
quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used.
## Security
If you discover a security vulnerability, please refer to our [Security Policy](SECURITY.md) for reporting instructions.
## Viability
When requesting or submitting new features, first consider whether it might be useful to others. Open
source projects are used by many developers, who may have entirely different needs to your own. Think about
whether or not your feature is likely to be used by other users of the project.
## Procedure
Before filing an issue:
- Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. Create a CodeSandbox to reproduce the issue. Use one of these templates to get started:
- [JavaScript template](https://codesandbox.io/s/tiptap-js-fv1lyo)
- [React template](https://codesandbox.io/s/tiptap-react-qidlsv)
- [Vue 2 template](https://codesandbox.io/s/tiptap-vue-2-25nq3g)
- [Vue 3 template](https://codesandbox.io/p/sandbox/tiptap-vue-3-ci7q9h)
- Check to make sure your feature suggestion isn't already present within the project.
- Check the pull requests tab to ensure that the bug doesn't have a fix in progress.
- Check the pull requests tab to ensure that the feature isn't already in progress.
Before submitting a pull request:
- Check the codebase to ensure that your feature doesn't already exist.
- Check the pull requests to ensure that another person hasn't already submitted the feature or fix.
Before committing:
- Make sure to run the tests and linter before committing your changes.
- If you are making changes to one of the packages, make sure to **always** include a [changeset](https://github.com/changesets/changesets) in your PR describing **what changed** with a **description** of the change. Those are responsible for changelog creation
## Create a new demo
To make it easier to add new demos to the demos app we provide a small helper script via `pnpm run make:demo` that scaffolds a new demo directory from our default template.
**What it does**
- Prompts for a demo name and category.
- Validates the category is one of: `Dev`, `Examples`, `Extensions`, `Experiments`, `Marks`, `Nodes`.
- Copies the template `demos/src/Examples/Default` to `demos/src/<Category>/<Demo_Name>`.
**How to use**
- From the repository root run:
- If the script is executable:
- Or with bash directly:
- Follow the interactive prompts for the demo name and category.
**Notes and follow-up steps**
- The script only copies the template. After the scaffold is created, update the demo's files (title, description, imports) to reflect your example.
- Make sure to review the generated demo in `demos/` and run the demos app (`pnpm dev`) to verify it appears and works as expected.
- If your demo changes package behaviour or exposes user-facing changes, follow the normal rule and add a changeset and tests as needed.
- If you don't want your demo to be included in the Git repository, use the `Dev` category. Demos in this category are ignored by git via `.gitignore`.
## Publishing New Packages
When adding a new package to the repository that does not yet exist on NPM, additional setup is required before the automated publish CI can release it:
1. **Manual initial publish** - The package must be published manually to NPM for the first time using normal user authentication. This is required because trusted publishing can only be configured for packages that already exist on the registry.
- For a single package, run `pnpm run build && pnpm publish` from the package directory (e.g., `packages/extension-audio/`).
- Alternatively, run `pnpm run publish` from the root directory to publish all packages.
2. **Configure trusted publishing** - After the initial publish, set up [NPM trusted publishing](https://docs.npmjs.com/trusted-publishers) (also known as provenance) for the package on NPM. This allows the GitHub Actions workflow to publish subsequent versions automatically.
Without this setup, the publish CI will fail when attempting to release a new package.
## Requirements
If the project maintainer has any additional requirements, you will find them listed here.
- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date.
- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](https://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting.
**Happy coding**!
================================================
FILE: LICENSE.md
================================================
MIT License
Copyright (c) 2025, Tiptap GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================

[](https://insights.linuxfoundation.org/project/tiptap)
[](https://github.com/ueberdosis/tiptap/actions/workflows/build.yml)
[](https://www.npmjs.com/package/@tiptap/core)
[](https://npmcharts.com/compare/@tiptap/core?minimal=true)
[](https://www.npmjs.com/package/@tiptap/core)
[](https://discord.gg/WtJ49jGshW)
[](https://github.com/sponsors/ueberdosis)
# Tiptap Editor
The Tiptap Editor is a headless, framework-agnostic rich text editor that's customizable and extendable through extensions. Its headless nature means it comes without a set user interface, offering full design freedom (for a jumpstart, see linked [UI templates](#examples-codesandbox-and-ui-templates) below). Tiptap is based on the highly reliable [ProseMirror](https://github.com/ProseMirror/prosemirror) library.
Tiptap Editor is complemented by the collaboration open-source backend [Hocuspocus](https://github.com/ueberdosis/hocuspocus). Both the Editor and Hocuspocus form the foundation of the [Tiptap Suite](https://tiptap.dev/).
### How does the Tiptap Editor work?
- **Headless Framework:** Tiptap does not rely on a user interface. So there is no need for class overrides or code hacks. If you do need an example UI feel free to browse our [UI templates](#examples-codesandbox-and-ui-templates) linked below.
- **Framework-agnostic:** The Tiptap Editor is designed to work across different frontend frameworks. This means whether you're using Vue, React, or plain JavaScript, Tiptap integrates without compatibility issues.
- **Extension based:** Extensions in Tiptap allow for a tailored editing experience, from simple text styling to advanced features like drag-and-drop block editing. You have the option to choose from over 100 extensions available in the [documentation](https://tiptap.dev/docs/editor/extensions) and [community](https://github.com/ueberdosis/awesome-tiptap/#community-extensions) to enhance your editor's functionality.
- **Customize your UX:** The editor was built to give you control to define your own [extensions](https://tiptap.dev/docs/editor/guide/custom-extensions) and [nodes](https://tiptap.dev/docs/editor/api/nodes).
### Editor Pro Extensions
The **Pro Extensions** are a set of advanced functionalities that enhance the capabilities of the Tiptap Editor. They are additional features that can be integrated into the base editor to provide more sophisticated editing options.
Key functionalities include collaborative editing, commenting, versioning, document conversion and AI related features.
Review the docs right [here](https://tiptap.dev/docs/editor/extensions).
Pro Extensions need a valid subscription.
### Make your editor collaborative
Interested in collaborative editing? Check out our open-source package [Hocuspocus](https://github.com/ueberdosis/hocuspocus) - a collaboration backend built around the CRDT power of [Yjs](https://github.com/yjs/yjs). Hocuspocus serves as the backbone for the [Tiptap Suite](https://tiptap.dev/).
## Documentation
For more detailed information, make sure to check out our [documentation](https://tiptap.dev/docs/editor/installation). If you encounter any problems or have suggestions for our system, please open an issue.
### Examples, CodeSandbox and UI Templates
Have a look at the [examples to see Tiptap in action](https://tiptap.dev/examples) or review and fork our codesandboxes.
- [Basic example of the Tiptap editor.](https://codesandbox.io/p/devbox/editor-9x9dkd?embed=1&file=%2Fsrc%2FApp.js)
- [Collaboration ready Tiptap CodeSandbox](https://codesandbox.io/p/devbox/collaboration-4stk94)
- React notion-like block editor template: [Demo](https://templates.tiptap.dev/)
## About Tiptap
Tiptap is a collection of developer components based on open-source technology, forming the basis of our advanced, paid features. It includes the open-source editor component, collaboration features, Content AI, and Tiptap Cloud. We are developing open-source products that also shape our paid features. We're committed to improving both, ensuring quality and reliability in every update.
For more details, visit the Tiptap [documentation](https://tiptap.dev/docs/editor/introduction) or [website](https://tiptap.dev/).
### Community
For help, discussion about best practices, or any other conversation that would benefit from being searchable:
[Discuss Tiptap on GitHub](https://github.com/ueberdosis/tiptap/discussions)
### Sponsors 💖
<table>
<tr>
<td align="center">
<a href="https://www.complish.app/">
<img src="https://uploads-ssl.webflow.com/5fa93d27380666789a1cbbd3/5fae50824b4d2d06f3d2898f_Frame%20374.png" width="25"><br>
<strong>Complish</strong>
</a>
</td>
<td align="center">
<a href="https://www.storyblok.com/">
<img src="https://unavatar.io/github/storyblok" width="25"><br>
<strong>Storyblok</strong>
</a>
</td>
<td align="center">
<a href="https://posthog.com/">
<img src="https://unavatar.io/github/posthog" width="25"><br>
<strong>PostHog</strong>
</a>
</td>
<td align="center" width="100">
<a href="https://reflect.app/">
<img src="https://unavatar.io/reflect.app" width="25"><br>
<strong>Reflect</strong>
</a>
</td>
<td align="center" width="100">
<a href="https://ziffmedia.com/">
<img src="https://unavatar.io/github/ziffmedia" width="25"><br>
<strong>Ziff Media</strong>
</a>
</td>
<td align="center" width="100">
<a href="https://www.basewell.com/">
<img src="https://unavatar.io/github/Basewell" width="25"><br>
<strong>Basewell</strong>
</a>
</td>
<td align="center" width="100">
<a href="https://poggio.io">
<img src="https://unavatar.io/github/poggiolabs" width="25"><br>
<strong>Poggio</strong>
</a>
</td>
</tr>
</table>
[iFixit](https://www.ifixit.com/), [ApostropheCMS](https://apostrophecms.com/), [Novadiscovery](http://www.novadiscovery.com/), [Omics Data Automation](https://www.omicsautomation.com), [Flow Mobile](https://www.flowmobile.app/), [DocIQ](https://www.dociq.io/) and [hundreds of awesome individuals](https://github.com/sponsors/ueberdosis).
### Contributing
Feel like adding some magic of your own to Tiptap Editor Core? We welcome contributions! Please see our [CONTRIBUTING](CONTRIBUTING.md) guidelines for how to get started.
### Contributors
[Sam Willis](https://github.com/samwillis),
[Brian Hung](https://github.com/BrianHung),
[Dirk Holtwick](https://github.com/holtwick),
[Sam Duvall](https://github.com/SamDuvall),
[Christoph Flathmann](https://github.com/Chrissi2812),
[Erick Wilder](https://github.com/erickwilder),
[Marius Tolzmann](https://github.com/mariux),
[jjangga0214](https://github.com/jjangga0214),
[Maya Nedeljkovich](https://github.com/mayacoda),
[Ryan Bliss](https://github.com/ryanbliss),
[Gregor](https://github.com/gambolputty) and [many more](../../contributors).
## License
The MIT License (MIT). Please see [License File](LICENSE.md) for more information.
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Reporting Vulnerabilities
If you discover a security vulnerability in Tiptap, please report it responsibly. We appreciate your help in keeping our users safe.
### How to Report
**Please do not report security vulnerabilities through public GitHub issues.**
Send details to security@tiptap.dev. Include a description of the vulnerability, steps to reproduce, and any potential impact.
We will acknowledge receipt within 48 hours and provide updates as we investigate.
## Response Process
Vulnerabilities are assessed and prioritized based on severity, exploitability, and business impact. Fixes are deployed according to the following timelines:
- **Critical** (e.g., remote code execution, data breaches): Fixed and released within 24 hours.
- **High** (e.g., significant data exposure): Fixed and released within 72 hours.
- **Medium** (e.g., moderate leaks): Fixed and released within 14 days.
- **Low** (e.g., minor issues): Addressed in the next scheduled update.
We follow responsible disclosure practices and will credit reporters unless requested otherwise.
## Scope
This policy applies to all Tiptap packages and related infrastructure. Reports are handled through our established vulnerability management process.
## Contact
For questions, email security@tiptap.dev or humans@tiptap.dev.
================================================
FILE: babel.config.js
================================================
module.exports = {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-nullish-coalescing-operator', '@babel/plugin-proposal-optional-chaining'],
}
================================================
FILE: commitlint.config.mjs
================================================
export default { extends: ['@commitlint/config-conventional'] }
================================================
FILE: demos/CHANGELOG.md
================================================
# Change Log
## 3.0.1
### Major Changes
- a92f4a6: We are now building packages with tsup which does not support UMD builds, please repackage if you require UMD builds
### Patch Changes
- 89bd9c7: Enforce type imports so that the bundler ignores TypeScript type imports when generating the index.js file of the dist directory
- 8c69002: Synced beta with stable features
## 3.0.0-beta.1
### Patch Changes
- 8c69002: Synced beta with stable features
## 3.0.0-next.2
### Patch Changes
- 89bd9c7: Enforce type imports so that the bundler ignores TypeScript type imports when generating the index.js file of the dist directory
## 3.0.0-next.1
### Major Changes
- a92f4a6: We are now building packages with tsup which does not support UMD builds, please repackage if you require UMD builds
## 3.0.0-next.0
### Major Changes
- a92f4a6: We are now building packages with tsup which does not support UMD builds, please repackage if you require UMD builds
## 2.5.2
### Patch Changes
- 98fffbb: Upgraded prosemirror-tables to 1.6.3 to fix cells being resizable while the editor is uneditable
## 2.5.1
### Patch Changes
- 7619215: The link extension's `validate` option now applies to both auto-linking and XSS mitigation. While, the new `shouldAutoLink` option is used to disable auto linking on an otherwise valid url.
## 2.5.0
### Minor Changes
- 6834a7f: Bundling of packages no longer includes tiptap dependency type definitions
## 2.4.2
### Patch Changes
- d6e56c4: declare lowlight to be a peer dep of extension-code-block-lowlight, update usage to v3
## 2.4.1
### Patch Changes
- 85d21ca: Updated demos and reverted vue specific performance enhancements until we know they work
> in commit ff04353b3ee0e6fc63733a673e2b27d2272a3355 revert: "fix(vue-3): faster component rendering (#5206)"
> This reverts commit 31f37464912b7b21f3a565ca63222b9f5b6cce00.
and
> in commit dbab8e42eac893a0237566fb30c14b4ed0f3674a revert: "fix(vue-3): fix editor.state updating too late during a transaction due to reactiveState fixes #4870 (#5252)"
> This reverts commit 509676ed4a63b84b904a98c1e34d18449d25c2a7.
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [2.4.0](https://github.com/ueberdosis/tiptap/compare/v2.3.2...v2.4.0) (2024-05-14)
**Note:** Version bump only for package tiptap-demos
## [2.3.2](https://github.com/ueberdosis/tiptap/compare/v2.3.1...v2.3.2) (2024-05-08)
### Bug Fixes
- NodePos querySelectorAll function ([#5094](https://github.com/ueberdosis/tiptap/issues/5094)) ([4900a27](https://github.com/ueberdosis/tiptap/commit/4900a27c5389d9a2d0d69f407ca3db0155304315))
## [2.3.1](https://github.com/ueberdosis/tiptap/compare/v2.3.0...v2.3.1) (2024-04-30)
**Note:** Version bump only for package tiptap-demos
# [2.3.0](https://github.com/ueberdosis/tiptap/compare/v2.2.6...v2.3.0) (2024-04-09)
### Bug Fixes
- **core:** fix nodepos child lookup ([#5038](https://github.com/ueberdosis/tiptap/issues/5038)) ([22ced31](https://github.com/ueberdosis/tiptap/commit/22ced318723003365fbfd8f59b8dac79c7563017))
### Features
- **core:** apply input and paste rules when using insertContent methods ([#5046](https://github.com/ueberdosis/tiptap/issues/5046)) ([96b6abc](https://github.com/ueberdosis/tiptap/commit/96b6abcf6edbc6cac03a391130d9feebb6de3a04))
## [2.2.6](https://github.com/ueberdosis/tiptap/compare/v2.2.5...v2.2.6) (2024-04-06)
**Note:** Version bump only for package tiptap-demos
## [2.2.5](https://github.com/ueberdosis/tiptap/compare/v2.2.4...v2.2.5) (2024-04-05)
**Note:** Version bump only for package tiptap-demos
## [2.2.4](https://github.com/ueberdosis/tiptap/compare/v2.2.3...v2.2.4) (2024-02-23)
**Note:** Version bump only for package tiptap-demos
## [2.2.3](https://github.com/ueberdosis/tiptap/compare/v2.2.2...v2.2.3) (2024-02-15)
### Bug Fixes
- fix test path ([21aa96d](https://github.com/ueberdosis/tiptap/commit/21aa96dee8deab1f439b7f655b8ed266a516a4cd))
## [2.2.2](https://github.com/ueberdosis/tiptap/compare/v2.2.1...v2.2.2) (2024-02-07)
**Note:** Version bump only for package tiptap-demos
## [2.2.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0...v2.2.1) (2024-01-31)
**Note:** Version bump only for package tiptap-demos
# [2.2.0](https://github.com/ueberdosis/tiptap/compare/v2.1.16...v2.2.0) (2024-01-29)
### Bug Fixes
- **core:** fix new lines being added via elementFromString ([#4767](https://github.com/ueberdosis/tiptap/issues/4767)) ([b7a2504](https://github.com/ueberdosis/tiptap/commit/b7a2504f16f46563537c890930cb2c332c256175))
- fix imports, fix demos, unpin y-prosemirror ([681aa57](https://github.com/ueberdosis/tiptap/commit/681aa577bff500015c3f925e300c55a71c73efaf))
- fix newline stripping via insertContent ([8954007](https://github.com/ueberdosis/tiptap/commit/8954007b2b92b040d69b26a0866ae58fabf5e512))
# [2.2.0-rc.8](https://github.com/ueberdosis/tiptap/compare/v2.1.14...v2.2.0-rc.8) (2024-01-08)
# [2.2.0-rc.7](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.6...v2.2.0-rc.7) (2023-11-27)
# [2.2.0-rc.6](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.5...v2.2.0-rc.6) (2023-11-23)
# [2.2.0-rc.4](https://github.com/ueberdosis/tiptap/compare/v2.1.11...v2.2.0-rc.4) (2023-10-10)
# [2.2.0-rc.3](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.2...v2.2.0-rc.3) (2023-08-18)
# [2.2.0-rc.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.0...v2.2.0-rc.1) (2023-08-18)
# [2.2.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.2.0-rc.0) (2023-08-18)
### Features
- **placeholder:** allow editor-is-empty class on any node ([#4335](https://github.com/ueberdosis/tiptap/issues/4335)) ([ff929b1](https://github.com/ueberdosis/tiptap/commit/ff929b179de930619005a773bb4186ae2aa2ec58))
## [2.1.16](https://github.com/ueberdosis/tiptap/compare/v2.1.15...v2.1.16) (2024-01-10)
### Bug Fixes
- **core:** fix new lines being added via elementFromString ([#4767](https://github.com/ueberdosis/tiptap/issues/4767)) ([2235908](https://github.com/ueberdosis/tiptap/commit/2235908c28f388eda041d1d5d017554d513fe909))
## [2.1.15](https://github.com/ueberdosis/tiptap/compare/v2.1.14...v2.1.15) (2024-01-08)
### Bug Fixes
- **core:** fix insertContentAt keeping new lines in html content ([#4465](https://github.com/ueberdosis/tiptap/issues/4465)) ([135a12f](https://github.com/ueberdosis/tiptap/commit/135a12f7aa2df839a0b619704110a360b980c738))
- **link:** fix tests ([d495d92](https://github.com/ueberdosis/tiptap/commit/d495d92a1f7b1c51e09ac8f4934e15a2d1cf070d))
## [2.1.14](https://github.com/ueberdosis/tiptap/compare/v2.1.13...v2.1.14) (2024-01-08)
### Bug Fixes
- **typography:** require spaces after divisions to not break date formats ([#4696](https://github.com/ueberdosis/tiptap/issues/4696)) ([f6d7e00](https://github.com/ueberdosis/tiptap/commit/f6d7e00a746a67fa440a3fa0f5362295959873d2))
## [2.1.13](https://github.com/ueberdosis/tiptap/compare/v2.1.12...v2.1.13) (2023-11-30)
**Note:** Version bump only for package tiptap-demos
## [2.1.12](https://github.com/ueberdosis/tiptap/compare/v2.1.11...v2.1.12) (2023-10-11)
**Note:** Version bump only for package tiptap-demos
## [2.1.11](https://github.com/ueberdosis/tiptap/compare/v2.1.10...v2.1.11) (2023-09-20)
### Reverts
- Revert "v2.2.11" ([6aa755a](https://github.com/ueberdosis/tiptap/commit/6aa755a04b9955fc175c7ab33dee527d0d5deef0))
## [2.1.10](https://github.com/ueberdosis/tiptap/compare/v2.1.9...v2.1.10) (2023-09-15)
**Note:** Version bump only for package tiptap-demos
## [2.1.9](https://github.com/ueberdosis/tiptap/compare/v2.1.8...v2.1.9) (2023-09-14)
**Note:** Version bump only for package tiptap-demos
## [2.1.8](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.7...v2.1.8) (2023-09-04)
**Note:** Version bump only for package tiptap-demos
## [2.1.7](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.6...v2.1.7) (2023-09-04)
**Note:** Version bump only for package tiptap-demos
## [2.1.6](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.1.6) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
# [2.2.0-rc.2](https://github.com/ueberdosis/tiptap/compare/v2.1.6...v2.2.0-rc.2) (2023-08-18)
# [2.2.0-rc.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.0...v2.2.0-rc.1) (2023-08-18)
# [2.2.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.2.0-rc.0) (2023-08-18)
### Features
- **placeholder:** allow editor-is-empty class on any node ([#4335](https://github.com/ueberdosis/tiptap/issues/4335)) ([ff929b1](https://github.com/ueberdosis/tiptap/commit/ff929b179de930619005a773bb4186ae2aa2ec58))
# [2.2.0-rc.1](https://github.com/ueberdosis/tiptap/compare/v2.2.0-rc.0...v2.2.0-rc.1) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
# [2.2.0-rc.0](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.2.0-rc.0) (2023-08-18)
### Features
- **placeholder:** allow editor-is-empty class on any node ([#4335](https://github.com/ueberdosis/tiptap/issues/4335)) ([ff929b1](https://github.com/ueberdosis/tiptap/commit/ff929b179de930619005a773bb4186ae2aa2ec58))
## [2.1.6](https://github.com/ueberdosis/tiptap/compare/v2.1.5...v2.1.6) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
## [2.1.5](https://github.com/ueberdosis/tiptap/compare/v2.1.4...v2.1.5) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
## [2.1.4](https://github.com/ueberdosis/tiptap/compare/v2.1.3...v2.1.4) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
## [2.1.3](https://github.com/ueberdosis/tiptap/compare/v2.1.2...v2.1.3) (2023-08-18)
**Note:** Version bump only for package tiptap-demos
## [2.1.2](https://github.com/ueberdosis/tiptap/compare/v2.1.1...v2.1.2) (2023-08-17)
### Bug Fixes
- **core:** fix error when merging class attributes ([#4340](https://github.com/ueberdosis/tiptap/issues/4340)) ([a251946](https://github.com/ueberdosis/tiptap/commit/a2519468589e2baa44901a66a3a06b24dc8626d6))
## [2.1.1](https://github.com/ueberdosis/tiptap/compare/v2.1.0...v2.1.1) (2023-08-16)
**Note:** Version bump only for package tiptap-demos
# [2.1.0](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.14...v2.1.0) (2023-08-16)
**Note:** Version bump only for package tiptap-demos
# [2.1.0-rc.14](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.13...v2.1.0-rc.14) (2023-08-11)
**Note:** Version bump only for package tiptap-demos
# [2.1.0-rc.13](https://github.com/ueberdosis/tiptap-workspace/compare/v2.0.4...v2.1.0-rc.13) (2023-08-11)
### Bug Fixes
- **demos:** add missing extensions ([6383fd5](https://github.com/ueberdosis/tiptap-workspace/commit/6383fd54080b2ad555286cd0e7c4ad880200200f))
- **demos:** update deps ([05a2edf](https://github.com/ueberdosis/tiptap-workspace/commit/05a2edfc16e297effa86d1583fb1680be0320f25))
- **strikethrough:** update strikethrough shortcut ([#4288](https://github.com/ueberdosis/tiptap-workspace/issues/4288)) ([fd35db4](https://github.com/ueberdosis/tiptap-workspace/commit/fd35db4d090d9fdfef1196fb1f6f858f13cf53d1))
# [2.1.0-rc.12](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.11...v2.1.0-rc.12) (2023-07-14)
# [2.1.0-rc.11](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.10...v2.1.0-rc.11) (2023-07-07)
### Bug Fixes
- **tests:** fix link rel tests ([c1d1854](https://github.com/ueberdosis/tiptap-workspace/commit/c1d18543b03b1fb6b99a2f3546aa5da10c919920))
# [2.1.0-rc.10](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.9...v2.1.0-rc.10) (2023-07-07)
### Bug Fixes
- **react:** check props.clientRect before creating ReactRenderer ([#4138](https://github.com/ueberdosis/tiptap-workspace/issues/4138)) ([d710846](https://github.com/ueberdosis/tiptap-workspace/commit/d710846ecb6a3059dfbc21300b9a4b887a8defa3))
# [2.1.0-rc.9](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.8...v2.1.0-rc.9) (2023-06-15)
# [2.1.0-rc.8](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.7...v2.1.0-rc.8) (2023-05-25)
# [2.1.0-rc.5](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.4...v2.1.0-rc.5) (2023-05-25)
### Features
- add tiptap class ([614fc80](https://github.com/ueberdosis/tiptap-workspace/commit/614fc8082c376bf3c40a05c23ceda6b4a6fbf8d0))
# [2.1.0-rc.4](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.3...v2.1.0-rc.4) (2023-04-27)
# [2.1.0-rc.3](https://github.com/ueberdosis/tiptap-workspace/compare/v2.1.0-rc.2...v2.1.0-rc.3) (2023-04-26)
# [2.1.0-rc.2](https://github.com/ueberdosis/tiptap-workspace/compare/v2.0.3...v2.1.0-rc.2) (2023-04-26)
### Bug Fixes
- **extension-link:** fix link not being kept when pasting url with link ([#3975](https://github.com/ueberdosis/tiptap-workspace/issues/3975)) ([e7d7d49](https://github.com/ueberdosis/tiptap-workspace/commit/e7d7d496376c8c11e24c342e20bd179a6ea7dcee))
# [2
gitextract_m6860ykr/ ├── .changeset/ │ ├── README.md │ └── config.json ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .github/ │ ├── CODEOWNERS │ ├── DISCUSSION_TEMPLATE/ │ │ ├── community-extensions.yml │ │ ├── feature-requests.yml │ │ └── showcase.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── bug_report_pro.yml │ │ ├── config.yml │ │ └── documentation.yml │ ├── dependabot.yml │ ├── instructions/ │ │ ├── PR.instructions.md │ │ ├── changeset.instructions.md │ │ └── tiptap.instructions.md │ ├── pull_request_template.md │ └── workflows/ │ ├── build.yml │ ├── notify-discord.yml │ └── publish.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .npmrc ├── .prettierignore ├── .prettierrc ├── .vscode/ │ ├── launch.json │ └── settings.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── SECURITY.md ├── babel.config.js ├── commitlint.config.mjs ├── demos/ │ ├── CHANGELOG.md │ ├── dedupeDeps.txt │ ├── index.html │ ├── package.json │ ├── postcss.config.cjs │ ├── preview/ │ │ ├── Demo.vue │ │ ├── DemoFrame.vue │ │ ├── Shiki.vue │ │ ├── index.html │ │ ├── index.js │ │ ├── index.vue │ │ ├── shiki.worker.js │ │ └── style.css │ ├── public/ │ │ └── _redirects │ ├── setup/ │ │ ├── helper.ts │ │ ├── js.ts │ │ ├── react.ts │ │ ├── style.scss │ │ ├── svelte.ts │ │ └── vue.ts │ ├── src/ │ │ ├── Commands/ │ │ │ ├── Cut/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ ├── InsertContent/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ ├── InsertContentApplyingRules/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ └── SetContent/ │ │ │ └── React/ │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── index.spec.js │ │ │ └── styles.scss │ │ ├── Demos/ │ │ │ ├── CollaborationSplitPane/ │ │ │ │ └── React/ │ │ │ │ ├── Editor.jsx │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ └── SingleRoomCollab/ │ │ │ └── React/ │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── index.spec.js │ │ │ └── styles.scss │ │ ├── Dev/ │ │ │ └── .gitkeep │ │ ├── Examples/ │ │ │ ├── Accessibility/ │ │ │ │ └── React/ │ │ │ │ ├── InsertMenu.tsx │ │ │ │ ├── MenuBar.tsx │ │ │ │ ├── TextMenu.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── useMenubarNav.ts │ │ │ ├── AutolinkValidation/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Book/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ ├── Vue/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── index.vue │ │ │ │ └── content.js │ │ │ ├── CSSModules/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.module.css │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.module.css │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CodeBlockLanguage/ │ │ │ │ ├── React/ │ │ │ │ │ ├── CodeBlockComponent.jsx │ │ │ │ │ ├── CodeBlockComponent.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── CodeBlockComponent.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CollaborativeEditing/ │ │ │ │ ├── React/ │ │ │ │ │ ├── MenuBar.jsx │ │ │ │ │ ├── MenuBar.scss │ │ │ │ │ ├── MenuItem.jsx │ │ │ │ │ ├── MenuItem.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── MenuBar.vue │ │ │ │ ├── MenuItem.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Community/ │ │ │ │ ├── React/ │ │ │ │ │ ├── MentionList.jsx │ │ │ │ │ ├── MentionList.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── suggestion.js │ │ │ │ └── Vue/ │ │ │ │ ├── MentionList.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.vue │ │ │ │ └── suggestion.js │ │ │ ├── CustomDocument/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CustomParagraph/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Paragraph.jsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Default/ │ │ │ │ ├── React/ │ │ │ │ │ ├── MenuBar.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── menuBarState.ts │ │ │ │ │ └── styles.scss │ │ │ │ ├── Svelte/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.svelte │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Drawing/ │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Paper.js │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── EnterShortcuts/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Formatting/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Images/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── InteractivityComponent/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Component.jsx │ │ │ │ │ ├── Extension.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── InteractivityComponentContent/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Component.jsx │ │ │ │ │ ├── Extension.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── InteractivityComponentProvideInject/ │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Editor.vue │ │ │ │ ├── Extension.js │ │ │ │ ├── ValidateInject.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── JSX/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Paragraph.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── Paragraph.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── MarkdownShortcuts/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Menus/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Minimal/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── MultiMention/ │ │ │ │ ├── React/ │ │ │ │ │ ├── MentionList.jsx │ │ │ │ │ ├── MentionList.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── suggestions.js │ │ │ │ └── Vue/ │ │ │ │ ├── MentionList.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.vue │ │ │ │ └── suggestions.js │ │ │ ├── NodePos/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ ├── Performance/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ ├── ResizableImages/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── ResizableNodes/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Savvy/ │ │ │ │ ├── React/ │ │ │ │ │ ├── ColorHighlighter.ts │ │ │ │ │ ├── SmilieReplacer.ts │ │ │ │ │ ├── findColors.ts │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── ColorHighlighter.ts │ │ │ │ ├── SmilieReplacer.ts │ │ │ │ ├── findColors.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── StaticRendering/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── StaticRenderingAdvanced/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.tsx │ │ │ ├── Tables/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Tasks/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TextDirection/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── TransformPastedHTML/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ └── Transition/ │ │ │ └── Vue/ │ │ │ ├── Extension.js │ │ │ ├── ParentComponent.vue │ │ │ ├── VueComponent.vue │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.vue │ │ ├── Experiments/ │ │ │ ├── All/ │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── CollaborationAnnotation/ │ │ │ │ └── Vue/ │ │ │ │ ├── extension/ │ │ │ │ │ ├── AnnotationItem.ts │ │ │ │ │ ├── AnnotationPlugin.ts │ │ │ │ │ ├── AnnotationState.ts │ │ │ │ │ ├── collaboration-annotation.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CollaborationMappingPerformance/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── Commands/ │ │ │ │ └── Vue/ │ │ │ │ ├── CommandsList.vue │ │ │ │ ├── commands.js │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.vue │ │ │ │ └── suggestion.js │ │ │ ├── DestroyingEditor/ │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Embeds/ │ │ │ │ └── Vue/ │ │ │ │ ├── iframe.ts │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── ExtensionStorage/ │ │ │ │ ├── React/ │ │ │ │ │ ├── CustomExtension.ts │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── CustomExtension.ts │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Figure/ │ │ │ │ └── Vue/ │ │ │ │ ├── figure.ts │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── GenericFigure/ │ │ │ │ └── Vue/ │ │ │ │ ├── figcaption.ts │ │ │ │ ├── figure.ts │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── GlobalDragHandle/ │ │ │ │ └── Vue/ │ │ │ │ ├── DragHandle.js │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── IsolatingClear/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── content.ts │ │ │ ├── Linter/ │ │ │ │ └── Vue/ │ │ │ │ ├── extension/ │ │ │ │ │ ├── Linter.ts │ │ │ │ │ ├── LinterPlugin.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── plugins/ │ │ │ │ │ ├── BadWords.ts │ │ │ │ │ ├── HeadingLevel.ts │ │ │ │ │ └── Punctuation.ts │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── MultipleEditorStyles/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ └── index.tsx │ │ │ ├── MultipleEditors/ │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── OnDelete/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── OnUpdateRerender/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── TiptapComponent.vue │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ └── Tailwind/ │ │ │ └── JS/ │ │ │ └── index.html │ │ ├── Extensions/ │ │ │ ├── BackgroundColor/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── BubbleMenu/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── CharacterCount/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Collaboration/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CollaborationCaret/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CollaborationMapPositions/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── CollaborationWithMenus/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Color/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── DragHandle/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.vue │ │ │ │ └── style.css │ │ │ ├── DragHandleWithNodeViews/ │ │ │ │ └── React/ │ │ │ │ ├── extensions/ │ │ │ │ │ └── recommendation/ │ │ │ │ │ ├── Recommendation.jsx │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── views/ │ │ │ │ │ ├── RecommendationView.jsx │ │ │ │ │ └── index.jsx │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ └── styles.scss │ │ │ ├── Dropcursor/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── FileHandler/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── FloatingMenu/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Focus/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── FontFamily/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── FontSize/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.spec.js │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Gapcursor/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── InvisibleCharacters/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── LineHeight/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.vue │ │ │ │ └── styles.scss │ │ │ ├── ListKeymap/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ └── styles.scss │ │ │ ├── Mathematics/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Placeholder/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Selection/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TableOfContents/ │ │ │ │ ├── React/ │ │ │ │ │ ├── ToC.jsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ ├── Vue/ │ │ │ │ │ ├── ToC.vue │ │ │ │ │ ├── ToCEmptyState.vue │ │ │ │ │ ├── ToCItem.vue │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── index.vue │ │ │ │ └── content.js │ │ │ ├── TextAlign/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TrailingNode/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Typography/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TypographyWithOverrides/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.spec.js │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── UndoRedo/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── UniqueID/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ └── UniqueIDWithYdoc/ │ │ │ └── React/ │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ ├── index.spec.js │ │ │ └── styles.scss │ │ ├── GuideContent/ │ │ │ ├── ExportHTML/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── ExportJSON/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── GenerateHTML/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── index.tsx │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── GenerateJSON/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.spec.js │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── GenerateText/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.spec.js │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── ReadOnly/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── StaticRenderHTML/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── index.tsx │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ └── StaticRenderReact/ │ │ │ └── React/ │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.tsx │ │ ├── GuideGettingStarted/ │ │ │ └── VModel/ │ │ │ └── Vue/ │ │ │ ├── Editor.vue │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.vue │ │ ├── GuideMarkViews/ │ │ │ ├── ReactComponent/ │ │ │ │ └── React/ │ │ │ │ ├── Component.tsx │ │ │ │ ├── Extension.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ └── VueComponent/ │ │ │ └── Vue/ │ │ │ ├── Component.vue │ │ │ ├── Extension.ts │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.vue │ │ ├── GuideNodeViews/ │ │ │ ├── DragHandle/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Component.jsx │ │ │ │ │ ├── DraggableItem.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── DraggableItem.js │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── JavaScript/ │ │ │ │ └── Vue/ │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── JavaScriptContent/ │ │ │ │ └── Vue/ │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── ReactComponent/ │ │ │ │ └── React/ │ │ │ │ ├── Component.tsx │ │ │ │ ├── Extension.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── ReactComponentContent/ │ │ │ │ └── React/ │ │ │ │ ├── Component.jsx │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ └── styles.scss │ │ │ ├── ReactComponentContext/ │ │ │ │ └── React/ │ │ │ │ ├── Component.tsx │ │ │ │ ├── Context.ts │ │ │ │ ├── Extension.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── VueComponent/ │ │ │ │ └── Vue/ │ │ │ │ ├── Component.vue │ │ │ │ ├── Extension.js │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ └── VueComponentContent/ │ │ │ └── Vue/ │ │ │ ├── Component.vue │ │ │ ├── Extension.js │ │ │ ├── index.html │ │ │ └── index.vue │ │ ├── Markdown/ │ │ │ ├── CustomSyntax/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ └── styles.scss │ │ │ ├── Full/ │ │ │ │ └── React/ │ │ │ │ ├── content.ts │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── Parse/ │ │ │ │ └── React/ │ │ │ │ ├── index.html │ │ │ │ └── index.jsx │ │ │ └── Serialize/ │ │ │ └── React/ │ │ │ ├── index.html │ │ │ ├── index.jsx │ │ │ └── styles.scss │ │ ├── Marks/ │ │ │ ├── Bold/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Code/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Highlight/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Italic/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Link/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Strike/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Subscript/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Superscript/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TextStyle/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ └── Underline/ │ │ │ ├── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ └── Vue/ │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.vue │ │ ├── Nodes/ │ │ │ ├── Audio/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Blockquote/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── BulletList/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CodeBlock/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── CodeBlockLowlight/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ ├── Details/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Document/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Emoji/ │ │ │ │ ├── React/ │ │ │ │ │ ├── EmojiList.jsx │ │ │ │ │ ├── EmojiList.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── suggestion.js │ │ │ │ └── Vue/ │ │ │ │ ├── EmojiList.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.vue │ │ │ │ └── suggestion.js │ │ │ ├── HardBreak/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Heading/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── HorizontalRule/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Image/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── ListItem/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Mention/ │ │ │ │ ├── React/ │ │ │ │ │ ├── MentionList.jsx │ │ │ │ │ ├── MentionList.scss │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── suggestion.js │ │ │ │ └── Vue/ │ │ │ │ ├── MentionList.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ ├── index.vue │ │ │ │ └── suggestion.js │ │ │ ├── OrderedList/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Paragraph/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Table/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TaskItem/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── TaskList/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Text/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.js │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ ├── index.spec.js │ │ │ │ └── index.vue │ │ │ ├── Twitch/ │ │ │ │ ├── React/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── styles.scss │ │ │ │ └── Vue/ │ │ │ │ ├── index.html │ │ │ │ └── index.vue │ │ │ └── Youtube/ │ │ │ ├── React/ │ │ │ │ ├── index.html │ │ │ │ ├── index.jsx │ │ │ │ ├── index.spec.js │ │ │ │ └── styles.scss │ │ │ └── Vue/ │ │ │ ├── index.html │ │ │ ├── index.spec.js │ │ │ └── index.vue │ │ ├── Overview/ │ │ │ └── Installation/ │ │ │ └── Vue/ │ │ │ ├── index.html │ │ │ └── index.vue │ │ ├── Tutorials/ │ │ │ ├── 1-1-textarea/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Note.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── types.ts │ │ │ │ └── Vue/ │ │ │ │ ├── Note.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.vue │ │ │ │ ├── styles.scss │ │ │ │ └── types.ts │ │ │ ├── 1-2-tiptap/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Note.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── types.ts │ │ │ │ └── Vue/ │ │ │ │ ├── Note.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.vue │ │ │ │ ├── styles.scss │ │ │ │ └── types.ts │ │ │ ├── 1-2-tiptap_lexical/ │ │ │ │ └── Lexical-React/ │ │ │ │ ├── Note.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.css │ │ │ │ └── types.ts │ │ │ ├── 1-3-yjs/ │ │ │ │ ├── React/ │ │ │ │ │ ├── Note.tsx │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.scss │ │ │ │ │ └── types.ts │ │ │ │ └── Vue/ │ │ │ │ ├── Note.vue │ │ │ │ ├── index.html │ │ │ │ ├── index.vue │ │ │ │ ├── styles.scss │ │ │ │ └── types.ts │ │ │ ├── 1-3-yjs_lexical/ │ │ │ │ └── Lexical-React/ │ │ │ │ ├── Note.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.css │ │ │ │ └── types.ts │ │ │ └── 1-4-collab/ │ │ │ ├── React/ │ │ │ │ ├── Note.tsx │ │ │ │ ├── index.html │ │ │ │ ├── index.tsx │ │ │ │ ├── styles.scss │ │ │ │ └── types.ts │ │ │ └── Vue/ │ │ │ ├── Note.vue │ │ │ ├── index.html │ │ │ ├── index.vue │ │ │ ├── styles.scss │ │ │ └── types.ts │ │ └── variables.js │ ├── tailwind.config.js │ ├── tsconfig.json │ └── vite.config.ts ├── env.d.ts ├── package.json ├── packages/ │ ├── core/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── can.spec.ts │ │ │ ├── createNodeFromContent.spec.ts │ │ │ ├── dispatchTransaction.spec.ts │ │ │ ├── editorProps.spec.ts │ │ │ ├── extendExtensions.spec.ts │ │ │ ├── extendMarkRange.spec.ts │ │ │ ├── extensionOptions.spec.ts │ │ │ ├── extensionStorage.spec.ts │ │ │ ├── fromString.spec.ts │ │ │ ├── generateHTML.spec.ts │ │ │ ├── generateJSON.spec.ts │ │ │ ├── generateText.spec.ts │ │ │ ├── getAttributesFromExtensions.spec.ts │ │ │ ├── getMarkRange.spec.ts │ │ │ ├── getTextContentFromNodes.spec.ts │ │ │ ├── isActive.spec.ts │ │ │ ├── isNodeEmpty.spec.ts │ │ │ ├── mergeAttributes.spec.ts │ │ │ ├── mergeDeep.spec.ts │ │ │ ├── nodePos.spec.ts │ │ │ ├── onContentError.spec.ts │ │ │ ├── requiredAttributes.spec.ts │ │ │ └── unmounted.spec.ts │ │ ├── jsx-dev-runtime/ │ │ │ ├── index.cjs │ │ │ ├── index.d.cts │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── jsx-runtime/ │ │ │ ├── index.cjs │ │ │ ├── index.d.cts │ │ │ ├── index.d.ts │ │ │ └── index.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── CommandManager.ts │ │ │ ├── Editor.ts │ │ │ ├── EventEmitter.ts │ │ │ ├── Extendable.ts │ │ │ ├── Extension.ts │ │ │ ├── ExtensionManager.ts │ │ │ ├── InputRule.ts │ │ │ ├── Mark.ts │ │ │ ├── MarkView.ts │ │ │ ├── Node.ts │ │ │ ├── NodePos.ts │ │ │ ├── NodeView.ts │ │ │ ├── PasteRule.ts │ │ │ ├── Tracker.ts │ │ │ ├── __tests__/ │ │ │ │ └── transformPastedHTML.test.ts │ │ │ ├── commands/ │ │ │ │ ├── blur.ts │ │ │ │ ├── clearContent.ts │ │ │ │ ├── clearNodes.ts │ │ │ │ ├── command.ts │ │ │ │ ├── createParagraphNear.ts │ │ │ │ ├── cut.ts │ │ │ │ ├── deleteCurrentNode.ts │ │ │ │ ├── deleteNode.ts │ │ │ │ ├── deleteRange.ts │ │ │ │ ├── deleteSelection.ts │ │ │ │ ├── enter.ts │ │ │ │ ├── exitCode.ts │ │ │ │ ├── extendMarkRange.ts │ │ │ │ ├── first.ts │ │ │ │ ├── focus.ts │ │ │ │ ├── forEach.ts │ │ │ │ ├── index.ts │ │ │ │ ├── insertContent.ts │ │ │ │ ├── insertContentAt.ts │ │ │ │ ├── join.ts │ │ │ │ ├── joinItemBackward.ts │ │ │ │ ├── joinItemForward.ts │ │ │ │ ├── joinTextblockBackward.ts │ │ │ │ ├── joinTextblockForward.ts │ │ │ │ ├── keyboardShortcut.ts │ │ │ │ ├── lift.ts │ │ │ │ ├── liftEmptyBlock.ts │ │ │ │ ├── liftListItem.ts │ │ │ │ ├── newlineInCode.ts │ │ │ │ ├── resetAttributes.ts │ │ │ │ ├── scrollIntoView.ts │ │ │ │ ├── selectAll.ts │ │ │ │ ├── selectNodeBackward.ts │ │ │ │ ├── selectNodeForward.ts │ │ │ │ ├── selectParentNode.ts │ │ │ │ ├── selectTextblockEnd.ts │ │ │ │ ├── selectTextblockStart.ts │ │ │ │ ├── setContent.ts │ │ │ │ ├── setMark.ts │ │ │ │ ├── setMeta.ts │ │ │ │ ├── setNode.ts │ │ │ │ ├── setNodeSelection.ts │ │ │ │ ├── setTextDirection.ts │ │ │ │ ├── setTextSelection.ts │ │ │ │ ├── sinkListItem.ts │ │ │ │ ├── splitBlock.ts │ │ │ │ ├── splitListItem.ts │ │ │ │ ├── toggleList.ts │ │ │ │ ├── toggleMark.ts │ │ │ │ ├── toggleNode.ts │ │ │ │ ├── toggleWrap.ts │ │ │ │ ├── undoInputRule.ts │ │ │ │ ├── unsetAllMarks.ts │ │ │ │ ├── unsetMark.ts │ │ │ │ ├── unsetTextDirection.ts │ │ │ │ ├── updateAttributes.ts │ │ │ │ ├── wrapIn.ts │ │ │ │ └── wrapInList.ts │ │ │ ├── extensions/ │ │ │ │ ├── clipboardTextSerializer.ts │ │ │ │ ├── commands.ts │ │ │ │ ├── delete.ts │ │ │ │ ├── drop.ts │ │ │ │ ├── editable.ts │ │ │ │ ├── focusEvents.ts │ │ │ │ ├── index.ts │ │ │ │ ├── keymap.ts │ │ │ │ ├── paste.ts │ │ │ │ ├── tabindex.ts │ │ │ │ └── textDirection.ts │ │ │ ├── helpers/ │ │ │ │ ├── MappablePosition.ts │ │ │ │ ├── combineTransactionSteps.ts │ │ │ │ ├── createChainableState.ts │ │ │ │ ├── createDocument.ts │ │ │ │ ├── createNodeFromContent.ts │ │ │ │ ├── defaultBlockAt.ts │ │ │ │ ├── findChildren.ts │ │ │ │ ├── findChildrenInRange.ts │ │ │ │ ├── findParentNode.ts │ │ │ │ ├── findParentNodeClosestToPos.ts │ │ │ │ ├── flattenExtensions.ts │ │ │ │ ├── generateHTML.ts │ │ │ │ ├── generateJSON.ts │ │ │ │ ├── generateText.ts │ │ │ │ ├── getAttributes.ts │ │ │ │ ├── getAttributesFromExtensions.ts │ │ │ │ ├── getChangedRanges.ts │ │ │ │ ├── getDebugJSON.ts │ │ │ │ ├── getExtensionField.ts │ │ │ │ ├── getHTMLFromFragment.ts │ │ │ │ ├── getMarkAttributes.ts │ │ │ │ ├── getMarkRange.ts │ │ │ │ ├── getMarkType.ts │ │ │ │ ├── getMarksBetween.ts │ │ │ │ ├── getNodeAtPosition.ts │ │ │ │ ├── getNodeAttributes.ts │ │ │ │ ├── getNodeType.ts │ │ │ │ ├── getRenderedAttributes.ts │ │ │ │ ├── getSchema.ts │ │ │ │ ├── getSchemaByResolvedExtensions.ts │ │ │ │ ├── getSchemaTypeByName.ts │ │ │ │ ├── getSchemaTypeNameByName.ts │ │ │ │ ├── getSplittedAttributes.ts │ │ │ │ ├── getText.ts │ │ │ │ ├── getTextBetween.ts │ │ │ │ ├── getTextContentFromNodes.ts │ │ │ │ ├── getTextSerializersFromSchema.ts │ │ │ │ ├── index.ts │ │ │ │ ├── injectExtensionAttributesToParseRule.ts │ │ │ │ ├── isActive.ts │ │ │ │ ├── isAtEndOfNode.ts │ │ │ │ ├── isAtStartOfNode.ts │ │ │ │ ├── isExtensionRulesEnabled.ts │ │ │ │ ├── isList.ts │ │ │ │ ├── isMarkActive.ts │ │ │ │ ├── isNodeActive.ts │ │ │ │ ├── isNodeEmpty.ts │ │ │ │ ├── isNodeSelection.ts │ │ │ │ ├── isTextSelection.ts │ │ │ │ ├── posToDOMRect.ts │ │ │ │ ├── resolveExtensions.ts │ │ │ │ ├── resolveFocusPosition.ts │ │ │ │ ├── rewriteUnknownContent.ts │ │ │ │ ├── selectionToInsertionEnd.ts │ │ │ │ ├── sortExtensions.ts │ │ │ │ └── splitExtensions.ts │ │ │ ├── index.ts │ │ │ ├── inputRules/ │ │ │ │ ├── index.ts │ │ │ │ ├── markInputRule.ts │ │ │ │ ├── nodeInputRule.ts │ │ │ │ ├── textInputRule.ts │ │ │ │ ├── textblockTypeInputRule.ts │ │ │ │ └── wrappingInputRule.ts │ │ │ ├── jsx-runtime.ts │ │ │ ├── lib/ │ │ │ │ ├── ResizableNodeView.ts │ │ │ │ └── index.ts │ │ │ ├── pasteRules/ │ │ │ │ ├── index.ts │ │ │ │ ├── markPasteRule.ts │ │ │ │ ├── nodePasteRule.ts │ │ │ │ └── textPasteRule.ts │ │ │ ├── style.ts │ │ │ ├── types.ts │ │ │ └── utilities/ │ │ │ ├── callOrReturn.ts │ │ │ ├── canInsertNode.ts │ │ │ ├── createStyleTag.ts │ │ │ ├── deleteProps.ts │ │ │ ├── elementFromString.ts │ │ │ ├── escapeForRegEx.ts │ │ │ ├── findDuplicates.ts │ │ │ ├── fromString.ts │ │ │ ├── index.ts │ │ │ ├── isAndroid.ts │ │ │ ├── isEmptyObject.ts │ │ │ ├── isFirefox.ts │ │ │ ├── isFunction.ts │ │ │ ├── isMacOS.ts │ │ │ ├── isNumber.ts │ │ │ ├── isPlainObject.ts │ │ │ ├── isRegExp.ts │ │ │ ├── isSafari.ts │ │ │ ├── isString.ts │ │ │ ├── isiOS.ts │ │ │ ├── markdown/ │ │ │ │ ├── attributeUtils.ts │ │ │ │ ├── createAtomBlockMarkdownSpec.ts │ │ │ │ ├── createBlockMarkdownSpec.ts │ │ │ │ ├── createInlineMarkdownSpec.ts │ │ │ │ ├── index.ts │ │ │ │ ├── parseIndentedBlocks.ts │ │ │ │ └── renderNestedMarkdownContent.ts │ │ │ ├── mergeAttributes.ts │ │ │ ├── mergeDeep.ts │ │ │ ├── minMax.ts │ │ │ ├── objectIncludes.ts │ │ │ └── removeDuplicates.ts │ │ └── tsup.config.ts │ ├── extension-audio/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── audio.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── audio.ts │ │ │ ├── index.ts │ │ │ └── utils.ts │ │ └── tsup.config.ts │ ├── extension-blockquote/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── blockquote.tsx │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-bold/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── bold.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── bold.tsx │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-bubble-menu/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── bubble-menu-plugin.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── bubble-menu-plugin.ts │ │ │ ├── bubble-menu.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-bullet-list/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-code/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── code.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-code-block/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── code-block.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-code-block-lowlight/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── codeBlockLowlight.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── code-block-lowlight.ts │ │ │ ├── index.ts │ │ │ └── lowlight-plugin.ts │ │ └── tsup.config.ts │ ├── extension-collaboration/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── collaboration.ts │ │ │ ├── helpers/ │ │ │ │ ├── CollaborationMappablePosition.ts │ │ │ │ ├── isChangeOrigin.ts │ │ │ │ └── yRelativePosition.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-collaboration-caret/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── collaboration-caret.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── collaboration-caret.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-color/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-details/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── content/ │ │ │ │ ├── details-content.ts │ │ │ │ └── index.ts │ │ │ ├── details.ts │ │ │ ├── helpers/ │ │ │ │ ├── findClosestVisibleNode.ts │ │ │ │ ├── isNodeVisible.ts │ │ │ │ └── setGapCursor.ts │ │ │ ├── index.ts │ │ │ └── summary/ │ │ │ ├── details-summary.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-document/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── document.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-drag-handle/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── defaultRules.spec.ts │ │ │ ├── drag-handle.spec.ts │ │ │ ├── edgeDetection.spec.ts │ │ │ ├── findBestDragTarget.spec.ts │ │ │ ├── normalizeOptions.spec.ts │ │ │ └── scoring.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── drag-handle-plugin.ts │ │ │ ├── drag-handle.ts │ │ │ ├── helpers/ │ │ │ │ ├── cloneElement.ts │ │ │ │ ├── defaultRules.ts │ │ │ │ ├── dragHandler.ts │ │ │ │ ├── edgeDetection.ts │ │ │ │ ├── findBestDragTarget.ts │ │ │ │ ├── findNextElementFromCursor.ts │ │ │ │ ├── getComputedStyle.ts │ │ │ │ ├── getInnerCoords.ts │ │ │ │ ├── getOuterNode.ts │ │ │ │ ├── minMax.ts │ │ │ │ ├── normalizeOptions.ts │ │ │ │ ├── removeNode.ts │ │ │ │ └── scoring.ts │ │ │ ├── index.ts │ │ │ └── types/ │ │ │ ├── options.ts │ │ │ └── rules.ts │ │ └── tsup.config.ts │ ├── extension-drag-handle-react/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── DragHandle.tsx │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-drag-handle-vue-2/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── DragHandle.ts │ │ │ ├── Vue.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-drag-handle-vue-3/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── DragHandle.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-emoji/ │ │ ├── CHANGELOG.md │ │ ├── __tests__/ │ │ │ └── emoji.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── data.ts │ │ │ ├── emoji.ts │ │ │ ├── generate.ts │ │ │ ├── helpers/ │ │ │ │ ├── emojiToShortcode.ts │ │ │ │ ├── removeDuplicates.ts │ │ │ │ ├── removeVariationSelector.ts │ │ │ │ └── shortcodeToEmoji.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-file-handler/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── FileHandlePlugin.ts │ │ │ ├── fileHandler.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ └── tsup.config.ts │ ├── extension-floating-menu/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── floating-menu-plugin.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── floating-menu-plugin.ts │ │ │ ├── floating-menu.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-font-family/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-hard-break/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── hard-break.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-heading/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── heading.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-highlight/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── highlight.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-horizontal-rule/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── horizontalRule.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── horizontal-rule.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-image/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── image.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-invisible-characters/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── invisible-characters.ts │ │ │ ├── plugin/ │ │ │ │ ├── InvisibleCharacter.ts │ │ │ │ ├── InvisibleCharactersPlugin.ts │ │ │ │ ├── InvisibleNode.ts │ │ │ │ ├── index.ts │ │ │ │ ├── invisible-characters/ │ │ │ │ │ ├── hardBreak.ts │ │ │ │ │ ├── paragraph.ts │ │ │ │ │ └── space.ts │ │ │ │ ├── reducers.ts │ │ │ │ ├── style.ts │ │ │ │ └── utils/ │ │ │ │ ├── create-decoration-widget.ts │ │ │ │ ├── create-style-tag.ts │ │ │ │ ├── get-updated-ranges.ts │ │ │ │ └── text-between.ts │ │ │ └── types.ts │ │ └── tsup.config.ts │ ├── extension-italic/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── italic.ts │ │ └── tsup.config.ts │ ├── extension-link/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── link.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── helpers/ │ │ │ │ ├── autolink.ts │ │ │ │ ├── clickHandler.ts │ │ │ │ ├── pasteHandler.ts │ │ │ │ └── whitespace.ts │ │ │ ├── index.ts │ │ │ └── link.ts │ │ └── tsup.config.ts │ ├── extension-list/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── taskItem.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── bullet-list/ │ │ │ │ ├── bullet-list.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── item/ │ │ │ │ ├── index.ts │ │ │ │ └── list-item.ts │ │ │ ├── keymap/ │ │ │ │ ├── index.ts │ │ │ │ ├── list-keymap.ts │ │ │ │ └── listHelpers/ │ │ │ │ ├── findListItemPos.ts │ │ │ │ ├── getNextListDepth.ts │ │ │ │ ├── handleBackspace.ts │ │ │ │ ├── handleDelete.ts │ │ │ │ ├── hasListBefore.ts │ │ │ │ ├── hasListItemAfter.ts │ │ │ │ ├── hasListItemBefore.ts │ │ │ │ ├── index.ts │ │ │ │ ├── listItemHasSubList.ts │ │ │ │ ├── nextListIsDeeper.ts │ │ │ │ └── nextListIsHigher.ts │ │ │ ├── kit/ │ │ │ │ └── index.ts │ │ │ ├── ordered-list/ │ │ │ │ ├── index.ts │ │ │ │ ├── ordered-list.ts │ │ │ │ └── utils.ts │ │ │ ├── task-item/ │ │ │ │ ├── index.ts │ │ │ │ └── task-item.ts │ │ │ └── task-list/ │ │ │ ├── index.ts │ │ │ └── task-list.ts │ │ └── tsup.config.ts │ ├── extension-mathematics/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── extensions/ │ │ │ │ ├── BlockMath.ts │ │ │ │ ├── InlineMath.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── mathematics.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ └── tsup.config.ts │ ├── extension-mention/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── mention.ts │ │ │ └── utils/ │ │ │ └── get-default-suggestion-attributes.ts │ │ └── tsup.config.ts │ ├── extension-node-range/ │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── helpers/ │ │ │ │ ├── NodeRangeBookmark.ts │ │ │ │ ├── NodeRangeSelection.ts │ │ │ │ ├── getNodeRangeDecorations.ts │ │ │ │ ├── getSelectionRanges.ts │ │ │ │ └── isNodeRangeSelection.ts │ │ │ ├── index.ts │ │ │ └── node-range.ts │ │ └── tsup.config.ts │ ├── extension-ordered-list/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-paragraph/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── paragraph.ts │ │ └── tsup.config.ts │ ├── extension-strike/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── strike.ts │ │ └── tsup.config.ts │ ├── extension-subscript/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── subscript.ts │ │ └── tsup.config.ts │ ├── extension-superscript/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── superscript.ts │ │ └── tsup.config.ts │ ├── extension-table/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── tableCell.spec.ts │ │ │ └── tableHeader.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── cell/ │ │ │ │ ├── index.ts │ │ │ │ └── table-cell.ts │ │ │ ├── header/ │ │ │ │ ├── index.ts │ │ │ │ └── table-header.ts │ │ │ ├── index.ts │ │ │ ├── kit/ │ │ │ │ └── index.ts │ │ │ ├── row/ │ │ │ │ ├── index.ts │ │ │ │ └── table-row.ts │ │ │ ├── table/ │ │ │ │ ├── TableView.ts │ │ │ │ ├── index.ts │ │ │ │ ├── table.ts │ │ │ │ └── utilities/ │ │ │ │ ├── colStyle.ts │ │ │ │ ├── createCell.ts │ │ │ │ ├── createColGroup.ts │ │ │ │ ├── createTable.ts │ │ │ │ ├── deleteTableWhenAllCellsSelected.ts │ │ │ │ ├── getTableNodeTypes.ts │ │ │ │ ├── isCellSelection.ts │ │ │ │ └── markdown.ts │ │ │ └── types.ts │ │ └── tsup.config.ts │ ├── extension-table-of-contents/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── plugin.ts │ │ │ ├── tableOfContents.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ └── tsup.config.ts │ ├── extension-text/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── text.ts │ │ └── tsup.config.ts │ ├── extension-text-align/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── text-align.ts │ │ └── tsup.config.ts │ ├── extension-text-style/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── background-color.spec.ts │ │ │ └── color.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── background-color/ │ │ │ │ ├── background-color.ts │ │ │ │ └── index.ts │ │ │ ├── color/ │ │ │ │ ├── color.ts │ │ │ │ └── index.ts │ │ │ ├── font-family/ │ │ │ │ ├── font-family.ts │ │ │ │ └── index.ts │ │ │ ├── font-size/ │ │ │ │ ├── font-size.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── line-height/ │ │ │ │ ├── index.ts │ │ │ │ └── line-height.ts │ │ │ ├── text-style/ │ │ │ │ └── index.ts │ │ │ └── text-style-kit/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-twitch/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── twitch.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── twitch.ts │ │ │ └── utils.ts │ │ └── tsup.config.ts │ ├── extension-typography/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── typography.ts │ │ └── tsup.config.ts │ ├── extension-underline/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── underline.ts │ │ └── tsup.config.ts │ ├── extension-unique-id/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── unique-id-collab.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── generate-unique-ids.ts │ │ │ ├── helpers/ │ │ │ │ └── findDuplicates.ts │ │ │ ├── index.ts │ │ │ └── unique-id.ts │ │ └── tsup.config.ts │ ├── extension-youtube/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── youtube.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── utils.ts │ │ │ └── youtube.ts │ │ └── tsup.config.ts │ ├── extensions/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── placeholder.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── character-count/ │ │ │ │ ├── character-count.ts │ │ │ │ └── index.ts │ │ │ ├── drop-cursor/ │ │ │ │ ├── drop-cursor.ts │ │ │ │ └── index.ts │ │ │ ├── focus/ │ │ │ │ ├── focus.ts │ │ │ │ └── index.ts │ │ │ ├── gap-cursor/ │ │ │ │ ├── gap-cursor.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── placeholder/ │ │ │ │ ├── index.ts │ │ │ │ └── placeholder.ts │ │ │ ├── selection/ │ │ │ │ ├── index.ts │ │ │ │ └── selection.ts │ │ │ ├── trailing-node/ │ │ │ │ ├── index.ts │ │ │ │ └── trailing-node.ts │ │ │ └── undo-redo/ │ │ │ ├── index.ts │ │ │ └── undo-redo.ts │ │ └── tsup.config.ts │ ├── html/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── generateHTML.spec.ts │ │ │ ├── generateJSON.spec.ts │ │ │ └── server-with-jsdom.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── generateHTML.ts │ │ │ ├── generateJSON.ts │ │ │ ├── getHTMLFromFragment.ts │ │ │ ├── index.ts │ │ │ └── server/ │ │ │ ├── generateHTML.ts │ │ │ ├── generateJSON.ts │ │ │ ├── getHTMLFromFragment.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── markdown/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── conversion-files/ │ │ │ │ ├── bullet-list.ts │ │ │ │ ├── custom-atom.ts │ │ │ │ ├── custom-block.ts │ │ │ │ ├── custom-inline.ts │ │ │ │ ├── hard-break-marks.ts │ │ │ │ ├── index.ts │ │ │ │ ├── link-with-title.ts │ │ │ │ ├── link-without-title.ts │ │ │ │ ├── mixed-list-types.ts │ │ │ │ ├── nested-nodes.ts │ │ │ │ ├── ordered-list-separated-by-bullet.ts │ │ │ │ ├── ordered-list-with-bullet-list.ts │ │ │ │ ├── ordered-list.ts │ │ │ │ ├── soft-break-marks.ts │ │ │ │ ├── task-list.ts │ │ │ │ └── trailing-whitespace-marks.ts │ │ │ ├── conversion.spec.ts │ │ │ ├── extensions/ │ │ │ │ └── blockquote.spec.ts │ │ │ ├── inline-marks-punctuation.spec.ts │ │ │ ├── manager.spec.ts │ │ │ ├── mixed-html.spec.ts │ │ │ ├── overlapping-marks.spec.ts │ │ │ ├── paragraph.spec.ts │ │ │ ├── server-side-parsing.spec.ts │ │ │ └── utilities.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Extension.ts │ │ │ ├── MarkdownManager.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ └── tsup.config.ts │ ├── pm/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── changeset/ │ │ │ └── index.ts │ │ ├── collab/ │ │ │ └── index.ts │ │ ├── commands/ │ │ │ └── index.ts │ │ ├── dropcursor/ │ │ │ └── index.ts │ │ ├── gapcursor/ │ │ │ └── index.ts │ │ ├── history/ │ │ │ └── index.ts │ │ ├── inputrules/ │ │ │ └── index.ts │ │ ├── keymap/ │ │ │ └── index.ts │ │ ├── markdown/ │ │ │ └── index.ts │ │ ├── menu/ │ │ │ └── index.ts │ │ ├── model/ │ │ │ └── index.ts │ │ ├── package.json │ │ ├── schema-basic/ │ │ │ └── index.ts │ │ ├── schema-list/ │ │ │ └── index.ts │ │ ├── state/ │ │ │ └── index.ts │ │ ├── tables/ │ │ │ └── index.ts │ │ ├── trailing-node/ │ │ │ └── index.ts │ │ ├── transform/ │ │ │ └── index.ts │ │ ├── tsup.config.ts │ │ └── view/ │ │ └── index.ts │ ├── react/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Context.tsx │ │ │ ├── Editor.ts │ │ │ ├── EditorContent.tsx │ │ │ ├── NodeViewContent.tsx │ │ │ ├── NodeViewWrapper.tsx │ │ │ ├── ReactMarkViewRenderer.tsx │ │ │ ├── ReactNodeViewRenderer.tsx │ │ │ ├── ReactRenderer.tsx │ │ │ ├── Tiptap.tsx │ │ │ ├── index.ts │ │ │ ├── menus/ │ │ │ │ ├── BubbleMenu.spec.ts │ │ │ │ ├── BubbleMenu.tsx │ │ │ │ ├── FloatingMenu.spec.ts │ │ │ │ ├── FloatingMenu.tsx │ │ │ │ ├── getAutoPluginKey.ts │ │ │ │ ├── index.ts │ │ │ │ └── useMenuElementProps.ts │ │ │ ├── types.ts │ │ │ ├── useEditor.ts │ │ │ ├── useEditorState.ts │ │ │ └── useReactNodeView.ts │ │ └── tsup.config.ts │ ├── starter-kit/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── starter-kit.ts │ │ └── tsup.config.ts │ ├── static-renderer/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__/ │ │ │ ├── json-string.spec.ts │ │ │ ├── md-string.spec.ts │ │ │ └── react-string.spec.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── helpers.ts │ │ │ ├── index.ts │ │ │ ├── json/ │ │ │ │ ├── html-string/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── string.ts │ │ │ │ ├── react/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── react.ts │ │ │ │ └── renderer.ts │ │ │ └── pm/ │ │ │ ├── extensionRenderer.ts │ │ │ ├── html-string/ │ │ │ │ ├── html-string.ts │ │ │ │ └── index.ts │ │ │ ├── markdown/ │ │ │ │ ├── index.ts │ │ │ │ └── markdown.ts │ │ │ └── react/ │ │ │ ├── index.ts │ │ │ └── react.ts │ │ └── tsup.config.ts │ ├── suggestion/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ └── suggestion.test.ts │ │ │ ├── findSuggestionMatch.ts │ │ │ ├── index.ts │ │ │ └── suggestion.ts │ │ └── tsup.config.ts │ ├── vue-2/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Editor.ts │ │ │ ├── EditorContent.ts │ │ │ ├── NodeViewContent.ts │ │ │ ├── NodeViewWrapper.ts │ │ │ ├── Vue.ts │ │ │ ├── VueNodeViewRenderer.ts │ │ │ ├── VueRenderer.ts │ │ │ ├── index.ts │ │ │ └── menus/ │ │ │ ├── BubbleMenu.ts │ │ │ ├── FloatingMenu.ts │ │ │ └── index.ts │ │ └── tsup.config.ts │ └── vue-3/ │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__/ │ │ ├── VueMarkViewRenderer.spec.ts │ │ └── VueRenderer.spec.ts │ ├── package.json │ ├── src/ │ │ ├── Editor.ts │ │ ├── EditorContent.ts │ │ ├── NodeViewContent.ts │ │ ├── NodeViewWrapper.ts │ │ ├── VueMarkViewRenderer.ts │ │ ├── VueNodeViewRenderer.ts │ │ ├── VueRenderer.ts │ │ ├── index.ts │ │ ├── menus/ │ │ │ ├── BubbleMenu.ts │ │ │ ├── FloatingMenu.ts │ │ │ └── index.ts │ │ └── useEditor.ts │ └── tsup.config.ts ├── packages-deprecated/ │ ├── .gitkeep │ ├── extension-character-count/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── extension-dropcursor/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-focus/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-gapcursor/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-history/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-list-item/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-list-keymap/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-placeholder/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-table-cell/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-table-header/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-table-row/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ ├── extension-task-item/ │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsup.config.ts │ └── extension-task-list/ │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src/ │ │ └── index.ts │ └── tsup.config.ts ├── patches/ │ └── @changesets__assemble-release-plan.patch ├── pnpm-workspace.yaml ├── scripts/ │ ├── aggregate-changeset.js │ ├── check-package-dists.sh │ └── make-demo.sh ├── skills/ │ └── tiptap/ │ └── SKILL.md ├── tests/ │ ├── cypress/ │ │ ├── fixtures/ │ │ │ └── example.json │ │ ├── integration/ │ │ │ └── core/ │ │ │ ├── pluginOrder.spec.ts │ │ │ └── transformPastedHTML.spec.ts │ │ ├── plugins/ │ │ │ └── index.js │ │ ├── support/ │ │ │ ├── commands.js │ │ │ └── e2e.js │ │ └── tsconfig.json │ ├── cypress.config.js │ └── package.json ├── tsconfig.build.json ├── tsconfig.json ├── turbo.json └── vitest.config.ts
SYMBOL INDEX (1917 symbols across 497 files)
FILE: demos/preview/index.js
method unmounted (line 56) | unmounted(el) {
FILE: demos/preview/shiki.worker.js
function init (line 5) | async function init() {
FILE: demos/setup/helper.ts
function splitName (line 17) | function splitName(name: string) {
function debug (line 27) | function debug() {
FILE: demos/setup/js.ts
function init (line 6) | function init(name: string, source: any) {
FILE: demos/setup/react.ts
function init (line 9) | function init(name: string, source: any) {
FILE: demos/setup/svelte.ts
function init (line 6) | function init(name: string, source: any) {
FILE: demos/setup/vue.ts
function init (line 8) | function init(name: string, source: any) {
FILE: demos/src/Examples/Accessibility/React/InsertMenu.tsx
function InsertMenu (line 11) | function InsertMenu({ editor }: { editor: Editor }) {
FILE: demos/src/Examples/Accessibility/React/MenuBar.tsx
function NodeTypeDropdown (line 10) | function NodeTypeDropdown({ editor }: { editor: Editor }) {
function MenuBar (line 258) | function MenuBar({ editor }: { editor: Editor }) {
FILE: demos/src/Examples/Accessibility/React/TextMenu.tsx
function TextMenu (line 12) | function TextMenu({ editor }: { editor: Editor }) {
FILE: demos/src/Examples/Accessibility/React/useMenubarNav.ts
function useMenubarNav (line 8) | function useMenubarNav({
FILE: demos/src/Examples/CodeBlockLanguage/React/index.jsx
method addNodeView (line 54) | addNodeView() {
FILE: demos/src/Examples/Community/React/suggestion.js
method onUpdate (line 77) | onUpdate(props) {
method onKeyDown (line 86) | onKeyDown(props) {
method onExit (line 97) | onExit() {
FILE: demos/src/Examples/Community/Vue/suggestion.js
method onUpdate (line 80) | onUpdate(props) {
method onKeyDown (line 90) | onKeyDown(props) {
method onExit (line 101) | onExit() {
FILE: demos/src/Examples/CustomParagraph/React/Paragraph.jsx
method addNodeView (line 25) | addNodeView() {
FILE: demos/src/Examples/CustomParagraph/Vue/Extension.js
method addNodeView (line 7) | addNodeView() {
FILE: demos/src/Examples/Default/React/menuBarState.ts
function menuBarStateSelector (line 8) | function menuBarStateSelector(ctx: EditorStateSnapshot<Editor>) {
type MenuBarState (line 42) | type MenuBarState = ReturnType<typeof menuBarStateSelector>
FILE: demos/src/Examples/Drawing/Vue/Paper.js
method addAttributes (line 12) | addAttributes() {
method parseHTML (line 20) | parseHTML() {
method renderHTML (line 28) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 32) | addNodeView() {
FILE: demos/src/Examples/EnterShortcuts/React/index.tsx
method addKeyboardShortcuts (line 11) | addKeyboardShortcuts() {
FILE: demos/src/Examples/InteractivityComponent/React/Extension.js
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/Examples/InteractivityComponent/Vue/Extension.js
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/Examples/InteractivityComponentContent/React/Extension.js
method parseHTML (line 13) | parseHTML() {
method renderHTML (line 21) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 25) | addNodeView() {
FILE: demos/src/Examples/InteractivityComponentContent/Vue/Extension.js
method parseHTML (line 13) | parseHTML() {
method renderHTML (line 21) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 25) | addNodeView() {
FILE: demos/src/Examples/InteractivityComponentProvideInject/Vue/Extension.js
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/Examples/JSX/React/Paragraph.tsx
method renderHTML (line 6) | renderHTML({ HTMLAttributes }) {
FILE: demos/src/Examples/JSX/Vue/Paragraph.tsx
method renderHTML (line 6) | renderHTML({ HTMLAttributes }) {
FILE: demos/src/Examples/MultiMention/React/suggestions.js
method onUpdate (line 78) | onUpdate(props) {
method onKeyDown (line 88) | onKeyDown(props) {
method onExit (line 98) | onExit() {
method onUpdate (line 133) | onUpdate(props) {
method onKeyDown (line 143) | onKeyDown(props) {
method onExit (line 153) | onExit() {
FILE: demos/src/Examples/MultiMention/Vue/suggestions.js
method onUpdate (line 83) | onUpdate(props) {
method onKeyDown (line 93) | onKeyDown(props) {
method onExit (line 103) | onExit() {
method onUpdate (line 142) | onUpdate(props) {
method onKeyDown (line 152) | onKeyDown(props) {
method onExit (line 162) | onExit() {
FILE: demos/src/Examples/Performance/React/index.jsx
function EditorInstance (line 8) | function EditorInstance({ shouldOptimizeRendering }) {
FILE: demos/src/Examples/ResizableNodes/React/index.tsx
method addAttributes (line 15) | addAttributes() {
method parseHTML (line 26) | parseHTML() {
method renderHTML (line 30) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 41) | addNodeView() {
FILE: demos/src/Examples/Savvy/React/ColorHighlighter.ts
method addProseMirrorPlugins (line 9) | addProseMirrorPlugins() {
FILE: demos/src/Examples/Savvy/React/SmilieReplacer.ts
method addInputRules (line 6) | addInputRules() {
FILE: demos/src/Examples/Savvy/Vue/ColorHighlighter.ts
method addProseMirrorPlugins (line 9) | addProseMirrorPlugins() {
FILE: demos/src/Examples/Savvy/Vue/SmilieReplacer.ts
method addInputRules (line 6) | addInputRules() {
FILE: demos/src/Examples/StaticRendering/React/index.tsx
function MenuBar (line 204) | function MenuBar() {
FILE: demos/src/Examples/StaticRenderingAdvanced/React/index.tsx
function MyCustomComponentWithoutContent (line 7) | function MyCustomComponentWithoutContent() {
function MyCustomComponentWithContent (line 19) | function MyCustomComponentWithContent() {
method renderHTML (line 34) | renderHTML() {
method addNodeView (line 37) | addNodeView() {
method renderHTML (line 45) | renderHTML() {
method addNodeView (line 48) | addNodeView() {
method heading (line 67) | heading({ node, children }) {
method customNodeExtensionWithContent (line 78) | customNodeExtensionWithContent({ children }) {
method customNodeExtensionWithoutContent (line 85) | customNodeExtensionWithoutContent() {
FILE: demos/src/Examples/Tables/React/index.jsx
method addAttributes (line 9) | addAttributes() {
FILE: demos/src/Examples/TextDirection/React/index.tsx
function MenuBar (line 10) | function MenuBar({
FILE: demos/src/Examples/TransformPastedHTML/React/index.jsx
method transformPastedHTML (line 14) | transformPastedHTML(html) {
method transformPastedHTML (line 25) | transformPastedHTML(html) {
method transformPastedHTML (line 36) | transformPastedHTML(html) {
method transformPastedHTML (line 47) | transformPastedHTML(html) {
FILE: demos/src/Examples/Transition/Vue/Extension.js
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/Experiments/CollaborationAnnotation/Vue/extension/AnnotationItem.ts
class AnnotationItem (line 1) | class AnnotationItem {
method constructor (line 4) | constructor(decoration: any) {
method id (line 8) | get id() {
method from (line 12) | get from() {
method to (line 16) | get to() {
method data (line 20) | get data() {
method HTMLAttributes (line 24) | get HTMLAttributes() {
method toString (line 28) | toString() {
FILE: demos/src/Experiments/CollaborationAnnotation/Vue/extension/AnnotationPlugin.ts
type AnnotationPluginOptions (line 10) | interface AnnotationPluginOptions {
method init (line 24) | init() {
method apply (line 31) | apply(transaction, pluginState, oldState, newState) {
method decorations (line 37) | decorations(state) {
FILE: demos/src/Experiments/CollaborationAnnotation/Vue/extension/AnnotationState.ts
type AnnotationStateOptions (line 14) | interface AnnotationStateOptions {
class AnnotationState (line 22) | class AnnotationState {
method constructor (line 27) | constructor(options: AnnotationStateOptions) {
method randomId (line 31) | randomId() {
method findAnnotation (line 36) | findAnnotation(id: string) {
method addAnnotation (line 46) | addAnnotation(action: AddAnnotationAction, state: EditorState) {
method updateAnnotation (line 61) | updateAnnotation(action: UpdateAnnotationAction) {
method deleteAnnotation (line 73) | deleteAnnotation(id: string) {
method annotationsAt (line 79) | annotationsAt(position: number) {
method createDecorations (line 85) | createDecorations(state: EditorState) {
method apply (line 121) | apply(transaction: Transaction, state: EditorState) {
FILE: demos/src/Experiments/CollaborationAnnotation/Vue/extension/collaboration-annotation.ts
type AddAnnotationAction (line 6) | interface AddAnnotationAction {
type UpdateAnnotationAction (line 13) | interface UpdateAnnotationAction {
type DeleteAnnotationAction (line 19) | interface DeleteAnnotationAction {
type AnnotationOptions (line 24) | interface AnnotationOptions {
function getMapFromOptions (line 47) | function getMapFromOptions(options: AnnotationOptions): Y.Map<any> {
type Commands (line 52) | interface Commands<ReturnType> {
method addOptions (line 66) | addOptions() {
method onCreate (line 79) | onCreate() {
method addCommands (line 94) | addCommands() {
method addProseMirrorPlugins (line 144) | addProseMirrorPlugins() {
FILE: demos/src/Experiments/CollaborationMappingPerformance/React/index.tsx
function generateContent (line 22) | function generateContent(paragraphCount: number): string {
constant CONTENT_SIZES (line 55) | const CONTENT_SIZES = {
type ContentSize (line 62) | type ContentSize = keyof typeof CONTENT_SIZES
constant DECORATION_COUNTS (line 67) | const DECORATION_COUNTS = [5, 50, 500, 1000] as const
type DecorationCount (line 69) | type DecorationCount = (typeof DECORATION_COUNTS)[number]
function createDecorations (line 77) | function createDecorations(positions: number[], doc: Node): DecorationSet {
type PluginState (line 97) | interface PluginState {
type DecorationsMeta (line 107) | interface DecorationsMeta {
type PerformanceCallback (line 115) | type PerformanceCallback = (action: string, duration: number) => void
function setPerformanceCallback (line 126) | function setPerformanceCallback(callback: PerformanceCallback | null): v...
method addProseMirrorPlugins (line 137) | addProseMirrorPlugins() {
type PerformanceEntry (line 200) | interface PerformanceEntry {
FILE: demos/src/Experiments/Commands/Vue/commands.js
method addOptions (line 7) | addOptions() {
method addProseMirrorPlugins (line 18) | addProseMirrorPlugins() {
FILE: demos/src/Experiments/Commands/Vue/suggestion.js
method onUpdate (line 79) | onUpdate(props) {
method onKeyDown (line 89) | onKeyDown(props) {
method onExit (line 100) | onExit() {
FILE: demos/src/Experiments/Embeds/Vue/iframe.ts
type IframeOptions (line 3) | interface IframeOptions {
type Commands (line 11) | interface Commands<ReturnType> {
method addOptions (line 28) | addOptions() {
method addAttributes (line 37) | addAttributes() {
method parseHTML (line 52) | parseHTML() {
method renderHTML (line 60) | renderHTML({ HTMLAttributes }) {
method addCommands (line 64) | addCommands() {
FILE: demos/src/Experiments/ExtensionStorage/React/CustomExtension.ts
type CustomStorage (line 3) | type CustomStorage = {
method addStorage (line 10) | addStorage() {
method onUpdate (line 16) | onUpdate() {
FILE: demos/src/Experiments/ExtensionStorage/Vue/CustomExtension.ts
type CustomStorage (line 3) | type CustomStorage = {
method addStorage (line 10) | addStorage() {
method onUpdate (line 16) | onUpdate() {
FILE: demos/src/Experiments/Figure/Vue/figure.ts
type FigureOptions (line 3) | interface FigureOptions {
type Commands (line 8) | interface Commands<ReturnType> {
method addOptions (line 33) | addOptions() {
method addAttributes (line 47) | addAttributes() {
method parseHTML (line 66) | parseHTML() {
method renderHTML (line 75) | renderHTML({ HTMLAttributes }) {
method addCommands (line 84) | addCommands() {
method addInputRules (line 177) | addInputRules() {
FILE: demos/src/Experiments/GenericFigure/Vue/figcaption.ts
method addOptions (line 6) | addOptions() {
method parseHTML (line 18) | parseHTML() {
method renderHTML (line 26) | renderHTML({ HTMLAttributes }) {
FILE: demos/src/Experiments/GenericFigure/Vue/figure.ts
method addOptions (line 7) | addOptions() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addProseMirrorPlugins (line 33) | addProseMirrorPlugins() {
FILE: demos/src/Experiments/GlobalDragHandle/Vue/DragHandle.js
function removeNode (line 4) | function removeNode(node) {
function absoluteRect (line 8) | function absoluteRect(node) {
method addProseMirrorPlugins (line 19) | addProseMirrorPlugins() {
FILE: demos/src/Experiments/IsolatingClear/React/index.jsx
method parseHTML (line 20) | parseHTML() {
method renderHTML (line 24) | renderHTML({ HTMLAttributes }) {
FILE: demos/src/Experiments/Linter/Vue/extension/Linter.ts
type IconDivElement (line 9) | interface IconDivElement extends HTMLDivElement {
function renderIcon (line 13) | function renderIcon(issue: Issue) {
function runAllLinterPlugins (line 23) | function runAllLinterPlugins(doc: ProsemirrorNode, plugins: Array<typeof...
type LinterOptions (line 44) | interface LinterOptions {
method addOptions (line 51) | addOptions() {
method addProseMirrorPlugins (line 57) | addProseMirrorPlugins() {
FILE: demos/src/Experiments/Linter/Vue/extension/LinterPlugin.ts
type Result (line 3) | interface Result {
class LinterPlugin (line 11) | class LinterPlugin {
method constructor (line 16) | constructor(doc: ProsemirrorNode) {
method record (line 21) | record(message: string, from: number, to: number, fix?: Function) {
method scan (line 30) | scan() {
method getResults (line 34) | getResults() {
FILE: demos/src/Experiments/Linter/Vue/extension/plugins/BadWords.ts
class BadWords (line 3) | class BadWords extends LinterPlugin {
method scan (line 6) | scan() {
FILE: demos/src/Experiments/Linter/Vue/extension/plugins/HeadingLevel.ts
class HeadingLevel (line 6) | class HeadingLevel extends LinterPlugin {
method fixHeader (line 7) | fixHeader(level: number) {
method scan (line 13) | scan() {
FILE: demos/src/Experiments/Linter/Vue/extension/plugins/Punctuation.ts
class Punctuation (line 6) | class Punctuation extends LinterPlugin {
method fix (line 9) | fix(replacement: any) {
method scan (line 15) | scan() {
FILE: demos/src/Experiments/MultipleEditorStyles/React/index.tsx
function EditorComponent (line 5) | function EditorComponent({ label }: { label?: string }) {
function MultipleEditors (line 24) | function MultipleEditors() {
FILE: demos/src/Experiments/OnDelete/React/index.tsx
method onDelete (line 16) | onDelete({ node, transaction, newPos }) {
FILE: demos/src/Extensions/CollaborationCaret/React/index.jsx
function Component (line 17) | function Component() {
function App (line 42) | function App() {
FILE: demos/src/Extensions/CollaborationMapPositions/React/index.tsx
function createDecorations (line 19) | function createDecorations(data: MappablePosition[], doc: Node): Decorat...
type PluginState (line 35) | interface PluginState {
method addProseMirrorPlugins (line 49) | addProseMirrorPlugins() {
FILE: demos/src/Extensions/DragHandle/React/index.jsx
constant NESTED_CONFIG (line 10) | const NESTED_CONFIG = { edgeDetection: { threshold: -16 } }
FILE: demos/src/Extensions/DragHandleWithNodeViews/React/extensions/recommendation/Recommendation.jsx
method addOptions (line 13) | addOptions() {
method addAttributes (line 22) | addAttributes() {
method parseHTML (line 34) | parseHTML() {
method renderHTML (line 42) | renderHTML({ HTMLAttributes }) {
method addCommands (line 46) | addCommands() {
method addNodeView (line 60) | addNodeView() {
FILE: demos/src/Extensions/TableOfContents/React/index.jsx
method onUpdate (line 21) | onUpdate(content) {
FILE: demos/src/GuideMarkViews/ReactComponent/React/Extension.ts
method addAttributes (line 9) | addAttributes() {
method parseHTML (line 15) | parseHTML() {
method renderHTML (line 23) | renderHTML({ HTMLAttributes }) {
method addMarkView (line 27) | addMarkView() {
FILE: demos/src/GuideMarkViews/VueComponent/Vue/Extension.ts
method addAttributes (line 9) | addAttributes() {
method parseHTML (line 15) | parseHTML() {
method renderHTML (line 23) | renderHTML({ HTMLAttributes }) {
method addMarkView (line 27) | addMarkView() {
FILE: demos/src/GuideNodeViews/DragHandle/React/DraggableItem.js
method parseHTML (line 15) | parseHTML() {
method renderHTML (line 23) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 27) | addNodeView() {
FILE: demos/src/GuideNodeViews/DragHandle/Vue/DraggableItem.js
method parseHTML (line 15) | parseHTML() {
method renderHTML (line 23) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 27) | addNodeView() {
FILE: demos/src/GuideNodeViews/JavaScript/Vue/Extension.js
method addAttributes (line 10) | addAttributes() {
method parseHTML (line 18) | parseHTML() {
method renderHTML (line 26) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 30) | addNodeView() {
FILE: demos/src/GuideNodeViews/JavaScriptContent/Vue/Extension.js
method parseHTML (line 10) | parseHTML() {
method renderHTML (line 18) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 22) | addNodeView() {
FILE: demos/src/GuideNodeViews/ReactComponent/React/Extension.ts
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/GuideNodeViews/ReactComponentContent/React/Extension.js
method parseHTML (line 13) | parseHTML() {
method addKeyboardShortcuts (line 21) | addKeyboardShortcuts() {
method renderHTML (line 33) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 37) | addNodeView() {
FILE: demos/src/GuideNodeViews/ReactComponentContext/React/Extension.ts
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/GuideNodeViews/VueComponent/Vue/Extension.js
method addAttributes (line 13) | addAttributes() {
method parseHTML (line 21) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 33) | addNodeView() {
FILE: demos/src/GuideNodeViews/VueComponentContent/Vue/Extension.js
method parseHTML (line 13) | parseHTML() {
method renderHTML (line 21) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 25) | addNodeView() {
FILE: demos/src/Markdown/CustomSyntax/React/index.jsx
method renderHTML (line 23) | renderHTML() {
method parseHTML (line 27) | parseHTML() {
method renderHTML (line 46) | renderHTML() {
method parseHTML (line 50) | parseHTML() {
method addNodeView (line 58) | addNodeView() {
method renderHTML (line 81) | renderHTML() {
method parseHTML (line 85) | parseHTML() {
method renderHTML (line 102) | renderHTML() {
method parseHTML (line 106) | parseHTML() {
method renderMarkdown (line 114) | renderMarkdown(node, helpers) {
method parseMarkdown (line 118) | parseMarkdown(token, helpers) {
method start (line 128) | start(src) {
method tokenize (line 131) | tokenize(src, _tokens, lexer) {
FILE: demos/src/Markdown/Full/React/index.tsx
method addAttributes (line 52) | addAttributes() {
method parseHTML (line 60) | parseHTML() {
method renderHTML (line 68) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 72) | addNodeView() {
FILE: demos/src/Nodes/Audio/React/index.jsx
constant DEFAULT_AUDIO_SRC (line 8) | const DEFAULT_AUDIO_SRC = 'https://www.w3schools.com/html/horse.ogg'
FILE: demos/src/Nodes/Emoji/React/suggestion.js
function repositionComponent (line 23) | function repositionComponent(clientRect) {
method onUpdate (line 56) | onUpdate(props) {
method onKeyDown (line 61) | onKeyDown(props) {
method onExit (line 72) | onExit() {
FILE: demos/src/Nodes/Emoji/Vue/suggestion.js
function repositionComponent (line 21) | function repositionComponent(clientRect) {
method onUpdate (line 54) | onUpdate(props) {
method onKeyDown (line 59) | onKeyDown(props) {
method onExit (line 70) | onExit() {
FILE: demos/src/Nodes/Mention/React/suggestion.js
method onUpdate (line 77) | onUpdate(props) {
method onKeyDown (line 87) | onKeyDown(props) {
method onExit (line 97) | onExit() {
FILE: demos/src/Nodes/Mention/Vue/suggestion.js
method onUpdate (line 81) | onUpdate(props) {
method onKeyDown (line 91) | onKeyDown(props) {
method onExit (line 101) | onExit() {
FILE: demos/src/Tutorials/1-1-textarea/React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-1-textarea/Vue/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-2-tiptap/React/Note.tsx
method onUpdate (line 17) | onUpdate() {
FILE: demos/src/Tutorials/1-2-tiptap/React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-2-tiptap/Vue/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-2-tiptap_lexical/Lexical-React/Note.tsx
method onError (line 19) | onError(error: Error): void {
FILE: demos/src/Tutorials/1-2-tiptap_lexical/Lexical-React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-3-yjs/React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-3-yjs/Vue/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-3-yjs_lexical/Lexical-React/Note.tsx
method onError (line 18) | onError(error: Error): void {
FILE: demos/src/Tutorials/1-3-yjs_lexical/Lexical-React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-4-collab/React/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/src/Tutorials/1-4-collab/Vue/types.ts
type TNote (line 1) | type TNote = {
FILE: demos/vite.config.ts
function collectPackageInformation (line 13) | function collectPackageInformation(path: string) {
method transform (line 107) | transform(html: string, context) {
method resolveId (line 212) | resolveId(id, importer) {
method load (line 220) | load(id) {
method resolveId (line 232) | resolveId(id) {
method load (line 237) | load(id) {
method resolveId (line 258) | resolveId(id, importer) {
method load (line 263) | load(id) {
method configureServer (line 316) | configureServer(viteDevServer) {
FILE: packages/core/__tests__/dispatchTransaction.spec.ts
method dispatchTransaction (line 31) | dispatchTransaction({ transaction, next }) {
method dispatchTransaction (line 39) | dispatchTransaction({ transaction, next }) {
method dispatchTransaction (line 59) | dispatchTransaction() {
method dispatchTransaction (line 83) | dispatchTransaction({ transaction, next }) {
FILE: packages/core/__tests__/editorProps.spec.ts
function transformPastedHTML (line 9) | function transformPastedHTML(html: string) {
function transformPastedHTML (line 22) | function transformPastedHTML(html: string) {
FILE: packages/core/__tests__/extendExtensions.spec.ts
type ExtensionConfig (line 6) | interface ExtensionConfig {
method addAttributes (line 17) | addAttributes() {
method addAttributes (line 33) | addAttributes() {
method addAttributes (line 39) | addAttributes() {
method addAttributes (line 55) | addAttributes() {
method addAttributes (line 63) | addAttributes() {
method addAttributes (line 77) | addAttributes() {
method addAttributes (line 83) | addAttributes() {
method addAttributes (line 101) | addAttributes() {
method addAttributes (line 108) | addAttributes() {
method addAttributes (line 116) | addAttributes() {
method addAttributes (line 135) | addAttributes() {
method addAttributes (line 143) | addAttributes() {
method addAttributes (line 152) | addAttributes() {
method addAttributes (line 166) | addAttributes() {
method addAttributes (line 174) | addAttributes() {
method addAttributes (line 198) | addAttributes() {
method addAttributes (line 206) | addAttributes() {
method addAttributes (line 215) | addAttributes() {
method addAttributes (line 241) | addAttributes() {
method addAttributes (line 249) | addAttributes() {
method addAttributes (line 258) | addAttributes() {
method addAttributes (line 281) | addAttributes() {
method addAttributes (line 289) | addAttributes() {
method addAttributes (line 308) | addAttributes() {
method addAttributes (line 317) | addAttributes() {
method addAttributes (line 334) | addAttributes() {
method addAttributes (line 351) | addAttributes() {
method addAttributes (line 359) | addAttributes() {
method addOptions (line 378) | addOptions() {
method addOptions (line 395) | addOptions() {
method addOptions (line 404) | addOptions() {
FILE: packages/core/__tests__/extensionOptions.spec.ts
method addOptions (line 9) | addOptions() {
method addOptions (line 25) | addOptions() {
method addOptions (line 43) | addOptions() {
method addOptions (line 61) | addOptions() {
method addOptions (line 70) | addOptions() {
method addOptions (line 87) | addOptions() {
method addOptions (line 94) | addOptions() {
method addOptions (line 103) | addOptions() {
method addOptions (line 121) | addOptions() {
method addOptions (line 128) | addOptions() {
method addOptions (line 145) | addOptions() {
method addOptions (line 172) | addOptions() {
method addOptions (line 187) | addOptions() {
FILE: packages/core/__tests__/extensionStorage.spec.ts
method addStorage (line 15) | addStorage() {
method addStorage (line 25) | addStorage() {
method addStorage (line 35) | addStorage() {
method addStorage (line 47) | addStorage() {
method addStorage (line 61) | addStorage() {
method addStorage (line 66) | addStorage() {
method addStorage (line 76) | addStorage() {
method addStorage (line 82) | addStorage() {
method addStorage (line 88) | addStorage() {
method addStorage (line 98) | addStorage() {
FILE: packages/core/__tests__/generateText.spec.ts
method parseHTML (line 49) | parseHTML() {
method renderText (line 61) | renderText({ node }) {
FILE: packages/core/__tests__/getAttributesFromExtensions.spec.ts
method addAttributes (line 9) | addAttributes() {
method addAttributes (line 34) | addAttributes() {
method addAttributes (line 59) | addAttributes() {
method addAttributes (line 77) | addAttributes() {
method addAttributes (line 99) | addAttributes() {
method addGlobalAttributes (line 134) | addGlobalAttributes() {
method addGlobalAttributes (line 173) | addGlobalAttributes() {
method addGlobalAttributes (line 207) | addGlobalAttributes() {
method addGlobalAttributes (line 255) | addGlobalAttributes() {
method addGlobalAttributes (line 307) | addGlobalAttributes() {
method addAttributes (line 347) | addAttributes() {
method addGlobalAttributes (line 358) | addGlobalAttributes() {
method addGlobalAttributes (line 416) | addGlobalAttributes() {
FILE: packages/core/__tests__/nodePos.spec.ts
method addAttributes (line 17) | addAttributes() {
method parseHTML (line 25) | parseHTML() {
method renderHTML (line 33) | renderHTML({ HTMLAttributes }) {
FILE: packages/core/__tests__/onContentError.spec.ts
method addStorage (line 152) | addStorage() {
method addStorage (line 194) | addStorage() {
FILE: packages/core/__tests__/requiredAttributes.spec.ts
method addAttributes (line 11) | addAttributes() {
method addAttributes (line 43) | addAttributes() {
method addAttributes (line 76) | addAttributes() {
method addAttributes (line 115) | addAttributes() {
method addAttributes (line 146) | addAttributes() {
FILE: packages/core/src/CommandManager.ts
class CommandManager (line 7) | class CommandManager {
method constructor (line 14) | constructor(props: { editor: Editor; state?: EditorState }) {
method hasCustomState (line 20) | get hasCustomState(): boolean {
method state (line 24) | get state(): EditorState {
method commands (line 28) | get commands(): SingleCommands {
method chain (line 51) | get chain(): () => ChainedCommands {
method can (line 55) | get can(): () => CanCommands {
method createChain (line 59) | public createChain(startTr?: Transaction, shouldDispatch = true): Chai...
method createCan (line 95) | public createCan(startTr?: Transaction): CanCommands {
method buildProps (line 112) | public buildProps(tr: Transaction, shouldDispatch = true): CommandProps {
FILE: packages/core/src/Editor.ts
type TiptapEditorHTMLElement (line 52) | interface TiptapEditorHTMLElement extends HTMLElement {
class Editor (line 56) | class Editor extends EventEmitter<EditorEvents> {
method constructor (line 121) | constructor(options: Partial<EditorOptions> = {}) {
method mount (line 161) | public mount(el: NonNullable<EditorOptions['element']> & {}) {
method unmount (line 190) | public unmount() {
method storage (line 225) | public get storage(): Storage {
method commands (line 232) | public get commands(): SingleCommands {
method chain (line 239) | public chain(): ChainedCommands {
method can (line 246) | public can(): CanCommands {
method injectCSS (line 253) | private injectCSS(): void {
method setOptions (line 264) | public setOptions(options: Partial<EditorOptions> = {}): void {
method setEditable (line 284) | public setEditable(editable: boolean, emitUpdate = true): void {
method isEditable (line 295) | public get isEditable(): boolean {
method view (line 305) | public get view(): EditorView {
method state (line 353) | public get state(): EditorState {
method registerPlugin (line 368) | public registerPlugin(
method unregisterPlugin (line 389) | public unregisterPlugin(
method createExtensionManager (line 424) | private createExtensionManager(): void {
method createCommandManager (line 460) | private createCommandManager(): void {
method createSchema (line 469) | private createSchema(): void {
method createDoc (line 476) | private createDoc(): ProseMirrorNode {
method createView (line 521) | private createView(element: NonNullable<EditorOptions['element']>): vo...
method createNodeViews (line 571) | public createNodeViews(): void {
method prependClass (line 585) | public prependClass(): void {
method captureTransaction (line 593) | public captureTransaction(fn: () => void) {
method dispatchTransaction (line 610) | private dispatchTransaction(transaction: Transaction): void {
method getAttributes (line 704) | public getAttributes(nameOrType: string | NodeType | MarkType): Record...
method isActive (line 716) | public isActive(nameOrAttributes: string, attributesOrUndefined?: {}):...
method getJSON (line 727) | public getJSON(): DocumentType<
method getHTML (line 737) | public getHTML(): string {
method getText (line 744) | public getText(options?: { blockSeparator?: string; textSerializers?: ...
method isEmpty (line 759) | public get isEmpty(): boolean {
method destroy (line 766) | public destroy(): void {
method isDestroyed (line 777) | public get isDestroyed(): boolean {
method $node (line 781) | public $node(selector: string, attributes?: { [key: string]: any }): N...
method $nodes (line 785) | public $nodes(selector: string, attributes?: { [key: string]: any }): ...
method $pos (line 789) | public $pos(pos: number) {
method $doc (line 795) | get $doc() {
FILE: packages/core/src/EventEmitter.ts
type StringKeyOf (line 1) | type StringKeyOf<T> = Extract<keyof T, string>
type CallbackType (line 2) | type CallbackType<T extends Record<string, any>, EventName extends Strin...
type CallbackFunction (line 5) | type CallbackFunction<T extends Record<string, any>, EventName extends S...
class EventEmitter (line 9) | class EventEmitter<T extends Record<string, any>> {
method on (line 12) | public on<EventName extends StringKeyOf<T>>(event: EventName, fn: Call...
method emit (line 22) | public emit<EventName extends StringKeyOf<T>>(event: EventName, ...arg...
method off (line 32) | public off<EventName extends StringKeyOf<T>>(event: EventName, fn?: Ca...
method once (line 46) | public once<EventName extends StringKeyOf<T>>(event: EventName, fn: Ca...
method removeAllListeners (line 55) | public removeAllListeners(): void {
FILE: packages/core/src/Extendable.ts
type ExtendableConfig (line 30) | interface ExtendableConfig<
class Extendable (line 526) | class Extendable<
method constructor (line 542) | constructor(config: Partial<Config> = {}) {
method options (line 551) | get options(): Options {
method storage (line 561) | get storage(): Readonly<Storage> {
method configure (line 572) | configure(options: Partial<Options> = {}) {
method extend (line 586) | extend<
FILE: packages/core/src/Extension.ts
type ExtensionConfig (line 5) | interface ExtensionConfig<Options = any, Storage = any>
class Extension (line 12) | class Extension<Options = any, Storage = any> extends Extendable<
method create (line 23) | static create<O = any, S = any>(
method configure (line 31) | configure(options?: Partial<Options>) {
method extend (line 35) | extend<
FILE: packages/core/src/ExtensionManager.ts
class ExtensionManager (line 27) | class ExtensionManager {
method constructor (line 44) | constructor(extensions: Extensions, editor: Editor) {
method commands (line 62) | get commands(): RawCommands {
method plugins (line 89) | get plugins(): Plugin[] {
method attributes (line 188) | get attributes() {
method nodeViews (line 196) | get nodeViews(): Record<string, NodeViewConstructor> {
method dispatchTransaction (line 251) | dispatchTransaction(baseDispatch: (tr: Transaction) => void): (tr: Tra...
method transformPastedHTML (line 285) | transformPastedHTML(
method markViews (line 321) | get markViews(): Record<string, MarkViewConstructor> {
method setupExtensions (line 370) | private setupExtensions() {
FILE: packages/core/src/InputRule.ts
type InputRuleMatch (line 14) | type InputRuleMatch = {
type InputRuleFinder (line 22) | type InputRuleFinder = RegExp | ((text: string) => InputRuleMatch | null)
class InputRule (line 24) | class InputRule {
method constructor (line 38) | constructor(config: {
function run (line 84) | function run(config: {
function inputRulesPlugin (line 177) | function inputRulesPlugin(props: { editor: Editor; rules: InputRule[] })...
FILE: packages/core/src/Mark.ts
type MarkConfig (line 8) | interface MarkConfig<Options = any, Storage = any>
class Mark (line 146) | class Mark<Options = any, Storage = any> extends Extendable<Options, Sto...
method create (line 153) | static create<O = any, S = any>(config: Partial<MarkConfig<O, S>> | ((...
method handleExit (line 159) | static handleExit({ editor, mark }: { editor: Editor; mark: Mark }) {
method configure (line 187) | configure(options?: Partial<Options>) {
method extend (line 191) | extend<
FILE: packages/core/src/MarkView.ts
function updateMarkViewAttributes (line 8) | function updateMarkViewAttributes(checkMark: Mark, editor: Editor, attrs...
class MarkView (line 55) | class MarkView<Component, Options extends MarkViewRendererOptions = Mark...
method constructor (line 62) | constructor(component: Component, props: MarkViewProps, options?: Part...
method dom (line 70) | get dom(): HTMLElement {
method contentDOM (line 74) | get contentDOM(): HTMLElement | null {
method updateAttributes (line 82) | updateAttributes(attrs: Record<string, any>, checkMark?: Mark): void {
method ignoreMutation (line 86) | ignoreMutation(mutation: ViewMutationRecord): boolean {
FILE: packages/core/src/Node.ts
type NodeConfig (line 8) | interface NodeConfig<Options = any, Storage = any>
class Node (line 340) | class Node<Options = any, Storage = any> extends Extendable<Options, Sto...
method create (line 347) | static create<O = any, S = any>(config: Partial<NodeConfig<O, S>> | ((...
method configure (line 353) | configure(options?: Partial<Options>) {
method extend (line 357) | extend<
FILE: packages/core/src/NodePos.ts
class NodePos (line 6) | class NodePos {
method name (line 13) | private get name(): string {
method constructor (line 17) | constructor(pos: ResolvedPos, editor: Editor, isBlock = false, node: N...
method node (line 26) | get node(): Node {
method element (line 30) | get element(): HTMLElement {
method depth (line 36) | get depth(): number {
method pos (line 40) | get pos(): number {
method content (line 44) | get content(): Fragment {
method content (line 48) | set content(content: Content) {
method attributes (line 65) | get attributes(): { [key: string]: any } {
method textContent (line 69) | get textContent(): string {
method size (line 73) | get size(): number {
method from (line 77) | get from(): number {
method range (line 85) | get range(): Range {
method to (line 92) | get to(): number {
method parent (line 100) | get parent(): NodePos | null {
method before (line 111) | get before(): NodePos | null {
method after (line 121) | get after(): NodePos | null {
method children (line 131) | get children(): NodePos[] {
method firstChild (line 168) | get firstChild(): NodePos | null {
method lastChild (line 172) | get lastChild(): NodePos | null {
method closest (line 178) | closest(selector: string, attributes: { [key: string]: any } = {}): No...
method querySelector (line 206) | querySelector(selector: string, attributes: { [key: string]: any } = {...
method querySelectorAll (line 210) | querySelectorAll(selector: string, attributes: { [key: string]: any } ...
method setAttribute (line 247) | setAttribute(attributes: { [key: string]: any }) {
FILE: packages/core/src/NodeView.ts
class NodeView (line 13) | class NodeView<
method constructor (line 41) | constructor(component: Component, props: NodeViewRendererProps, option...
method mount (line 59) | mount() {
method dom (line 64) | get dom(): HTMLElement {
method contentDOM (line 68) | get contentDOM(): HTMLElement | null {
method onDragStart (line 72) | onDragStart(event: DragEvent) {
method stopEvent (line 158) | stopEvent(event: Event) {
method ignoreMutation (line 252) | ignoreMutation(mutation: ViewMutationRecord) {
method updateAttributes (line 309) | updateAttributes(attributes: Record<string, any>): void {
method deleteNode (line 329) | deleteNode(): void {
FILE: packages/core/src/PasteRule.ts
type PasteRuleMatch (line 14) | type PasteRuleMatch = {
type PasteRuleFinder (line 22) | type PasteRuleFinder =
class PasteRule (line 30) | class PasteRule {
method constructor (line 44) | constructor(config: {
function run (line 96) | function run(config: {
function pasteRulesPlugin (line 192) | function pasteRulesPlugin(props: { editor: Editor; rules: PasteRule[] })...
FILE: packages/core/src/Tracker.ts
type TrackerResult (line 3) | interface TrackerResult {
class Tracker (line 8) | class Tracker {
method constructor (line 13) | constructor(transaction: Transaction) {
method map (line 18) | map(position: number): TrackerResult {
FILE: packages/core/src/__tests__/transformPastedHTML.test.ts
method transformPastedHTML (line 20) | transformPastedHTML(html) {
method transformPastedHTML (line 28) | transformPastedHTML(html) {
method transformPastedHTML (line 36) | transformPastedHTML(html) {
method transformPastedHTML (line 61) | transformPastedHTML(html) {
method transformPastedHTML (line 68) | transformPastedHTML(html) {
method transformPastedHTML (line 94) | transformPastedHTML(html) {
method transformPastedHTML (line 101) | transformPastedHTML(html) {
method transformPastedHTML (line 124) | transformPastedHTML(html) {
method transformPastedHTML (line 131) | transformPastedHTML(html) {
method transformPastedHTML (line 138) | transformPastedHTML(html) {
method transformPastedHTML (line 157) | transformPastedHTML(html) {
method transformPastedHTML (line 167) | transformPastedHTML(html) {
method transformPastedHTML (line 189) | transformPastedHTML(html) {
method transformPastedHTML (line 217) | transformPastedHTML(html) {
method addOptions (line 269) | addOptions() {
method addStorage (line 274) | addStorage() {
method transformPastedHTML (line 279) | transformPastedHTML(html) {
method transformPastedHTML (line 311) | transformPastedHTML(html) {
method transformPastedHTML (line 336) | transformPastedHTML(html) {
method transformPastedHTML (line 358) | transformPastedHTML(html) {
method transformPastedHTML (line 380) | transformPastedHTML(html) {
method transformPastedHTML (line 404) | transformPastedHTML(html) {
method transformPastedHTML (line 426) | transformPastedHTML(html, view) {
method transformPastedHTML (line 444) | transformPastedHTML(html, view) {
method transformPastedHTML (line 469) | transformPastedHTML(html) {
method transformPastedHTML (line 491) | transformPastedHTML(html) {
method transformPastedHTML (line 517) | transformPastedHTML(html) {
method transformPastedHTML (line 524) | transformPastedHTML(html) {
method transformPastedHTML (line 531) | transformPastedHTML(html) {
method transformPastedHTML (line 556) | transformPastedHTML(html) {
FILE: packages/core/src/commands/blur.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/clearContent.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/clearNodes.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/command.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/createParagraphNear.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/cut.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/deleteCurrentNode.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/deleteNode.ts
type Commands (line 7) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/deleteRange.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/deleteSelection.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/enter.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/exitCode.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/extendMarkRange.ts
type Commands (line 9) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/first.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/focus.ts
type Commands (line 9) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/forEach.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/insertContent.ts
type InsertContentOptions (line 5) | interface InsertContentOptions {
type Commands (line 20) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/insertContentAt.ts
type InsertContentAtOptions (line 8) | interface InsertContentAtOptions {
type Commands (line 36) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/join.ts
type Commands (line 11) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/joinItemBackward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/joinItemForward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/joinTextblockBackward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/joinTextblockForward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/keyboardShortcut.ts
function normalizeKeyName (line 5) | function normalizeKeyName(name: string) {
type Commands (line 60) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/lift.ts
type Commands (line 9) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/liftEmptyBlock.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/liftListItem.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/newlineInCode.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/resetAttributes.ts
type Commands (line 10) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/scrollIntoView.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectAll.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectNodeBackward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectNodeForward.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectParentNode.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectTextblockEnd.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/selectTextblockStart.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setContent.ts
type SetContentOptions (line 6) | interface SetContentOptions {
type Commands (line 26) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setMark.ts
type Commands (line 10) | interface Commands<ReturnType> {
function canSetMark (line 22) | function canSetMark(state: EditorState, tr: Transaction, newMarkType: Ma...
FILE: packages/core/src/commands/setMeta.ts
type Commands (line 6) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setNode.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setNodeSelection.ts
type Commands (line 7) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setTextDirection.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/setTextSelection.ts
type Commands (line 7) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/sinkListItem.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/splitBlock.ts
function ensureMarks (line 9) | function ensureMarks(state: EditorState, splittableMarks?: string[]) {
type Commands (line 20) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/splitListItem.ts
type Commands (line 11) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/toggleList.ts
type Commands (line 61) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/toggleMark.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/toggleNode.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/toggleWrap.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/undoInputRule.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/unsetAllMarks.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/unsetMark.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/unsetTextDirection.ts
type Commands (line 4) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/updateAttributes.ts
type Commands (line 10) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/wrapIn.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/commands/wrapInList.ts
type Commands (line 8) | interface Commands<ReturnType> {
FILE: packages/core/src/extensions/clipboardTextSerializer.ts
type ClipboardTextSerializerOptions (line 7) | type ClipboardTextSerializerOptions = {
method addOptions (line 14) | addOptions() {
method addProseMirrorPlugins (line 20) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/commands.ts
method addCommands (line 9) | addCommands() {
FILE: packages/core/src/extensions/delete.ts
method onUpdate (line 12) | onUpdate({ transaction, appendedTransactions }) {
FILE: packages/core/src/extensions/drop.ts
method addProseMirrorPlugins (line 8) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/editable.ts
method addProseMirrorPlugins (line 8) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/focusEvents.ts
method addProseMirrorPlugins (line 10) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/keymap.ts
method addKeyboardShortcuts (line 13) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 102) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/paste.ts
method addProseMirrorPlugins (line 8) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/tabindex.ts
method addProseMirrorPlugins (line 8) | addProseMirrorPlugins() {
FILE: packages/core/src/extensions/textDirection.ts
type TextDirectionOptions (line 6) | interface TextDirectionOptions {
method addOptions (line 21) | addOptions() {
method addGlobalAttributes (line 27) | addGlobalAttributes() {
method addProseMirrorPlugins (line 66) | addProseMirrorPlugins() {
FILE: packages/core/src/helpers/MappablePosition.ts
class MappablePosition (line 8) | class MappablePosition {
method constructor (line 14) | constructor(position: number) {
method fromJSON (line 21) | static fromJSON(json: any): MappablePosition {
method toJSON (line 28) | toJSON(): any {
type GetUpdatedPositionResult (line 38) | interface GetUpdatedPositionResult {
function getUpdatedPosition (line 48) | function getUpdatedPosition(position: MappablePosition, transaction: Tra...
function createMappablePosition (line 64) | function createMappablePosition(position: number): MappablePosition {
FILE: packages/core/src/helpers/combineTransactionSteps.ts
function combineTransactionSteps (line 11) | function combineTransactionSteps(oldDoc: ProseMirrorNode, transactions: ...
FILE: packages/core/src/helpers/createChainableState.ts
function createChainableState (line 8) | function createChainableState(config: { transaction: Transaction; state:...
FILE: packages/core/src/helpers/createDocument.ts
function createDocument (line 13) | function createDocument(
FILE: packages/core/src/helpers/createNodeFromContent.ts
type CreateNodeFromContentOptions (line 7) | type CreateNodeFromContentOptions = {
function createNodeFromContent (line 20) | function createNodeFromContent(
FILE: packages/core/src/helpers/defaultBlockAt.ts
function defaultBlockAt (line 8) | function defaultBlockAt(match: ContentMatch): NodeType | null {
FILE: packages/core/src/helpers/findChildren.ts
function findChildren (line 11) | function findChildren(node: ProseMirrorNode, predicate: Predicate): Node...
FILE: packages/core/src/helpers/findChildrenInRange.ts
function findChildrenInRange (line 12) | function findChildrenInRange(node: ProseMirrorNode, range: Range, predic...
FILE: packages/core/src/helpers/findParentNode.ts
function findParentNode (line 14) | function findParentNode(
FILE: packages/core/src/helpers/findParentNodeClosestToPos.ts
function findParentNodeClosestToPos (line 14) | function findParentNodeClosestToPos(
FILE: packages/core/src/helpers/flattenExtensions.ts
function flattenExtensions (line 9) | function flattenExtensions(extensions: Extensions): Extensions {
FILE: packages/core/src/helpers/generateHTML.ts
function generateHTML (line 13) | function generateHTML(doc: JSONContent, extensions: Extensions): string {
FILE: packages/core/src/helpers/generateJSON.ts
function generateJSON (line 13) | function generateJSON(html: string, extensions: Extensions): Record<stri...
FILE: packages/core/src/helpers/generateText.ts
function generateText (line 15) | function generateText(
FILE: packages/core/src/helpers/getAttributes.ts
function getAttributes (line 14) | function getAttributes(state: EditorState, typeOrName: string | NodeType...
FILE: packages/core/src/helpers/getAttributesFromExtensions.ts
function getAttributesFromExtensions (line 10) | function getAttributesFromExtensions(extensions: Extensions): ExtensionA...
FILE: packages/core/src/helpers/getChangedRanges.ts
type ChangedRange (line 6) | type ChangedRange = {
function simplifyChangedRanges (line 15) | function simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {
function getChangedRanges (line 38) | function getChangedRanges(transform: Transform): ChangedRange[] {
FILE: packages/core/src/helpers/getDebugJSON.ts
type DebugJSONContent (line 5) | interface DebugJSONContent extends JSONContent {
function getDebugJSON (line 10) | function getDebugJSON(node: ProseMirrorNode, startOffset = 0): DebugJSON...
FILE: packages/core/src/helpers/getExtensionField.ts
function getExtensionField (line 13) | function getExtensionField<T = any, E extends AnyExtension = any>(
FILE: packages/core/src/helpers/getHTMLFromFragment.ts
function getHTMLFromFragment (line 4) | function getHTMLFromFragment(fragment: Fragment, schema: Schema): string {
FILE: packages/core/src/helpers/getMarkAttributes.ts
function getMarkAttributes (line 6) | function getMarkAttributes(state: EditorState, typeOrName: string | Mark...
FILE: packages/core/src/helpers/getMarkRange.ts
function findMarkInSet (line 6) | function findMarkInSet(
function isMarkInSet (line 23) | function isMarkInSet(marks: ProseMirrorMark[], type: MarkType, attribute...
function getMarkRange (line 30) | function getMarkRange(
FILE: packages/core/src/helpers/getMarkType.ts
function getMarkType (line 3) | function getMarkType(nameOrType: string | MarkType, schema: Schema): Mar...
FILE: packages/core/src/helpers/getMarksBetween.ts
function getMarksBetween (line 6) | function getMarksBetween(from: number, to: number, doc: ProseMirrorNode)...
FILE: packages/core/src/helpers/getNodeAttributes.ts
function getNodeAttributes (line 6) | function getNodeAttributes(state: EditorState, typeOrName: string | Node...
FILE: packages/core/src/helpers/getNodeType.ts
function getNodeType (line 3) | function getNodeType(nameOrType: string | NodeType, schema: Schema): Nod...
FILE: packages/core/src/helpers/getRenderedAttributes.ts
function getRenderedAttributes (line 6) | function getRenderedAttributes(
FILE: packages/core/src/helpers/getSchema.ts
function getSchema (line 8) | function getSchema(extensions: Extensions, editor?: Editor): Schema {
FILE: packages/core/src/helpers/getSchemaByResolvedExtensions.ts
function cleanUpSchemaItem (line 14) | function cleanUpSchemaItem<T>(data: T) {
function buildAttributeSpec (line 32) | function buildAttributeSpec(
function getSchemaByResolvedExtensions (line 56) | function getSchemaByResolvedExtensions(extensions: Extensions, editor?: ...
FILE: packages/core/src/helpers/getSchemaTypeByName.ts
function getSchemaTypeByName (line 9) | function getSchemaTypeByName(name: string, schema: Schema): NodeType | M...
FILE: packages/core/src/helpers/getSchemaTypeNameByName.ts
function getSchemaTypeNameByName (line 9) | function getSchemaTypeNameByName(name: string, schema: Schema): 'node' |...
FILE: packages/core/src/helpers/getSplittedAttributes.ts
function getSplittedAttributes (line 10) | function getSplittedAttributes(
FILE: packages/core/src/helpers/getText.ts
function getText (line 15) | function getText(
FILE: packages/core/src/helpers/getTextBetween.ts
function getTextBetween (line 13) | function getTextBetween(
FILE: packages/core/src/helpers/getTextSerializersFromSchema.ts
function getTextSerializersFromSchema (line 10) | function getTextSerializersFromSchema(schema: Schema): Record<string, Te...
FILE: packages/core/src/helpers/injectExtensionAttributesToParseRule.ts
function injectExtensionAttributesToParseRule (line 12) | function injectExtensionAttributesToParseRule(
FILE: packages/core/src/helpers/isActive.ts
function isActive (line 7) | function isActive(state: EditorState, name: string | null, attributes: R...
FILE: packages/core/src/helpers/isExtensionRulesEnabled.ts
function isExtensionRulesEnabled (line 3) | function isExtensionRulesEnabled(extension: AnyExtension, enabled: Enabl...
FILE: packages/core/src/helpers/isList.ts
function isList (line 7) | function isList(name: string, extensions: Extensions): boolean {
FILE: packages/core/src/helpers/isMarkActive.ts
function isMarkActive (line 8) | function isMarkActive(
FILE: packages/core/src/helpers/isNodeActive.ts
function isNodeActive (line 8) | function isNodeActive(
FILE: packages/core/src/helpers/isNodeEmpty.ts
function isNodeEmpty (line 6) | function isNodeEmpty(
FILE: packages/core/src/helpers/isNodeSelection.ts
function isNodeSelection (line 3) | function isNodeSelection(value: unknown): value is NodeSelection {
FILE: packages/core/src/helpers/isTextSelection.ts
function isTextSelection (line 3) | function isTextSelection(value: unknown): value is TextSelection {
FILE: packages/core/src/helpers/posToDOMRect.ts
function posToDOMRect (line 5) | function posToDOMRect(view: EditorView, from: number, to: number): DOMRe...
FILE: packages/core/src/helpers/resolveExtensions.ts
function resolveExtensions (line 12) | function resolveExtensions(extensions: Extensions): Extensions {
FILE: packages/core/src/helpers/resolveFocusPosition.ts
function resolveFocusPosition (line 7) | function resolveFocusPosition(doc: ProseMirrorNode, position: FocusPosit...
FILE: packages/core/src/helpers/rewriteUnknownContent.ts
type RewriteUnknownContentOptions (line 5) | type RewriteUnknownContentOptions = {
type RewrittenContent (line 13) | type RewrittenContent = {
function rewriteUnknownContentInner (line 27) | function rewriteUnknownContentInner({
function rewriteUnknownContent (line 111) | function rewriteUnknownContent(
FILE: packages/core/src/helpers/selectionToInsertionEnd.ts
function selectionToInsertionEnd (line 6) | function selectionToInsertionEnd(tr: Transaction, startLen: number, bias...
FILE: packages/core/src/helpers/sortExtensions.ts
function sortExtensions (line 9) | function sortExtensions(extensions: Extensions): Extensions {
FILE: packages/core/src/helpers/splitExtensions.ts
function splitExtensions (line 6) | function splitExtensions(extensions: Extensions) {
FILE: packages/core/src/index.ts
type Commands (line 25) | interface Commands<ReturnType = any> {}
type Storage (line 28) | interface Storage {}
FILE: packages/core/src/inputRules/markInputRule.ts
function markInputRule (line 14) | function markInputRule(config: {
FILE: packages/core/src/inputRules/nodeInputRule.ts
function nodeInputRule (line 13) | function nodeInputRule(config: {
FILE: packages/core/src/inputRules/textInputRule.ts
function textInputRule (line 9) | function textInputRule(config: { find: InputRuleFinder; replace: string;...
FILE: packages/core/src/inputRules/textblockTypeInputRule.ts
function textblockTypeInputRule (line 15) | function textblockTypeInputRule(config: {
FILE: packages/core/src/inputRules/wrappingInputRule.ts
function wrappingInputRule (line 25) | function wrappingInputRule(config: {
FILE: packages/core/src/jsx-runtime.ts
type Attributes (line 1) | type Attributes = Record<string, any>
type DOMOutputSpecElement (line 3) | type DOMOutputSpecElement = 0 | Attributes | DOMOutputSpecArray
type DOMOutputSpecArray (line 8) | type DOMOutputSpecArray =
type Element (line 20) | type Element = DOMOutputSpecArray
type IntrinsicElements (line 21) | interface IntrinsicElements {
type ElementChildrenAttribute (line 25) | interface ElementChildrenAttribute {
type JSXRenderer (line 30) | type JSXRenderer = (
function Fragment (line 36) | function Fragment(props: { children: JSXRenderer[] }) {
FILE: packages/core/src/lib/ResizableNodeView.ts
type ResizableNodeViewDirection (line 17) | type ResizableNodeViewDirection =
type ResizableNodeDimensions (line 30) | type ResizableNodeDimensions = {
type ResizableNodeViewOptions (line 62) | type ResizableNodeViewOptions = {
class ResizableNodeView (line 298) | class ResizableNodeView {
method constructor (line 399) | constructor(options: ResizableNodeViewOptions) {
method dom (line 460) | get dom() {
method contentDOM (line 464) | get contentDOM(): HTMLElement | null {
method handleEditorUpdate (line 468) | private handleEditorUpdate() {
method update (line 496) | update(node: PMNode, decorations: readonly Decoration[], innerDecorati...
method destroy (line 517) | destroy() {
method createContainer (line 547) | createContainer() {
method createWrapper (line 571) | createWrapper() {
method createHandle (line 595) | private createHandle(direction: ResizableNodeViewDirection): HTMLEleme...
method positionHandle (line 616) | private positionHandle(handle: HTMLElement, direction: ResizableNodeVi...
method attachHandles (line 656) | private attachHandles(): void {
method removeHandles (line 691) | private removeHandles(): void {
method applyInitialSize (line 703) | private applyInitialSize(): void {
method handleResizeStart (line 737) | private handleResizeStart(event: MouseEvent | TouchEvent, direction: R...
method handleResize (line 817) | private handleResize(deltaX: number, deltaY: number) {
method calculateNewDimensions (line 905) | private calculateNewDimensions(
method applyConstraints (line 965) | private applyConstraints(width: number, height: number, preserveAspect...
method applyAspectRatio (line 1024) | private applyAspectRatio(
FILE: packages/core/src/pasteRules/markPasteRule.ts
function markPasteRule (line 14) | function markPasteRule(config: {
FILE: packages/core/src/pasteRules/nodePasteRule.ts
function nodePasteRule (line 13) | function nodePasteRule(config: {
FILE: packages/core/src/pasteRules/textPasteRule.ts
function textPasteRule (line 9) | function textPasteRule(config: { find: PasteRuleFinder; replace: string ...
FILE: packages/core/src/types.ts
type AnyConfig (line 29) | type AnyConfig = ExtensionConfig | NodeConfig | MarkConfig
type AnyExtension (line 30) | type AnyExtension = Extendable
type Extensions (line 31) | type Extensions = AnyExtension[]
type ParentConfig (line 33) | type ParentConfig<T> = Partial<{
type Primitive (line 39) | type Primitive = null | undefined | string | number | boolean | symbol |...
type RemoveThis (line 41) | type RemoveThis<T> = T extends (...args: any) => any ? (...args: Paramet...
type MaybeReturnType (line 43) | type MaybeReturnType<T> = T extends (...args: any) => any ? ReturnType<T...
type MaybeThisParameterType (line 45) | type MaybeThisParameterType<T> =
type EditorEvents (line 48) | interface EditorEvents {
type DispatchTransactionProps (line 270) | type DispatchTransactionProps = {
type EnableRules (line 284) | type EnableRules = (AnyExtension | string)[] | boolean
type EditorOptions (line 286) | interface EditorOptions {
type HTMLContent (line 486) | type HTMLContent = string
type JSONContent (line 521) | type JSONContent = {
type MarkType (line 561) | type MarkType<
type NodeType (line 572) | type NodeType<
type DocumentType (line 587) | type DocumentType<
type TextType (line 595) | type TextType<TMarkType extends MarkType = MarkType> = {
type DOMOutputSpecArray (line 605) | type DOMOutputSpecArray =
type Content (line 613) | type Content = HTMLContent | JSONContent | JSONContent[] | null
type CommandProps (line 615) | type CommandProps = {
type Command (line 626) | type Command = (props: CommandProps) => boolean
type CommandSpec (line 628) | type CommandSpec = (...args: any[]) => Command
type KeyboardShortcutCommand (line 630) | type KeyboardShortcutCommand = (props: { editor: Editor }) => boolean
type Attribute (line 632) | type Attribute = {
type Attributes (line 642) | type Attributes = {
type ExtensionAttribute (line 646) | type ExtensionAttribute = {
type GlobalAttributes (line 652) | type GlobalAttributes = {
type PickValue (line 673) | type PickValue<T, K extends keyof T> = T[K]
type UnionToIntersection (line 675) | type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) e...
type Diff (line 677) | type Diff<T extends keyof any, U extends keyof any> = ({ [P in T]: P } & {
type Overwrite (line 681) | type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U
type ValuesOf (line 683) | type ValuesOf<T> = T[keyof T]
type KeysWithTypeOf (line 685) | type KeysWithTypeOf<T, Type> = { [P in keyof T]: T[P] extends Type ? P :...
type DOMNode (line 687) | type DOMNode = InstanceType<typeof window.Node>
type DecorationType (line 693) | interface DecorationType {
type DecorationWithType (line 706) | type DecorationWithType = Decoration & {
type NodeViewProps (line 710) | interface NodeViewProps extends NodeViewRendererProps {
type NodeViewRendererOptions (line 718) | interface NodeViewRendererOptions {
type NodeViewRendererProps (line 724) | interface NodeViewRendererProps {
type NodeViewRenderer (line 763) | type NodeViewRenderer = (props: NodeViewRendererProps) => NodeView
type MarkViewProps (line 766) | interface MarkViewProps extends MarkViewRendererProps {}
type MarkViewRendererProps (line 768) | interface MarkViewRendererProps {
type MarkViewRenderer (line 799) | type MarkViewRenderer<Props = MarkViewRendererProps> = (props: Props) =>...
type MarkViewRendererOptions (line 801) | interface MarkViewRendererOptions {
type AnyCommands (line 805) | type AnyCommands = Record<string, (...args: any[]) => Command>
type UnionCommands (line 807) | type UnionCommands<T = Command> = UnionToIntersection<
type RawCommands (line 811) | type RawCommands = {
type SingleCommands (line 815) | type SingleCommands = {
type ChainedCommands (line 819) | type ChainedCommands = {
type CanCommands (line 825) | type CanCommands = SingleCommands & { chain: () => ChainedCommands }
type FocusPosition (line 827) | type FocusPosition = 'start' | 'end' | 'all' | number | boolean | null
type Range (line 829) | type Range = {
type NodeRange (line 834) | type NodeRange = {
type MarkRange (line 840) | type MarkRange = {
type Predicate (line 846) | type Predicate = (node: ProseMirrorNode) => boolean
type NodeWithPos (line 848) | type NodeWithPos = {
type TextSerializer (line 853) | type TextSerializer = (props: {
type ExtendedRegExpMatchArray (line 861) | type ExtendedRegExpMatchArray = RegExpMatchArray & {
type Dispatch (line 865) | type Dispatch = ((args?: any) => any) | undefined
type MarkdownToken (line 870) | type MarkdownToken = {
type MarkdownHelpers (line 880) | type MarkdownHelpers = {
type MarkdownParseHelpers (line 896) | type MarkdownParseHelpers = {
type FullMarkdownHelpers (line 920) | type FullMarkdownHelpers = MarkdownHelpers & {
type MarkdownParseResult (line 943) | type MarkdownParseResult = JSONContent | JSONContent[] | { mark: string;...
type RenderContext (line 945) | type RenderContext = {
type MarkdownExtensionSpec (line 954) | interface MarkdownExtensionSpec {
type MarkdownLexerConfiguration (line 973) | type MarkdownLexerConfiguration = {
type MarkdownTokenizer (line 990) | type MarkdownTokenizer = {
type MarkdownRendererHelpers (line 1005) | type MarkdownRendererHelpers = {
type Utils (line 1033) | type Utils = {
FILE: packages/core/src/utilities/callOrReturn.ts
function callOrReturn (line 11) | function callOrReturn<T>(value: T, context: any = undefined, ...props: a...
FILE: packages/core/src/utilities/canInsertNode.ts
function canInsertNode (line 4) | function canInsertNode(state: EditorState, nodeType: NodeType): boolean {
FILE: packages/core/src/utilities/createStyleTag.ts
function createStyleTag (line 1) | function createStyleTag(style: string, nonce?: string, suffix?: string):...
FILE: packages/core/src/utilities/deleteProps.ts
function deleteProps (line 6) | function deleteProps(obj: Record<string, any>, propOrProps: string | str...
FILE: packages/core/src/utilities/elementFromString.ts
function elementFromString (line 17) | function elementFromString(value: string): HTMLElement {
FILE: packages/core/src/utilities/escapeForRegEx.ts
function escapeForRegEx (line 2) | function escapeForRegEx(string: string): string {
FILE: packages/core/src/utilities/findDuplicates.ts
function findDuplicates (line 4) | function findDuplicates<T>(items: T[]): T[] {
FILE: packages/core/src/utilities/fromString.ts
function fromString (line 1) | function fromString(value: any): any {
FILE: packages/core/src/utilities/isAndroid.ts
function isAndroid (line 1) | function isAndroid(): boolean {
FILE: packages/core/src/utilities/isEmptyObject.ts
function isEmptyObject (line 1) | function isEmptyObject(value = {}): boolean {
FILE: packages/core/src/utilities/isFirefox.ts
function isFirefox (line 9) | function isFirefox(): boolean {
FILE: packages/core/src/utilities/isFunction.ts
function isFunction (line 2) | function isFunction(value: any): value is Function {
FILE: packages/core/src/utilities/isMacOS.ts
function isMacOS (line 1) | function isMacOS(): boolean {
FILE: packages/core/src/utilities/isNumber.ts
function isNumber (line 1) | function isNumber(value: any): value is number {
FILE: packages/core/src/utilities/isPlainObject.ts
function getType (line 3) | function getType(value: any): string {
function isPlainObject (line 7) | function isPlainObject(value: any): value is Record<string, any> {
FILE: packages/core/src/utilities/isRegExp.ts
function isRegExp (line 1) | function isRegExp(value: any): value is RegExp {
FILE: packages/core/src/utilities/isSafari.ts
function isSafari (line 9) | function isSafari(): boolean {
FILE: packages/core/src/utilities/isString.ts
function isString (line 1) | function isString(value: any): value is string {
FILE: packages/core/src/utilities/isiOS.ts
function isiOS (line 1) | function isiOS(): boolean {
FILE: packages/core/src/utilities/markdown/attributeUtils.ts
function parseAttributes (line 26) | function parseAttributes(attrString: string): Record<string, any> {
function serializeAttributes (line 96) | function serializeAttributes(attributes: Record<string, any>): string {
FILE: packages/core/src/utilities/markdown/createAtomBlockMarkdownSpec.ts
type AtomBlockMarkdownSpecOptions (line 13) | interface AtomBlockMarkdownSpecOptions {
function createAtomBlockMarkdownSpec (line 58) | function createAtomBlockMarkdownSpec(options: AtomBlockMarkdownSpecOptio...
FILE: packages/core/src/utilities/markdown/createBlockMarkdownSpec.ts
type BlockMarkdownSpecOptions (line 14) | interface BlockMarkdownSpecOptions {
function createBlockMarkdownSpec (line 60) | function createBlockMarkdownSpec(options: BlockMarkdownSpecOptions): {
FILE: packages/core/src/utilities/markdown/createInlineMarkdownSpec.ts
function parseShortcodeAttributes (line 13) | function parseShortcodeAttributes(attrString: string): Record<string, an...
function serializeShortcodeAttributes (line 36) | function serializeShortcodeAttributes(attrs: Record<string, any>): string {
type AllowedAttribute (line 47) | type AllowedAttribute =
type InlineMarkdownSpecOptions (line 60) | interface InlineMarkdownSpecOptions {
function createInlineMarkdownSpec (line 142) | function createInlineMarkdownSpec(options: InlineMarkdownSpecOptions): {
FILE: packages/core/src/utilities/markdown/parseIndentedBlocks.ts
type ParsedBlock (line 9) | interface ParsedBlock {
type BlockParserConfig (line 19) | interface BlockParserConfig {
function parseIndentedBlocks (line 77) | function parseIndentedBlocks(
FILE: packages/core/src/utilities/markdown/renderNestedMarkdownContent.ts
function renderNestedMarkdownContent (line 56) | function renderNestedMarkdownContent(
FILE: packages/core/src/utilities/mergeAttributes.ts
function splitStyleDeclarations (line 2) | function splitStyleDeclarations(styles: string): string[] {
function parseStyleEntries (line 50) | function parseStyleEntries(styles: string | undefined): [property: strin...
function mergeAttributes (line 74) | function mergeAttributes(...objects: Record<string, any>[]): Record<stri...
FILE: packages/core/src/utilities/mergeDeep.ts
function mergeDeep (line 3) | function mergeDeep(target: Record<string, any>, source: Record<string, a...
FILE: packages/core/src/utilities/minMax.ts
function minMax (line 1) | function minMax(value = 0, min = 0, max = 0): number {
FILE: packages/core/src/utilities/objectIncludes.ts
function objectIncludes (line 8) | function objectIncludes(
FILE: packages/core/src/utilities/removeDuplicates.ts
function removeDuplicates (line 5) | function removeDuplicates<T>(array: T[], by = JSON.stringify): T[] {
FILE: packages/extension-audio/src/audio.ts
type AudioOptions (line 5) | interface AudioOptions {
type SetAudioOptions (line 94) | type SetAudioOptions = {
type Commands (line 108) | interface Commands<ReturnType> {
method addOptions (line 126) | addOptions() {
method inline (line 143) | inline() {
method group (line 147) | group() {
method addAttributes (line 155) | addAttributes() {
method parseHTML (line 187) | parseHTML() {
method addCommands (line 195) | addCommands() {
method addPasteRules (line 212) | addPasteRules() {
method renderHTML (line 228) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-audio/src/utils.ts
constant AUDIO_URL_REGEX (line 6) | const AUDIO_URL_REGEX = /https?:\/\/[^\s]+?\.(?:mp3|wav|ogg|oga|flac|m4a...
constant AUDIO_URL_REGEX_GLOBAL (line 12) | const AUDIO_URL_REGEX_GLOBAL =
constant AUDIO_DATA_URL_REGEX (line 18) | const AUDIO_DATA_URL_REGEX = /^data:audio\/[a-zA-Z0-9.+-]+;base64,/i
FILE: packages/extension-blockquote/src/blockquote.tsx
type BlockquoteOptions (line 4) | interface BlockquoteOptions {
type Commands (line 14) | interface Commands<ReturnType> {
method addOptions (line 44) | addOptions() {
method parseHTML (line 56) | parseHTML() {
method renderHTML (line 60) | renderHTML({ HTMLAttributes }) {
method addCommands (line 106) | addCommands() {
method addKeyboardShortcuts (line 126) | addKeyboardShortcuts() {
method addInputRules (line 132) | addInputRules() {
FILE: packages/extension-bold/src/bold.tsx
type BoldOptions (line 4) | interface BoldOptions {
type Commands (line 14) | interface Commands<ReturnType> {
method addOptions (line 59) | addOptions() {
method parseHTML (line 65) | parseHTML() {
method renderHTML (line 85) | renderHTML({ HTMLAttributes }) {
method addCommands (line 111) | addCommands() {
method addKeyboardShortcuts (line 131) | addKeyboardShortcuts() {
method addInputRules (line 138) | addInputRules() {
method addPasteRules (line 151) | addPasteRules() {
FILE: packages/extension-bubble-menu/__tests__/bubble-menu-plugin.spec.ts
function createEditor (line 10) | function createEditor(content = '<p>Hello world</p>') {
function createBubbleMenuView (line 17) | function createBubbleMenuView(
FILE: packages/extension-bubble-menu/src/bubble-menu-plugin.ts
function combineDOMRects (line 21) | function combineDOMRects(rect1: DOMRect, rect2: DOMRect): DOMRect {
type BubbleMenuPluginProps (line 33) | interface BubbleMenuPluginProps {
type BubbleMenuViewProps (line 147) | type BubbleMenuViewProps = BubbleMenuPluginProps & {
class BubbleMenuView (line 151) | class BubbleMenuView implements PluginView {
method middlewares (line 218) | get middlewares() {
method virtualElement (line 266) | private get virtualElement(): VirtualElement | undefined {
method constructor (line 332) | constructor({
method updatePosition (line 432) | updatePosition() {
method update (line 462) | update(view: EditorView, oldState?: EditorState) {
method getShouldShow (line 494) | getShouldShow(oldState?: EditorState) {
method show (line 537) | show() {
method hide (line 556) | hide() {
method updateOptions (line 588) | updateOptions(newProps: Partial<Omit<BubbleMenuPluginProps, 'editor' |...
method destroy (line 629) | destroy() {
FILE: packages/extension-bubble-menu/src/bubble-menu.ts
type BubbleMenuOptions (line 6) | type BubbleMenuOptions = Omit<BubbleMenuPluginProps, 'editor' | 'element...
method addOptions (line 22) | addOptions() {
method addProseMirrorPlugins (line 32) | addProseMirrorPlugins() {
FILE: packages/extension-code-block-lowlight/src/code-block-lowlight.ts
type CodeBlockLowlightOptions (line 6) | interface CodeBlockLowlightOptions extends CodeBlockOptions {
method addOptions (line 18) | addOptions() {
method addProseMirrorPlugins (line 32) | addProseMirrorPlugins() {
FILE: packages/extension-code-block-lowlight/src/lowlight-plugin.ts
function parseNodes (line 8) | function parseNodes(nodes: any[], className: string[] = []): { text: str...
function getHighlightNodes (line 23) | function getHighlightNodes(result: any) {
function registered (line 28) | function registered(aliasOrLanguage: string) {
function getDecorations (line 32) | function getDecorations({
function isFunction (line 74) | function isFunction(param: any): param is Function {
function LowlightPlugin (line 78) | function LowlightPlugin({
FILE: packages/extension-code-block/src/code-block.ts
constant DEFAULT_TAB_SIZE (line 4) | const DEFAULT_TAB_SIZE = 4
type CodeBlockOptions (line 6) | interface CodeBlockOptions {
type Commands (line 47) | interface Commands<ReturnType> {
method addOptions (line 82) | addOptions() {
method addAttributes (line 104) | addAttributes() {
method parseHTML (line 132) | parseHTML() {
method renderHTML (line 141) | renderHTML({ node, HTMLAttributes }) {
method addCommands (line 187) | addCommands() {
method addKeyboardShortcuts (line 202) | addKeyboardShortcuts() {
method addInputRules (line 403) | addInputRules() {
method addProseMirrorPlugins (line 422) | addProseMirrorPlugins() {
FILE: packages/extension-code/src/code.ts
type CodeOptions (line 3) | interface CodeOptions {
type Commands (line 13) | interface Commands<ReturnType> {
method addOptions (line 54) | addOptions() {
method parseHTML (line 66) | parseHTML() {
method renderHTML (line 70) | renderHTML({ HTMLAttributes }) {
method addCommands (line 90) | addCommands() {
method addKeyboardShortcuts (line 110) | addKeyboardShortcuts() {
method addInputRules (line 116) | addInputRules() {
method addPasteRules (line 125) | addPasteRules() {
FILE: packages/extension-collaboration-caret/src/collaboration-caret.ts
type CollaborationCaretStorage (line 5) | type CollaborationCaretStorage = {
type CollaborationCaretOptions (line 9) | interface CollaborationCaretOptions {
type Commands (line 64) | interface Commands<ReturnType> {
type Storage (line 80) | interface Storage {
method addOptions (line 105) | addOptions() {
method onCreate (line 132) | onCreate() {
method addStorage (line 143) | addStorage() {
method addCommands (line 149) | addCommands() {
method addProseMirrorPlugins (line 167) | addProseMirrorPlugins() {
FILE: packages/extension-collaboration/src/collaboration.ts
type YSyncOpts (line 9) | type YSyncOpts = Parameters<typeof ySyncPlugin>[1]
type YUndoOpts (line 10) | type YUndoOpts = Parameters<typeof yUndoPlugin>[0]
type CollaborationStorage (line 12) | interface CollaborationStorage {
type Commands (line 21) | interface Commands<ReturnType> {
type Storage (line 36) | interface Storage {
type CollaborationOptions (line 41) | interface CollaborationOptions {
method addOptions (line 92) | addOptions() {
method addStorage (line 101) | addStorage() {
method onCreate (line 107) | onCreate() {
method onBeforeCreate (line 115) | onBeforeCreate() {
method addCommands (line 121) | addCommands() {
method addKeyboardShortcuts (line 160) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 168) | addProseMirrorPlugins() {
FILE: packages/extension-collaboration/src/helpers/CollaborationMappablePosition.ts
class CollaborationMappablePosition (line 15) | class CollaborationMappablePosition extends MappablePosition {
method constructor (line 21) | constructor(position: number, yRelativePosition: YRelativePosition) {
method fromJSON (line 29) | static fromJSON(json: any): CollaborationMappablePosition {
method toJSON (line 36) | toJSON(): any {
function createMappablePosition (line 48) | function createMappablePosition(position: number, state: EditorState): C...
function getUpdatedPosition (line 57) | function getUpdatedPosition(
FILE: packages/extension-collaboration/src/helpers/isChangeOrigin.ts
function isChangeOrigin (line 12) | function isChangeOrigin(transaction: Transaction): boolean {
FILE: packages/extension-collaboration/src/helpers/yRelativePosition.ts
type YRelativePosition (line 14) | type YRelativePosition = any
function getYAbsolutePosition (line 19) | function getYAbsolutePosition(state: EditorState, relativePos: YRelative...
function getYRelativePosition (line 28) | function getYRelativePosition(state: EditorState, absolutePos: number): ...
FILE: packages/extension-details/src/content/details-content.ts
type DetailsContentOptions (line 5) | interface DetailsContentOptions {
method addOptions (line 23) | addOptions() {
method parseHTML (line 29) | parseHTML() {
method renderHTML (line 37) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 41) | addNodeView() {
method addKeyboardShortcuts (line 76) | addKeyboardShortcuts() {
FILE: packages/extension-details/src/details.ts
type DetailsOptions (line 17) | interface DetailsOptions {
type Commands (line 35) | interface Commands<ReturnType> {
method addOptions (line 63) | addOptions() {
method addAttributes (line 71) | addAttributes() {
method parseHTML (line 91) | parseHTML() {
method renderHTML (line 99) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 108) | addNodeView() {
method addCommands (line 222) | addCommands() {
method addKeyboardShortcuts (line 302) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 384) | addProseMirrorPlugins() {
FILE: packages/extension-details/src/summary/details-summary.ts
type DetailsSummaryOptions (line 3) | interface DetailsSummaryOptions {
method addOptions (line 23) | addOptions() {
method parseHTML (line 29) | parseHTML() {
method renderHTML (line 37) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-drag-handle-react/src/DragHandle.tsx
type Optional (line 14) | type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
type DragHandleProps (line 16) | type DragHandleProps = Omit<Optional<DragHandlePluginProps, 'pluginKey'>...
FILE: packages/extension-drag-handle-vue-2/src/DragHandle.ts
type Optional (line 14) | type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
type DragHandleProps (line 16) | type DragHandleProps = Omit<Optional<DragHandlePluginProps, 'pluginKey'>...
method mounted (line 76) | mounted() {
method beforeDestroy (line 96) | beforeDestroy() {
method render (line 102) | render(h: Vue.CreateElement) {
FILE: packages/extension-drag-handle-vue-3/src/DragHandle.ts
type Optional (line 14) | type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
type DragHandleProps (line 16) | type DragHandleProps = Omit<Optional<DragHandlePluginProps, 'pluginKey' ...
method setup (line 76) | setup(props, { slots }) {
FILE: packages/extension-drag-handle/__tests__/defaultRules.spec.ts
function createMockContext (line 17) | function createMockContext(overrides: Partial<RuleContext> = {}): RuleCo...
FILE: packages/extension-drag-handle/__tests__/findBestDragTarget.spec.ts
function createDefaultOptions (line 11) | function createDefaultOptions(overrides: Partial<NormalizedNestedOptions...
function createMockNode (line 25) | function createMockNode(overrides: Partial<Record<string, unknown>> = {}...
FILE: packages/extension-drag-handle/__tests__/scoring.spec.ts
function createMockContext (line 12) | function createMockContext(overrides: Partial<RuleContext> = {}): RuleCo...
FILE: packages/extension-drag-handle/src/drag-handle-plugin.ts
type PluginState (line 19) | type PluginState = {
type DragHandlePluginProps (line 59) | interface DragHandlePluginProps {
function hideHandle (line 93) | function hideHandle() {
function showHandle (line 102) | function showHandle() {
function repositionDragHandle (line 116) | function repositionDragHandle(dom: Element) {
function onDragStart (line 130) | function onDragStart(e: DragEvent) {
function onDragEnd (line 148) | function onDragEnd(e: DragEvent) {
function onDrop (line 157) | function onDrop() {
method unbind (line 177) | unbind() {
method init (line 191) | init() {
method apply (line 194) | apply(tr: Transaction, value: PluginState, _oldState: EditorState, state...
method update (line 268) | update(_, oldState) {
method destroy (line 323) | destroy() {
method keydown (line 343) | keydown(view) {
method mouseleave (line 360) | mouseleave(_view, e) {
method mousemove (line 379) | mousemove(view, e) {
FILE: packages/extension-drag-handle/src/drag-handle.ts
type DragHandleOptions (line 14) | interface DragHandleOptions {
type Commands (line 99) | interface Commands<ReturnType> {
method addOptions (line 120) | addOptions() {
method addCommands (line 140) | addCommands() {
method addProseMirrorPlugins (line 163) | addProseMirrorPlugins() {
FILE: packages/extension-drag-handle/src/helpers/cloneElement.ts
function getCSSText (line 1) | function getCSSText(element: Element) {
function cloneElement (line 12) | function cloneElement(node: HTMLElement) {
FILE: packages/extension-drag-handle/src/helpers/dragHandler.ts
type DragContext (line 11) | interface DragContext {
function getDragHandleRanges (line 16) | function getDragHandleRanges(
function dragHandler (line 61) | function dragHandler(
FILE: packages/extension-drag-handle/src/helpers/edgeDetection.ts
constant DEFAULT_EDGE_CONFIG (line 6) | const DEFAULT_EDGE_CONFIG: EdgeDetectionConfig = {
function normalizeEdgeDetection (line 19) | function normalizeEdgeDetection(
function isNearEdge (line 50) | function isNearEdge(
function calculateEdgeDeduction (line 94) | function calculateEdgeDeduction(
FILE: packages/extension-drag-handle/src/helpers/findBestDragTarget.ts
type DragTarget (line 12) | interface DragTarget {
function hasAncestorOfType (line 31) | function hasAncestorOfType($pos: ResolvedPos, depth: number, allowedType...
function findBestDragTarget (line 45) | function findBestDragTarget(
FILE: packages/extension-drag-handle/src/helpers/findNextElementFromCursor.ts
type FindElementNextToCoords (line 8) | type FindElementNextToCoords = {
function findClosestTopLevelBlock (line 19) | function findClosestTopLevelBlock(element: Element, view: EditorView): H...
function isValidRect (line 32) | function isValidRect(rect: DOMRect): boolean {
function clampToContent (line 46) | function clampToContent(view: EditorView, x: number, y: number, inset = ...
FILE: packages/extension-drag-handle/src/helpers/getComputedStyle.ts
function getComputedStyle (line 1) | function getComputedStyle(node: Element, property: keyof CSSStyleDeclara...
FILE: packages/extension-drag-handle/src/helpers/getInnerCoords.ts
function getInnerCoords (line 6) | function getInnerCoords(view: EditorView, x: number, y: number): { left:...
FILE: packages/extension-drag-handle/src/helpers/minMax.ts
function minMax (line 1) | function minMax(value = 0, min = 0, max = 0): number {
FILE: packages/extension-drag-handle/src/helpers/normalizeOptions.ts
function normalizeNestedOptions (line 20) | function normalizeNestedOptions(input: boolean | NestedOptions | undefin...
FILE: packages/extension-drag-handle/src/helpers/removeNode.ts
function removeNode (line 1) | function removeNode(node: HTMLElement) {
FILE: packages/extension-drag-handle/src/helpers/scoring.ts
constant BASE_SCORE (line 9) | const BASE_SCORE = 1000
function calculateScore (line 21) | function calculateScore(
FILE: packages/extension-drag-handle/src/types/options.ts
type EdgeDetectionPreset (line 6) | type EdgeDetectionPreset =
type EdgeDetectionConfig (line 16) | interface EdgeDetectionConfig {
type NestedOptions (line 40) | interface NestedOptions {
type NormalizedNestedOptions (line 102) | interface NormalizedNestedOptions {
FILE: packages/extension-drag-handle/src/types/rules.ts
type RuleContext (line 8) | interface RuleContext {
type DragHandleRule (line 40) | interface DragHandleRule {
FILE: packages/extension-emoji/src/emoji.ts
type Commands (line 25) | interface Commands<ReturnType> {
type Storage (line 34) | interface Storage {
type EmojiItem (line 39) | type EmojiItem = {
type EmojiOptions (line 78) | type EmojiOptions = {
type EmojiStorage (line 86) | type EmojiStorage = {
method addOptions (line 106) | addOptions() {
method addStorage (line 155) | addStorage() {
method addAttributes (line 176) | addAttributes() {
method parseHTML (line 188) | parseHTML() {
method renderHTML (line 196) | renderHTML({ HTMLAttributes, node }) {
method renderText (line 232) | renderText({ node }) {
method addCommands (line 246) | addCommands() {
method addInputRules (line 275) | addInputRules() {
method addPasteRules (line 332) | addPasteRules() {
method addProseMirrorPlugins (line 372) | addProseMirrorPlugins() {
FILE: packages/extension-emoji/src/generate.ts
type Shortcodes (line 12) | type Shortcodes = Record<string, string | string[]>
FILE: packages/extension-emoji/src/helpers/emojiToShortcode.ts
function emojiToShortcode (line 4) | function emojiToShortcode(emoji: string, emojis: EmojiItem[]): string | ...
FILE: packages/extension-emoji/src/helpers/removeDuplicates.ts
function removeDuplicates (line 5) | function removeDuplicates<T>(array: T[], by = JSON.stringify): T[] {
FILE: packages/extension-emoji/src/helpers/removeVariationSelector.ts
function removeVariationSelector (line 1) | function removeVariationSelector(value: string): string {
FILE: packages/extension-emoji/src/helpers/shortcodeToEmoji.ts
function shortcodeToEmoji (line 3) | function shortcodeToEmoji(shortcode: string, emojis: EmojiItem[]): Emoji...
FILE: packages/extension-file-handler/src/FileHandlePlugin.ts
method handleDrop (line 10) | handleDrop(_view, event) {
method handlePaste (line 42) | handlePaste(_view, event) {
FILE: packages/extension-file-handler/src/fileHandler.ts
method addOptions (line 10) | addOptions() {
method addProseMirrorPlugins (line 18) | addProseMirrorPlugins() {
FILE: packages/extension-file-handler/src/types.ts
type FileHandlePluginOptions (line 4) | type FileHandlePluginOptions = {
type FileHandlerOptions (line 41) | type FileHandlerOptions = {} & Omit<FileHandlePluginOptions, 'key' | 'ed...
FILE: packages/extension-floating-menu/__tests__/floating-menu-plugin.spec.ts
function createEditor (line 11) | function createEditor(content = '<p>Hello world</p>') {
function createFloatingMenuView (line 18) | function createFloatingMenuView(
FILE: packages/extension-floating-menu/src/floating-menu-plugin.ts
type FloatingMenuPluginProps (line 20) | interface FloatingMenuPluginProps {
type FloatingMenuViewProps (line 124) | type FloatingMenuViewProps = FloatingMenuPluginProps & {
class FloatingMenuView (line 131) | class FloatingMenuView {
method getTextContent (line 164) | private getTextContent(node: ProsemirrorNode) {
method middlewares (line 200) | get middlewares() {
method constructor (line 248) | constructor({
method getShouldShow (line 294) | getShouldShow(oldState?: EditorState) {
method updateOptions (line 377) | updateOptions(newProps: Partial<Omit<FloatingMenuPluginProps, 'editor'...
method updatePosition (line 429) | updatePosition() {
method update (line 462) | update(view: EditorView, oldState?: EditorState) {
method show (line 469) | show() {
method hide (line 488) | hide() {
method destroy (line 505) | destroy() {
FILE: packages/extension-floating-menu/src/floating-menu.ts
type FloatingMenuOptions (line 6) | type FloatingMenuOptions = Omit<FloatingMenuPluginProps, 'editor' | 'ele...
type Commands (line 16) | interface Commands<ReturnType> {
method addOptions (line 34) | addOptions() {
method addCommands (line 46) | addCommands() {
method addProseMirrorPlugins (line 59) | addProseMirrorPlugins() {
FILE: packages/extension-hard-break/src/hard-break.ts
type HardBreakOptions (line 3) | interface HardBreakOptions {
type Commands (line 20) | interface Commands<ReturnType> {
method addOptions (line 40) | addOptions() {
method parseHTML (line 55) | parseHTML() {
method renderHTML (line 59) | renderHTML({ HTMLAttributes }) {
method renderText (line 63) | renderText() {
method addCommands (line 75) | addCommands() {
method addKeyboardShortcuts (line 112) | addKeyboardShortcuts() {
FILE: packages/extension-heading/src/heading.ts
type Level (line 6) | type Level = 1 | 2 | 3 | 4 | 5 | 6
type HeadingOptions (line 8) | interface HeadingOptions {
type Commands (line 25) | interface Commands<ReturnType> {
method addOptions (line 50) | addOptions() {
method addAttributes (line 63) | addAttributes() {
method parseHTML (line 72) | parseHTML() {
method renderHTML (line 79) | renderHTML({ node, HTMLAttributes }) {
method addCommands (line 104) | addCommands() {
method addKeyboardShortcuts (line 127) | addKeyboardShortcuts() {
method addInputRules (line 139) | addInputRules() {
FILE: packages/extension-highlight/src/highlight.ts
type HighlightOptions (line 3) | interface HighlightOptions {
type Commands (line 20) | interface Commands<ReturnType> {
method addOptions (line 60) | addOptions() {
method addAttributes (line 67) | addAttributes() {
method parseHTML (line 90) | parseHTML() {
method renderHTML (line 98) | renderHTML({ HTMLAttributes }) {
method tokenize (line 114) | tokenize(src, _, h) {
method addCommands (line 133) | addCommands() {
method addKeyboardShortcuts (line 153) | addKeyboardShortcuts() {
method addInputRules (line 159) | addInputRules() {
method addPasteRules (line 168) | addPasteRules() {
FILE: packages/extension-horizontal-rule/src/horizontal-rule.ts
type HorizontalRuleOptions (line 4) | interface HorizontalRuleOptions {
type Commands (line 20) | interface Commands<ReturnType> {
method addOptions (line 38) | addOptions() {
method parseHTML (line 47) | parseHTML() {
method renderHTML (line 51) | renderHTML({ HTMLAttributes }) {
method addCommands (line 65) | addCommands() {
method addInputRules (line 127) | addInputRules() {
FILE: packages/extension-image/src/image.ts
type ImageOptions (line 4) | interface ImageOptions {
type SetImageOptions (line 43) | interface SetImageOptions {
type Commands (line 52) | interface Commands<ReturnType> {
method addOptions (line 79) | addOptions() {
method inline (line 88) | inline() {
method group (line 92) | group() {
method addAttributes (line 98) | addAttributes() {
method parseHTML (line 118) | parseHTML() {
method renderHTML (line 126) | renderHTML({ HTMLAttributes }) {
method addNodeView (line 146) | addNodeView() {
method addCommands (line 226) | addCommands() {
method addInputRules (line 239) | addInputRules() {
FILE: packages/extension-invisible-characters/src/invisible-characters.ts
type Commands (line 12) | interface Commands<ReturnType> {
method addOptions (line 35) | addOptions() {
method addProseMirrorPlugins (line 44) | addProseMirrorPlugins() {
method addStorage (line 48) | addStorage() {
method onBeforeCreate (line 54) | onBeforeCreate() {
method addCommands (line 60) | addCommands() {
FILE: packages/extension-invisible-characters/src/plugin/InvisibleCharacter.ts
type InvisibleCharacterOptions (line 7) | interface InvisibleCharacterOptions {
class InvisibleCharacter (line 14) | class InvisibleCharacter {
method constructor (line 23) | constructor(options: InvisibleCharacterOptions) {
method createDecoration (line 30) | createDecoration(from: number, to: number, doc: Node, decorations: Dec...
method test (line 42) | test(value: string) {
FILE: packages/extension-invisible-characters/src/plugin/InvisibleCharactersPlugin.ts
method decorations (line 70) | decorations(editorState) {
FILE: packages/extension-invisible-characters/src/plugin/InvisibleNode.ts
type InvisibleNodeOptions (line 6) | interface InvisibleNodeOptions {
class InvisibleNode (line 17) | class InvisibleNode {
method constructor (line 28) | constructor(options: InvisibleNodeOptions) {
method createDecoration (line 36) | createDecoration(from: number, to: number, doc: Node, decorations: Dec...
method test (line 56) | test(value: Node) {
FILE: packages/extension-invisible-characters/src/plugin/invisible-characters/hardBreak.ts
class HardBreakNode (line 3) | class HardBreakNode extends InvisibleNode {
method constructor (line 4) | constructor() {
FILE: packages/extension-invisible-characters/src/plugin/invisible-characters/paragraph.ts
class ParagraphNode (line 3) | class ParagraphNode extends InvisibleNode {
method constructor (line 4) | constructor() {
FILE: packages/extension-invisible-characters/src/plugin/invisible-characters/space.ts
class SpaceCharacter (line 3) | class SpaceCharacter extends InvisibleCharacter {
method constructor (line 4) | constructor() {
FILE: packages/extension-invisible-characters/src/plugin/utils/get-updated-ranges.ts
type StepRange (line 3) | type StepRange = [from: number, to: number]
FILE: packages/extension-invisible-characters/src/types.ts
type InvisibleCharactersOptions (line 6) | interface InvisibleCharactersOptions {
type Position (line 13) | interface Position {
type PluginState (line 18) | interface PluginState {
type InvisibleCharactersStorage (line 23) | interface InvisibleCharactersStorage {
type Storage (line 31) | interface Storage {
FILE: packages/extension-italic/src/italic.ts
type ItalicOptions (line 3) | interface ItalicOptions {
type Commands (line 13) | interface Commands<ReturnType> {
method addOptions (line 61) | addOptions() {
method parseHTML (line 67) | parseHTML() {
method renderHTML (line 86) | renderHTML({ HTMLAttributes }) {
method addCommands (line 90) | addCommands() {
method addKeyboardShortcuts (line 128) | addKeyboardShortcuts() {
method addInputRules (line 135) | addInputRules() {
method addPasteRules (line 148) | addPasteRules() {
FILE: packages/extension-link/src/helpers/autolink.ts
function isValidLinkStructure (line 20) | function isValidLinkStructure(tokens: Array<ReturnType<MultiToken['toObj...
type AutolinkOptions (line 32) | type AutolinkOptions = {
function autolink (line 44) | function autolink(options: AutolinkOptions): Plugin {
FILE: packages/extension-link/src/helpers/clickHandler.ts
type ClickHandlerOptions (line 6) | type ClickHandlerOptions = {
function clickHandler (line 13) | function clickHandler(options: ClickHandlerOptions): Plugin {
FILE: packages/extension-link/src/helpers/pasteHandler.ts
type PasteHandlerOptions (line 8) | type PasteHandlerOptions = {
function pasteHandler (line 15) | function pasteHandler(options: PasteHandlerOptions): Plugin {
FILE: packages/extension-link/src/helpers/whitespace.ts
constant UNICODE_WHITESPACE_PATTERN (line 3) | const UNICODE_WHITESPACE_PATTERN = '[\u0000-\u0020\u00A0\u1680\u180E\u20...
constant UNICODE_WHITESPACE_REGEX (line 5) | const UNICODE_WHITESPACE_REGEX = new RegExp(UNICODE_WHITESPACE_PATTERN)
constant UNICODE_WHITESPACE_REGEX_END (line 6) | const UNICODE_WHITESPACE_REGEX_END = new RegExp(`${UNICODE_WHITESPACE_PA...
constant UNICODE_WHITESPACE_REGEX_GLOBAL (line 7) | const UNICODE_WHITESPACE_REGEX_GLOBAL = new RegExp(UNICODE_WHITESPACE_PA...
FILE: packages/extension-link/src/link.ts
type LinkProtocolOptions (line 11) | interface LinkProtocolOptions {
type DeprecatedOpenWhenNotEditable (line 34) | type DeprecatedOpenWhenNotEditable = 'whenNotEditable'
type LinkOptions (line 36) | interface LinkOptions {
type Commands (line 132) | interface Commands<ReturnType> {
function isAllowedUri (line 167) | function isAllowedUri(uri: string | undefined, protocols?: LinkOptions['...
method onCreate (line 205) | onCreate() {
method onDestroy (line 221) | onDestroy() {
method inclusive (line 225) | inclusive() {
method addOptions (line 229) | addOptions() {
method addAttributes (line 270) | addAttributes() {
method parseHTML (line 293) | parseHTML() {
method renderHTML (line 317) | renderHTML({ HTMLAttributes }) {
method addCommands (line 350) | addCommands() {
method addPasteRules (line 400) | addPasteRules() {
method addProseMirrorPlugins (line 447) | addProseMirrorPlugins() {
FILE: packages/extension-list/__tests__/taskItem.spec.ts
method addAttributes (line 19) | addAttributes() {
method addAttributes (line 76) | addAttributes() {
method addAttributes (line 128) | addAttributes() {
method addAttributes (line 246) | addAttributes() {
FILE: packages/extension-list/src/bullet-list/bullet-list.ts
type BulletListOptions (line 6) | interface BulletListOptions {
type Commands (line 37) | interface Commands<ReturnType> {
method addOptions (line 61) | addOptions() {
method content (line 72) | content() {
method parseHTML (line 76) | parseHTML() {
method renderHTML (line 80) | renderHTML({ HTMLAttributes }) {
method addCommands (line 109) | addCommands() {
method addKeyboardShortcuts (line 125) | addKeyboardShortcuts() {
method addInputRules (line 131) | addInputRules() {
FILE: packages/extension-list/src/item/list-item.ts
type ListItemOptions (line 3) | interface ListItemOptions {
method addOptions (line 33) | addOptions() {
method parseHTML (line 45) | parseHTML() {
method renderHTML (line 53) | renderHTML({ HTMLAttributes }) {
method addKeyboardShortcuts (line 139) | addKeyboardShortcuts() {
FILE: packages/extension-list/src/keymap/list-keymap.ts
type ListKeymapOptions (line 5) | type ListKeymapOptions = {
method addOptions (line 27) | addOptions() {
method addKeyboardShortcuts (line 42) | addKeyboardShortcuts() {
FILE: packages/extension-list/src/kit/index.ts
type ListKitOptions (line 16) | interface ListKitOptions {
method addExtensions (line 52) | addExtensions() {
FILE: packages/extension-list/src/ordered-list/ordered-list.ts
type OrderedListOptions (line 8) | interface OrderedListOptions {
type Commands (line 39) | interface Commands<ReturnType> {
method addOptions (line 64) | addOptions() {
method content (line 75) | content() {
method addAttributes (line 79) | addAttributes() {
method parseHTML (line 94) | parseHTML() {
method renderHTML (line 102) | renderHTML({ HTMLAttributes }) {
method addCommands (line 180) | addCommands() {
method addKeyboardShortcuts (line 196) | addKeyboardShortcuts() {
method addInputRules (line 202) | addInputRules() {
FILE: packages/extension-list/src/ordered-list/utils.ts
constant ORDERED_LIST_ITEM_REGEX (line 8) | const ORDERED_LIST_ITEM_REGEX = /^(\s*)(\d+)\.\s+(.*)$/
constant INDENTED_LINE_REGEX (line 14) | const INDENTED_LINE_REGEX = /^\s/
type OrderedListItem (line 19) | interface OrderedListItem {
function collectOrderedListItems (line 34) | function collectOrderedListItems(lines: string[]): [OrderedListItem[], n...
function buildNestedStructure (line 104) | function buildNestedStructure(
function parseListItems (line 193) | function parseListItems(items: MarkdownToken[], helpers: MarkdownParseHe...
FILE: packages/extension-list/src/task-item/task-item.ts
type TaskItemOptions (line 11) | interface TaskItemOptions {
method addOptions (line 67) | addOptions() {
method content (line 76) | content() {
method addAttributes (line 82) | addAttributes() {
method parseHTML (line 99) | parseHTML() {
method renderHTML (line 108) | renderHTML({ node, HTMLAttributes }) {
method addKeyboardShortcuts (line 161) | addKeyboardShortcuts() {
method addNodeView (line 179) | addNodeView() {
method addInputRules (line 309) | addInputRules() {
FILE: packages/extension-list/src/task-list/task-list.ts
type TaskListOptions (line 3) | interface TaskListOptions {
type Commands (line 20) | interface Commands<ReturnType> {
method addOptions (line 38) | addOptions() {
method content (line 47) | content() {
method parseHTML (line 51) | parseHTML() {
method renderHTML (line 60) | renderHTML({ HTMLAttributes }) {
method start (line 79) | start(src) {
method tokenize (line 84) | tokenize(src, tokens, lexer) {
method addCommands (line 168) | addCommands() {
method addKeyboardShortcuts (line 178) | addKeyboardShortcuts() {
FILE: packages/extension-mathematics/src/extensions/BlockMath.ts
type BlockMathOptions (line 8) | type BlockMathOptions = {
type Commands (line 38) | interface Commands<ReturnType> {
method addOptions (line 90) | addOptions() {
method addAttributes (line 97) | addAttributes() {
method addCommands (line 111) | addCommands() {
method parseHTML (line 168) | parseHTML() {
method renderHTML (line 176) | renderHTML({ HTMLAttributes }) {
method addInputRules (line 217) | addInputRules() {
method addNodeView (line 233) | addNodeView() {
FILE: packages/extension-mathematics/src/extensions/InlineMath.ts
type InlineMathOptions (line 8) | type InlineMathOptions = {
type Commands (line 43) | interface Commands<ReturnType> {
method addOptions (line 97) | addOptions() {
method addAttributes (line 104) | addAttributes() {
method addCommands (line 118) | addCommands() {
method parseHTML (line 172) | parseHTML() {
method renderHTML (line 180) | renderHTML({ HTMLAttributes }) {
method addInputRules (line 220) | addInputRules() {
method addNodeView (line 236) | addNodeView() {
FILE: packages/extension-mathematics/src/mathematics.ts
method addOptions (line 55) | addOptions() {
method addExtensions (line 63) | addExtensions() {
FILE: packages/extension-mathematics/src/types.ts
type MathematicsOptions (line 10) | type MathematicsOptions = {
type MathematicsOptionsWithEditor (line 24) | type MathematicsOptionsWithEditor = MathematicsOptions & { editor: Editor }
FILE: packages/extension-mathematics/src/utils.ts
function createMathMigrateTransaction (line 35) | function createMathMigrateTransaction(editor: Editor, tr: Transaction, r...
function migrateMathStrings (line 98) | function migrateMathStrings(editor: Editor, regex: RegExp = mathMigratio...
FILE: packages/extension-mention/src/mention.ts
type MentionNodeAttrs (line 11) | interface MentionNodeAttrs {
type MentionOptions (line 29) | interface MentionOptions<SuggestionItem = any, Attrs extends Record<stri...
type GetSuggestionsOptions (line 101) | interface GetSuggestionsOptions {
function getSuggestions (line 113) | function getSuggestions(options: GetSuggestionsOptions) {
function getSuggestionFromChar (line 134) | function getSuggestionFromChar(options: GetSuggestionsOptions, char: str...
method addOptions (line 158) | addOptions() {
method addAttributes (line 185) | addAttributes() {
method parseHTML (line 228) | parseHTML() {
method renderHTML (line 236) | renderHTML({ node, HTMLAttributes }) {
method renderText (line 301) | renderText({ node }) {
method addKeyboardShortcuts (line 315) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 353) | addProseMirrorPlugins() {
FILE: packages/extension-mention/src/utils/get-default-suggestion-attributes.ts
type GetSuggestionOptionsOptions (line 9) | interface GetSuggestionOptionsOptions {
function getSuggestionOptions (line 40) | function getSuggestionOptions({
FILE: packages/extension-node-range/src/helpers/NodeRangeBookmark.ts
class NodeRangeBookmark (line 6) | class NodeRangeBookmark {
method constructor (line 11) | constructor(anchor: number, head: number) {
method map (line 16) | map(mapping: Mappable) {
method resolve (line 20) | resolve(doc: ProseMirrorNode) {
FILE: packages/extension-node-range/src/helpers/NodeRangeSelection.ts
class NodeRangeSelection (line 8) | class NodeRangeSelection extends Selection {
method constructor (line 11) | constructor($anchor: ResolvedPos, $head: ResolvedPos, depth?: number, ...
method $to (line 37) | get $to() {
method eq (line 41) | eq(other: Selection): boolean {
method map (line 45) | map(doc: ProseMirrorNode, mapping: Mapping): NodeRangeSelection {
method toJSON (line 52) | toJSON() {
method isForwards (line 60) | get isForwards(): boolean {
method isBackwards (line 64) | get isBackwards(): boolean {
method extendBackwards (line 68) | extendBackwards(): NodeRangeSelection {
method extendForwards (line 85) | extendForwards(): NodeRangeSelection {
method fromJSON (line 102) | static fromJSON(doc: ProseMirrorNode, json: any): NodeRangeSelection {
method create (line 106) | static create(doc: ProseMirrorNode, anchor: number, head: number, dept...
method getBookmark (line 110) | getBookmark(): NodeRangeBookmark {
FILE: packages/extension-node-range/src/helpers/getNodeRangeDecorations.ts
function getNodeRangeDecorations (line 4) | function getNodeRangeDecorations(ranges: SelectionRange[]): DecorationSet {
FILE: packages/extension-node-range/src/helpers/getSelectionRanges.ts
function getSelectionRanges (line 4) | function getSelectionRanges($from: ResolvedPos, $to: ResolvedPos, depth?...
FILE: packages/extension-node-range/src/helpers/isNodeRangeSelection.ts
function isNodeRangeSelection (line 3) | function isNodeRangeSelection(value: unknown): value is NodeRangeSelecti...
FILE: packages/extension-node-range/src/node-range.ts
type NodeRangeOptions (line 10) | interface NodeRangeOptions {
method addOptions (line 18) | addOptions() {
method addKeyboardShortcuts (line 25) | addKeyboardShortcuts() {
method onSelectionUpdate (line 90) | onSelectionUpdate() {
method addProseMirrorPlugins (line 98) | addProseMirrorPlugins() {
FILE: packages/extension-paragraph/src/paragraph.ts
type ParagraphOptions (line 3) | interface ParagraphOptions {
type Commands (line 13) | interface Commands<ReturnType> {
constant EMPTY_PARAGRAPH_MARKDOWN (line 29) | const EMPTY_PARAGRAPH_MARKDOWN = ' '
constant NBSP_CHAR (line 35) | const NBSP_CHAR = '\u00A0'
method addOptions (line 46) | addOptions() {
method parseHTML (line 56) | parseHTML() {
method renderHTML (line 60) | renderHTML({ HTMLAttributes }) {
method addCommands (line 112) | addCommands() {
method addKeyboardShortcuts (line 122) | addKeyboardShortcuts() {
FILE: packages/extension-strike/src/strike.ts
type StrikeOptions (line 3) | interface StrikeOptions {
type Commands (line 13) | interface Commands<ReturnType> {
method addOptions (line 51) | addOptions() {
method parseHTML (line 57) | parseHTML() {
method renderHTML (line 76) | renderHTML({ HTMLAttributes }) {
method addCommands (line 91) | addCommands() {
method addKeyboardShortcuts (line 111) | addKeyboardShortcuts() {
method addInputRules (line 117) | addInputRules() {
method addPasteRules (line 126) | addPasteRules() {
FILE: packages/extension-subscript/src/subscript.ts
type SubscriptExtensionOptions (line 4) | interface SubscriptExtensionOptions {
type Commands (line 14) | interface Commands<ReturnType> {
method addOptions (line 42) | addOptions() {
method parseHTML (line 48) | parseHTML() {
method renderHTML (line 68) | renderHTML({ HTMLAttributes }) {
method addCommands (line 72) | addCommands() {
method addKeyboardShortcuts (line 92) | addKeyboardShortcuts() {
FILE: packages/extension-superscript/src/superscript.ts
type SuperscriptExtensionOptions (line 4) | interface SuperscriptExtensionOptions {
type Commands (line 14) | interface Commands<ReturnType> {
method addOptions (line 42) | addOptions() {
method parseHTML (line 48) | parseHTML() {
method renderHTML (line 68) | renderHTML({ HTMLAttributes }) {
method addCommands (line 72) | addCommands() {
method addKeyboardShortcuts (line 92) | addKeyboardShortcuts() {
FILE: packages/extension-table-of-contents/src/plugin.ts
method appendTransaction (line 15) | appendTransaction(transactions, _oldState, newState) {
FILE: packages/extension-table-of-contents/src/tableOfContents.ts
method addStorage (line 174) | addStorage() {
method addGlobalAttributes (line 183) | addGlobalAttributes() {
method addOptions (line 215) | addOptions() {
method addCommands (line 230) | addCommands() {
method onTransaction (line 251) | onTransaction({ transaction }) {
method onCreate (line 264) | onCreate() {
method onDestroy (line 352) | onDestroy() {
method addProseMirrorPlugins (line 365) | addProseMirrorPlugins() {
FILE: packages/extension-table-of-contents/src/types.ts
type GetTableOfContentLevelFunction (line 4) | type GetTableOfContentLevelFunction = (
type GetTableOfContentIndexFunction (line 9) | type GetTableOfContentIndexFunction = (
type TableOfContentsOptions (line 15) | type TableOfContentsOptions = {
type TableOfContentsStorage (line 24) | type TableOfContentsStorage = {
type TableOfContentData (line 31) | type TableOfContentData = Array<TableOfContentDataItem>
type TableOfContentDataItem (line 33) | type TableOfContentDataItem = {
type Commands (line 48) | interface Commands<ReturnType> {
type Storage (line 54) | interface Storage {
FILE: packages/extension-table-of-contents/src/utils.ts
function debounce (line 64) | function debounce(func: (...args: any[]) => void, wait: number) {
FILE: packages/extension-table/src/cell/table-cell.ts
type TableCellOptions (line 5) | interface TableCellOptions {
method addOptions (line 21) | addOptions() {
method addAttributes (line 29) | addAttributes() {
method parseHTML (line 64) | parseHTML() {
method renderHTML (line 68) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-table/src/header/table-header.ts
type TableHeaderOptions (line 5) | interface TableHeaderOptions {
method addOptions (line 21) | addOptions() {
method addAttributes (line 29) | addAttributes() {
method parseHTML (line 53) | parseHTML() {
method renderHTML (line 57) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-table/src/kit/index.ts
type TableKitOptions (line 12) | interface TableKitOptions {
method addExtensions (line 43) | addExtensions() {
FILE: packages/extension-table/src/row/table-row.ts
type TableRowOptions (line 5) | interface TableRowOptions {
method addOptions (line 21) | addOptions() {
method parseHTML (line 31) | parseHTML() {
method renderHTML (line 35) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-table/src/table/TableView.ts
function updateColumns (line 6) | function updateColumns(
class TableView (line 73) | class TableView implements NodeView {
method constructor (line 86) | constructor(node: ProseMirrorNode, cellMinWidth: number) {
method update (line 103) | update(node: ProseMirrorNode) {
method ignoreMutation (line 114) | ignoreMutation(mutation: ViewMutationRecord) {
FILE: packages/extension-table/src/table/table.ts
type MarkdownTableToken (line 40) | type MarkdownTableToken = {
type TableOptions (line 45) | interface TableOptions {
type Commands (line 104) | interface Commands<ReturnType> {
method addOptions (line 254) | addOptions() {
method parseHTML (line 276) | parseHTML() {
method renderHTML (line 280) | renderHTML({ node, HTMLAttributes }) {
method addCommands (line 335) | addCommands() {
method addKeyboardShortcuts (line 460) | addKeyboardShortcuts() {
method addProseMirrorPlugins (line 481) | addProseMirrorPlugins() {
method extendNodeSchema (line 502) | extendNodeSchema(extension) {
FILE: packages/extension-table/src/table/utilities/colStyle.ts
function getColStyleDeclaration (line 1) | function getColStyleDeclaration(minWidth: number, width: number | undefi...
FILE: packages/extension-table/src/table/utilities/createCell.ts
function createCell (line 3) | function createCell(
FILE: packages/extension-table/src/table/utilities/createColGroup.ts
type ColGroup (line 5) | type ColGroup =
function createColGroup (line 29) | function createColGroup(
FILE: packages/extension-table/src/table/utilities/createTable.ts
function createTable (line 6) | function createTable(
FILE: packages/extension-table/src/table/utilities/getTableNodeTypes.ts
function getTableNodeTypes (line 3) | function getTableNodeTypes(schema: Schema): { [key: string]: NodeType } {
FILE: packages/extension-table/src/table/utilities/isCellSelection.ts
function isCellSelection (line 3) | function isCellSelection(value: unknown): value is CellSelection {
FILE: packages/extension-table/src/table/utilities/markdown.ts
constant DEFAULT_CELL_LINE_SEPARATOR (line 3) | const DEFAULT_CELL_LINE_SEPARATOR = '\u001F'
function collapseWhitespace (line 5) | function collapseWhitespace(s: string) {
function renderTableToMarkdown (line 9) | function renderTableToMarkdown(
FILE: packages/extension-table/src/types.ts
type NodeConfig (line 4) | interface NodeConfig<Options, Storage> {
FILE: packages/extension-text-align/src/text-align.ts
type TextAlignOptions (line 3) | interface TextAlignOptions {
type Commands (line 27) | interface Commands<ReturnType> {
method addOptions (line 57) | addOptions() {
method addGlobalAttributes (line 65) | addGlobalAttributes() {
method addCommands (line 90) | addCommands() {
method addKeyboardShortcuts (line 125) | addKeyboardShortcuts() {
FILE: packages/extension-text-style/src/background-color/background-color.ts
type BackgroundColorOptions (line 5) | type BackgroundColorOptions = {
type Commands (line 15) | interface Commands<ReturnType> {
type TextStyleAttributes (line 35) | interface TextStyleAttributes {
method addOptions (line 47) | addOptions() {
method addGlobalAttributes (line 53) | addGlobalAttributes() {
method addCommands (line 102) | addCommands() {
FILE: packages/extension-text-style/src/color/color.ts
type ColorOptions (line 5) | type ColorOptions = {
type Commands (line 15) | interface Commands<ReturnType> {
type TextStyleAttributes (line 35) | interface TextStyleAttributes {
method addOptions (line 47) | addOptions() {
method addGlobalAttributes (line 53) | addGlobalAttributes() {
method addCommands (line 102) | addCommands() {
FILE: packages/extension-text-style/src/font-family/font-family.ts
type FontFamilyOptions (line 5) | type FontFamilyOptions = {
type Commands (line 15) | interface Commands<ReturnType> {
type TextStyleAttributes (line 34) | interface TextStyleAttributes {
method addOptions (line 46) | addOptions() {
method addGlobalAttributes (line 52) | addGlobalAttributes() {
method addCommands (line 75) | addCommands() {
FILE: packages/extension-text-style/src/font-size/font-size.ts
type FontSizeOptions (line 5) | type FontSizeOptions = {
type Commands (line 15) | interface Commands<ReturnType> {
type TextStyleAttributes (line 34) | interface TextStyleAttributes {
method addOptions (line 46) | addOptions() {
method addGlobalAttributes (line 52) | addGlobalAttributes() {
method addCommands (line 75) | addCommands() {
FILE: packages/extension-text-style/src/index.ts
type TextStyleAttributes (line 14) | interface TextStyleAttributes extends Record<string, any> {}
FILE: packages/extension-text-style/src/line-height/line-height.ts
type LineHeightOptions (line 5) | type LineHeightOptions = {
type Commands (line 15) | interface Commands<ReturnType> {
type TextStyleAttributes (line 34) | interface TextStyleAttributes {
method addOptions (line 46) | addOptions() {
method addGlobalAttributes (line 52) | addGlobalAttributes() {
method addCommands (line 75) | addCommands() {
FILE: packages/extension-text-style/src/text-style-kit/index.ts
type TextStyleKitOptions (line 16) | interface TextStyleKitOptions {
method addExtensions (line 57) | addExtensions() {
FILE: packages/extension-text-style/src/text-style/index.ts
type TextStyleOptions (line 5) | interface TextStyleOptions {
type Commands (line 23) | interface Commands<ReturnType> {
constant MAX_FIND_CHILD_SPAN_DEPTH (line 40) | const MAX_FIND_CHILD_SPAN_DEPTH = 20
method addOptions (line 93) | addOptions() {
method parseHTML (line 100) | parseHTML() {
method renderHTML (line 122) | renderHTML({ HTMLAttributes }) {
method addCommands (line 126) | addCommands() {
FILE: packages/extension-twitch/src/twitch.ts
type TwitchOptions (line 5) | interface TwitchOptions {
type SetTwitchVideoOptions (line 81) | type SetTwitchVideoOptions = {
type Commands (line 91) | interface Commands<ReturnType> {
method addOptions (line 128) | addOptions() {
method inline (line 143) | inline() {
method group (line 147) | group() {
method addAttributes (line 153) | addAttributes() {
method parseHTML (line 176) | parseHTML() {
method addCommands (line 184) | addCommands() {
method addPasteRules (line 201) | addPasteRules() {
method renderHTML (line 217) | renderHTML({ HTMLAttributes }) {
FILE: packages/extension-twitch/src/utils.ts
constant TWITCH_REGEX (line 13) | const TWITCH_REGEX =
constant TWITCH_REGEX_GLOBAL (line 16) | const TWITCH_REGEX_GLOBAL =
type GetEmbedUrlOptions (line 38) | interface GetEmbedUrlOptions {
FILE: packages/extension-typography/src/typography.ts
type TypographyOptions (line 3) | interface TypographyOptions {
method addOptions (line 276) | addOptions() {
method addInputRules (line 303) | addInputRules() {
FILE: packages/extension-underline/src/underline.ts
type UnderlineOptions (line 3) | interface UnderlineOptions {
type Commands (line 13) | interface Commands<ReturnType> {
method addOptions (line 41) | addOptions() {
method parseHTML (line 47) | parseHTML() {
method renderHTML (line 60) | renderHTML({ HTMLAttributes }) {
method parseMarkdown (line 64) | parseMarkdown(token, helpers) {
method renderMarkdown (line 68) | renderMarkdown(node, helpers) {
method start (line 75) | start(src) {
method tokenize (line 78) | tokenize(src, _tokens, lexer) {
method addCommands (line 97) | addCommands() {
method addKeyboardShortcuts (line 117) | addKeyboardShortcuts() {
FILE: packages/extension-unique-id/__tests__/unique-id-collab.spec.ts
constant ATTR (line 10) | const ATTR = 'uniqueId'
function generateID (line 13) | function generateID() {
function createEditor (line 18) | function createEditor(options: { withCollaboration?: boolean } = {}) {
function getParagraphIds (line 38) | function getParagraphIds(editor: Editor): (string | null)[] {
FILE: packages/extension-unique-id/src/generate-unique-ids.ts
function generateUniqueIds (line 43) | function generateUniqueIds(doc: JSONContent, extensions: Extensions): JS...
FILE: packages/extension-unique-id/src/helpers/findDuplicates.ts
function findDuplicates (line 4) | function findDuplicates(items: any[]): any[] {
FILE: packages/extension-unique-id/src/unique-id.ts
type UniqueIDGenerationContext (line 18) | type UniqueIDGenerationContext = {
type UniqueIDOptions (line 23) | interface UniqueIDOptions {
method addOptions (line 74) | addOptions() {
method addStorage (line 90) | addStorage() {
method addGlobalAttributes (line 96) | addGlobalAttributes() {
method onCreate (line 122) | onCreate() {
method addProseMirrorPlugins (line 177) | addProseMirrorPlugins() {
FILE: packages/extension-youtube/src/utils.ts
constant YOUTUBE_REGEX (line 1) | const YOUTUBE_REGEX =
constant YOUTUBE_REGEX_GLOBAL (line 3) | const YOUTUBE_REGEX_GLOBAL =
type GetEmbedUrlOptions (line 10) | interface GetEmbedUrlOptions {
FILE: packages/extension-youtube/src/youtube.ts
type YoutubeOptions (line 8) | interface YoutubeOptions {
type SetYoutubeVideoOptions (line 167) | type SetYoutubeVideoOptions = { src: string; width?: number; height?: nu...
type Commands (line 170) | interface Commands<ReturnType> {
method addOptions (line 189) | addOptions() {
method inline (line 216) | inline() {
method group (line 220) | group() {
method addAttributes (line 226) | addAttributes() {
method parseHTML (line 243) | parseHTML() {
method addCommands (line 251) | addCommands() {
method addPasteRules (line 268) | addPasteRules() {
method renderHTML (line 284) | renderHTML({ HTMLAttributes }) {
FILE: packages/extensions/src/character-count/character-count.ts
type CharacterCountOptions (line 5) | interface CharacterCountOptions {
type CharacterCountStorage (line 33) | interface CharacterCountStorage {
type Storage (line 51) | interface Storage {
method addOptions (line 63) | addOptions() {
method addStorage (line 72) | addStorage() {
method onBeforeCreate (line 79) | onBeforeCreate() {
method addProseMirrorPlugins (line 101) | addProseMirrorPlugins() {
FILE: packages/extensions/src/drop-cursor/drop-cursor.ts
type DropcursorOptions (line 4) | interface DropcursorOptions {
method addOptions (line 36) | addOptions() {
method addProseMirrorPlugins (line 44) | addProseMirrorPlugins() {
FILE: packages/extensions/src/focus/focus.ts
type FocusOptions (line 5) | interface FocusOptions {
method addOptions (line 33) | addOptions() {
method addProseMirrorPlugins (line 40) | addProseMirrorPlugins() {
FILE: packages/extensions/src/gap-cursor/gap-cursor.ts
type NodeConfig (line 6) | interface NodeConfig<Options, Storage> {
method addProseMirrorPlugins (line 32) | addProseMirrorPlugins() {
method extendNodeSchema (line 36) | extendNodeSchema(extension) {
FILE: packages/extensions/src/placeholder/placeholder.ts
constant DEFAULT_DATA_ATTRIBUTE (line 10) | const DEFAULT_DATA_ATTRIBUTE = 'placeholder'
function preparePlaceholderAttribute (line 17) | function preparePlaceholderAttribute(attr: string): string {
type PlaceholderOptions (line 34) | interface PlaceholderOptions {
method addOptions (line 100) | addOptions() {
method addProseMirrorPlugins (line 112) | addProseMirrorPlugins() {
FILE: packages/extensions/src/selection/selection.ts
type SelectionOptions (line 5) | type SelectionOptions = {
method addOptions (line 21) | addOptions() {
method addProseMirrorPlugins (line 27) | addProseMirrorPlugins() {
FILE: packages/extensions/src/trailing-node/trailing-node.ts
function nodeEqualsType (line 5) | function nodeEqualsType({ types, node }: { types: NodeType | NodeType[];...
type TrailingNodeOptions (line 15) | interface TrailingNodeOptions {
method addOptions (line 37) | addOptions() {
method addProseMirrorPlugins (line 44) | addProseMirrorPlugins() {
FILE: packages/extensions/src/undo-redo/undo-redo.ts
type UndoRedoOptions (line 4) | interface UndoRedoOptions {
type Commands (line 21) | interface Commands<ReturnType> {
method addOptions (line 49) | addOptions() {
method addCommands (line 56) | addCommands() {
method addProseMirrorPlugins (line 71) | addProseMirrorPlugins() {
method addKeyboardShortcuts (line 75) | addKeyboardShortcuts() {
FILE: packages/html/src/generateHTML.ts
function generateHTML (line 30) | function generateHTML(doc: JSONContent, extensions: Extensions): string {
FILE: packages/html/src/generateJSON.ts
function generateJSON (line 18) | function generateJSON(html: string, extensions: Extensions, options?: Pa...
FILE: packages/html/src/getHTMLFromFragment.ts
function getHTMLFromFragment (line 16) | function getHTMLFromFragment(doc: Node, schema: Schema, options?: { docu...
FILE: packages/html/src/server/generateHTML.ts
function generateHTML (line 19) | function generateHTML(doc: JSONContent, extensions: Extensions): string {
FILE: packages/html/src/server/generateJSON.ts
function generateJSON (line 19) | function generateJSON(html: string, extensions: Extensions, options?: Pa...
FILE: packages/html/src/server/getHTMLFromFragment.ts
function getHTMLFromFragment (line 18) | function getHTMLFromFragment(doc: Node, schema: Schema, options?: { docu...
FILE: packages/markdown/__tests__/conversion-files/custom-atom.ts
method parseHTML (line 34) | parseHTML() {
method renderHTML (line 42) | renderHTML({ HTMLAttributes }) {
FILE: packages/markdown/__tests__/conversion-files/custom-block.ts
method parseHTML (line 45) | parseHTML() {
method renderHTML (line 53) | renderHTML({ HTMLAttributes }) {
FILE: packages/markdown/__tests__/conversion-files/custom-inline.ts
method parseHTML (line 57) | parseHTML() {
method renderHTML (line 65) | renderHTML({ HTMLAttributes }) {
method parseHTML (line 84) | parseHTML() {
method renderHTML (line 92) | renderHTML({ HTMLAttributes }) {
FILE: packages/markdown/__tests__/conversion-files/nested-nodes.ts
method parseHTML (line 60) | parseHTML() {
method renderHTML (line 68) | renderHTML({ HTMLAttributes }) {
FILE: packages/markdown/__tests__/manager.spec.ts
method addAttributes (line 24) | addAttributes() {
method addAttributes (line 44) | addAttributes() {
FILE: packages/markdown/src/Extension.ts
type Editor (line 15) | interface Editor {
type EditorOptions (line 27) | interface EditorOptions {
type Storage (line 36) | interface Storage {
type InsertContentOptions (line 40) | interface InsertContentOptions {
type InsertContentAtOptions (line 49) | interface InsertContentAtOptions {
type SetContentOptions (line 58) | interface SetContentOptions {
type MarkdownExtensionOptions (line 68) | type MarkdownExtensionOptions = {
type MarkdownExtensionStorage (line 89) | type MarkdownExtensionStorage = {
method addOptions (line 96) | addOptions() {
method addCommands (line 104) | addCommands() {
method addStorage (line 156) | addStorage() {
method onBeforeCreate (line 167) | onBeforeCreate() {
FILE: packages/markdown/src/MarkdownManager.ts
class MarkdownManager (line 28) | class MarkdownManager {
method constructor (line 45) | constructor(options?: {
method instance (line 74) | get instance(): typeof marked {
method indentCharacter (line 79) | get indentCharacter(): string {
method indentString (line 84) | get indentString(): string {
method hasMarked (line 89) | hasMarked(): boolean {
method registerExtension (line 98) | registerExtension(extension: AnyExtension, recreateLexer: boolean = tr...
method registerTokenizer (line 156) | private registerTokenizer(tokenizer: MarkdownTokenizer): void {
method getHandlersForToken (line 222) | private getHandlersForToken(type: string): MarkdownExtensionSpec[] {
method getHandlerForToken (line 231) | private getHandlerForToken(type: string): MarkdownExtensionSpec | unde...
method getHandlersForNodeType (line 244) | private getHandlersForNodeType(type: string): MarkdownExtensionSpec[] {
method serialize (line 256) | serialize(docOrContent: JSONContent): string {
method isEmptyOutput (line 271) | private isEmptyOutput(markdown: string): boolean {
method parse (line 287) | parse(markdown: string): JSONContent {
method parseTokens (line 308) | private parseTokens(tokens: MarkdownToken[], parseImplicitEmptyParagra...
method createImplicitEmptyParagraphsFromSpace (line 345) | private createImplicitEmptyParagraphsFromSpace(
method countParagraphSeparators (line 362) | private countParagraphSeparators(raw: string): number {
method parseToken (line 369) | private parseToken(token: MarkdownToken, parseImplicitEmptyParagraphs ...
method parseListToken (line 421) | private parseListToken(token: MarkdownToken): JSONContent | JSONConten...
method parseTokenWithHandlers (line 537) | private parseTokenWithHandlers(token: MarkdownToken): JSONContent | JS...
method createParseHelpers (line 579) | private createParseHelpers(): MarkdownParseHelpers {
method escapeRegex (line 617) | private escapeRegex(str: string): string {
method parseInlineTokens (line 625) | private parseInlineTokens(tokens: MarkdownToken[]): JSONContent[] {
method applyMarkToContent (line 735) | private applyMarkToContent(markType: string, content: JSONContent[], a...
method isMarkResult (line 756) | private isMarkResult(result: any): result is { mark: string; content: ...
method normalizeParseResult (line 763) | private normalizeParseResult(result: MarkdownParseResult): JSONContent...
method parseFallbackToken (line 779) | private parseFallbackToken(
method parseHTMLToken (line 823) | private parseHTMLToken(token: MarkdownToken): JSONContent | JSONConten...
method renderNodeToMarkdown (line 878) | renderNodeToMarkdown(
method renderNodes (line 943) | renderNodes(
method renderNodesWithMarkBoundaries (line 966) | private renderNodesWithMarkBoundaries(
method getMarkOpening (line 1155) | private getMarkOpening(markType: string, mark: any, openingMode: 'mark...
method getMarkClosing (line 1199) | private getMarkClosing(markType: string, mark: any, openingMode: 'mark...
method getHtmlReopenTags (line 1244) | private getHtmlReopenTags(markType: string): { open: string; close: st...
method markSetsEqual (line 1254) | private markSetsEqual(marks1: Map<string, any>, marks2: Map<string, an...
FILE: packages/markdown/src/types.ts
type ContentType (line 1) | type ContentType = 'json' | 'html' | 'markdown'
FILE: packages/markdown/src/utils.ts
function wrapInMarkdownBlock (line 12) | function wrapInMarkdownBlock(prefix: string, content: string) {
function findMarksToClose (line 30) | function findMarksToClose(currentMarks: Map<string, any>, nextNode: any)...
function findMarksToOpen (line 44) | function findMarksToOpen(
function findMarksToCloseAtEnd (line 62) | function findMarksToCloseAtEnd(
function closeMarksBeforeNode (line 100) | function closeMarksBeforeNode(
function reopenMarksAfterNode (line 122) | function reopenMarksAfterNode(
function isTaskItem (line 151) | function isTaskItem(item: MarkdownToken): { isTask: boolean; checked?: b...
function assumeContentType (line 168) | function assumeContentType(
FILE: packages/react/src/Context.tsx
type EditorContextValue (line 9) | type EditorContextValue = {
type EditorProviderProps (line 24) | type EditorProviderProps = {
function EditorProvider (line 36) | function EditorProvider({
FILE: packages/react/src/Editor.ts
type EditorWithContentComponent (line 6) | type EditorWithContentComponent = Editor & { contentComponent?: ContentC...
type ContentComponent (line 7) | type ContentComponent = {
FILE: packages/react/src/EditorContent.tsx
type EditorContentProps (line 37) | interface EditorContentProps extends HTMLProps<HTMLDivElement> {
function getInstance (line 42) | function getInstance(): ContentComponent {
class PureEditorContent (line 86) | class PureEditorContent extends React.Component<
method constructor (line 96) | constructor(props: EditorContentProps) {
method componentDidMount (line 106) | componentDidMount() {
method componentDidUpdate (line 110) | componentDidUpdate() {
method init (line 114) | init() {
method componentWillUnmount (line 158) | componentWillUnmount() {
method render (line 199) | render() {
FILE: packages/react/src/NodeViewContent.tsx
type NodeViewContentProps (line 6) | type NodeViewContentProps<T extends keyof React.JSX.IntrinsicElements = ...
function NodeViewContent (line 10) | function NodeViewContent<T extends keyof React.JSX.IntrinsicElements = '...
FILE: packages/react/src/NodeViewWrapper.tsx
type NodeViewWrapperProps (line 5) | interface NodeViewWrapperProps {
FILE: packages/react/src/ReactMarkViewRenderer.tsx
type MarkViewContextProps (line 9) | interface MarkViewContextProps {
type MarkViewContentProps (line 18) | type MarkViewContentProps<T extends keyof React.JSX.IntrinsicElements = ...
type ReactMarkViewRendererOptions (line 34) | interface ReactMarkViewRendererOptions extends MarkViewRendererOptions {
class ReactMarkView (line 43) | class ReactMarkView extends MarkView<React.ComponentType<MarkViewProps>,...
method constructor (line 47) | constructor(
method dom (line 92) | get dom() {
method contentDOM (line 96) | get contentDOM() {
function ReactMarkViewRenderer (line 101) | function ReactMarkViewRenderer(
FILE: packages/react/src/ReactNodeViewRenderer.tsx
type ReactNodeViewRendererOptions (line 20) | interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {
class ReactNodeView (line 54) | class ReactNodeView<
method constructor (line 75) | constructor(component: Component, props: NodeViewRendererProps, option...
method extensionWithSyncedStorage (line 110) | get extensionWithSyncedStorage(): NodeViewRendererProps['extension'] {
method mount (line 132) | mount() {
method dom (line 205) | get dom() {
method contentDOM (line 220) | get contentDOM() {
method handleSelectionUpdate (line 232) | handleSelectionUpdate() {
method update (line 266) | update(node: Node, decorations: readonly Decoration[], innerDecoration...
method selectNode (line 316) | selectNode() {
method deselectNode (line 327) | deselectNode() {
method destroy (line 337) | destroy() {
method updateElementAttributes (line 352) | updateElementAttributes() {
function ReactNodeViewRenderer (line 373) | function ReactNodeViewRenderer<T = HTMLElement>(
FILE: packages/react/src/ReactRenderer.tsx
function isClassComponent (line 20) | function isClassComponent(Component: any) {
function isForwardRefComponent (line 29) | function isForwardRefComponent(Component: any) {
function isMemoComponent (line 43) | function isMemoComponent(Component: any) {
function canReceiveRef (line 58) | function canReceiveRef(Component: any) {
function isReact19Plus (line 85) | function isReact19Plus(): boolean {
type ReactRendererOptions (line 101) | interface ReactRendererOptions {
type ComponentType (line 131) | type ComponentType<R, P> =
class ReactRenderer (line 147) | class ReactRenderer<R = unknown, P extends Record<string, any> = object> {
method constructor (line 170) | constructor(
method render (line 205) | render(): void {
method updateProps (line 241) | updateProps(props: Record<string, any> = {}): void {
method destroy (line 257) | destroy(): void {
method updateAttributes (line 277) | updateAttributes(attributes: Record<string, string>): void {
FILE: packages/react/src/Tiptap.tsx
type TiptapContextType (line 15) | type TiptapContextType = {
method editor (line 26) | get editor(): Editor {
function useTiptapState (line 83) | function useTiptapState<TSelectorResult>(
type TiptapWrapperProps (line 99) | type TiptapWrapperProps = {
function TiptapWrapper (line 141) | function TiptapWrapper({ editor, instance, children }: TiptapWrapperProp...
function TiptapContent (line 176) | function TiptapContent({ ...rest }: Omit<EditorContentProps, 'editor' | ...
FILE: packages/react/src/menus/BubbleMenu.spec.ts
function createEditor (line 15) | function createEditor() {
FILE: packages/react/src/menus/BubbleMenu.tsx
type Optional (line 10) | type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
type BubbleMenuProps (line 12) | type BubbleMenuProps = Optional<Omit<Optional<BubbleMenuPluginProps, 'pl...
FILE: packages/react/src/menus/FloatingMenu.spec.ts
function createEditor (line 15) | function createEditor() {
FILE: packages/react/src/menus/FloatingMenu.tsx
type Optional (line 11) | type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
type FloatingMenuProps (line 13) | type FloatingMenuProps = Omit<Optional<FloatingMenuPluginProps, 'pluginK...
FILE: packages/react/src/menus/getAutoPluginKey.ts
function getAutoPluginKey (line 3) | function getAutoPluginKey(pluginKey: PluginKey | string | undefined, def...
FILE: packages/react/src/menus/useMenuElementProps.ts
type MenuElementProps (line 6) | type MenuElementProps = HTMLAttributes<HTMLDivElement>
type MenuSyntheticEvent (line 7) | type MenuSyntheticEvent = Event & {
type MenuEventListener (line 15) | type MenuEventListener = (event: MenuSyntheticEvent) => void
type MenuNativeListener (line 16) | type MenuNativeListener = (event: Event) => void
type MenuEventListenerOptions (line 17) | type MenuEventListenerOptions = {
type EventListenerEntry (line 21) | type EventListenerEntry = {
constant PLUGIN_MANAGED_STYLE_PROPERTIES (line 27) | const PLUGIN_MANAGED_STYLE_PROPERTIES = new Set(['left', 'opacity', 'pos...
constant UNITLESS_STYLE_PROPERTIES (line 28) | const UNITLESS_STYLE_PROPERTIES = new Set([
constant ATTRIBUTE_EXCLUSIONS (line 65) | const ATTRIBUTE_EXCLUSIONS = new Set(['children', 'className', 'style'])
constant DIRECT_PROPERTY_KEYS (line 66) | const DIRECT_PROPERTY_KEYS = new Set(['tabIndex'])
constant FORWARDED_ATTRIBUTE_KEYS (line 67) | const FORWARDED_ATTRIBUTE_KEYS = new Set([
constant SPECIAL_EVENT_NAMES (line 86) | const SPECIAL_EVENT_NAMES: Record<string, string> = {
function isEventProp (line 94) | function isEventProp(key: string, value: unknown): value is MenuEventLis...
function toAttributeName (line 98) | function toAttributeName(key: string) {
function isForwardedAttributeKey (line 106) | function isForwardedAttributeKey(key: string) {
function toStylePropertyName (line 110) | function toStylePropertyName(key: string) {
function toEventConfig (line 118) | function toEventConfig(key: string) {
function createSyntheticEvent (line 130) | function createSyntheticEvent(element: HTMLDivElement, nativeEvent: Even...
function isDirectPropertyKey (line 159) | function isDirectPropertyKey(key: string) {
function setDirectProperty (line 163) | function setDirectProperty(element: HTMLDivElement, key: string, value: ...
function clearDirectProperty (line 172) | function clearDirectProperty(element: HTMLDivElement, key: string) {
function toStyleValue (line 193) | function toStyleValue(styleName: string, value: string | number) {
function removeStyleProperty (line 206) | function removeStyleProperty(element: HTMLDivElement, styleName: string) {
function applyStyleProperty (line 214) | function applyStyleProperty(element: HTMLDivElement, styleName: string, ...
function syncAttributes (line 222) | function syncAttributes(element: HTMLDivElement, prevProps: MenuElementP...
function syncClassName (line 271) | function syncClassName(element: HTMLDivElement, prevClassName?: string, ...
function syncStyles (line 284) | function syncStyles(
function syncEventListeners (line 310) | function syncEventListeners(element: HTMLDivElement, prevListeners: Even...
function useMenuElementProps (line 334) | function useMenuElementProps(element: HTMLDivElement, props: MenuElement...
FILE: packages/react/src/types.ts
type ReactNodeViewProps (line 4) | type ReactNodeViewProps<T = HTMLElement> = CoreNodeViewProps & {
FILE: packages/react/src/useEditor.ts
type UseEditorOptions (line 16) | type UseEditorOptions = Partial<EditorOptions> & {
class EditorInstanceManager (line 35) | class EditorInstanceManager {
method constructor (line 72) | constructor(options: MutableRefObject<UseEditorOptions>) {
method setEditor (line 87) | private setEditor(editor: Editor | null) {
method getInitialEditor (line 95) | private getInitialEditor() {
method createEditor (line 133) | private createEditor(): Editor {
method getEditor (line 160) | getEditor(): Editor | null {
method getServerSnapshot (line 167) | getServerSnapshot(): null {
method subscribe (line 174) | subscribe(onStoreChange: () => void) {
method compareOptions (line 182) | static compareOptions(a: UseEditorOptions, b: UseEditorOptions) {
method onRender (line 228) | onRender(deps: DependencyList) {
method refreshEditorInstance (line 264) | private refreshEditorInstance(deps: DependencyList) {
method scheduleDestroy (line 297) | private scheduleDestroy() {
function useEditor (line 344) | function useEditor(options: UseEditorOptions = {}, deps: DependencyList ...
FILE: packages/react/src/useEditorState.ts
type EditorStateSnapshot (line 8) | type EditorStateSnapshot<TEditor extends Editor | null = Editor | null> = {
type UseEditorStateOptions (line 13) | type UseEditorStateOptions<TSelectorResult, TEditor extends Editor | nul...
class EditorStateManager (line 33) | class EditorStateManager<TEditor extends Editor | null = Editor | null> {
method constructor (line 44) | constructor(initialEditor: TEditor) {
method getSnapshot (line 57) | getSnapshot(): EditorStateSnapshot<TEditor> {
method getServerSnapshot (line 69) | getServerSnapshot(): EditorStateSnapshot<null> {
method subscribe (line 76) | subscribe(callback: () => void): () => void {
method watch (line 86) | watch(nextEditor: Editor | null): undefined | (() => void) {
function useEditorState (line 152) | function useEditorState<TSelectorResult>(
FILE: packages/react/src/useReactNodeView.ts
type ReactNodeViewContextProps (line 4) | interface ReactNodeViewContextProps {
FILE: packages/starter-kit/src/starter-kit.ts
type StarterKitOptions (line 33) | interface StarterKitOptions {
method addExtensions (line 175) | addExtensions() {
FILE: packages/static-renderer/src/helpers.ts
function getAttributes (line 10) | function getAttributes(
function getHTMLAttributes (line 52) | function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAtt...
FILE: packages/static-renderer/src/json/html-string/string.ts
function renderJSONContentToString (line 7) | function renderJSONContentToString<
function serializeAttrsToHTMLString (line 31) | function serializeAttrsToHTMLString(attrs: Record<string, any> | undefin...
function serializeChildrenToHTMLString (line 44) | function serializeChildrenToHTMLString(children?: string | string[]): st...
FILE: packages/static-renderer/src/json/react/react.ts
function renderJSONContentToReactElement (line 9) | function renderJSONContentToReactElement<
FILE: packages/static-renderer/src/json/renderer.ts
type NodeProps (line 7) | type NodeProps<TNodeType = any, TChildren = any> = {
type MarkProps (line 38) | type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {
type TiptapStaticRendererOptions (line 57) | type TiptapStaticRendererOptions<
function TiptapStaticRenderer (line 116) | function TiptapStaticRenderer<
FILE: packages/static-renderer/src/pm/extensionRenderer.ts
type DomOutputSpecToElement (line 26) | type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?:...
function mapNodeExtensionToReactNode (line 34) | function mapNodeExtensionToReactNode<T>(
function mapMarkExtensionToReactNode (line 91) | function mapMarkExtensionToReactNode<T>(
function renderToElement (line 150) | function renderToElement<T>({
FILE: packages/static-renderer/src/pm/html-string/html-string.ts
constant NON_SELF_CLOSING_TAGS (line 19) | const NON_SELF_CLOSING_TAGS = new Set(['iframe', 'script', 'style', 'tit...
function domOutputSpecToHTMLString (line 26) | function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: ...
function renderToHTMLString (line 92) | function renderToHTMLString({
FILE: packages/static-renderer/src/pm/markdown/markdown.ts
function renderToMarkdown (line 11) | function renderToMarkdown({
FILE: packages/static-renderer/src/pm/react/react.ts
function mapAttrsToHTMLAttributes (line 16) | function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: str...
function domOutputSpecToReactElement (line 53) | function domOutputSpecToReactElement(
function renderToReactElement (line 147) | function renderToReactElement({
FILE: packages/suggestion/src/__tests__/suggestion.test.ts
method addProseMirrorPlugins (line 15) | addProseMirrorPlugins() {
method addProseMirrorPlugins (line 55) | addProseMirrorPlugins() {
method addProseMirrorPlugins (line 97) | addProseMirrorPlugins() {
FILE: packages/suggestion/src/findSuggestionMatch.ts
type Trigger (line 5) | interface Trigger {
type SuggestionMatch (line 14) | type SuggestionMatch = {
function findSuggestionMatch (line 20) | function findSuggestionMatch(config: Trigger): SuggestionMatch {
FILE: packages/suggestion/src/suggestion.ts
type SuggestionOptions (line 9) | interface SuggestionOptions<I = any, TSelected = any> {
type SuggestionProps (line 148) | interface SuggestionProps<I = any, TSelected = any> {
type SuggestionKeyDownProps (line 195) | interface SuggestionKeyDownProps {
function Suggestion (line 207) | function Suggestion<I = any, TSelected = any>({
function exitSuggestion (line 582) | function exitSuggestion(view: EditorView, pluginKeyRef: PluginKey = Sugg...
FILE: packages/vue-2/src/Editor.ts
class Editor (line 4) | class Editor extends CoreEditor {
FILE: packages/vue-2/src/EditorContent.ts
type EditorContentInterface (line 6) | interface EditorContentInterface extends Vue {
method handler (line 23) | handler(this: EditorContentInterface, editor: Editor) {
method render (line 46) | render(createElement: CreateElement) {
method beforeDestroy (line 50) | beforeDestroy(this: EditorContentInterface) {
FILE: packages/vue-2/src/NodeViewContent.ts
type NodeViewContentInterface (line 4) | interface NodeViewContentInterface extends Vue {
method render (line 16) | render(this: NodeViewContentInterface, createElement: CreateElement) {
FILE: packages/vue-2/src/NodeViewWrapper.ts
type NodeViewWrapperInterface (line 4) | interface NodeViewWrapperInterface extends Vue {
method render (line 22) | render(this: NodeViewWrapperInterface, createElement: CreateElement) {
FILE: packages/vue-2/src/VueNodeViewRenderer.ts
type VueNodeViewRendererOptions (line 23) | interface VueNodeViewRendererOptions extends NodeViewRendererOptions {
class VueNodeView (line 37) | class VueNodeView extends NodeView<Vue | VueConstructor, Editor, VueNode...
method mount (line 44) | mount() {
method dom (line 91) | get dom() {
method contentDOM (line 103) | get contentDOM() {
method handleSelectionUpdate (line 115) | handleSelectionUpdate() {
method update (line 142) | update(node: ProseMirrorNode, decorations: readonly Decoration[], inne...
method selectNode (line 189) | selectNode() {
method deselectNode (line 200) | deselectNode() {
method getDecorationClasses (line 207) | getDecorationClasses() {
method destroy (line 216) | destroy() {
function VueNodeViewRenderer (line 222) | function VueNodeViewRenderer(
FILE: packages/vue-2/src/VueRenderer.ts
class VueRenderer (line 8) | class VueRenderer {
method constructor (line 11) | constructor(component: Vue | VueConstructor, props: any) {
method element (line 17) | get element(): Element {
method updateProps (line 21) | updateProps(props: Record<string, any> = {}): void {
method destroy (line 40) | destroy(): void {
FILE: packages/vue-2/src/menus/BubbleMenu.ts
type BubbleMenuInterface (line 6) | interface BubbleMenuInterface {
method mounted (line 65) | mounted(this: BubbleMenuInterface) {
method render (line 96) | render(this: BubbleMenuInterface, createElement: CreateElement) {
method beforeDestroy (line 111) | beforeDestroy(this: BubbleMenuInterface) {
method getPluginKey (line 116) | getPluginKey(this: BubbleMenuInterface) {
FILE: packages/vue-2/src/menus/FloatingMenu.ts
type FloatingMenuInterface (line 7) | interface FloatingMenuInterface extends Vue {
method handler (line 64) | handler(this: FloatingMenuInterface, editor: FloatingMenuPluginProps['ed...
method render (line 96) | render(this: FloatingMenuInterface, createElement: CreateElement) {
method beforeDestroy (line 111) | beforeDestroy(this: FloatingMenuInterface) {
method getPluginKey (line 116) | getPluginKey(this: FloatingMenuInterface) {
FILE: packages/vue-3/__tests__/VueMarkViewRenderer.spec.ts
method setup (line 14) | setup() {
method parseHTML (line 25) | parseHTML() {
method renderHTML (line 29) | renderHTML({ HTMLAttributes }) {
method addMarkView (line 33) | addMarkView() {
FILE: packages/vue-3/src/Editor.ts
function useDebouncedRef (line 8) | function useDebouncedRef<T>(value: T) {
type ContentComponent (line 30) | type ContentComponent = ComponentInternalInstance & {
class Editor (line 34) | class Editor extends CoreEditor {
method constructor (line 43) | constructor(options: Partial<EditorOptions> = {}) {
method state (line 57) | get state() {
method storage (line 61) | get storage() {
method registerPlugin (line 68) | public registerPlugin(
method unregisterPlugin (line 84) | public unregisterPlugin(nameOrPluginKey: string | PluginKey): EditorSt...
FILE: packages/vue-3/src/EditorContent.ts
method setup (line 16) | setup(props) {
method render (line 70) | render() {
FILE: packages/vue-3/src/NodeViewContent.ts
method render (line 13) | render() {
FILE: packages/vue-3/src/NodeViewWrapper.ts
method render (line 15) | render() {
FILE: packages/vue-3/src/VueMarkViewRenderer.ts
type VueMarkViewRendererOptions (line 10) | interface VueMarkViewRendererOptions extends MarkViewRendererOptions {
method render (line 57) | render() {
class VueMarkView (line 67) | class VueMarkView extends MarkView<Component, VueMarkViewRendererOptions> {
method constructor (line 70) | constructor(component: Component, props: MarkViewProps, options?: Part...
method dom (line 97) | get dom() {
method contentDOM (line 101) | get contentDOM() {
method updateAttributes (line 105) | updateAttributes(attrs: Record<string, any>): void {
method destroy (line 111) | destroy() {
function VueMarkViewRenderer (line 116) | function VueMarkViewRenderer(
FILE: packages/vue-3/src/VueNodeViewRenderer.ts
type VueNodeViewRendererOptions (line 59) | interface VueNodeViewRendererOptions extends NodeViewRendererOptions {
class VueNodeView (line 73) | class VueNodeView extends NodeView<Component, Editor, VueNodeViewRendere...
method extensionWithSyncedStorage (line 85) | get extensionWithSyncedStorage(): NodeViewProps['extension'] {
method mount (line 103) | mount() {
method dom (line 164) | get dom() {
method contentDOM (line 176) | get contentDOM() {
method handleSelectionUpdate (line 188) | handleSelectionUpdate() {
method update (line 215) | update(node: ProseMirrorNode, decorations: readonly Decoration[], inne...
method selectNode (line 263) | selectNode() {
method deselectNode (line 276) | deselectNode() {
method getDecorationClasses (line 285) | getDecorationClasses() {
method destroy (line 294) | destroy() {
function VueNodeViewRenderer (line 300) | function VueNodeViewRenderer(
FILE: packages/vue-3/src/VueRenderer.ts
type VueRendererOptions (line 7) | interface VueRendererOptions {
type ExtendedVNode (line 12) | type ExtendedVNode = ReturnType<typeof h> | null
type RenderedComponent (line 14) | interface RenderedComponent {
class VueRenderer (line 23) | class VueRenderer {
method constructor (line 39) | constructor(component: Component, { props = {}, editor }: VueRendererO...
method element (line 47) | get element(): Element | null {
method ref (line 51) | get ref(): any {
method renderComponent (line 60) | renderComponent() {
method updateProps (line 85) | updateProps(props: Record<string, any> = {}): void {
method destroy (line 96) | destroy(): void {
FILE: packages/vue-3/src/menus/BubbleMenu.ts
method setup (line 54) | setup(props, { slots, attrs }) {
FILE: packages/vue-3/src/menus/FloatingMenu.ts
method setup (line 51) | setup(props, { slots, attrs }) {
FILE: scripts/aggregate-changeset.js
constant TITLE_MAP (line 6) | const TITLE_MAP = new Map([
constant CHANGE_TYPE_ORDER (line 13) | const CHANGE_TYPE_ORDER = ['major', 'minor', 'patch', 'none']
class PackageChanges (line 18) | class PackageChanges {
method constructor (line 19) | constructor(name) {
method addChange (line 25) | addChange(type, summary) {
class ChangeEntry (line 37) | class ChangeEntry {
method constructor (line 38) | constructor(type, summary) {
method toString (line 43) | toString() {
class ReleaseData (line 51) | class ReleaseData {
method constructor (line 52) | constructor(version) {
method addPackage (line 58) | addPackage(pkg) {
function buildPackagesMap (line 68) | function buildPackagesMap(plan) {
function renderReleaseNotes (line 90) | function renderReleaseNotes(releaseData) {
function replaceOrPrependVersionSection (line 126) | function replaceOrPrependVersionSection(body, newSection, version) {
function readChangelogBody (line 177) | async function readChangelogBody() {
function main (line 189) | async function main() {
FILE: tests/cypress.config.js
method setupNodeEvents (line 7) | setupNodeEvents(on, config) {
FILE: tests/cypress/integration/core/pluginOrder.spec.ts
method addKeyboardShortcuts (line 25) | addKeyboardShortcuts() {
method addKeyboardShortcuts (line 36) | addKeyboardShortcuts() {
method addKeyboardShortcuts (line 47) | addKeyboardShortcuts() {
FILE: tests/cypress/integration/core/transformPastedHTML.spec.ts
method transformPastedHTML (line 26) | transformPastedHTML(html) {
method transformPastedHTML (line 34) | transformPastedHTML(html) {
method transformPastedHTML (line 42) | transformPastedHTML(html) {
method transformPastedHTML (line 74) | transformPastedHTML(html) {
method transformPastedHTML (line 81) | transformPastedHTML(html) {
method transformPastedHTML (line 107) | transformPastedHTML(html) {
method transformPastedHTML (line 117) | transformPastedHTML(html) {
method transformPastedHTML (line 152) | transformPastedHTML(html) {
method addOptions (line 213) | addOptions() {
method transformPastedHTML (line 218) | transformPastedHTML(html) {
method transformPastedHTML (line 259) | transformPastedHTML(html) {
method transformPastedHTML (line 266) | transformPastedHTML(html) {
method transformPastedHTML (line 295) | transformPastedHTML(html) {
method transformPastedHTML (line 321) | transformPastedHTML(html, view) {
FILE: tests/cypress/support/commands.js
function defaults (line 27) | function defaults(object, name, value) {
FILE: vitest.config.ts
function collectPackageInformation (line 8) | function collectPackageInformation(path: string) {
Condensed preview — 1936 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,379K chars).
[
{
"path": ".changeset/README.md",
"chars": 510,
"preview": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that wo"
},
{
"path": ".changeset/config.json",
"chars": 397,
"preview": "{\n \"$schema\": \"https://unpkg.com/@changesets/config@3.0.1/schema.json\",\n \"changelog\": \"@changesets/cli/changelog\",\n \""
},
{
"path": ".editorconfig",
"chars": 221,
"preview": "# EditorConfig is awesome: http://EditorConfig.org\n\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\ninsert_final_newli"
},
{
"path": ".eslintignore",
"chars": 11,
"preview": "**/dist/**\n"
},
{
"path": ".eslintrc.js",
"chars": 3502,
"preview": "module.exports = {\n parserOptions: {\n parser: '@typescript-eslint/parser',\n sourceType: 'module',\n },\n env: {\n "
},
{
"path": ".github/CODEOWNERS",
"chars": 33,
"preview": "# LICENSE\nLICENSE.md @philipisik\n"
},
{
"path": ".github/DISCUSSION_TEMPLATE/community-extensions.yml",
"chars": 1441,
"preview": "title: 'Community Extension: '\nbody:\n - type: markdown\n attributes:\n value: |\n Hey! Thanks for your time"
},
{
"path": ".github/DISCUSSION_TEMPLATE/feature-requests.yml",
"chars": 986,
"preview": "title: 'Feature Request: '\nlabels:\n - 'Type: Feature Request'\nbody:\n - type: markdown\n attributes:\n value: |\n "
},
{
"path": ".github/DISCUSSION_TEMPLATE/showcase.yml",
"chars": 1630,
"preview": "title: 'Community Extension: '\nbody:\n - type: markdown\n attributes:\n value: |\n Hey! Thanks for using Tip"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2794,
"preview": "name: Bug Report\ndescription: Found a bug in the editor core or one of the extensions? Report it here to help us improve"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_pro.yml",
"chars": 2948,
"preview": "name: Bug Report (Tiptap Pro)\ndescription: If you've encountered a bug with Tiptap Pro features, please report it here.\n"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 1037,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: New Feature Request\n url: https://github.com/ueberdosis/tiptap/d"
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.yml",
"chars": 1299,
"preview": "name: Documentation feedback\ndescription: Share what we need to explain better.\ntitle: '[Documentation]: '\nlabels:\n - '"
},
{
"path": ".github/dependabot.yml",
"chars": 410,
"preview": "# Dependabot creates pull requests to keep your dependencies secure and up-to-date.\n# Documentation: https://docs.github"
},
{
"path": ".github/instructions/PR.instructions.md",
"chars": 1281,
"preview": "---\napplyTo: '**'\n---\n\nWhen asked to write a pull request description, use the following template:\n\n```\n## Changes Overv"
},
{
"path": ".github/instructions/changeset.instructions.md",
"chars": 623,
"preview": "---\napplyTo: '**'\n---\n\nWhen a user asks for a changeset to be generated, follow the following rules:\n\nCreate a good chan"
},
{
"path": ".github/instructions/tiptap.instructions.md",
"chars": 7776,
"preview": "---\napplyTo: '**'\n---\n\n# Tiptap\n\nThis document explains how to work on the Tiptap monorepo in VS Code. It covers repo la"
},
{
"path": ".github/pull_request_template.md",
"chars": 821,
"preview": "## Changes Overview\n\n<!-- Briefly describe your changes. -->\n\n## Implementation Approach\n\n<!-- Describe your approach to"
},
{
"path": ".github/workflows/build.yml",
"chars": 8575,
"preview": "name: Verify\n\nenv:\n NODE_VERSION: 24\n PNPM_VERSION: 9.15.4\n PNPM_STORE_DIR: .pnpm-store\n\nconcurrency:\n group: ${{ gi"
},
{
"path": ".github/workflows/notify-discord.yml",
"chars": 689,
"preview": "name: Notify Discord on Release\n\non:\n release:\n types: [published]\n\njobs:\n discord_notify:\n name: Send release t"
},
{
"path": ".github/workflows/publish.yml",
"chars": 5597,
"preview": "name: Publish\n\nenv:\n NODE_VERSION: 24\n PNPM_VERSION: 9.15.4\n\non:\n push:\n branches:\n - main\n - next\n "
},
{
"path": ".gitignore",
"chars": 707,
"preview": "*.log\n.cache\n.DS_Store\n.temp\nnode_modules\ndist\n.env\n.env.*\n.eslintcache\n\n.instructions\n.agent\n\ndocs\n\n# Log files\nnpm-deb"
},
{
"path": ".husky/pre-commit",
"chars": 74,
"preview": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\npnpm run lint:staged\n"
},
{
"path": ".npmrc",
"chars": 60,
"preview": "link-workspace-packages=deep\nprefer-workspace-packages=true\n"
},
{
"path": ".prettierignore",
"chars": 127,
"preview": "**/.git\n**/.svn\n**/.hg\n**/node_modules\n\n.turbo\n.changeset\n.github/**/*\n\ndemos/dist/**/*\ndemos/node_modules/**/*\npnpm-loc"
},
{
"path": ".prettierrc",
"chars": 133,
"preview": "{\n \"trailingComma\": \"all\",\n \"tabWidth\": 2,\n \"semi\": false,\n \"singleQuote\": true,\n \"arrowParens\": \"avoid\",\n \"printW"
},
{
"path": ".vscode/launch.json",
"chars": 223,
"preview": "{\n \"configurations\": [\n {\n \"name\": \"Launch Tiptap demos in Google Chrome\",\n \"request\": \"launch\",\n \"ty"
},
{
"path": ".vscode/settings.json",
"chars": 1863,
"preview": "{\n \"typescript.tsdk\": \"node_modules/typescript/lib\",\n \"conventionalCommits.scopes\": [\n \"ci\",\n \"docs\",\n \"maint"
},
{
"path": "CHANGELOG.md",
"chars": 120512,
"preview": "# Releases\n\n## v3.20.4\n\n### @tiptap/core\n\n#### Patch Changes\n\n- Fixed Tiptap not publishing with build dist artifacts\n\n#"
},
{
"path": "CONTRIBUTING.md",
"chars": 5652,
"preview": "# Contributing\n\nContributions are **welcome** and will be fully **credited**.\n\nPlease read and understand the [contribut"
},
{
"path": "LICENSE.md",
"chars": 1069,
"preview": "MIT License\n\nCopyright (c) 2025, Tiptap GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "README.md",
"chars": 7670,
"preview": "\n\n[\n\nconst "
},
{
"path": "demos/preview/shiki.worker.js",
"chars": 708,
"preview": "import * as shiki from 'shiki'\n\nlet highlighter = null\n\nasync function init() {\n if (highlighter) {\n return highligh"
},
{
"path": "demos/preview/style.css",
"chars": 3915,
"preview": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n "
},
{
"path": "demos/public/_redirects",
"chars": 39,
"preview": "/preview/* /preview/index.html 200\n"
},
{
"path": "demos/setup/helper.ts",
"chars": 906,
"preview": "const waitUntilElementExists = (selector: any, callback: (element: Element) => void) => {\n const element = document.que"
},
{
"path": "demos/setup/js.ts",
"chars": 251,
"preview": "import 'iframe-resizer/js/iframeResizer.contentWindow'\nimport './style.scss'\n\nimport { debug } from './helper.js'\n\nexpor"
},
{
"path": "demos/setup/react.ts",
"chars": 955,
"preview": "import 'iframe-resizer/js/iframeResizer.contentWindow'\nimport './style.scss'\n\nimport React from 'react'\nimport { createR"
},
{
"path": "demos/setup/style.scss",
"chars": 9506,
"preview": "/* Base HTML and global element styles*/\n:root {\n --white: #fff;\n --black: #2e2b29;\n --black-contrast: #110f0e;\n --g"
},
{
"path": "demos/setup/svelte.ts",
"chars": 554,
"preview": "import 'iframe-resizer/js/iframeResizer.contentWindow'\nimport './style.scss'\n\nimport { debug, splitName } from './helper"
},
{
"path": "demos/setup/vue.ts",
"chars": 615,
"preview": "import 'iframe-resizer/js/iframeResizer.contentWindow'\nimport './style.scss'\n\nimport { createApp } from 'vue'\n\nimport { "
},
{
"path": "demos/src/Commands/Cut/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Commands/Cut/React/index.jsx",
"chars": 2143,
"preview": "import './styles.scss'\n\nimport { Color, TextStyle } from '@tiptap/extension-text-style'\nimport { EditorContent, useEdito"
},
{
"path": "demos/src/Commands/Cut/React/index.spec.js",
"chars": 553,
"preview": "context('/src/Commands/Cut/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Commands/Cut/React/')\n cy.get('.t"
},
{
"path": "demos/src/Commands/Cut/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Commands/InsertContent/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Commands/InsertContent/React/index.jsx",
"chars": 2013,
"preview": "import './styles.scss'\n\nimport { Image } from '@tiptap/extension-image'\nimport Link from '@tiptap/extension-link'\nimport"
},
{
"path": "demos/src/Commands/InsertContent/React/index.spec.js",
"chars": 6002,
"preview": "context('/src/Commands/InsertContent/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Commands/InsertContent/Rea"
},
{
"path": "demos/src/Commands/InsertContent/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Commands/InsertContentApplyingRules/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Commands/InsertContentApplyingRules/React/index.jsx",
"chars": 4116,
"preview": "import './styles.scss'\n\nimport { EditorProvider, useCurrentEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap"
},
{
"path": "demos/src/Commands/InsertContentApplyingRules/React/index.spec.js",
"chars": 981,
"preview": "context('/src/Commands/InsertContentApplyingRules/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Commands/Inse"
},
{
"path": "demos/src/Commands/InsertContentApplyingRules/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Commands/SetContent/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Commands/SetContent/React/index.jsx",
"chars": 447,
"preview": "import './styles.scss'\n\nimport Mentions from '@tiptap/extension-mention'\nimport { Color, TextStyle } from '@tiptap/exten"
},
{
"path": "demos/src/Commands/SetContent/React/index.spec.js",
"chars": 7770,
"preview": "context('/src/Commands/SetContent/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Commands/SetContent/React/')\n"
},
{
"path": "demos/src/Commands/SetContent/React/styles.scss",
"chars": 757,
"preview": "/* Basic editor styles */\n.tiptap {\n > * + * {\n margin-top: 0.75em;\n }\n\n ul,\n ol {\n padding: 0 1rem;\n }\n\n h1"
},
{
"path": "demos/src/Demos/CollaborationSplitPane/React/Editor.jsx",
"chars": 5186,
"preview": "import Collaboration from '@tiptap/extension-collaboration'\nimport CollaborationCaret from '@tiptap/extension-collaborat"
},
{
"path": "demos/src/Demos/CollaborationSplitPane/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Demos/CollaborationSplitPane/React/index.jsx",
"chars": 831,
"preview": "import './styles.scss'\n\nimport { TiptapCollabProvider } from '@hocuspocus/provider'\nimport * as Y from 'yjs'\n\nimport Edi"
},
{
"path": "demos/src/Demos/CollaborationSplitPane/React/index.spec.js",
"chars": 658,
"preview": "context('/src/Demos/CollaborationSplitPane/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Demos/CollaborationS"
},
{
"path": "demos/src/Demos/CollaborationSplitPane/React/styles.scss",
"chars": 4680,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Demos/SingleRoomCollab/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Demos/SingleRoomCollab/React/index.jsx",
"chars": 3481,
"preview": "import './styles.scss'\n\nimport { TiptapCollabProvider } from '@hocuspocus/provider'\nimport Collaboration from '@tiptap/e"
},
{
"path": "demos/src/Demos/SingleRoomCollab/React/index.spec.js",
"chars": 601,
"preview": "context('/src/Demos/SingleRoomCollab/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Demos/SingleRoomCollab/Rea"
},
{
"path": "demos/src/Demos/SingleRoomCollab/React/styles.scss",
"chars": 3264,
"preview": "/* Basic editor styles */\n.tiptap {\n > * + * {\n margin-top: 0.75em;\n }\n\n ul,\n ol {\n padding: 0 1rem;\n }\n\n h1"
},
{
"path": "demos/src/Dev/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Accessibility/React/InsertMenu.tsx",
"chars": 2604,
"preview": "import type { Editor } from '@tiptap/react'\nimport { useEditorState } from '@tiptap/react'\nimport { FloatingMenu } from "
},
{
"path": "demos/src/Examples/Accessibility/React/MenuBar.tsx",
"chars": 9575,
"preview": "import type { Editor } from '@tiptap/core'\nimport { useEditorState } from '@tiptap/react'\nimport React, { useEffect, use"
},
{
"path": "demos/src/Examples/Accessibility/React/TextMenu.tsx",
"chars": 3724,
"preview": "import { Selection } from '@tiptap/pm/state'\nimport type { Editor } from '@tiptap/react'\nimport { useEditorState } from "
},
{
"path": "demos/src/Examples/Accessibility/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Accessibility/React/index.spec.js",
"chars": 3325,
"preview": "context('/src/Examples/AutolinkValidation/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/AutolinkVali"
},
{
"path": "demos/src/Examples/Accessibility/React/index.tsx",
"chars": 1271,
"preview": "import './styles.scss'\n\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter"
},
{
"path": "demos/src/Examples/Accessibility/React/styles.scss",
"chars": 3547,
"preview": ".tiptap {\n /**\n * This fixes a bug with voiceover where it speaks text that runs from one element to another as one "
},
{
"path": "demos/src/Examples/Accessibility/React/useMenubarNav.ts",
"chars": 3325,
"preview": "import type { Editor } from '@tiptap/core'\nimport type React from 'react'\nimport { useCallback, useEffect, useRef } from"
},
{
"path": "demos/src/Examples/AutolinkValidation/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/AutolinkValidation/React/index.jsx",
"chars": 1867,
"preview": "import './styles.scss'\n\nimport Link from '@tiptap/extension-link'\nimport { EditorContent, useEditor, useEditorState } fr"
},
{
"path": "demos/src/Examples/AutolinkValidation/React/index.spec.js",
"chars": 3325,
"preview": "context('/src/Examples/AutolinkValidation/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/AutolinkVali"
},
{
"path": "demos/src/Examples/AutolinkValidation/React/styles.scss",
"chars": 1437,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/AutolinkValidation/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/AutolinkValidation/Vue/index.spec.js",
"chars": 1241,
"preview": "context('/src/Examples/AutolinkValidation/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/AutolinkValida"
},
{
"path": "demos/src/Examples/AutolinkValidation/Vue/index.vue",
"chars": 1561,
"preview": "<template>\n <editor-content :editor=\"editor\" />\n</template>\n\n<script>\nimport Link from '@tiptap/extension-link'\nimport "
},
{
"path": "demos/src/Examples/Book/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Book/React/index.jsx",
"chars": 4390,
"preview": "import './styles.scss'\n\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter"
},
{
"path": "demos/src/Examples/Book/React/index.spec.js",
"chars": 300,
"preview": "context('/src/Examples/Book/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Book/React/')\n })\n\n it('"
},
{
"path": "demos/src/Examples/Book/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/Book/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Book/Vue/index.spec.js",
"chars": 296,
"preview": "context('/src/Examples/Book/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Book/Vue/')\n })\n\n it('shou"
},
{
"path": "demos/src/Examples/Book/Vue/index.vue",
"chars": 5497,
"preview": "<template>\n <div v-if=\"editor\" class=\"container\">\n <div class=\"control-group\">\n <div class=\"button-group\">\n "
},
{
"path": "demos/src/Examples/Book/content.js",
"chars": 1207168,
"preview": "export const content = `\n<h1>MOBY-DICK;<br>or, THE WHALE.</h1><p>By Herman Melville</p><hr><h2>CHAPTER 1. Loomings.</h2>"
},
{
"path": "demos/src/Examples/CSSModules/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CSSModules/React/index.jsx",
"chars": 5003,
"preview": "import './styles.scss'\n\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter"
},
{
"path": "demos/src/Examples/CSSModules/React/index.module.css",
"chars": 55,
"preview": ".toolbar {\n background-color: red;\n padding: 16px;\n}\n"
},
{
"path": "demos/src/Examples/CSSModules/React/index.spec.js",
"chars": 424,
"preview": "context('/src/Examples/CSSModules/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CSSModules/React/')\n"
},
{
"path": "demos/src/Examples/CSSModules/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/CSSModules/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CSSModules/Vue/index.module.css",
"chars": 55,
"preview": ".toolbar {\n background-color: red;\n padding: 16px;\n}\n"
},
{
"path": "demos/src/Examples/CSSModules/Vue/index.spec.js",
"chars": 420,
"preview": "context('/src/Examples/CSSModules/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CSSModules/Vue/')\n })"
},
{
"path": "demos/src/Examples/CSSModules/Vue/index.vue",
"chars": 5942,
"preview": "<template>\n <div v-if=\"editor\" class=\"toolbar\" :class=\"styles.toolbar\">\n <button @click=\"editor.chain().focus().togg"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/CodeBlockComponent.jsx",
"chars": 778,
"preview": "import './CodeBlockComponent.scss'\n\nimport { NodeViewContent, NodeViewWrapper } from '@tiptap/react'\nimport React from '"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/CodeBlockComponent.scss",
"chars": 365,
"preview": ".tiptap {\n .code-block {\n position: relative;\n\n select {\n position: absolute;\n background-color: var(--"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/index.jsx",
"chars": 2297,
"preview": "import './styles.scss'\n\nimport CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'\nimport Document from '@tip"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/index.spec.js",
"chars": 799,
"preview": "context('/src/Examples/CodeBlockLanguage/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CodeBlockLang"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/React/styles.scss",
"chars": 1181,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n pre {\n background: var(--black);\n b"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/Vue/CodeBlockComponent.vue",
"chars": 1309,
"preview": "<template>\n <node-view-wrapper class=\"code-block\">\n <select contenteditable=\"false\" v-model=\"selectedLanguage\">\n "
},
{
"path": "demos/src/Examples/CodeBlockLanguage/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CodeBlockLanguage/Vue/index.spec.js",
"chars": 795,
"preview": "context('/src/Examples/CodeBlockLanguage/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CodeBlockLangua"
},
{
"path": "demos/src/Examples/CodeBlockLanguage/Vue/index.vue",
"chars": 3514,
"preview": "<template>\n <div v-if=\"editor\" class=\"container\">\n <div class=\"control-group\">\n <div class=\"button-\">\n <"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/MenuBar.jsx",
"chars": 3637,
"preview": "import './MenuBar.scss'\n\nimport React, { Fragment } from 'react'\n\nimport MenuItem from './MenuItem.jsx'\n\nexport default "
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/MenuBar.scss",
"chars": 132,
"preview": ".divider {\n background-color: rgba(#fff, 0.25);\n height: 1.25rem;\n margin-left: 0.5rem;\n margin-right: 0.75rem;\n wi"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/MenuItem.jsx",
"chars": 399,
"preview": "import './MenuItem.scss'\n\nimport React from 'react'\nimport remixiconUrl from 'remixicon/fonts/remixicon.symbol.svg'\n\nexp"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/MenuItem.scss",
"chars": 340,
"preview": ".menu-item {\n background-color: transparent;\n border: none;\n border-radius: 0.4rem;\n color: #fff;\n cursor: pointer;"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/index.jsx",
"chars": 3731,
"preview": "import './styles.scss'\n\nimport { TiptapCollabProvider } from '@hocuspocus/provider'\nimport Collaboration from '@tiptap/e"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/index.spec.js",
"chars": 615,
"preview": "context('/src/Examples/CollaborativeEditing/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Collaborat"
},
{
"path": "demos/src/Examples/CollaborativeEditing/React/styles.scss",
"chars": 3378,
"preview": "/* Basic editor styles */\n.tiptap {\n > * + * {\n margin-top: 0.75em;\n }\n\n ul,\n ol {\n padding: 0 1rem;\n }\n\n h1"
},
{
"path": "demos/src/Examples/CollaborativeEditing/Vue/MenuBar.vue",
"chars": 4495,
"preview": "<template>\n <div>\n <template v-for=\"(item, index) in items\">\n <div class=\"divider\" v-if=\"item.type === 'divider"
},
{
"path": "demos/src/Examples/CollaborativeEditing/Vue/MenuItem.vue",
"chars": 1039,
"preview": "<template>\n <button class=\"menu-item\" :class=\"{ 'is-active': isActive ? isActive() : null }\" @click=\"action\" :title=\"ti"
},
{
"path": "demos/src/Examples/CollaborativeEditing/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CollaborativeEditing/Vue/index.spec.js",
"chars": 611,
"preview": "context('/src/Examples/CollaborativeEditing/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Collaborativ"
},
{
"path": "demos/src/Examples/CollaborativeEditing/Vue/index.vue",
"chars": 7532,
"preview": "<template>\n <div class=\"editor\" v-if=\"editor\">\n <menu-bar class=\"editor__header\" :editor=\"editor\" />\n <editor-con"
},
{
"path": "demos/src/Examples/Community/React/MentionList.jsx",
"chars": 1481,
"preview": "import './MentionList.scss'\n\nimport React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react'\n\nexport"
},
{
"path": "demos/src/Examples/Community/React/MentionList.scss",
"chars": 576,
"preview": "/* Dropdown menu */\n.dropdown-menu {\n background: var(--white);\n border: 1px solid var(--gray-1);\n border-radius: 0.7"
},
{
"path": "demos/src/Examples/Community/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Community/React/index.jsx",
"chars": 2019,
"preview": "import './styles.scss'\n\nimport Document from '@tiptap/extension-document'\nimport Mention from '@tiptap/extension-mention"
},
{
"path": "demos/src/Examples/Community/React/index.spec.js",
"chars": 1178,
"preview": "context('/src/Examples/Community/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Community/React/')\n "
},
{
"path": "demos/src/Examples/Community/React/styles.scss",
"chars": 516,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n .mention {\n background-color: var(--pu"
},
{
"path": "demos/src/Examples/Community/React/suggestion.js",
"chars": 2404,
"preview": "import { computePosition, flip, shift } from '@floating-ui/dom'\nimport { posToDOMRect, ReactRenderer } from '@tiptap/rea"
},
{
"path": "demos/src/Examples/Community/Vue/MentionList.vue",
"chars": 2056,
"preview": "<template>\n <div class=\"dropdown-menu\">\n <template v-if=\"items.length\">\n <button\n :class=\"{ 'is-selected"
},
{
"path": "demos/src/Examples/Community/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Community/Vue/index.spec.js",
"chars": 1174,
"preview": "context('/src/Examples/Community/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Community/Vue/')\n })\n\n"
},
{
"path": "demos/src/Examples/Community/Vue/index.vue",
"chars": 2497,
"preview": "<template>\n <editor-content :editor=\"editor\" />\n\n <div\n v-if=\"editor\"\n :class=\"{\n 'character-count': true,\n"
},
{
"path": "demos/src/Examples/Community/Vue/suggestion.js",
"chars": 2433,
"preview": "import { computePosition, flip, shift } from '@floating-ui/dom'\nimport { posToDOMRect, VueRenderer } from '@tiptap/vue-3"
},
{
"path": "demos/src/Examples/CustomDocument/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CustomDocument/React/index.jsx",
"chars": 1046,
"preview": "import './styles.scss'\n\nimport Document from '@tiptap/extension-document'\nimport { Placeholder } from '@tiptap/extension"
},
{
"path": "demos/src/Examples/CustomDocument/React/index.spec.js",
"chars": 1863,
"preview": "context('/src/Examples/CustomDocument/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CustomDocument/R"
},
{
"path": "demos/src/Examples/CustomDocument/React/styles.scss",
"chars": 1695,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/CustomDocument/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CustomDocument/Vue/index.spec.js",
"chars": 1893,
"preview": "context('/src/Examples/CustomDocument/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CustomDocument/Vue"
},
{
"path": "demos/src/Examples/CustomDocument/Vue/index.vue",
"chars": 2971,
"preview": "<template>\n <editor-content :editor=\"editor\" />\n</template>\n\n<script>\nimport Document from '@tiptap/extension-document'"
},
{
"path": "demos/src/Examples/CustomParagraph/React/Paragraph.jsx",
"chars": 725,
"preview": "import { Paragraph as BaseParagraph } from '@tiptap/extension-paragraph'\nimport { NodeViewContent, NodeViewWrapper, Reac"
},
{
"path": "demos/src/Examples/CustomParagraph/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CustomParagraph/React/index.jsx",
"chars": 512,
"preview": "import './styles.scss'\n\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter"
},
{
"path": "demos/src/Examples/CustomParagraph/React/index.spec.js",
"chars": 845,
"preview": "context('/src/Examples/CustomParagraph/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CustomParagraph"
},
{
"path": "demos/src/Examples/CustomParagraph/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/CustomParagraph/Vue/Component.vue",
"chars": 570,
"preview": "<template>\n <node-view-wrapper class=\"vue-component\">\n <span contenteditable=\"false\" class=\"label\">{{ node.textConte"
},
{
"path": "demos/src/Examples/CustomParagraph/Vue/Extension.js",
"chars": 273,
"preview": "import { Paragraph as BaseParagraph } from '@tiptap/extension-paragraph'\nimport { VueNodeViewRenderer } from '@tiptap/vu"
},
{
"path": "demos/src/Examples/CustomParagraph/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/CustomParagraph/Vue/index.spec.js",
"chars": 845,
"preview": "context('/src/Examples/CustomParagraph/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/CustomParagraph"
},
{
"path": "demos/src/Examples/CustomParagraph/Vue/index.vue",
"chars": 843,
"preview": "<template>\n <editor-content :editor=\"editor\" />\n</template>\n\n<script>\nimport StarterKit from '@tiptap/starter-kit'\nimpo"
},
{
"path": "demos/src/Examples/Default/React/MenuBar.tsx",
"chars": 4329,
"preview": "import type { Editor } from '@tiptap/core'\nimport { useEditorState } from '@tiptap/react'\nimport React from 'react'\n\nimp"
},
{
"path": "demos/src/Examples/Default/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Default/React/index.spec.js",
"chars": 5977,
"preview": "context('/src/Examples/Default/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Default/React/')\n\n c"
},
{
"path": "demos/src/Examples/Default/React/index.tsx",
"chars": 1259,
"preview": "import './styles.scss'\n\nimport { TextStyleKit } from '@tiptap/extension-text-style'\nimport { EditorContent, useEditor } "
},
{
"path": "demos/src/Examples/Default/React/menuBarState.ts",
"chars": 1878,
"preview": "import type { Editor } from '@tiptap/core'\nimport type { EditorStateSnapshot } from '@tiptap/react'\n\n/**\n * State select"
},
{
"path": "demos/src/Examples/Default/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/Default/Svelte/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Default/Svelte/index.spec.js",
"chars": 5979,
"preview": "context('/src/Examples/Default/Svelte/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Default/Svelte/')\n\n "
},
{
"path": "demos/src/Examples/Default/Svelte/index.svelte",
"chars": 6178,
"preview": "<script>\n import \"./styles.scss\";\n\n import { Color } from '@tiptap/extension-text-style'\n import { ListItem } from '@"
},
{
"path": "demos/src/Examples/Default/Svelte/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/Default/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Default/Vue/index.spec.js",
"chars": 4566,
"preview": "context('/src/Examples/Default/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Default/Vue/')\n })\n\n be"
},
{
"path": "demos/src/Examples/Default/Vue/index.vue",
"chars": 7310,
"preview": "<template>\n <div v-if=\"editor\" class=\"container\">\n <div class=\"control-group\">\n <div class=\"button-group\">\n "
},
{
"path": "demos/src/Examples/Drawing/Vue/Component.vue",
"chars": 3253,
"preview": "<template>\n <node-view-wrapper class=\"draw\">\n <div class=\"control-group\">\n <div class=\"button-group\">\n <"
},
{
"path": "demos/src/Examples/Drawing/Vue/Paper.js",
"chars": 572,
"preview": "import { mergeAttributes, Node, VueNodeViewRenderer } from '@tiptap/vue-3'\n\nimport Component from './Component.vue'\n\nexp"
},
{
"path": "demos/src/Examples/Drawing/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Drawing/Vue/index.spec.js",
"chars": 999,
"preview": "context('/src/Examples/Drawing/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Drawing/Vue/')\n })\n\n it"
},
{
"path": "demos/src/Examples/Drawing/Vue/index.vue",
"chars": 609,
"preview": "<template>\n <editor-content :editor=\"editor\" />\n</template>\n\n<script>\nimport Document from '@tiptap/extension-document'"
},
{
"path": "demos/src/Examples/EnterShortcuts/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/EnterShortcuts/React/index.spec.js",
"chars": 991,
"preview": "/// <reference types=\"cypress\" />\n\ncontext('/src/Examples/EnterShortcuts/React/', () => {\n beforeEach(() => {\n cy.vi"
},
{
"path": "demos/src/Examples/EnterShortcuts/React/index.tsx",
"chars": 2764,
"preview": "import './styles.scss'\n\nimport { EditorContent, Extension, useEditor } from '@tiptap/react'\nimport StarterKit from '@tip"
},
{
"path": "demos/src/Examples/EnterShortcuts/React/styles.scss",
"chars": 1301,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/EnterShortcuts/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/EnterShortcuts/Vue/index.spec.js",
"chars": 952,
"preview": "context('/src/Examples/EnterShortcuts/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/EnterShortcuts/Vue"
},
{
"path": "demos/src/Examples/EnterShortcuts/Vue/index.vue",
"chars": 4148,
"preview": "<template>\n <div v-if=\"editor\" class=\"container\">\n <div class=\"control-group\">\n <div class=\"button-group\">\n "
},
{
"path": "demos/src/Examples/Formatting/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Formatting/React/index.jsx",
"chars": 4319,
"preview": "import './styles.scss'\n\nimport Highlight from '@tiptap/extension-highlight'\nimport TextAlign from '@tiptap/extension-tex"
},
{
"path": "demos/src/Examples/Formatting/React/index.spec.js",
"chars": 990,
"preview": "context('/src/Examples/Formatting/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Formatting/React/')\n"
},
{
"path": "demos/src/Examples/Formatting/React/styles.scss",
"chars": 1434,
"preview": "/* Basic editor styles */\n.tiptap {\n :first-child {\n margin-top: 0;\n }\n\n /* List styles */\n ul,\n ol {\n paddin"
},
{
"path": "demos/src/Examples/Formatting/Vue/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Formatting/Vue/index.spec.js",
"chars": 986,
"preview": "context('/src/Examples/Formatting/Vue/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Formatting/Vue/')\n })"
},
{
"path": "demos/src/Examples/Formatting/Vue/index.vue",
"chars": 5718,
"preview": "<template>\n <div v-if=\"editor\" class=\"container\">\n <div class=\"control-group\">\n <div class=\"button-group\">\n "
},
{
"path": "demos/src/Examples/Images/React/index.html",
"chars": 0,
"preview": ""
},
{
"path": "demos/src/Examples/Images/React/index.jsx",
"chars": 1094,
"preview": "import './styles.scss'\n\nimport Document from '@tiptap/extension-document'\nimport Image from '@tiptap/extension-image'\nim"
},
{
"path": "demos/src/Examples/Images/React/index.spec.js",
"chars": 921,
"preview": "context('/src/Examples/Images/React/', () => {\n beforeEach(() => {\n cy.visit('/src/Examples/Images/React/')\n })\n\n "
}
]
// ... and 1736 more files (download for full content)
About this extraction
This page contains the full source code of the ueberdosis/tiptap GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1936 files (7.6 MB), approximately 2.1M tokens, and a symbol index with 1917 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.