@react-email/editor 1.3.10 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.cjs +3 -3
- package/dist/{core-CLyAVVUW.cjs → core-Dte9KXcz.cjs} +2 -2
- package/dist/{email-node-DvyWFrOM.cjs → email-node-BhbXb22u.cjs} +1 -1
- package/dist/{event-bus-C_wS2tD6.cjs → event-bus-C0haBiDw.cjs} +1 -1
- package/dist/{extension-D_sNGTbX.cjs → extension-bVrEjbFA.cjs} +2 -2
- package/dist/{extension-C1ilEKq-.cjs → extension-mBZiGbpM.cjs} +2 -2
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.d.cts.map +1 -1
- package/dist/extensions/index.d.mts.map +1 -1
- package/dist/extensions/index.mjs +2 -2
- package/dist/{extensions-oOPUnW7d.cjs → extensions-BQca53AB.cjs} +5 -5
- package/dist/{extensions-CU0ndoee.mjs → extensions-F1FqbQUp.mjs} +2 -2
- package/dist/{extensions-CU0ndoee.mjs.map → extensions-F1FqbQUp.mjs.map} +1 -1
- package/dist/{focus-scopes-B_0O7l7d.mjs → focus-scopes-DOsiXV7b.mjs} +88 -30
- package/dist/focus-scopes-DOsiXV7b.mjs.map +1 -0
- package/dist/{focus-scopes-l_Ki0562.cjs → focus-scopes-Ncj54H_M.cjs} +87 -29
- package/dist/{image-BpsmuXKq.cjs → image-D8OUIgwB.cjs} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.mjs +2 -2
- package/dist/plugins/index.cjs +4 -4
- package/dist/{root-yYM1BF1C.mjs → root-DYLwAjbF.mjs} +2 -2
- package/dist/{root-yYM1BF1C.mjs.map → root-DYLwAjbF.mjs.map} +1 -1
- package/dist/{root-D8zhkKgc.cjs → root-snVuaxh6.cjs} +2 -2
- package/dist/ui/index.cjs +5 -5
- package/dist/ui/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/focus-scopes-B_0O7l7d.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const require_focus_scopes = require("./focus-scopes-
|
|
2
|
-
const require_event_bus = require("./event-bus-
|
|
1
|
+
const require_focus_scopes = require("./focus-scopes-Ncj54H_M.cjs");
|
|
2
|
+
const require_event_bus = require("./event-bus-C0haBiDw.cjs");
|
|
3
3
|
const require_set_text_alignment = require("./set-text-alignment-CpGakuZ2.cjs");
|
|
4
4
|
let _tiptap_react = require("@tiptap/react");
|
|
5
5
|
let react = require("react");
|
package/dist/ui/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_focus_scopes = require("../focus-scopes-
|
|
3
|
-
const require_email_node = require("../email-node-
|
|
4
|
-
const require_extension = require("../extension-
|
|
5
|
-
const require_root = require("../root-
|
|
6
|
-
const require_image = require("../image-
|
|
2
|
+
const require_focus_scopes = require("../focus-scopes-Ncj54H_M.cjs");
|
|
3
|
+
const require_email_node = require("../email-node-BhbXb22u.cjs");
|
|
4
|
+
const require_extension = require("../extension-mBZiGbpM.cjs");
|
|
5
|
+
const require_root = require("../root-snVuaxh6.cjs");
|
|
6
|
+
const require_image = require("../image-D8OUIgwB.cjs");
|
|
7
7
|
let _tiptap_react = require("@tiptap/react");
|
|
8
8
|
let react = require("react");
|
|
9
9
|
react = require_focus_scopes.__toESM(react);
|
package/dist/ui/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as jsToInlineCss, i as inlineCssToJs, n as ensureBorderStyleFallback, r as expandShorthandProperties } from "../email-node-B-_g4X-S.mjs";
|
|
2
|
-
import { p as loadPrismTheme } from "../focus-scopes-
|
|
2
|
+
import { p as loadPrismTheme } from "../focus-scopes-DOsiXV7b.mjs";
|
|
3
3
|
import { d as useEmailTheming, l as setGlobalStyles, o as getThemeComponentKey, u as stylesToCss, v as EDITOR_THEMES, x as SUPPORTED_CSS_PROPERTIES } from "../extension-B_qJnv3m.mjs";
|
|
4
|
-
import { $ as BubbleMenuButtonToolbar, A as BubbleMenuImageUnlink, At as ChevronDownIcon, B as BubbleMenuNodeSelector, C as BubbleMenuLinkDefault, Ct as Heading2Icon, D as BubbleMenuLinkForm, Dt as Columns3Icon, E as BubbleMenuLinkOpenLink, Et as Columns4Icon, F as RootWithDefault, Ft as AlignLeftIcon, G as BubbleMenuItalic, H as NodeSelectorRoot, I as BubbleMenuUppercase, It as AlignCenterIcon, J as EditorFocusScope, K as BubbleMenuItemGroup, L as BubbleMenuUnderline, M as BubbleMenuImageForm, Mt as CaseUpperIcon, N as BubbleMenuImageEditLink, Nt as BoldIcon, O as BubbleMenuLinkEditLink, Ot as Columns2Icon, P as BubbleMenuButtonDefault, Pt as AlignRightIcon, Q as BubbleMenuButtonUnlink, R as bubbleMenuTriggers, S as BubbleMenuSeparator, St as Heading3Icon, T as BubbleMenuLinkToolbar, Tt as ExternalLinkIcon, U as NodeSelectorTrigger, V as NodeSelectorContent, W as BubbleMenuLinkSelector, X as FocusScopeContext, Y as EditorFocusScopeProvider, Z as useEditorFocusScope, _ as TWO_COLUMNS, _t as MousePointerIcon, a as BUTTON, at as BubbleMenuAlignCenter, b as isInsideNode, bt as LinkIcon, c as FOUR_COLUMNS, ct as UnlinkIcon, d as H3, dt as TextIcon, et as BubbleMenuButtonForm, f as NUMBERED_LIST, ft as StrikethroughIcon, g as THREE_COLUMNS, gt as PencilIcon, h as TEXT, ht as Rows2Icon, i as BULLET_LIST, it as BubbleMenuAlignLeft, j as BubbleMenuImageToolbar, jt as CheckIcon, k as BubbleMenuImageDefault, kt as CodeIcon, l as H1, lt as UnderlineIcon, m as SECTION, mt as SplitSquareVerticalIcon, n as filterAndRankItems, nt as BubbleMenuBold, o as CODE, ot as BubbleMenuItem, p as QUOTE, pt as SquareCodeIcon, q as BubbleMenuCode, r as scoreItem, rt as BubbleMenuAlignRight, s as DIVIDER, st as useBubbleMenuContext, t as SlashCommandRoot, tt as BubbleMenuButtonEditLink, u as H2, ut as TextQuoteIcon, v as defaultSlashCommands, vt as ListOrderedIcon, w as BubbleMenuLinkUnlink, wt as Heading1Icon, x as BubbleMenu, xt as ItalicIcon, y as isAtMaxColumnsDepth, yt as ListIcon, z as BubbleMenuStrike } from "../root-
|
|
4
|
+
import { $ as BubbleMenuButtonToolbar, A as BubbleMenuImageUnlink, At as ChevronDownIcon, B as BubbleMenuNodeSelector, C as BubbleMenuLinkDefault, Ct as Heading2Icon, D as BubbleMenuLinkForm, Dt as Columns3Icon, E as BubbleMenuLinkOpenLink, Et as Columns4Icon, F as RootWithDefault, Ft as AlignLeftIcon, G as BubbleMenuItalic, H as NodeSelectorRoot, I as BubbleMenuUppercase, It as AlignCenterIcon, J as EditorFocusScope, K as BubbleMenuItemGroup, L as BubbleMenuUnderline, M as BubbleMenuImageForm, Mt as CaseUpperIcon, N as BubbleMenuImageEditLink, Nt as BoldIcon, O as BubbleMenuLinkEditLink, Ot as Columns2Icon, P as BubbleMenuButtonDefault, Pt as AlignRightIcon, Q as BubbleMenuButtonUnlink, R as bubbleMenuTriggers, S as BubbleMenuSeparator, St as Heading3Icon, T as BubbleMenuLinkToolbar, Tt as ExternalLinkIcon, U as NodeSelectorTrigger, V as NodeSelectorContent, W as BubbleMenuLinkSelector, X as FocusScopeContext, Y as EditorFocusScopeProvider, Z as useEditorFocusScope, _ as TWO_COLUMNS, _t as MousePointerIcon, a as BUTTON, at as BubbleMenuAlignCenter, b as isInsideNode, bt as LinkIcon, c as FOUR_COLUMNS, ct as UnlinkIcon, d as H3, dt as TextIcon, et as BubbleMenuButtonForm, f as NUMBERED_LIST, ft as StrikethroughIcon, g as THREE_COLUMNS, gt as PencilIcon, h as TEXT, ht as Rows2Icon, i as BULLET_LIST, it as BubbleMenuAlignLeft, j as BubbleMenuImageToolbar, jt as CheckIcon, k as BubbleMenuImageDefault, kt as CodeIcon, l as H1, lt as UnderlineIcon, m as SECTION, mt as SplitSquareVerticalIcon, n as filterAndRankItems, nt as BubbleMenuBold, o as CODE, ot as BubbleMenuItem, p as QUOTE, pt as SquareCodeIcon, q as BubbleMenuCode, r as scoreItem, rt as BubbleMenuAlignRight, s as DIVIDER, st as useBubbleMenuContext, t as SlashCommandRoot, tt as BubbleMenuButtonEditLink, u as H2, ut as TextQuoteIcon, v as defaultSlashCommands, vt as ListOrderedIcon, w as BubbleMenuLinkUnlink, wt as Heading1Icon, x as BubbleMenu, xt as ItalicIcon, y as isAtMaxColumnsDepth, yt as ListIcon, z as BubbleMenuStrike } from "../root-DYLwAjbF.mjs";
|
|
5
5
|
import { t as ImageIcon } from "../image-jWcRFTLT.mjs";
|
|
6
6
|
import { useCurrentEditor, useEditorState } from "@tiptap/react";
|
|
7
7
|
import * as React$1 from "react";
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"focus-scopes-B_0O7l7d.mjs","names":["nativeTiptapExtensions"],"sources":["../src/utils/attribute-helpers.ts","../src/utils/prism-utils.ts","../src/extensions/columns.tsx","../src/extensions/focus-scopes.ts"],"sourcesContent":["/**\n * Creates TipTap attribute definitions for a list of HTML attributes.\n * Each attribute will have the same pattern:\n * - default: null\n * - parseHTML: extracts the attribute from the element\n * - renderHTML: conditionally renders the attribute if it has a value\n *\n * @param attributeNames - Array of HTML attribute names to create definitions for\n * @returns Object with TipTap attribute definitions\n *\n * @example\n * const attrs = createStandardAttributes(['class', 'id', 'title']);\n * // Returns:\n * // {\n * // class: {\n * // default: null,\n * // parseHTML: (element) => element.getAttribute('class'),\n * // renderHTML: (attributes) => attributes.class ? { class: attributes.class } : {}\n * // },\n * // ...\n * // }\n */\nexport function createStandardAttributes(attributeNames: readonly string[]) {\n return Object.fromEntries(\n attributeNames.map((attr) => [\n attr,\n {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute(attr),\n renderHTML: (attributes: Record<string, unknown>) => {\n if (!attributes[attr]) {\n return {};\n }\n\n return {\n [attr]: attributes[attr],\n };\n },\n },\n ]),\n );\n}\n\n/**\n * Common HTML attributes used across multiple extensions.\n * These preserve attributes during HTML import and editing for better\n * fidelity when importing existing email templates.\n */\nexport const COMMON_HTML_ATTRIBUTES = [\n 'id',\n 'class',\n 'title',\n 'lang',\n 'dir',\n 'data-id',\n] as const;\n\n/**\n * Layout-specific HTML attributes used for positioning and sizing.\n */\nexport const LAYOUT_ATTRIBUTES = ['align', 'width', 'height'] as const;\n\n/**\n * Table-specific HTML attributes used for table layout and styling.\n */\nexport const TABLE_ATTRIBUTES = [\n 'border',\n 'cellpadding',\n 'cellspacing',\n] as const;\n\n/**\n * Table cell-specific HTML attributes.\n */\nexport const TABLE_CELL_ATTRIBUTES = [\n 'valign',\n 'bgcolor',\n 'colspan',\n 'rowspan',\n] as const;\n\n/**\n * Table header cell-specific HTML attributes.\n * These are additional attributes that only apply to <th> elements.\n */\nexport const TABLE_HEADER_ATTRIBUTES = [\n ...TABLE_CELL_ATTRIBUTES,\n 'scope',\n] as const;\n","const publicURL = '/styles/prism';\n\nexport function loadPrismTheme(theme: string) {\n // Create new link element for the new theme\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = `${publicURL}/prism-${theme}.css`;\n link.setAttribute('data-prism-theme', ''); // Mark this link as the Prism theme\n\n // Append the new link element to the head\n document.head.appendChild(link);\n}\n\nexport function removePrismTheme() {\n const existingTheme = document.querySelectorAll(\n 'link[rel=\"stylesheet\"][data-prism-theme]',\n );\n if (existingTheme.length > 0) {\n existingTheme.forEach((cssLinkTag) => {\n cssLinkTag.remove();\n });\n }\n}\n\nexport function hasPrismThemeLoaded(theme: string) {\n const existingTheme = document.querySelector(\n `link[rel=\"stylesheet\"][data-prism-theme][href=\"${publicURL}/prism-${theme}.css\"]`,\n );\n return !!existingTheme;\n}\n","import { type CommandProps, mergeAttributes } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { Column, Row } from 'react-email';\nimport { EmailNode } from '../core/serializer/email-node';\nimport {\n COMMON_HTML_ATTRIBUTES,\n createStandardAttributes,\n LAYOUT_ATTRIBUTES,\n} from '../utils/attribute-helpers';\nimport { inlineCssToJs } from '../utils/styles';\n\nconst COLUMN_PARENT_ATTRIBUTES = ['cellspacing'] as const;\n\nfunction getColumnGapCss(cellspacing: unknown): string | undefined {\n if (cellspacing === undefined || cellspacing === null || cellspacing === '') {\n return undefined;\n }\n\n const value = String(cellspacing).trim();\n if (value === '') {\n return undefined;\n }\n\n if (/^\\d+(\\.\\d+)?$/.test(value)) {\n return `${value}px`;\n }\n\n return value;\n}\n\nfunction getRowCellSpacing(cellspacing: unknown): string | undefined {\n if (cellspacing === undefined || cellspacing === null || cellspacing === '') {\n return undefined;\n }\n\n const value = String(cellspacing).trim();\n if (value === '' || value === '0') {\n return undefined;\n }\n\n return value;\n}\n\nfunction mergeColumnsEditorStyle(\n spacing: unknown,\n existingStyle: unknown,\n): string | undefined {\n const gap = getColumnGapCss(spacing);\n const currentStyle =\n typeof existingStyle === 'string' && existingStyle.trim() !== ''\n ? existingStyle.trim()\n : '';\n\n if (!gap) {\n return currentStyle || undefined;\n }\n\n const separator = currentStyle.endsWith(';') ? '' : ';';\n return currentStyle\n ? `${currentStyle}${separator}gap:${gap};`\n : `gap:${gap};`;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n insertColumns: (count: 2 | 3 | 4) => ReturnType;\n };\n }\n}\n\nexport const COLUMN_PARENT_TYPES = [\n 'twoColumns',\n 'threeColumns',\n 'fourColumns',\n] as const;\n\nconst COLUMN_PARENT_SET = new Set<string>(COLUMN_PARENT_TYPES);\n\nexport const MAX_COLUMNS_DEPTH = 3;\n\nexport function getColumnsDepth(doc: ProseMirrorNode, from: number): number {\n const $from = doc.resolve(from);\n let depth = 0;\n for (let d = $from.depth; d > 0; d--) {\n if (COLUMN_PARENT_SET.has($from.node(d).type.name)) {\n depth++;\n }\n }\n return depth;\n}\n\ninterface ColumnsVariantConfig {\n name: (typeof COLUMN_PARENT_TYPES)[number];\n columnCount: number;\n content: string;\n dataType: string;\n}\n\nconst VARIANTS: ColumnsVariantConfig[] = [\n {\n name: 'twoColumns',\n columnCount: 2,\n content: 'columnsColumn columnsColumn',\n dataType: 'two-columns',\n },\n {\n name: 'threeColumns',\n columnCount: 3,\n content: 'columnsColumn columnsColumn columnsColumn',\n dataType: 'three-columns',\n },\n {\n name: 'fourColumns',\n columnCount: 4,\n content: 'columnsColumn{4}',\n dataType: 'four-columns',\n },\n];\n\nconst NODE_TYPE_MAP: Record<number, (typeof COLUMN_PARENT_TYPES)[number]> = {\n 2: 'twoColumns',\n 3: 'threeColumns',\n 4: 'fourColumns',\n};\n\nfunction createColumnsNode(\n config: ColumnsVariantConfig,\n includeCommands: boolean,\n) {\n return EmailNode.create({\n name: config.name,\n group: 'block',\n content: config.content,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return createStandardAttributes([\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ...COLUMN_PARENT_ATTRIBUTES,\n ]);\n },\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${config.dataType}\"]` }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const { style, cellspacing, ...attributes } = HTMLAttributes as Record<\n string,\n unknown\n >;\n const mergedStyle = mergeColumnsEditorStyle(cellspacing, style);\n\n return [\n 'div',\n mergeAttributes(\n {\n 'data-type': config.dataType,\n class: 'node-columns',\n ...(mergedStyle ? { style: mergedStyle } : {}),\n },\n attributes,\n ),\n 0,\n ];\n },\n\n ...(includeCommands && {\n addCommands() {\n return {\n insertColumns:\n (count: 2 | 3 | 4) =>\n ({\n commands,\n state,\n }: CommandProps & {\n state: { doc: ProseMirrorNode; selection: { from: number } };\n }) => {\n if (\n getColumnsDepth(state.doc, state.selection.from) >=\n MAX_COLUMNS_DEPTH\n ) {\n return false;\n }\n const nodeType = NODE_TYPE_MAP[count];\n const children = Array.from({ length: count }, () => ({\n type: 'columnsColumn',\n content: [{ type: 'paragraph', content: [] }],\n }));\n return commands.insertContent({\n type: nodeType,\n content: children,\n });\n },\n };\n },\n }),\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n const cellSpacing = getRowCellSpacing(node.attrs?.cellspacing);\n\n return (\n <Row\n className={node.attrs?.class || undefined}\n style={{ ...style, ...inlineStyles }}\n {...(cellSpacing ? { cellSpacing } : {})}\n >\n {children}\n </Row>\n );\n },\n });\n}\n\nexport const TwoColumns = createColumnsNode(VARIANTS[0], true);\nexport const ThreeColumns = createColumnsNode(VARIANTS[1], false);\nexport const FourColumns = createColumnsNode(VARIANTS[2], false);\n\nexport const ColumnsColumn = EmailNode.create({\n name: 'columnsColumn',\n group: 'columnsColumn',\n content: 'block+',\n isolating: true,\n\n addAttributes() {\n return {\n ...createStandardAttributes([\n ...LAYOUT_ATTRIBUTES,\n ...COMMON_HTML_ATTRIBUTES,\n ]),\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"column\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(\n { 'data-type': 'column', class: 'node-column' },\n HTMLAttributes,\n ),\n 0,\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: ({ editor }) => {\n const { state } = editor;\n const { selection } = state;\n const { empty, $from } = selection;\n\n if (!empty) return false;\n\n for (let depth = $from.depth; depth >= 1; depth--) {\n if ($from.pos !== $from.start(depth)) break;\n\n const indexInParent = $from.index(depth - 1);\n\n if (indexInParent === 0) continue;\n\n const parent = $from.node(depth - 1);\n const prevNode = parent.child(indexInParent - 1);\n\n if (COLUMN_PARENT_SET.has(prevNode.type.name)) {\n const deleteFrom = $from.before(depth) - prevNode.nodeSize;\n const deleteTo = $from.before(depth);\n editor.view.dispatch(state.tr.delete(deleteFrom, deleteTo));\n return true;\n }\n\n break;\n }\n\n return false;\n },\n 'Mod-a': ({ editor }) => {\n const { state } = editor;\n const { $from } = state.selection;\n\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type.name !== 'columnsColumn') {\n continue;\n }\n\n const columnStart = $from.start(d);\n const columnEnd = $from.end(d);\n const { from, to } = state.selection;\n\n if (from === columnStart && to === columnEnd) {\n return false;\n }\n\n editor.view.dispatch(\n state.tr.setSelection(\n TextSelection.create(state.doc, columnStart, columnEnd),\n ),\n );\n return true;\n }\n\n return false;\n },\n };\n },\n\n renderToReactEmail({ children, node, style }) {\n const inlineStyles = inlineCssToJs(node.attrs?.style);\n const width = node.attrs?.width;\n return (\n <Column\n className={node.attrs?.class || undefined}\n style={{\n ...style,\n ...inlineStyles,\n ...(width ? { width } : {}),\n }}\n >\n {children}\n </Column>\n );\n },\n});\n","import {\n type Editor,\n Extension,\n extensions as nativeTiptapExtensions,\n} from '@tiptap/core';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\n\nexport interface FocusScopesOptions {\n clearSelectionOnBlur: boolean;\n}\n\nexport interface FocusScopesStorage {\n registerScope: (el: HTMLElement | null) => void;\n unregisterScope: (el: HTMLElement | null) => void;\n}\n\ndeclare module '@tiptap/core' {\n interface Storage {\n focusScope: FocusScopesStorage;\n }\n}\n\nexport const focusScopePluginKey = new PluginKey('reactEmailFocusScopes');\n\nconst noop = () => {};\n\nexport function createFocusScopesStorage(): FocusScopesStorage {\n return {\n registerScope: noop,\n unregisterScope: noop,\n };\n}\n\nexport function createFocusScopePlugin({\n editor,\n storage,\n clearSelectionOnBlur,\n}: {\n editor: Editor;\n storage: FocusScopesStorage;\n clearSelectionOnBlur: boolean;\n}) {\n const scopeRefs = new Set<HTMLElement>();\n\n const isInsideScope = (node: Node | null) =>\n Boolean(node && [...scopeRefs].some((el) => el.contains(node)));\n\n const getClosestScope = (node: Node | null) => {\n if (!node) return null;\n\n let closest: HTMLElement | null = null;\n for (const scope of scopeRefs) {\n if (!scope.contains(node)) continue;\n if (!closest || closest.contains(scope)) {\n closest = scope;\n }\n }\n return closest;\n };\n\n const handleFocusIn = (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || !editor.view.dom.contains(target)) {\n return;\n }\n\n const previous = editor.isFocused;\n editor.isFocused = true;\n\n if (previous !== editor.isFocused) {\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false);\n\n editor.view.dispatch(transaction);\n }\n };\n\n const handleFocusOut = (event: FocusEvent) => {\n const blur = () => {\n const previous = editor.isFocused;\n editor.isFocused = false;\n\n if (previous !== editor.isFocused) {\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false);\n\n if (clearSelectionOnBlur) {\n transaction.setSelection(TextSelection.create(transaction.doc, 0));\n }\n\n editor.view.dispatch(transaction);\n }\n };\n\n const nextFocus = event.relatedTarget as Node | null;\n if (!nextFocus) {\n const previousFocus = event.target as Node | null;\n const fallbackScope = getClosestScope(previousFocus);\n\n // queueMicrotask is needed so that we can determine reliably\n // whether or not previousFocus is inside of the DOM\n queueMicrotask(() => {\n if (isInsideScope(event.view?.document.activeElement ?? null)) {\n return;\n }\n\n if (!previousFocus?.isConnected && fallbackScope?.isConnected) {\n fallbackScope.focus({ preventScroll: true });\n return;\n }\n\n blur();\n });\n return;\n }\n\n if (isInsideScope(nextFocus)) {\n return;\n }\n\n blur();\n };\n\n const registerScope = (el: HTMLElement | null) => {\n if (!el || scopeRefs.has(el)) return;\n\n scopeRefs.add(el);\n el.addEventListener('focusin', handleFocusIn);\n el.addEventListener('focusout', handleFocusOut);\n };\n\n const unregisterScope = (el: HTMLElement | null) => {\n if (!el || !scopeRefs.has(el)) return;\n\n scopeRefs.delete(el);\n el.removeEventListener('focusin', handleFocusIn);\n el.removeEventListener('focusout', handleFocusOut);\n };\n\n storage.registerScope = registerScope;\n storage.unregisterScope = unregisterScope;\n\n return new Plugin({\n key: focusScopePluginKey,\n view(view) {\n storage.registerScope = registerScope;\n storage.unregisterScope = unregisterScope;\n registerScope(view.dom);\n\n return {\n destroy() {\n for (const scope of [...scopeRefs]) {\n unregisterScope(scope);\n }\n storage.registerScope = noop;\n storage.unregisterScope = noop;\n },\n };\n },\n });\n}\n\nexport const FocusScopes = Extension.create<\n FocusScopesOptions,\n FocusScopesStorage\n>({\n name: 'focusScope',\n\n addOptions() {\n return {\n clearSelectionOnBlur: true,\n };\n },\n\n addStorage() {\n return createFocusScopesStorage();\n },\n\n onCreate() {\n this.editor.unregisterPlugin(nativeTiptapExtensions.focusEventsPluginKey);\n },\n\n addProseMirrorPlugins() {\n return [\n createFocusScopePlugin({\n editor: this.editor,\n storage: this.storage,\n clearSelectionOnBlur: this.options.clearSelectionOnBlur,\n }),\n ];\n },\n});\n"],"mappings":"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"}
|