@pubwave/editor 0.1.1 → 0.1.3
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/README.md +0 -22
- package/dist/index.cjs +48 -3
- package/dist/index.css +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.js +48 -3
- package/package.json +6 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/core/extensions/blocks.ts","../src/core/extensions/color.ts","../src/core/extensions/marks.ts","../src/ui/slashMenu/useScrollIntoView.ts","../src/ui/slashMenu/styles.ts","../src/core/ssr.ts","../src/ui/toolbar/icons.tsx","../src/ui/slashMenu/imageUpload.ts","../src/ui/slashMenu/commands.tsx","../node_modules/@popperjs/core/lib/enums.js","../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../node_modules/@popperjs/core/lib/utils/math.js","../node_modules/@popperjs/core/lib/utils/userAgent.js","../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../node_modules/@popperjs/core/lib/dom-utils/contains.js","../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../node_modules/@popperjs/core/lib/utils/within.js","../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../node_modules/@popperjs/core/lib/modifiers/arrow.js","../node_modules/@popperjs/core/lib/utils/getVariation.js","../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../node_modules/@popperjs/core/lib/modifiers/flip.js","../node_modules/@popperjs/core/lib/modifiers/hide.js","../node_modules/@popperjs/core/lib/modifiers/offset.js","../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../node_modules/@popperjs/core/lib/utils/debounce.js","../node_modules/@popperjs/core/lib/utils/mergeByName.js","../node_modules/@popperjs/core/lib/createPopper.js","../node_modules/@popperjs/core/lib/popper.js","../node_modules/tippy.js/dist/tippy.esm.js","../src/ui/theme.ts","../src/ui/slashMenu/extension.ts","../src/ui/SlashMenu.tsx","../src/core/plugins/dnd.ts","../src/i18n/index.ts","../src/core/extensions.ts","../src/core/createEditor.ts","../src/core/selection.ts","../src/core/commands.ts","../src/ui/readOnlyGuards.ts","../src/ui/a11y.ts","../src/ui/LocaleContext.tsx","../src/ui/toolbar/ToolbarButton.tsx","../src/ui/positionUtils.ts","../src/ui/PositionedDropdown.tsx","../src/ui/toolbar/TurnIntoButton.tsx","../src/ui/focus.ts","../src/ui/toolbar/LinkButton.tsx","../src/ui/ColorPicker.tsx","../src/ui/toolbar/ColorPickerButton.tsx","../src/ui/toolbar/DefaultToolbarContent.tsx","../src/ui/toolbar/position.ts","../src/ui/BubbleToolbar.tsx","../src/ui/dnd/BlockHandle.tsx","../src/ui/dnd/DropIndicator.tsx","../src/ui/dnd/DropIndicatorOverlay.tsx","../src/ui/PubwaveEditor.tsx","../src/ui/toolbar/actions.ts","../src/ui/dnd/DragHandle.tsx","../src/ui/dnd/autoScroll.ts","../src/ui/toast.tsx"],"sourcesContent":["/**\n * Core Block Extensions\n *\n * Defines and configures the core block-level nodes supported by the editor.\n * These are the fundamental building blocks for content structure.\n *\n * Constitution 4.1.1: Block Node Types\n * - Paragraph, Heading, Lists, Quote, Code Block, Divider, etc.\n */\n\nimport { Extension } from '@tiptap/core';\nimport Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport Heading from '@tiptap/extension-heading';\nimport BulletList from '@tiptap/extension-bullet-list';\nimport OrderedList from '@tiptap/extension-ordered-list';\nimport ListItem from '@tiptap/extension-list-item';\nimport TaskList from '@tiptap/extension-task-list';\nimport TaskItem from '@tiptap/extension-task-item';\nimport Blockquote from '@tiptap/extension-blockquote';\nimport CodeBlock from '@tiptap/extension-code-block';\nimport HorizontalRule from '@tiptap/extension-horizontal-rule';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport Image from '@tiptap/extension-image';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport type { ImageUploadConfig } from '../../types/editor';\n\nexport interface BlockExtensionsConfig {\n /**\n * Heading levels to support\n * @default [1, 2, 3]\n */\n headingLevels?: (1 | 2 | 3 | 4 | 5 | 6)[];\n\n /**\n * Image upload configuration\n */\n imageUpload?: ImageUploadConfig;\n}\n\n/**\n * Create the core block extensions\n *\n * This includes:\n * - Document: Root node\n * - Paragraph: Default text block\n * - Text: Inline text node\n * - Heading: H1-H6 heading blocks\n * - BulletList / OrderedList / TaskList: List types\n * - Blockquote: Quote blocks\n * - CodeBlock: Code snippets\n * - HorizontalRule: Divider\n */\n/**\n * Upload image file and return URL\n * Uses custom handler if provided, otherwise converts to base64\n */\nasync function uploadImage(\n file: File,\n config?: ImageUploadConfig\n): Promise<string> {\n const maxSize = config?.maxSize ?? 10 * 1024 * 1024; // 10MB default\n if (file.size > maxSize) {\n throw new Error(`Image file is too large. Maximum size is ${maxSize / 1024 / 1024}MB`);\n }\n\n // If custom handler is provided, use it\n if (config?.handler) {\n try {\n return await config.handler(file);\n } catch (error) {\n console.warn('Custom image upload failed, falling back to base64:', error);\n // Fall through to base64 conversion\n }\n }\n\n // Default: convert to base64\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n if (src) {\n resolve(src);\n } else {\n reject(new Error('Failed to read image file'));\n }\n };\n reader.onerror = () => {\n reject(new Error('Failed to read image file'));\n };\n reader.readAsDataURL(file);\n });\n}\n\nexport function createBlockExtensions(\n config: BlockExtensionsConfig = {}\n): Extension[] {\n const { headingLevels = [1, 2, 3], imageUpload } = config;\n\n return [\n // Document structure (required)\n Document,\n Paragraph.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__paragraph',\n },\n }),\n Text,\n HardBreak,\n\n // Headings\n Heading.configure({\n levels: headingLevels,\n HTMLAttributes: {\n class: 'pubwave-editor__heading',\n },\n }),\n\n // Lists\n BulletList.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__bullet-list',\n },\n }),\n OrderedList.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__ordered-list',\n },\n }),\n ListItem.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__list-item',\n },\n }),\n\n // Task list\n TaskList.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__task-list',\n },\n }),\n TaskItem.configure({\n nested: true,\n HTMLAttributes: {\n class: 'pubwave-editor__task-item',\n },\n }),\n\n // Quote\n Blockquote.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__blockquote',\n },\n }),\n\n // Code block\n CodeBlock.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__code-block',\n },\n }),\n\n // Divider\n HorizontalRule.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__divider',\n },\n }),\n\n // Image with paste support\n Image.extend({\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('imagePasteHandler'),\n props: {\n handlePaste: (view, event) => {\n const items = Array.from(event.clipboardData?.items || []);\n \n for (const item of items) {\n if (item.type.indexOf('image') === 0) {\n event.preventDefault();\n \n const file = item.getAsFile();\n if (file) {\n // Upload image (uses custom handler or base64)\n uploadImage(file, imageUpload)\n .then((src) => {\n const { state, dispatch } = view;\n const imageNodeType = state.schema.nodes.image;\n \n if (imageNodeType) {\n const imageNode = imageNodeType.create({\n src,\n });\n \n const transaction = state.tr.replaceSelectionWith(imageNode);\n dispatch(transaction);\n }\n })\n .catch((error) => {\n console.error('Failed to upload image:', error);\n });\n \n return true;\n }\n }\n }\n \n return false;\n },\n },\n }),\n ];\n },\n }).configure({\n inline: false,\n allowBase64: true,\n HTMLAttributes: {\n class: 'pubwave-editor__image',\n },\n }),\n ] as Extension[];\n}\n\n/**\n * Block type identifiers\n */\nexport const BLOCK_TYPES = {\n PARAGRAPH: 'paragraph',\n HEADING: 'heading',\n BULLET_LIST: 'bulletList',\n ORDERED_LIST: 'orderedList',\n TASK_LIST: 'taskList',\n TASK_ITEM: 'taskItem',\n LIST_ITEM: 'listItem',\n BLOCKQUOTE: 'blockquote',\n CODE_BLOCK: 'codeBlock',\n HORIZONTAL_RULE: 'horizontalRule',\n IMAGE: 'image',\n DOCUMENT: 'doc',\n TEXT: 'text',\n} as const;\n\nexport type BlockTypeKey = keyof typeof BLOCK_TYPES;\nexport type BlockTypeValue = (typeof BLOCK_TYPES)[BlockTypeKey];\n","/**\n * Color Extensions\n *\n * Text color and background color support using custom marks\n */\n\nimport { Mark, mergeAttributes } from '@tiptap/core';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n textColor: {\n setColor: (color: string) => ReturnType;\n unsetColor: () => ReturnType;\n };\n backgroundColor: {\n setBackgroundColor: (backgroundColor: string) => ReturnType;\n unsetBackgroundColor: () => ReturnType;\n };\n }\n}\n\n/**\n * Text Color Extension\n * Uses a custom mark with color attribute\n */\nexport const TextColor = Mark.create({\n name: 'textColor',\n // Ensure textColor and backgroundColor can coexist\n excludes: '',\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n addAttributes() {\n return {\n color: {\n default: null,\n parseHTML: (element) => {\n if (typeof element === 'string') return null;\n const el = element as HTMLElement;\n return el.style.color || el.getAttribute('data-color') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.color) {\n return {};\n }\n return {\n style: `color: ${attributes.color}`,\n 'data-color': attributes.color,\n };\n },\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: 'span[style*=\"color\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const element = node as HTMLElement;\n const color = element.style.color || element.getAttribute('data-color');\n return color ? { color } : false;\n },\n },\n ];\n },\n renderHTML({ HTMLAttributes }) {\n // ProseMirror/Tiptap's mergeAttributes should handle style merging automatically\n // when multiple marks use the same tag. If not, we rely on the attribute's renderHTML\n // which already returns the correct style string.\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n addCommands() {\n return {\n setColor: (color: string) => ({ chain, state }: { chain: any; state: any }) => {\n // If mark already exists with the same color, no need to update\n const currentAttrs = state.storedMarks?.find((m: any) => m.type.name === this.name)?.attrs ||\n state.selection.$from.marks().find((m: any) => m.type.name === this.name)?.attrs;\n \n if (currentAttrs?.color === color) {\n return true; // Already has this color, no change needed\n }\n\n // If there's a selection, apply the mark\n // Use unsetMark first to ensure the new color is applied\n if (!state.selection.empty) {\n return chain()\n .focus()\n .unsetMark(this.name)\n .setMark(this.name, { color })\n .run();\n }\n // If no selection, apply to the next typed character\n return chain()\n .focus()\n .unsetMark(this.name)\n .setMark(this.name, { color })\n .run();\n },\n unsetColor: () => ({ chain }: { chain: any }) => {\n return chain().unsetMark(this.name).run();\n },\n };\n },\n});\n\n/**\n * Background Color Extension\n * Uses a custom mark with backgroundColor attribute\n */\nexport const BackgroundColor = Mark.create({\n name: 'backgroundColor',\n // Ensure backgroundColor and textColor can coexist\n excludes: '',\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n addAttributes() {\n return {\n backgroundColor: {\n default: null,\n parseHTML: (element) => {\n if (typeof element === 'string') return null;\n const el = element as HTMLElement;\n return el.style.backgroundColor || el.getAttribute('data-background-color') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n 'data-background-color': attributes.backgroundColor,\n };\n },\n },\n };\n },\n parseHTML() {\n return [\n {\n tag: 'span[style*=\"background-color\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const element = node as HTMLElement;\n const backgroundColor = element.style.backgroundColor || \n element.getAttribute('data-background-color');\n return backgroundColor ? { backgroundColor } : false;\n },\n },\n ];\n },\n renderHTML({ HTMLAttributes }) {\n // ProseMirror/Tiptap's mergeAttributes should handle style merging automatically\n // when multiple marks use the same tag. If not, we rely on the attribute's renderHTML\n // which already returns the correct style string.\n return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n addCommands() {\n return {\n setBackgroundColor: (backgroundColor: string) => ({ chain, state }: { chain: any; state: any }) => {\n // If mark already exists with the same color, no need to update\n const currentAttrs = state.storedMarks?.find((m: any) => m.type.name === this.name)?.attrs ||\n state.selection.$from.marks().find((m: any) => m.type.name === this.name)?.attrs;\n \n if (currentAttrs?.backgroundColor === backgroundColor) {\n return true; // Already has this color, no change needed\n }\n\n // If there's a selection, apply the mark\n // Use unsetMark first to ensure the new color is applied\n if (!state.selection.empty) {\n return chain()\n .focus()\n .unsetMark(this.name)\n .setMark(this.name, { backgroundColor })\n .run();\n }\n // If no selection, apply to the next typed character\n return chain()\n .focus()\n .unsetMark(this.name)\n .setMark(this.name, { backgroundColor })\n .run();\n },\n unsetBackgroundColor: () => ({ chain }: { chain: any }) => {\n return chain().unsetMark(this.name).run();\n },\n };\n },\n});\n","/**\n * Core Mark Extensions\n *\n * Defines and configures the core inline formatting marks supported by the editor.\n * Marks are used for text-level formatting like bold, italic, and links.\n *\n * Constitution 4.5.1: Inline Formats\n * - Bold, Italic, Underline, Strikethrough, Inline Code, Link\n */\n\nimport { Extension } from '@tiptap/core';\nimport Bold from '@tiptap/extension-bold';\nimport Italic from '@tiptap/extension-italic';\nimport Underline from '@tiptap/extension-underline';\nimport Strike from '@tiptap/extension-strike';\nimport Code from '@tiptap/extension-code';\nimport Link from '@tiptap/extension-link';\nimport { TextColor, BackgroundColor } from './color';\n\nexport interface MarkExtensionsConfig {\n /**\n * Whether links should open in a new tab\n * @default true\n */\n linkOpenInNewTab?: boolean;\n\n /**\n * Whether to open links on click (within editor)\n * @default true - links open on click\n */\n linkOpenOnClick?: boolean;\n}\n\n/**\n * Create the core mark extensions\n *\n * This includes:\n * - Bold: Strong emphasis\n * - Italic: Emphasis\n * - Underline: Underlined text\n * - Strike: Strikethrough text\n * - Code: Inline code\n * - Link: Hyperlinks with customizable behavior\n */\nexport function createMarkExtensions(\n config: MarkExtensionsConfig = {}\n): Extension[] {\n const { linkOpenInNewTab = true, linkOpenOnClick = true } = config;\n\n return [\n // Text formatting marks\n Bold.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--bold',\n },\n }),\n\n Italic.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--italic',\n },\n }),\n\n Underline.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--underline',\n },\n }),\n\n Strike.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--strike',\n },\n }),\n\n Code.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--code',\n },\n }),\n\n // Link mark\n Link.configure({\n openOnClick: linkOpenOnClick,\n HTMLAttributes: {\n class: 'pubwave-editor__mark--link',\n rel: linkOpenInNewTab ? 'noopener noreferrer' : undefined,\n target: linkOpenInNewTab ? '_blank' : undefined,\n },\n validate: (href) => {\n // Basic URL validation\n try {\n new URL(href);\n return true;\n } catch {\n // Relative URLs are also valid\n return href.startsWith('/') || href.startsWith('#');\n }\n },\n }),\n\n // Color marks\n TextColor.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--text-color',\n },\n }),\n BackgroundColor.configure({\n HTMLAttributes: {\n class: 'pubwave-editor__mark--background-color',\n },\n }),\n ] as Extension[];\n}\n\n/**\n * Mark type identifiers\n */\nexport const MARK_TYPES = {\n BOLD: 'bold',\n ITALIC: 'italic',\n UNDERLINE: 'underline',\n STRIKE: 'strike',\n CODE: 'code',\n LINK: 'link',\n} as const;\n\nexport type MarkTypeKey = keyof typeof MARK_TYPES;\nexport type MarkTypeValue = (typeof MARK_TYPES)[MarkTypeKey];\n","/**\n * useScrollIntoView Hook\n *\n * Custom hook for handling scroll behavior in SlashMenu.\n * Ensures selected items are visible while preserving top/bottom content visibility.\n */\n\nimport { useEffect, RefObject } from 'react';\n\n/**\n * Hook to handle scrolling selected item into view\n * @param selectedIndex - Index of the currently selected item\n * @param menuRef - Ref to the menu container element\n * @param selectedItemRef - Ref to the currently selected item element\n */\nexport function useScrollIntoView(\n selectedIndex: number,\n menuRef: RefObject<HTMLDivElement>,\n selectedItemRef: RefObject<HTMLButtonElement>\n): void {\n useEffect(() => {\n if (selectedIndex >= 0 && selectedItemRef.current && menuRef.current) {\n const menu = menuRef.current;\n const selectedItem = selectedItemRef.current;\n\n const menuScrollTop = menu.scrollTop;\n const menuClientHeight = menu.clientHeight;\n const menuScrollHeight = menu.scrollHeight;\n const itemOffsetTop = selectedItem.offsetTop;\n const itemHeight = selectedItem.offsetHeight;\n\n // Find first group and first item for top visibility check\n const firstGroup = menu.querySelector('.pubwave-slash-menu__group') as HTMLElement | null;\n const firstItem = menu.querySelector('.pubwave-slash-menu__item') as HTMLElement | null;\n const lastItem = Array.from(menu.querySelectorAll('.pubwave-slash-menu__item')).pop() as HTMLElement | null;\n\n // Calculate item position relative to visible area\n const itemTopRelative = itemOffsetTop - menuScrollTop;\n const itemBottomRelative = itemTopRelative + itemHeight;\n\n // Check if we need to scroll\n let targetScrollTop = menuScrollTop;\n\n // If item is above visible area, scroll up but ensure first group/item remains visible\n if (itemTopRelative < 0) {\n targetScrollTop = itemOffsetTop - 4; // 4px padding from top\n // Ensure first group is still visible (must be at or above scrollTop)\n if (firstGroup && targetScrollTop > firstGroup.offsetTop) {\n targetScrollTop = Math.max(0, firstGroup.offsetTop);\n }\n // Ensure first item is still visible (must be at or above scrollTop + small padding)\n if (firstItem && targetScrollTop > firstItem.offsetTop - 2) {\n targetScrollTop = Math.max(0, firstItem.offsetTop - 2);\n }\n }\n // If item is below visible area, scroll down but ensure last item remains visible\n else if (itemBottomRelative > menuClientHeight) {\n targetScrollTop = itemOffsetTop - menuClientHeight + itemHeight + 4; // 4px padding from bottom\n // Ensure last item is still visible (with some padding at bottom)\n if (lastItem) {\n const lastItemBottom = lastItem.offsetTop + lastItem.offsetHeight;\n const maxScrollTop = lastItemBottom - menuClientHeight + 2; // 2px padding from bottom\n if (targetScrollTop > maxScrollTop) {\n targetScrollTop = maxScrollTop;\n }\n }\n // Don't scroll beyond maximum\n targetScrollTop = Math.min(menuScrollHeight - menuClientHeight, targetScrollTop);\n }\n // If item is already visible, don't scroll to preserve top/bottom visibility\n\n // Only update scroll if it changed\n if (Math.abs(targetScrollTop - menuScrollTop) > 0.5) {\n menu.scrollTop = targetScrollTop;\n }\n }\n }, [selectedIndex, menuRef, selectedItemRef]);\n}\n\n","/**\n * SlashMenu Styles\n *\n * Style constants for the SlashMenu component.\n */\n\nimport type { CSSProperties } from 'react';\n\nexport const menuStyle: CSSProperties = {\n backgroundColor: 'var(--pubwave-bg, #ffffff)',\n border: `1px solid var(--pubwave-border, #e5e7eb)`,\n borderRadius: 'var(--pubwave-radius-lg, 8px)',\n boxShadow: 'var(--pubwave-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05))',\n maxHeight: '280px',\n overflowY: 'auto',\n minWidth: '240px',\n maxWidth: '300px',\n padding: 'var(--pubwave-spacing-1, 4px)',\n display: 'flex',\n flexDirection: 'column',\n};\n\nexport const groupContainerStyle: CSSProperties = {\n marginBottom: '0',\n};\n\nexport const groupLabelStyle: CSSProperties = {\n padding: 'var(--pubwave-spacing-2, 8px) var(--pubwave-spacing-3, 12px) var(--pubwave-spacing-1, 4px)',\n fontSize: 'var(--pubwave-font-size-xs, 11px)',\n fontWeight: 600,\n color: 'var(--pubwave-text-muted, #6b7280)',\n textTransform: 'uppercase',\n letterSpacing: '0.5px',\n};\n\nexport const itemStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--pubwave-spacing-3, 12px)',\n width: '100%',\n padding: 'var(--pubwave-spacing-2, 8px) var(--pubwave-spacing-3, 12px)',\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n borderRadius: 'var(--pubwave-radius-md, 6px)',\n transition: `background-color 0.1s ease`,\n fontSize: 'var(--pubwave-font-size-base, 14px)',\n color: 'var(--pubwave-text, #1a1a1a)',\n};\n\nexport const iconStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--pubwave-icon-size, 20px)',\n height: 'var(--pubwave-icon-size, 20px)',\n color: 'var(--pubwave-text-tertiary, #4b5563)',\n flexShrink: 0,\n};\n\nexport const titleStyle: CSSProperties = {\n fontSize: 'var(--pubwave-font-size-base, 14px)',\n fontWeight: 400,\n color: 'var(--pubwave-text, #1a1a1a)',\n};\n\n","/**\n * SSR Safety Utilities\n *\n * This module provides utilities for safe SSR (Server-Side Rendering) integration.\n *\n * RULE: No window/document access at module top-level anywhere in the library.\n * All browser API access must be guarded by these utilities or occur in\n * useEffect/event handlers.\n *\n * This ensures the library can be safely imported in Node.js environments\n * like Next.js SSR without throwing errors.\n */\n\n/**\n * Check if code is running in a server-side environment\n */\nexport const isSSR = typeof window === 'undefined';\n\n/**\n * Check if DOM APIs are available\n * Use this before accessing window, document, or other browser APIs\n */\nexport const canUseDOM: boolean =\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n typeof window.document.createElement === 'function';\n\n/**\n * Safe wrapper for requestAnimationFrame\n * Returns a no-op function in SSR environments\n */\nexport function safeRequestAnimationFrame(\n callback: FrameRequestCallback\n): number {\n if (canUseDOM) {\n return window.requestAnimationFrame(callback);\n }\n return 0;\n}\n\n/**\n * Safe wrapper for cancelAnimationFrame\n * No-ops in SSR environments\n */\nexport function safeCancelAnimationFrame(handle: number): void {\n if (canUseDOM) {\n window.cancelAnimationFrame(handle);\n }\n}\n\n/**\n * Safe wrapper for setTimeout that works in SSR\n */\nexport function safeSetTimeout(\n callback: () => void,\n delay: number\n): ReturnType<typeof setTimeout> | null {\n if (canUseDOM) {\n return setTimeout(callback, delay);\n }\n return null;\n}\n\n/**\n * Safe wrapper for clearTimeout that works in SSR\n */\nexport function safeClearTimeout(\n handle: ReturnType<typeof setTimeout> | null\n): void {\n if (handle !== null && canUseDOM) {\n clearTimeout(handle);\n }\n}\n\n/**\n * Execute a callback only in browser environments\n * Useful for one-off browser-only operations\n */\nexport function runInBrowser<T>(callback: () => T): T | undefined {\n if (canUseDOM) {\n return callback();\n }\n return undefined;\n}\n\n/**\n * Get a browser API safely, returning undefined in SSR\n * @deprecated Direct window access is discouraged; use specific safe* wrappers\n */\nexport function getBrowserAPI<K extends keyof Window>(\n key: K\n): Window[K] | undefined {\n if (!canUseDOM) {\n return undefined;\n }\n if (!(key in window)) {\n return undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (window as unknown as Record<string, Window[K]>)[key as string];\n}\n","/**\n * Shared Icon Components\n *\n * Icon components used across BubbleToolbar and SlashMenu.\n * Centralized to avoid duplication.\n */\n\nimport React from 'react';\n\n// Block type icons\nexport function TextIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 7V4h16v3M9 20h6M12 4v16\" />\n </svg>\n );\n}\n\nexport function H1Icon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12h8M4 18V6M12 18V6M17 10l3-2v12\" />\n </svg>\n );\n}\n\nexport function H2Icon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12h8M4 18V6M12 18V6M21 18h-5c0-2.5 5-2.5 5-5 0-1.5-1-3-3-3s-3 1.5-3 3\" />\n </svg>\n );\n}\n\nexport function H3Icon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 12h8M4 18V6M12 18V6M17 12h3M17 18c2.5 0 4-1 4-3s-1.5-3-4-3\" />\n </svg>\n );\n}\n\nexport function BulletListIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function OrderedListIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <text x=\"3\" y=\"8\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\">1</text>\n <text x=\"3\" y=\"14\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\">2</text>\n <text x=\"3\" y=\"20\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\">3</text>\n </svg>\n );\n}\n\nexport function ChevronDownIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n );\n}\n\n// Formatting icons\nexport function BoldIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 2h5a3 3 0 0 1 0 6H4V2z\" />\n <path d=\"M4 8h6a3 3 0 0 1 0 6H4V8z\" />\n </svg>\n );\n}\n\nexport function ItalicIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"11\" y1=\"2\" x2=\"5\" y2=\"14\" />\n <line x1=\"6\" y1=\"2\" x2=\"12\" y2=\"2\" />\n <line x1=\"4\" y1=\"14\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\nexport function UnderlineIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 2v6a4 4 0 0 0 8 0V2\" />\n <line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"14\" />\n </svg>\n );\n}\n\nexport function StrikeIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" />\n <path d=\"M5 4c0-1 1.5-2 3-2s3 .5 3 2c0 1-1 2-3 2\" />\n <path d=\"M5 12c0 1 1.5 2 3 2s3-.5 3-2c0-1-1-2-3-2\" />\n </svg>\n );\n}\n\nexport function CodeIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"5 4 1 8 5 12\" />\n <polyline points=\"11 4 15 8 11 12\" />\n </svg>\n );\n}\n\nexport function LinkIcon(): React.ReactElement {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"1.87 0 12.19 16\"\n fill=\"currentColor\"\n >\n <path d=\"M12.848 2.8a3.145 3.145 0 0 0-4.448 0L6.918 4.283a.625.625 0 0 0 .884.883l1.482-1.482c.74-.74 1.94-.74 2.68 0l.294.294c.74.74.74 1.94 0 2.68l-1.482 1.483a.625.625 0 1 0 .884.884l1.482-1.482a3.145 3.145 0 0 0 0-4.449z\" />\n <path d=\"M10.472 5.47a.625.625 0 0 0-.884 0L5.229 9.83a.625.625 0 1 0 .884.883l4.359-4.359a.625.625 0 0 0 0-.883\" />\n <path d=\"M5.167 6.918a.625.625 0 0 0-.884 0L2.8 8.4a3.146 3.146 0 0 0 0 4.448l.294.294a3.145 3.145 0 0 0 4.449 0l1.482-1.482a.625.625 0 0 0-.884-.884L6.66 12.258c-.74.74-1.94.74-2.68 0l-.295-.294c-.74-.74-.74-1.94 0-2.68L5.167 7.8a.625.625 0 0 0 0-.883\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 3h4v4M14 3l-7 7M14 11v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h3\" />\n </svg>\n );\n}\n\nexport function CheckIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M13 4L6 11l-3-3\" />\n </svg>\n );\n}\n\nexport function ClearIcon(): React.ReactElement {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\n// Color icon with props\nexport interface ColorIconProps {\n textColor: string;\n backgroundColor: string | null;\n}\n\nexport function ColorIcon({ textColor, backgroundColor }: ColorIconProps): React.ReactElement {\n // Default is transparent, show selected content color, or color picker selection\n const bgColor = backgroundColor || 'transparent';\n // Add a subtle border when background is transparent to keep button visible\n const showBorder = !backgroundColor;\n \n return (\n <div\n style={{\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n backgroundColor: bgColor,\n border: showBorder ? '1px solid var(--pubwave-border)' : 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 600,\n color: textColor,\n lineHeight: 1,\n }}\n >\n A\n </span>\n </div>\n );\n}\n\n// SlashMenu specific icons\nexport function TaskListIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"5\" width=\"4\" height=\"4\" rx=\"0.5\" />\n <rect x=\"3\" y=\"14\" width=\"4\" height=\"4\" rx=\"0.5\" />\n <path d=\"M4 16l1.5 1.5L7 15\" />\n <line x1=\"10\" y1=\"7\" x2=\"21\" y2=\"7\" />\n <line x1=\"10\" y1=\"16\" x2=\"21\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function QuoteIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.75-2-2-2H4c-1.25 0-2 .75-2 2v6c0 1.25.75 2 2 2h4\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.75-2-2-2h-4c-1.25 0-2 .75-2 2v6c0 1.25.75 2 2 2h4\" />\n </svg>\n );\n}\n\nexport function CodeBlockIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"16,18 22,12 16,6\" />\n <polyline points=\"8,6 2,12 8,18\" />\n </svg>\n );\n}\n\nexport function DividerIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ImageIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21,15 16,10 5,21\" />\n </svg>\n );\n}\n\n","/**\n * Image Upload Utilities\n *\n * Functions for handling image uploads in SlashMenu.\n */\n\nimport type { Editor } from '@tiptap/core';\nimport type { ImageUploadConfig } from '../../types/editor';\n\n/**\n * Upload image file and return URL\n * Uses custom handler if provided, otherwise converts to base64\n */\nexport async function uploadImage(\n file: File,\n config?: ImageUploadConfig\n): Promise<string> {\n const maxSize = config?.maxSize ?? 10 * 1024 * 1024; // 10MB default\n if (file.size > maxSize) {\n throw new Error(`Image file is too large. Maximum size is ${maxSize / 1024 / 1024}MB`);\n }\n\n // If custom handler is provided, use it\n if (config?.handler) {\n try {\n return await config.handler(file);\n } catch (error) {\n console.warn('Custom image upload failed, falling back to base64:', error);\n // Fall through to base64 conversion\n }\n }\n\n // Default: convert to base64\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n if (src) {\n resolve(src);\n } else {\n reject(new Error('Failed to read image file'));\n }\n };\n reader.onerror = () => {\n reject(new Error('Failed to read image file'));\n };\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Handle image upload from file\n */\nexport function handleImageUpload(editor: Editor, file: File, imageUploadConfig?: ImageUploadConfig): void {\n // Check if file is an image\n const accept = imageUploadConfig?.accept ?? ['image/*'];\n const isImage = accept.some((pattern) => {\n if (pattern === 'image/*') {\n return file.type.startsWith('image/');\n }\n return file.type === pattern;\n });\n\n if (!isImage) {\n console.warn('Selected file is not an image');\n return;\n }\n\n // Upload image (uses custom handler or base64)\n uploadImage(file, imageUploadConfig)\n .then((src) => {\n // Insert image at current position\n editor\n .chain()\n .focus()\n .setImage({ src })\n .run();\n })\n .catch((error) => {\n console.error('Failed to upload image:', error);\n });\n}\n\n","/**\n * SlashMenu Commands\n *\n * Command definitions and filtering logic for the SlashMenu.\n */\n\nimport React from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { safeRequestAnimationFrame } from '../../core/ssr';\nimport type { ImageUploadConfig } from '../../types/editor';\nimport type { EditorLocale } from '../../i18n';\nimport {\n TextIcon,\n H1Icon,\n H2Icon,\n H3Icon,\n BulletListIcon,\n OrderedListIcon,\n TaskListIcon,\n QuoteIcon,\n CodeBlockIcon,\n DividerIcon,\n ImageIcon,\n} from '../toolbar/icons';\nimport { handleImageUpload } from './imageUpload';\n\n/**\n * Command item definition\n */\nexport interface SlashCommand {\n id: string;\n title: string;\n description: string;\n icon: React.ReactNode;\n aliases?: string[];\n group: 'basic' | 'list' | 'media' | 'advanced';\n action: (editor: Editor) => void;\n}\n\n/**\n * Create default slash commands with image upload config and locale\n */\nexport function createDefaultSlashCommands(\n imageUploadConfig?: ImageUploadConfig,\n locale?: EditorLocale\n): SlashCommand[] {\n const localeData = locale || {\n slashMenu: {\n groups: { basic: 'Basic', list: 'Lists', media: 'Media', advanced: 'Advanced' },\n commands: {\n paragraph: { title: 'Text', description: 'Plain text block' },\n heading1: { title: 'Heading 1', description: 'Large section heading' },\n heading2: { title: 'Heading 2', description: 'Medium section heading' },\n heading3: { title: 'Heading 3', description: 'Small section heading' },\n bulletList: { title: 'Bullet List', description: 'Create a bulleted list' },\n orderedList: { title: 'Numbered List', description: 'Create a numbered list' },\n taskList: { title: 'To-do list', description: 'Create a todo list with checkboxes' },\n image: { title: 'Image', description: 'Upload or paste an image' },\n blockquote: { title: 'Blockquote', description: 'Create a quote block' },\n codeBlock: { title: 'Code', description: 'Create a code snippet' },\n horizontalRule: { title: 'Divider', description: 'Create a horizontal line' },\n },\n },\n toolbar: {} as any,\n aria: {} as any,\n placeholder: '',\n linkPlaceholder: '',\n };\n\n const cmd = localeData.slashMenu.commands;\n return [\n // Basic blocks - Style group\n {\n id: 'paragraph',\n title: cmd.paragraph.title,\n description: cmd.paragraph.description,\n icon: <TextIcon />,\n aliases: ['p', 'text', 'paragraph'],\n group: 'basic',\n action: (editor) => editor.chain().focus().setParagraph().run(),\n },\n {\n id: 'heading1',\n title: cmd.heading1.title,\n description: cmd.heading1.description,\n icon: <H1Icon />,\n aliases: ['h1', 'title'],\n group: 'basic',\n action: (editor) => editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n id: 'heading2',\n title: cmd.heading2.title,\n description: cmd.heading2.description,\n icon: <H2Icon />,\n aliases: ['h2', 'subtitle'],\n group: 'basic',\n action: (editor) => editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n id: 'heading3',\n title: cmd.heading3.title,\n description: cmd.heading3.description,\n icon: <H3Icon />,\n aliases: ['h3'],\n group: 'basic',\n action: (editor) => editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n // Lists\n {\n id: 'bulletList',\n title: cmd.bulletList.title,\n description: cmd.bulletList.description,\n icon: <BulletListIcon />,\n aliases: ['ul', 'bullet', 'unordered', '-'],\n group: 'list',\n action: (editor) => editor.chain().focus().toggleBulletList().run(),\n },\n {\n id: 'orderedList',\n title: cmd.orderedList.title,\n description: cmd.orderedList.description,\n icon: <OrderedListIcon />,\n aliases: ['ol', 'numbered', 'ordered', '1.'],\n group: 'list',\n action: (editor) => editor.chain().focus().toggleOrderedList().run(),\n },\n {\n id: 'taskList',\n title: cmd.taskList.title,\n description: cmd.taskList.description,\n icon: <TaskListIcon />,\n aliases: ['todo', 'task', 'checkbox', '[]'],\n group: 'list',\n action: (editor) => editor.chain().focus().toggleTaskList().run(),\n },\n // Media\n {\n id: 'image',\n title: cmd.image.title,\n description: cmd.image.description,\n icon: <ImageIcon />,\n aliases: ['img', 'picture', 'photo', 'pic'],\n group: 'media',\n action: (editor) => {\n // Create a file input element\n const input = document.createElement('input');\n input.type = 'file';\n const accept = imageUploadConfig?.accept ?? ['image/*'];\n input.accept = accept.join(',');\n input.style.display = 'none';\n\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n handleImageUpload(editor, file, imageUploadConfig);\n }\n // Clean up\n document.body.removeChild(input);\n };\n\n // Append to body and trigger click\n document.body.appendChild(input);\n input.click();\n },\n },\n // Advanced\n {\n id: 'blockquote',\n title: cmd.blockquote.title,\n description: cmd.blockquote.description,\n icon: <QuoteIcon />,\n aliases: ['quote', 'blockquote', '>'],\n group: 'advanced',\n action: (editor) => editor.chain().focus().toggleBlockquote().run(),\n },\n {\n id: 'codeBlock',\n title: cmd.codeBlock.title,\n description: cmd.codeBlock.description,\n icon: <CodeBlockIcon />,\n aliases: ['code', 'pre', 'snippet', '```'],\n group: 'advanced',\n action: (editor) => editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n id: 'horizontalRule',\n title: cmd.horizontalRule.title,\n description: cmd.horizontalRule.description,\n icon: <DividerIcon />,\n aliases: ['hr', 'divider', 'line', '---'],\n group: 'advanced',\n action: (editor) => {\n // Set horizontal rule first\n editor.chain().focus().setHorizontalRule().run();\n\n // Then insert paragraph after the divider using requestAnimationFrame\n // This ensures the divider is fully inserted in the DOM first\n safeRequestAnimationFrame(() => {\n const { state } = editor.view;\n const { $from } = state.selection;\n\n // Find the horizontal rule node near the current cursor position\n // (this should be the one we just inserted)\n let hrPos = -1;\n const cursorPos = $from.pos;\n\n // Search for horizontalRule node closest to cursor\n state.doc.descendants((node, pos) => {\n if (node.type.name === 'horizontalRule') {\n const distance = Math.abs(pos - cursorPos);\n // Find the closest hr to cursor position (should be the one we just inserted)\n if (hrPos === -1 || Math.abs(hrPos - cursorPos) > distance) {\n hrPos = pos;\n }\n }\n });\n\n if (hrPos !== -1) {\n // Get the position after the hr node\n const hrNode = state.doc.nodeAt(hrPos);\n if (hrNode) {\n const afterHrPos = hrPos + hrNode.nodeSize;\n // Insert paragraph and set cursor\n editor\n .chain()\n .setTextSelection(afterHrPos)\n .insertContent({ type: 'paragraph' })\n .focus()\n .run();\n }\n } else {\n // Fallback: create paragraph near current position\n editor.chain().focus().createParagraphNear().run();\n }\n });\n },\n },\n ];\n}\n\n/**\n * Default slash commands (without image upload config, uses base64)\n * Note: This is deprecated, use createDefaultSlashCommands with locale instead\n */\nexport const defaultSlashCommands: SlashCommand[] = createDefaultSlashCommands();\n\n/**\n * Filter commands by query\n * Only matches title and aliases, not description\n */\nexport function filterCommands(commands: SlashCommand[], query: string): SlashCommand[] {\n if (!query) return commands;\n\n const lowerQuery = query.toLowerCase();\n return commands.filter((cmd) => {\n // Match title (must start with query or contain as word)\n const titleLower = cmd.title.toLowerCase();\n const matchTitle = titleLower.startsWith(lowerQuery) || titleLower.includes(` ${lowerQuery}`);\n\n // Match aliases (must start with query)\n const matchAlias = cmd.aliases?.some((a) => a.toLowerCase().startsWith(lowerQuery)) ?? false;\n\n // Only match title or aliases, not description\n return matchTitle || matchAlias;\n });\n}\n\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**!\n* tippy.js v6.3.7\n* (c) 2017-2021 atomiks\n* MIT License\n*/\nimport { createPopper, applyStyles } from '@popperjs/core';\n\nvar ROUND_ARROW = '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\nvar BOX_CLASS = \"tippy-box\";\nvar CONTENT_CLASS = \"tippy-content\";\nvar BACKDROP_CLASS = \"tippy-backdrop\";\nvar ARROW_CLASS = \"tippy-arrow\";\nvar SVG_ARROW_CLASS = \"tippy-svg-arrow\";\nvar TOUCH_OPTIONS = {\n passive: true,\n capture: true\n};\nvar TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() {\n return document.body;\n};\n\nfunction hasOwnProperty(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\nfunction getValueAtIndexOrReturn(value, index, defaultValue) {\n if (Array.isArray(value)) {\n var v = value[index];\n return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;\n }\n\n return value;\n}\nfunction isType(value, type) {\n var str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(type + \"]\") > -1;\n}\nfunction invokeWithArgsOrReturn(value, args) {\n return typeof value === 'function' ? value.apply(void 0, args) : value;\n}\nfunction debounce(fn, ms) {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n var timeout;\n return function (arg) {\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n fn(arg);\n }, ms);\n };\n}\nfunction removeProperties(obj, keys) {\n var clone = Object.assign({}, obj);\n keys.forEach(function (key) {\n delete clone[key];\n });\n return clone;\n}\nfunction splitBySpaces(value) {\n return value.split(/\\s+/).filter(Boolean);\n}\nfunction normalizeToArray(value) {\n return [].concat(value);\n}\nfunction pushIfUnique(arr, value) {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\nfunction unique(arr) {\n return arr.filter(function (item, index) {\n return arr.indexOf(item) === index;\n });\n}\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\nfunction arrayFrom(value) {\n return [].slice.call(value);\n}\nfunction removeUndefinedProps(obj) {\n return Object.keys(obj).reduce(function (acc, key) {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\nfunction div() {\n return document.createElement('div');\n}\nfunction isElement(value) {\n return ['Element', 'Fragment'].some(function (type) {\n return isType(value, type);\n });\n}\nfunction isNodeList(value) {\n return isType(value, 'NodeList');\n}\nfunction isMouseEvent(value) {\n return isType(value, 'MouseEvent');\n}\nfunction isReferenceElement(value) {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\nfunction getArrayOfElements(value) {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\nfunction setTransitionDuration(els, value) {\n els.forEach(function (el) {\n if (el) {\n el.style.transitionDuration = value + \"ms\";\n }\n });\n}\nfunction setVisibilityState(els, state) {\n els.forEach(function (el) {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\nfunction getOwnerDocument(elementOrElements) {\n var _element$ownerDocumen;\n\n var _normalizeToArray = normalizeToArray(elementOrElements),\n element = _normalizeToArray[0]; // Elements created via a <template> have an ownerDocument with no reference to the body\n\n\n return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document;\n}\nfunction isCursorOutsideInteractiveBorder(popperTreeData, event) {\n var clientX = event.clientX,\n clientY = event.clientY;\n return popperTreeData.every(function (_ref) {\n var popperRect = _ref.popperRect,\n popperState = _ref.popperState,\n props = _ref.props;\n var interactiveBorder = props.interactiveBorder;\n var basePlacement = getBasePlacement(popperState.placement);\n var offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n var topDistance = basePlacement === 'bottom' ? offsetData.top.y : 0;\n var bottomDistance = basePlacement === 'top' ? offsetData.bottom.y : 0;\n var leftDistance = basePlacement === 'right' ? offsetData.left.x : 0;\n var rightDistance = basePlacement === 'left' ? offsetData.right.x : 0;\n var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder;\n var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder;\n var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\nfunction updateTransitionEndListener(box, action, listener) {\n var method = action + \"EventListener\"; // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n\n ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {\n box[method](event, listener);\n });\n}\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\n\nfunction actualContains(parent, child) {\n var target = child;\n\n while (target) {\n var _target$getRootNode;\n\n if (parent.contains(target)) {\n return true;\n }\n\n target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host;\n }\n\n return false;\n}\n\nvar currentInput = {\n isTouch: false\n};\nvar lastMouseMoveTime = 0;\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\n\nfunction onDocumentTouchStart() {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\n\nfunction onDocumentMouseMove() {\n var now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\n\nfunction onWindowBlur() {\n var activeElement = document.activeElement;\n\n if (isReferenceElement(activeElement)) {\n var instance = activeElement._tippy;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\nfunction bindGlobalEventListeners() {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar isIE11 = isBrowser ? // @ts-ignore\n!!window.msCrypto : false;\n\nfunction createMemoryLeakWarning(method) {\n var txt = method === 'destroy' ? 'n already-' : ' ';\n return [method + \"() was called on a\" + txt + \"destroyed instance. This is a no-op but\", 'indicates a potential memory leak.'].join(' ');\n}\nfunction clean(value) {\n var spacesAndTabs = /[ \\t]{2,}/g;\n var lineStartWithSpaces = /^[ \\t]*/gm;\n return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n}\n\nfunction getDevMessage(message) {\n return clean(\"\\n %ctippy.js\\n\\n %c\" + clean(message) + \"\\n\\n %c\\uD83D\\uDC77\\u200D This is a development-only message. It will be removed in production.\\n \");\n}\n\nfunction getFormattedMessage(message) {\n return [getDevMessage(message), // title\n 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message\n 'line-height: 1.5', // footer\n 'color: #a6a095;'];\n} // Assume warnings and errors never have the same message\n\nvar visitedMessages;\n\nif (process.env.NODE_ENV !== \"production\") {\n resetVisitedMessages();\n}\n\nfunction resetVisitedMessages() {\n visitedMessages = new Set();\n}\nfunction warnWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console;\n\n visitedMessages.add(message);\n\n (_console = console).warn.apply(_console, getFormattedMessage(message));\n }\n}\nfunction errorWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console2;\n\n visitedMessages.add(message);\n\n (_console2 = console).error.apply(_console2, getFormattedMessage(message));\n }\n}\nfunction validateTargets(targets) {\n var didPassFalsyValue = !targets;\n var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener;\n errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element,', 'Element[], or NodeList.'].join(' '));\n errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is not supported as an argument', 'for virtual positioning. Use props.getReferenceClientRect instead.'].join(' '));\n}\n\nvar pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false\n};\nvar renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999\n};\nvar defaultProps = Object.assign({\n appendTo: TIPPY_DEFAULT_APPEND_TO,\n aria: {\n content: 'auto',\n expanded: 'auto'\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate: function onAfterUpdate() {},\n onBeforeUpdate: function onBeforeUpdate() {},\n onCreate: function onCreate() {},\n onDestroy: function onDestroy() {},\n onHidden: function onHidden() {},\n onHide: function onHide() {},\n onMount: function onMount() {},\n onShow: function onShow() {},\n onShown: function onShown() {},\n onTrigger: function onTrigger() {},\n onUntrigger: function onUntrigger() {},\n onClickOutside: function onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null\n}, pluginProps, renderProps);\nvar defaultKeys = Object.keys(defaultProps);\nvar setDefaultProps = function setDefaultProps(partialProps) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n validateProps(partialProps, []);\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (key) {\n defaultProps[key] = partialProps[key];\n });\n};\nfunction getExtendedPassedProps(passedProps) {\n var plugins = passedProps.plugins || [];\n var pluginProps = plugins.reduce(function (acc, plugin) {\n var name = plugin.name,\n defaultValue = plugin.defaultValue;\n\n if (name) {\n var _name;\n\n acc[name] = passedProps[name] !== undefined ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue;\n }\n\n return acc;\n }, {});\n return Object.assign({}, passedProps, pluginProps);\n}\nfunction getDataAttributeProps(reference, plugins) {\n var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {\n plugins: plugins\n }))) : defaultKeys;\n var props = propKeys.reduce(function (acc, key) {\n var valueAsString = (reference.getAttribute(\"data-tippy-\" + key) || '').trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n }, {});\n return props;\n}\nfunction evaluateProps(reference, props) {\n var out = Object.assign({}, props, {\n content: invokeWithArgsOrReturn(props.content, [reference])\n }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));\n out.aria = Object.assign({}, defaultProps.aria, out.aria);\n out.aria = {\n expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content\n };\n return out;\n}\nfunction validateProps(partialProps, plugins) {\n if (partialProps === void 0) {\n partialProps = {};\n }\n\n if (plugins === void 0) {\n plugins = [];\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (prop) {\n var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps));\n var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); // Check if the prop exists in `plugins`\n\n if (didPassUnknownProp) {\n didPassUnknownProp = plugins.filter(function (plugin) {\n return plugin.name === prop;\n }).length === 0;\n }\n\n warnWhen(didPassUnknownProp, [\"`\" + prop + \"`\", \"is not a valid prop. You may have spelled it incorrectly, or if it's\", 'a plugin, forgot to pass it in an array as props.plugins.', '\\n\\n', 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n', 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/'].join(' '));\n });\n}\n\nvar innerHTML = function innerHTML() {\n return 'innerHTML';\n};\n\nfunction dangerouslySetInnerHTML(element, html) {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value) {\n var arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value);\n }\n }\n\n return arrow;\n}\n\nfunction setContent(content, props) {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\nfunction getChildren(popper) {\n var box = popper.firstElementChild;\n var boxChildren = arrayFrom(box.children);\n return {\n box: box,\n content: boxChildren.find(function (node) {\n return node.classList.contains(CONTENT_CLASS);\n }),\n arrow: boxChildren.find(function (node) {\n return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS);\n }),\n backdrop: boxChildren.find(function (node) {\n return node.classList.contains(BACKDROP_CLASS);\n })\n };\n}\nfunction render(instance) {\n var popper = div();\n var box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n var content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n setContent(content, instance.props);\n popper.appendChild(box);\n box.appendChild(content);\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps, nextProps) {\n var _getChildren = getChildren(popper),\n box = _getChildren.box,\n content = _getChildren.content,\n arrow = _getChildren.arrow;\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth = typeof nextProps.maxWidth === 'number' ? nextProps.maxWidth + \"px\" : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow);\n }\n }\n\n return {\n popper: popper,\n onUpdate: onUpdate\n };\n} // Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\n\nrender.$$tippy = true;\n\nvar idCounter = 1;\nvar mouseMoveListeners = []; // Used by `hideAll()`\n\nvar mountedInstances = [];\nfunction createTippy(reference, passedProps) {\n var props = evaluateProps(reference, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n\n var showTimeout;\n var hideTimeout;\n var scheduleHideAnimationFrame;\n var isVisibleFromClick = false;\n var didHideDueToDocumentMouseDown = false;\n var didTouchMove = false;\n var ignoreOnFirstUpdate = false;\n var lastTriggerEvent;\n var currentTransitionEndListener;\n var onFirstUpdate;\n var listeners = [];\n var debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n var currentTarget; // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n\n var id = idCounter++;\n var popperInstance = null;\n var plugins = unique(props.plugins);\n var state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false\n };\n var instance = {\n // properties\n id: id,\n reference: reference,\n popper: div(),\n popperInstance: popperInstance,\n props: props,\n state: state,\n plugins: plugins,\n // methods\n clearDelayTimeouts: clearDelayTimeouts,\n setProps: setProps,\n setContent: setContent,\n show: show,\n hide: hide,\n hideWithInteractivity: hideWithInteractivity,\n enable: enable,\n disable: disable,\n unmount: unmount,\n destroy: destroy\n }; // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n\n /* istanbul ignore if */\n\n if (!props.render) {\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n } // ===========================================================================\n // Initial mutations\n // ===========================================================================\n\n\n var _props$render = props.render(instance),\n popper = _props$render.popper,\n onUpdate = _props$render.onUpdate;\n\n popper.setAttribute('data-tippy-root', '');\n popper.id = \"tippy-\" + instance.id;\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n var pluginsHooks = plugins.map(function (plugin) {\n return plugin.fn(instance);\n });\n var hasAriaExpanded = reference.hasAttribute('aria-expanded');\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n } // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n\n\n popper.addEventListener('mouseenter', function () {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n popper.addEventListener('mouseleave', function () {\n if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n }\n });\n return instance; // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n\n function getNormalizedTouchSettings() {\n var touch = instance.props.touch;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior() {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn() {\n var _instance$props$rende;\n\n // @ts-ignore\n return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy);\n }\n\n function getCurrentTarget() {\n return currentTarget || reference;\n }\n\n function getDocument() {\n var parent = getCurrentTarget().parentNode;\n return parent ? getOwnerDocument(parent) : document;\n }\n\n function getDefaultTemplateChildren() {\n return getChildren(popper);\n }\n\n function getDelay(isShow) {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === 'focus') {\n return 0;\n }\n\n return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);\n }\n\n function handleStyles(fromHide) {\n if (fromHide === void 0) {\n fromHide = false;\n }\n\n popper.style.pointerEvents = instance.props.interactive && !fromHide ? '' : 'none';\n popper.style.zIndex = \"\" + instance.props.zIndex;\n }\n\n function invokeHook(hook, args, shouldInvokePropsHook) {\n if (shouldInvokePropsHook === void 0) {\n shouldInvokePropsHook = true;\n }\n\n pluginsHooks.forEach(function (pluginHooks) {\n if (pluginHooks[hook]) {\n pluginHooks[hook].apply(pluginHooks, args);\n }\n });\n\n if (shouldInvokePropsHook) {\n var _instance$props;\n\n (_instance$props = instance.props)[hook].apply(_instance$props, args);\n }\n }\n\n function handleAriaContentAttribute() {\n var aria = instance.props.aria;\n\n if (!aria.content) {\n return;\n }\n\n var attr = \"aria-\" + aria.content;\n var id = popper.id;\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n var currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? currentValue + \" \" + id : id);\n } else {\n var nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute() {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n if (instance.props.interactive) {\n node.setAttribute('aria-expanded', instance.state.isVisible && node === getCurrentTarget() ? 'true' : 'false');\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners() {\n getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(function (listener) {\n return listener !== debouncedOnMouseMove;\n });\n }\n\n function onDocumentPress(event) {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n }\n\n var actualTarget = event.composedPath && event.composedPath()[0] || event.target; // Clicked on interactive popper\n\n if (instance.props.interactive && actualContains(popper, actualTarget)) {\n return;\n } // Clicked on the event listeners target\n\n\n if (normalizeToArray(instance.props.triggerTarget || reference).some(function (el) {\n return actualContains(el, actualTarget);\n })) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (instance.state.isVisible && instance.props.trigger.indexOf('click') >= 0) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide(); // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n\n didHideDueToDocumentMouseDown = true;\n setTimeout(function () {\n didHideDueToDocumentMouseDown = false;\n }); // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove() {\n didTouchMove = true;\n }\n\n function onTouchStart() {\n didTouchMove = false;\n }\n\n function addDocumentPress() {\n var doc = getDocument();\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress() {\n var doc = getDocument();\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration, callback) {\n onTransitionEnd(duration, function () {\n if (!instance.state.isVisible && popper.parentNode && popper.parentNode.contains(popper)) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration, callback) {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration, callback) {\n var box = getDefaultTemplateChildren().box;\n\n function listener(event) {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n } // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n\n\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n currentTransitionEndListener = listener;\n }\n\n function on(eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n });\n }\n\n function addListeners() {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {\n passive: true\n });\n on('touchend', onMouseLeave, {\n passive: true\n });\n }\n\n splitBySpaces(instance.props.trigger).forEach(function (eventType) {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave);\n break;\n\n case 'focus':\n on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut);\n break;\n\n case 'focusin':\n on('focusout', onBlurOrFocusOut);\n break;\n }\n });\n }\n\n function removeListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event) {\n var _lastTriggerEvent;\n\n var shouldScheduleClickHide = false;\n\n if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) {\n return;\n }\n\n var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === 'focus';\n lastTriggerEvent = event;\n currentTarget = event.currentTarget;\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach(function (listener) {\n return listener(event);\n });\n } // Toggle show/hide when clicking click-triggered tooltips\n\n\n if (event.type === 'click' && (instance.props.trigger.indexOf('mouseenter') < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event) {\n var target = event.target;\n var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n var popperTreeData = getNestedPopperTree().concat(popper).map(function (popper) {\n var _instance$popperInsta;\n\n var instance = popper._tippy;\n var state = (_instance$popperInsta = instance.popperInstance) == null ? void 0 : _instance$popperInsta.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props: props\n };\n }\n\n return null;\n }).filter(Boolean);\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event) {\n var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick;\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event) {\n if (instance.props.trigger.indexOf('focusin') < 0 && event.target !== getCurrentTarget()) {\n return;\n } // If focus was moved to within the popper\n\n\n if (instance.props.interactive && event.relatedTarget && popper.contains(event.relatedTarget)) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event) {\n return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0 : false;\n }\n\n function createPopperInstance() {\n destroyPopperInstance();\n var _instance$props2 = instance.props,\n popperOptions = _instance$props2.popperOptions,\n placement = _instance$props2.placement,\n offset = _instance$props2.offset,\n getReferenceClientRect = _instance$props2.getReferenceClientRect,\n moveTransition = _instance$props2.moveTransition;\n var arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n var computedReference = getReferenceClientRect ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement: getReferenceClientRect.contextElement || getCurrentTarget()\n } : reference;\n var tippyModifier = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh.box;\n\n ['placement', 'reference-hidden', 'escaped'].forEach(function (attr) {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[\"data-popper-\" + attr]) {\n box.setAttribute(\"data-\" + attr, '');\n } else {\n box.removeAttribute(\"data-\" + attr);\n }\n }\n });\n state.attributes.popper = {};\n }\n }\n };\n var modifiers = [{\n name: 'offset',\n options: {\n offset: offset\n }\n }, {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5\n }\n }\n }, {\n name: 'flip',\n options: {\n padding: 5\n }\n }, {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition\n }\n }, tippyModifier];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3\n }\n });\n }\n\n modifiers.push.apply(modifiers, (popperOptions == null ? void 0 : popperOptions.modifiers) || []);\n instance.popperInstance = createPopper(computedReference, popper, Object.assign({}, popperOptions, {\n placement: placement,\n onFirstUpdate: onFirstUpdate,\n modifiers: modifiers\n }));\n }\n\n function destroyPopperInstance() {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount() {\n var appendTo = instance.props.appendTo;\n var parentNode; // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n\n var node = getCurrentTarget();\n\n if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === 'parent') {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n } // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n\n\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n instance.state.isMounted = true;\n createPopperInstance();\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n // Accessibility check\n warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper, ['Interactive tippy element may not be accessible via keyboard', 'navigation because it is not directly after the reference element', 'in the DOM source order.', '\\n\\n', 'Using a wrapper <div> or <span> tag around the reference element', 'solves this by creating a new parentNode context.', '\\n\\n', 'Specifying `appendTo: document.body` silences this warning, but it', 'assumes you are using a focus management solution to handle', 'keyboard navigation.', '\\n\\n', 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity'].join(' '));\n }\n }\n\n function getNestedPopperTree() {\n return arrayFrom(popper.querySelectorAll('[data-tippy-root]'));\n }\n\n function scheduleShow(event) {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n var delay = getDelay(true);\n\n var _getNormalizedTouchSe = getNormalizedTouchSettings(),\n touchValue = _getNormalizedTouchSe[0],\n touchDelay = _getNormalizedTouchSe[1];\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(function () {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event) {\n instance.clearDelayTimeouts();\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n return;\n } // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n\n\n if (instance.props.trigger.indexOf('mouseenter') >= 0 && instance.props.trigger.indexOf('click') >= 0 && ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 && isVisibleFromClick) {\n return;\n }\n\n var delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(function () {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(function () {\n instance.hide();\n });\n }\n } // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n\n\n function enable() {\n instance.state.isEnabled = true;\n }\n\n function disable() {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts() {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n removeListeners();\n var prevProps = instance.props;\n var nextProps = evaluateProps(reference, Object.assign({}, prevProps, removeUndefinedProps(partialProps), {\n ignoreAttributes: true\n }));\n instance.props = nextProps;\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce);\n } // Ensure stale aria-expanded attributes are removed\n\n\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach(function (node) {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance(); // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content) {\n instance.setProps({\n content: content\n });\n }\n\n function show() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n } // Early bail-out\n\n\n var isAlreadyVisible = instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration);\n\n if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) {\n return;\n } // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. <span>) is recommended.\n\n\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n } // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh2 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh2.box,\n content = _getDefaultTemplateCh2.content;\n\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = function onFirstUpdate() {\n var _instance$popperInsta2;\n\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true; // reflow\n\n void popper.offsetHeight;\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n var _getDefaultTemplateCh3 = getDefaultTemplateChildren(),\n _box = _getDefaultTemplateCh3.box,\n _content = _getDefaultTemplateCh3.content;\n\n setTransitionDuration([_box, _content], duration);\n setVisibilityState([_box, _content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n pushIfUnique(mountedInstances, instance); // certain modifiers (e.g. `maxSize`) require a second update after the\n // popper has been positioned for the first time\n\n (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate();\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, function () {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n } // Early bail-out\n\n\n var isAlreadyHidden = !instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration);\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles(true);\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh4.box,\n content = _getDefaultTemplateCh4.content;\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hideWithInteractivity'));\n }\n\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance(); // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n nestedPopper._tippy.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter(function (i) {\n return i !== instance;\n });\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n removeListeners();\n delete reference._tippy;\n instance.state.isDestroyed = true;\n invokeHook('onDestroy', [instance]);\n }\n}\n\nfunction tippy(targets, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n var passedProps = Object.assign({}, optionalProps, {\n plugins: plugins\n });\n var elements = getArrayOfElements(targets);\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n var isSingleContentElement = isElement(passedProps.content);\n var isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ['tippy() was passed an Element as the `content` prop, but more than', 'one tippy instance was created by this invocation. This means the', 'content element will only be appended to the last tippy instance.', '\\n\\n', 'Instead, pass the .innerHTML of the element, or use a function that', 'returns a cloned version of the element instead.', '\\n\\n', '1) content: element.innerHTML\\n', '2) content: () => element.cloneNode(true)'].join(' '));\n }\n\n var instances = elements.reduce(function (acc, reference) {\n var instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n }, []);\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\nvar hideAll = function hideAll(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n excludedReferenceOrInstance = _ref.exclude,\n duration = _ref.duration;\n\n mountedInstances.forEach(function (instance) {\n var isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper;\n }\n\n if (!isExcluded) {\n var originalDuration = instance.props.duration;\n instance.setProps({\n duration: duration\n });\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({\n duration: originalDuration\n });\n }\n }\n });\n};\n\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\n\nvar applyStylesModifier = Object.assign({}, applyStyles, {\n effect: function effect(_ref) {\n var state = _ref.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n } // intentionally return no cleanup function\n // return () => { ... }\n\n }\n});\n\nvar createSingleton = function createSingleton(tippyInstances, optionalProps) {\n var _optionalProps$popper;\n\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(!Array.isArray(tippyInstances), ['The first argument passed to createSingleton() must be an array of', 'tippy instances. The passed value was', String(tippyInstances)].join(' '));\n }\n\n var individualInstances = tippyInstances;\n var references = [];\n var triggerTargets = [];\n var currentTarget;\n var overrides = optionalProps.overrides;\n var interceptSetPropsCleanups = [];\n var shownOnCreate = false;\n\n function setTriggerTargets() {\n triggerTargets = individualInstances.map(function (instance) {\n return normalizeToArray(instance.props.triggerTarget || instance.reference);\n }).reduce(function (acc, item) {\n return acc.concat(item);\n }, []);\n }\n\n function setReferences() {\n references = individualInstances.map(function (instance) {\n return instance.reference;\n });\n }\n\n function enableInstances(isEnabled) {\n individualInstances.forEach(function (instance) {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n function interceptSetProps(singleton) {\n return individualInstances.map(function (instance) {\n var originalSetProps = instance.setProps;\n\n instance.setProps = function (props) {\n originalSetProps(props);\n\n if (instance.reference === currentTarget) {\n singleton.setProps(props);\n }\n };\n\n return function () {\n instance.setProps = originalSetProps;\n };\n });\n } // have to pass singleton, as it maybe undefined on first call\n\n\n function prepareInstance(singleton, target) {\n var index = triggerTargets.indexOf(target); // bail-out\n\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n var overrideProps = (overrides || []).concat('content').reduce(function (acc, prop) {\n acc[prop] = individualInstances[index].props[prop];\n return acc;\n }, {});\n singleton.setProps(Object.assign({}, overrideProps, {\n getReferenceClientRect: typeof overrideProps.getReferenceClientRect === 'function' ? overrideProps.getReferenceClientRect : function () {\n var _references$index;\n\n return (_references$index = references[index]) == null ? void 0 : _references$index.getBoundingClientRect();\n }\n }));\n }\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n var plugin = {\n fn: function fn() {\n return {\n onDestroy: function onDestroy() {\n enableInstances(true);\n },\n onHidden: function onHidden() {\n currentTarget = null;\n },\n onClickOutside: function onClickOutside(instance) {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n currentTarget = null;\n }\n },\n onShow: function onShow(instance) {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n prepareInstance(instance, references[0]);\n }\n },\n onTrigger: function onTrigger(instance, event) {\n prepareInstance(instance, event.currentTarget);\n }\n };\n }\n };\n var singleton = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {\n plugins: [plugin].concat(optionalProps.plugins || []),\n triggerTarget: triggerTargets,\n popperOptions: Object.assign({}, optionalProps.popperOptions, {\n modifiers: [].concat(((_optionalProps$popper = optionalProps.popperOptions) == null ? void 0 : _optionalProps$popper.modifiers) || [], [applyStylesModifier])\n })\n }));\n var originalShow = singleton.show;\n\n singleton.show = function (target) {\n originalShow(); // first time, showOnCreate or programmatic call with no params\n // default to showing first instance\n\n if (!currentTarget && target == null) {\n return prepareInstance(singleton, references[0]);\n } // triggered from event (do nothing as prepareInstance already called by onTrigger)\n // programmatic call with no params when already visible (do nothing again)\n\n\n if (currentTarget && target == null) {\n return;\n } // target is index of instance\n\n\n if (typeof target === 'number') {\n return references[target] && prepareInstance(singleton, references[target]);\n } // target is a child tippy instance\n\n\n if (individualInstances.indexOf(target) >= 0) {\n var ref = target.reference;\n return prepareInstance(singleton, ref);\n } // target is a ReferenceElement\n\n\n if (references.indexOf(target) >= 0) {\n return prepareInstance(singleton, target);\n }\n };\n\n singleton.showNext = function () {\n var first = references[0];\n\n if (!currentTarget) {\n return singleton.show(0);\n }\n\n var index = references.indexOf(currentTarget);\n singleton.show(references[index + 1] || first);\n };\n\n singleton.showPrevious = function () {\n var last = references[references.length - 1];\n\n if (!currentTarget) {\n return singleton.show(last);\n }\n\n var index = references.indexOf(currentTarget);\n var target = references[index - 1] || last;\n singleton.show(target);\n };\n\n var originalSetProps = singleton.setProps;\n\n singleton.setProps = function (props) {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n singleton.setInstances = function (nextInstances) {\n enableInstances(true);\n interceptSetPropsCleanups.forEach(function (fn) {\n return fn();\n });\n individualInstances = nextInstances;\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n interceptSetPropsCleanups = interceptSetProps(singleton);\n singleton.setProps({\n triggerTarget: triggerTargets\n });\n };\n\n interceptSetPropsCleanups = interceptSetProps(singleton);\n return singleton;\n};\n\nvar BUBBLING_EVENTS_MAP = {\n mouseover: 'mouseenter',\n focusin: 'focus',\n click: 'click'\n};\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\n\nfunction delegate(targets, props) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(!(props && props.target), ['You must specity a `target` prop indicating a CSS selector string matching', 'the target elements that should receive a tippy.'].join(' '));\n }\n\n var listeners = [];\n var childTippyInstances = [];\n var disabled = false;\n var target = props.target;\n var nativeProps = removeProperties(props, ['target']);\n var parentProps = Object.assign({}, nativeProps, {\n trigger: 'manual',\n touch: false\n });\n var childProps = Object.assign({\n touch: defaultProps.touch\n }, nativeProps, {\n showOnCreate: true\n });\n var returnValue = tippy(targets, parentProps);\n var normalizedReturnValue = normalizeToArray(returnValue);\n\n function onTrigger(event) {\n if (!event.target || disabled) {\n return;\n }\n\n var targetNode = event.target.closest(target);\n\n if (!targetNode) {\n return;\n } // Get relevant trigger with fallbacks:\n // 1. Check `data-tippy-trigger` attribute on target node\n // 2. Fallback to `trigger` passed to `delegate()`\n // 3. Fallback to `defaultProps.trigger`\n\n\n var trigger = targetNode.getAttribute('data-tippy-trigger') || props.trigger || defaultProps.trigger; // @ts-ignore\n\n if (targetNode._tippy) {\n return;\n }\n\n if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n return;\n }\n\n if (event.type !== 'touchstart' && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0) {\n return;\n }\n\n var instance = tippy(targetNode, childProps);\n\n if (instance) {\n childTippyInstances = childTippyInstances.concat(instance);\n }\n }\n\n function on(node, eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n }\n\n function addEventListeners(instance) {\n var reference = instance.reference;\n on(reference, 'touchstart', onTrigger, TOUCH_OPTIONS);\n on(reference, 'mouseover', onTrigger);\n on(reference, 'focusin', onTrigger);\n on(reference, 'click', onTrigger);\n }\n\n function removeEventListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function applyMutations(instance) {\n var originalDestroy = instance.destroy;\n var originalEnable = instance.enable;\n var originalDisable = instance.disable;\n\n instance.destroy = function (shouldDestroyChildInstances) {\n if (shouldDestroyChildInstances === void 0) {\n shouldDestroyChildInstances = true;\n }\n\n if (shouldDestroyChildInstances) {\n childTippyInstances.forEach(function (instance) {\n instance.destroy();\n });\n }\n\n childTippyInstances = [];\n removeEventListeners();\n originalDestroy();\n };\n\n instance.enable = function () {\n originalEnable();\n childTippyInstances.forEach(function (instance) {\n return instance.enable();\n });\n disabled = false;\n };\n\n instance.disable = function () {\n originalDisable();\n childTippyInstances.forEach(function (instance) {\n return instance.disable();\n });\n disabled = true;\n };\n\n addEventListeners(instance);\n }\n\n normalizedReturnValue.forEach(applyMutations);\n return returnValue;\n}\n\nvar animateFill = {\n name: 'animateFill',\n defaultValue: false,\n fn: function fn(instance) {\n var _instance$props$rende;\n\n // @ts-ignore\n if (!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy)) {\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');\n }\n\n return {};\n }\n\n var _getChildren = getChildren(instance.popper),\n box = _getChildren.box,\n content = _getChildren.content;\n\n var backdrop = instance.props.animateFill ? createBackdropElement() : null;\n return {\n onCreate: function onCreate() {\n if (backdrop) {\n box.insertBefore(backdrop, box.firstElementChild);\n box.setAttribute('data-animatefill', '');\n box.style.overflow = 'hidden';\n instance.setProps({\n arrow: false,\n animation: 'shift-away'\n });\n }\n },\n onMount: function onMount() {\n if (backdrop) {\n var transitionDuration = box.style.transitionDuration;\n var duration = Number(transitionDuration.replace('ms', '')); // The content should fade in after the backdrop has mostly filled the\n // tooltip element. `clip-path` is the other alternative but is not\n // well-supported and is buggy on some devices.\n\n content.style.transitionDelay = Math.round(duration / 10) + \"ms\";\n backdrop.style.transitionDuration = transitionDuration;\n setVisibilityState([backdrop], 'visible');\n }\n },\n onShow: function onShow() {\n if (backdrop) {\n backdrop.style.transitionDuration = '0ms';\n }\n },\n onHide: function onHide() {\n if (backdrop) {\n setVisibilityState([backdrop], 'hidden');\n }\n }\n };\n }\n};\n\nfunction createBackdropElement() {\n var backdrop = div();\n backdrop.className = BACKDROP_CLASS;\n setVisibilityState([backdrop], 'hidden');\n return backdrop;\n}\n\nvar mouseCoords = {\n clientX: 0,\n clientY: 0\n};\nvar activeInstances = [];\n\nfunction storeMouseCoords(_ref) {\n var clientX = _ref.clientX,\n clientY = _ref.clientY;\n mouseCoords = {\n clientX: clientX,\n clientY: clientY\n };\n}\n\nfunction addMouseCoordsListener(doc) {\n doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc) {\n doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nvar followCursor = {\n name: 'followCursor',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n var doc = getOwnerDocument(instance.props.triggerTarget || reference);\n var isInternalUpdate = false;\n var wasFocusEvent = false;\n var isUnmounted = true;\n var prevProps = instance.props;\n\n function getIsInitialBehavior() {\n return instance.props.followCursor === 'initial' && instance.state.isVisible;\n }\n\n function addListener() {\n doc.addEventListener('mousemove', onMouseMove);\n }\n\n function removeListener() {\n doc.removeEventListener('mousemove', onMouseMove);\n }\n\n function unsetGetReferenceClientRect() {\n isInternalUpdate = true;\n instance.setProps({\n getReferenceClientRect: null\n });\n isInternalUpdate = false;\n }\n\n function onMouseMove(event) {\n // If the instance is interactive, avoid updating the position unless it's\n // over the reference element\n var isCursorOverReference = event.target ? reference.contains(event.target) : true;\n var followCursor = instance.props.followCursor;\n var clientX = event.clientX,\n clientY = event.clientY;\n var rect = reference.getBoundingClientRect();\n var relativeX = clientX - rect.left;\n var relativeY = clientY - rect.top;\n\n if (isCursorOverReference || !instance.props.interactive) {\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect: function getReferenceClientRect() {\n var rect = reference.getBoundingClientRect();\n var x = clientX;\n var y = clientY;\n\n if (followCursor === 'initial') {\n x = rect.left + relativeX;\n y = rect.top + relativeY;\n }\n\n var top = followCursor === 'horizontal' ? rect.top : y;\n var right = followCursor === 'vertical' ? rect.right : x;\n var bottom = followCursor === 'horizontal' ? rect.bottom : y;\n var left = followCursor === 'vertical' ? rect.left : x;\n return {\n width: right - left,\n height: bottom - top,\n top: top,\n right: right,\n bottom: bottom,\n left: left\n };\n }\n });\n }\n }\n\n function create() {\n if (instance.props.followCursor) {\n activeInstances.push({\n instance: instance,\n doc: doc\n });\n addMouseCoordsListener(doc);\n }\n }\n\n function destroy() {\n activeInstances = activeInstances.filter(function (data) {\n return data.instance !== instance;\n });\n\n if (activeInstances.filter(function (data) {\n return data.doc === doc;\n }).length === 0) {\n removeMouseCoordsListener(doc);\n }\n }\n\n return {\n onCreate: create,\n onDestroy: destroy,\n onBeforeUpdate: function onBeforeUpdate() {\n prevProps = instance.props;\n },\n onAfterUpdate: function onAfterUpdate(_, _ref2) {\n var followCursor = _ref2.followCursor;\n\n if (isInternalUpdate) {\n return;\n }\n\n if (followCursor !== undefined && prevProps.followCursor !== followCursor) {\n destroy();\n\n if (followCursor) {\n create();\n\n if (instance.state.isMounted && !wasFocusEvent && !getIsInitialBehavior()) {\n addListener();\n }\n } else {\n removeListener();\n unsetGetReferenceClientRect();\n }\n }\n },\n onMount: function onMount() {\n if (instance.props.followCursor && !wasFocusEvent) {\n if (isUnmounted) {\n onMouseMove(mouseCoords);\n isUnmounted = false;\n }\n\n if (!getIsInitialBehavior()) {\n addListener();\n }\n }\n },\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n mouseCoords = {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n\n wasFocusEvent = event.type === 'focus';\n },\n onHidden: function onHidden() {\n if (instance.props.followCursor) {\n unsetGetReferenceClientRect();\n removeListener();\n isUnmounted = true;\n }\n }\n };\n }\n};\n\nfunction getProps(props, modifier) {\n var _props$popperOptions;\n\n return {\n popperOptions: Object.assign({}, props.popperOptions, {\n modifiers: [].concat((((_props$popperOptions = props.popperOptions) == null ? void 0 : _props$popperOptions.modifiers) || []).filter(function (_ref) {\n var name = _ref.name;\n return name !== modifier.name;\n }), [modifier])\n })\n };\n}\n\nvar inlinePositioning = {\n name: 'inlinePositioning',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n\n function isEnabled() {\n return !!instance.props.inlinePositioning;\n }\n\n var placement;\n var cursorRectIndex = -1;\n var isInternalUpdate = false;\n var triedPlacements = [];\n var modifier = {\n name: 'tippyInlinePositioning',\n enabled: true,\n phase: 'afterWrite',\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (isEnabled()) {\n if (triedPlacements.indexOf(state.placement) !== -1) {\n triedPlacements = [];\n }\n\n if (placement !== state.placement && triedPlacements.indexOf(state.placement) === -1) {\n triedPlacements.push(state.placement);\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect: function getReferenceClientRect() {\n return _getReferenceClientRect(state.placement);\n }\n });\n }\n\n placement = state.placement;\n }\n }\n };\n\n function _getReferenceClientRect(placement) {\n return getInlineBoundingClientRect(getBasePlacement(placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);\n }\n\n function setInternalProps(partialProps) {\n isInternalUpdate = true;\n instance.setProps(partialProps);\n isInternalUpdate = false;\n }\n\n function addModifier() {\n if (!isInternalUpdate) {\n setInternalProps(getProps(instance.props, modifier));\n }\n }\n\n return {\n onCreate: addModifier,\n onAfterUpdate: addModifier,\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n var rects = arrayFrom(instance.reference.getClientRects());\n var cursorRect = rects.find(function (rect) {\n return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;\n });\n var index = rects.indexOf(cursorRect);\n cursorRectIndex = index > -1 ? index : cursorRectIndex;\n }\n },\n onHidden: function onHidden() {\n cursorRectIndex = -1;\n }\n };\n }\n};\nfunction getInlineBoundingClientRect(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {\n // Not an inline element, or placement is not yet known\n if (clientRects.length < 2 || currentBasePlacement === null) {\n return boundingRect;\n } // There are two rects and they are disjoined\n\n\n if (clientRects.length === 2 && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) {\n return clientRects[cursorRectIndex] || boundingRect;\n }\n\n switch (currentBasePlacement) {\n case 'top':\n case 'bottom':\n {\n var firstRect = clientRects[0];\n var lastRect = clientRects[clientRects.length - 1];\n var isTop = currentBasePlacement === 'top';\n var top = firstRect.top;\n var bottom = lastRect.bottom;\n var left = isTop ? firstRect.left : lastRect.left;\n var right = isTop ? firstRect.right : lastRect.right;\n var width = right - left;\n var height = bottom - top;\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n }\n\n case 'left':\n case 'right':\n {\n var minLeft = Math.min.apply(Math, clientRects.map(function (rects) {\n return rects.left;\n }));\n var maxRight = Math.max.apply(Math, clientRects.map(function (rects) {\n return rects.right;\n }));\n var measureRects = clientRects.filter(function (rect) {\n return currentBasePlacement === 'left' ? rect.left === minLeft : rect.right === maxRight;\n });\n var _top = measureRects[0].top;\n var _bottom = measureRects[measureRects.length - 1].bottom;\n var _left = minLeft;\n var _right = maxRight;\n\n var _width = _right - _left;\n\n var _height = _bottom - _top;\n\n return {\n top: _top,\n bottom: _bottom,\n left: _left,\n right: _right,\n width: _width,\n height: _height\n };\n }\n\n default:\n {\n return boundingRect;\n }\n }\n}\n\nvar sticky = {\n name: 'sticky',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference,\n popper = instance.popper;\n\n function getReference() {\n return instance.popperInstance ? instance.popperInstance.state.elements.reference : reference;\n }\n\n function shouldCheck(value) {\n return instance.props.sticky === true || instance.props.sticky === value;\n }\n\n var prevRefRect = null;\n var prevPopRect = null;\n\n function updatePosition() {\n var currentRefRect = shouldCheck('reference') ? getReference().getBoundingClientRect() : null;\n var currentPopRect = shouldCheck('popper') ? popper.getBoundingClientRect() : null;\n\n if (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) {\n if (instance.popperInstance) {\n instance.popperInstance.update();\n }\n }\n\n prevRefRect = currentRefRect;\n prevPopRect = currentPopRect;\n\n if (instance.state.isMounted) {\n requestAnimationFrame(updatePosition);\n }\n }\n\n return {\n onMount: function onMount() {\n if (instance.props.sticky) {\n updatePosition();\n }\n }\n };\n }\n};\n\nfunction areRectsDifferent(rectA, rectB) {\n if (rectA && rectB) {\n return rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left;\n }\n\n return true;\n}\n\ntippy.setDefaultProps({\n render: render\n});\n\nexport default tippy;\nexport { animateFill, createSingleton, delegate, followCursor, hideAll, inlinePositioning, ROUND_ARROW as roundArrow, sticky };\n//# sourceMappingURL=tippy.esm.js.map\n","/**\n * Theme System - Shared className/Token Mapping Layer\n *\n * This module provides utilities for working with CSS tokens and class names.\n * CRITICAL: No raw color values are allowed in UI code. Use tokens only.\n */\n\n/**\n * CSS Token definitions\n * These map to CSS custom properties that host applications can override.\n */\nexport const tokens = {\n // Colors - all use CSS custom properties\n colors: {\n background: 'var(--pubwave-color-background)',\n surface: 'var(--pubwave-color-surface)',\n text: 'var(--pubwave-color-text)',\n textMuted: 'var(--pubwave-color-text-muted)',\n border: 'var(--pubwave-color-border)',\n borderLight: 'var(--pubwave-color-border-light)',\n hover: 'var(--pubwave-color-hover)',\n focus: 'var(--pubwave-color-focus)',\n selection: 'var(--pubwave-color-selection)',\n selectionBg: 'var(--pubwave-color-selection-bg)',\n primary: 'var(--pubwave-color-primary)',\n primaryFaded: 'var(--pubwave-color-primary-faded)',\n dropIndicator: 'var(--pubwave-color-drop-indicator)',\n dropTarget: 'var(--pubwave-color-drop-target)',\n error: 'var(--pubwave-color-error)',\n },\n\n // Spacing\n spacing: {\n xs: 'var(--pubwave-spacing-xs)',\n sm: 'var(--pubwave-spacing-sm)',\n md: 'var(--pubwave-spacing-md)',\n lg: 'var(--pubwave-spacing-lg)',\n xl: 'var(--pubwave-spacing-xl)',\n blockPaddingX: 'var(--pubwave-block-padding-x)',\n blockPaddingY: 'var(--pubwave-block-padding-y)',\n blockMarginY: 'var(--pubwave-block-margin-y)',\n toolbarGap: 'var(--pubwave-toolbar-gap)',\n },\n\n // Typography\n typography: {\n fontFamily: 'var(--pubwave-font-family)',\n fontSizeBase: 'var(--pubwave-font-size-base)',\n fontSizeSmall: 'var(--pubwave-font-size-small)',\n lineHeightBase: 'var(--pubwave-line-height-base)',\n lineHeightHeading: 'var(--pubwave-line-height-heading)',\n fontWeightNormal: 'var(--pubwave-font-weight-normal)',\n fontWeightMedium: 'var(--pubwave-font-weight-medium)',\n fontWeightBold: 'var(--pubwave-font-weight-bold)',\n fontWeightHeading: 'var(--pubwave-font-weight-heading)',\n },\n\n // Borders & Radii\n borderRadius: {\n sm: 'var(--pubwave-border-radius-sm)',\n md: 'var(--pubwave-border-radius)',\n lg: 'var(--pubwave-border-radius-large)',\n },\n\n // Shadows\n shadow: {\n sm: 'var(--pubwave-shadow-sm)',\n md: 'var(--pubwave-shadow-md)',\n toolbar: 'var(--pubwave-shadow-toolbar)',\n popup: 'var(--pubwave-shadow-popup)',\n },\n\n // Transitions\n transition: {\n fast: 'var(--pubwave-transition-fast)',\n normal: 'var(--pubwave-transition-normal)',\n },\n\n // Z-index layers\n zIndex: {\n dragPreview: 100,\n dragHandle: 40,\n toolbar: 50,\n dropdown: 60,\n },\n} as const;\n\n/**\n * Default CSS custom properties\n * Include these in your base stylesheet or use the provided CSS file.\n */\nexport const defaultTokenValues = `\n:root {\n /* Colors - Light theme */\n --pubwave-color-background: #ffffff;\n --pubwave-color-surface: #ffffff;\n --pubwave-color-text: #1a1a1a;\n --pubwave-color-text-muted: #6b7280;\n --pubwave-color-border: #e5e7eb;\n --pubwave-color-border-light: #f3f4f6;\n --pubwave-color-hover: rgba(0, 0, 0, 0.03);\n --pubwave-color-focus: rgba(0, 0, 0, 0.05);\n --pubwave-color-selection: #3b82f6;\n --pubwave-color-selection-bg: rgba(59, 130, 246, 0.1);\n --pubwave-color-primary: #3b82f6;\n --pubwave-color-primary-faded: rgba(59, 130, 246, 0.1);\n --pubwave-color-drop-indicator: #3b82f6;\n --pubwave-color-drop-target: rgba(59, 130, 246, 0.05);\n --pubwave-color-error: #ef4444;\n\n /* Spacing */\n --pubwave-spacing-xs: 0.25rem;\n --pubwave-spacing-sm: 0.5rem;\n --pubwave-spacing-md: 1rem;\n --pubwave-spacing-lg: 1.5rem;\n --pubwave-spacing-xl: 2rem;\n --pubwave-block-padding-x: 0;\n --pubwave-block-padding-y: 0.25rem;\n --pubwave-block-margin-y: 0.25rem;\n --pubwave-toolbar-gap: 0.25rem;\n\n /* Typography */\n --pubwave-font-family: inherit;\n --pubwave-font-size-base: 1rem;\n --pubwave-font-size-small: 0.875rem;\n --pubwave-line-height-base: 1.625;\n --pubwave-line-height-heading: 1.25;\n --pubwave-font-weight-normal: 400;\n --pubwave-font-weight-medium: 500;\n --pubwave-font-weight-bold: 700;\n --pubwave-font-weight-heading: 600;\n\n /* Borders */\n --pubwave-border-radius-sm: 0.25rem;\n --pubwave-border-radius: 0.375rem;\n --pubwave-border-radius-large: 0.5rem;\n\n /* Shadows */\n --pubwave-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --pubwave-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --pubwave-shadow-toolbar: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --pubwave-shadow-popup: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n\n /* Transitions */\n --pubwave-transition-fast: 0.1s ease;\n --pubwave-transition-normal: 0.15s ease;\n\n /* Z-index layers */\n --pubwave-z-drag-preview: 100;\n --pubwave-z-toolbar: 50;\n --pubwave-z-dropdown: 60;\n}\n\n/* Dark theme (if prefers-color-scheme is dark) */\n@media (prefers-color-scheme: dark) {\n :root {\n --pubwave-color-background: #1a1a1a;\n --pubwave-color-surface: #262626;\n --pubwave-color-text: #e5e7eb;\n --pubwave-color-text-muted: #9ca3af;\n --pubwave-color-border: #374151;\n --pubwave-color-border-light: #4b5563;\n --pubwave-color-hover: rgba(255, 255, 255, 0.05);\n --pubwave-color-focus: rgba(255, 255, 255, 0.08);\n --pubwave-color-selection: #60a5fa;\n --pubwave-color-selection-bg: rgba(96, 165, 250, 0.15);\n --pubwave-color-primary: #60a5fa;\n --pubwave-color-primary-faded: rgba(96, 165, 250, 0.15);\n --pubwave-color-drop-indicator: #60a5fa;\n --pubwave-color-drop-target: rgba(96, 165, 250, 0.08);\n --pubwave-color-error: #f87171;\n }\n}\n`;\n\n// Export alias for backwards compatibility\nexport const defaultTokens = defaultTokenValues;\n\n/**\n * Utility function to combine class names\n * Filters out falsy values and joins with space\n */\nexport function cn(\n ...classes: (string | boolean | undefined | null)[]\n): string {\n return classes.filter(Boolean).join(' ');\n}\n\n/**\n * Shared styles for dropdown section headers\n * Used in TurnIntoButton, ColorPicker, and other dropdown menus\n */\nexport const dropdownSectionHeaderStyle = {\n padding: 'var(--pubwave-spacing-2, 8px) var(--pubwave-spacing-3, 12px) var(--pubwave-spacing-1, 4px)',\n fontSize: 'var(--pubwave-font-size-xs, 11px)',\n fontWeight: 600,\n color: 'var(--pubwave-text-muted)',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.5px',\n} as const;\n\n/**\n * Create a CSS variable reference\n */\nexport function cssVar(name: string, fallback?: string): string {\n if (fallback) {\n return `var(--pubwave-${name}, ${fallback})`;\n }\n return `var(--pubwave-${name})`;\n}\n\n/**\n * Create a data attribute selector for styling\n */\nexport function dataAttr(name: string, value?: string | boolean): string {\n if (value === true) {\n return `[data-${name}]`;\n }\n if (typeof value === 'string') {\n return `[data-${name}=\"${value}\"]`;\n }\n return '';\n}\n\n/**\n * Theme class name constants\n */\nexport const themeClasses = {\n // Editor root\n editor: 'pubwave-editor',\n editorContent: 'pubwave-editor__content',\n editorReadonly: 'pubwave-editor--readonly',\n editorEmpty: 'pubwave-editor--empty',\n\n // Blocks\n block: 'pubwave-block',\n blockParagraph: 'pubwave-block--paragraph',\n blockHeading: 'pubwave-block--heading',\n blockFocused: 'pubwave-block--focused',\n blockHovered: 'pubwave-block--hovered',\n blockSelected: 'pubwave-block--selected',\n blockDragging: 'pubwave-block--dragging',\n blockDropTarget: 'pubwave-block--drop-target',\n\n // Marks\n markBold: 'pubwave-mark--bold',\n markItalic: 'pubwave-mark--italic',\n markLink: 'pubwave-mark--link',\n\n // Toolbar\n toolbar: 'pubwave-toolbar',\n toolbarButton: 'pubwave-toolbar__button',\n toolbarButtonActive: 'pubwave-toolbar__button--active',\n toolbarDivider: 'pubwave-toolbar__divider',\n\n // Drag and Drop\n dragHandle: 'pubwave-drag-handle',\n dropIndicator: 'pubwave-drop-indicator',\n} as const;\n\nexport default tokens;\n","/**\n * SlashMenu Extension\n *\n * Tiptap extension for the SlashMenu command system.\n */\n\nimport type { Editor, Range } from '@tiptap/core';\nimport { Extension } from '@tiptap/core';\nimport Suggestion, { SuggestionProps, SuggestionKeyDownProps } from '@tiptap/suggestion';\nimport { ReactRenderer } from '@tiptap/react';\nimport tippy, { Instance as TippyInstance } from 'tippy.js';\nimport { tokens } from '../theme';\nimport type { ImageUploadConfig } from '../../types/editor';\nimport type { EditorLocale } from '../../i18n';\nimport type { SlashCommand } from './commands';\nimport { filterCommands, defaultSlashCommands, createDefaultSlashCommands } from './commands';\nimport { SlashMenuList } from '../SlashMenu';\n\n/**\n * Create the Slash Commands Extension\n */\nexport function createSlashCommandsExtension(\n commands: SlashCommand[] = defaultSlashCommands,\n imageUploadConfig?: ImageUploadConfig,\n locale?: EditorLocale\n) {\n // If imageUploadConfig or locale is provided, recreate commands with the config\n const finalCommands = imageUploadConfig || locale\n ? createDefaultSlashCommands(imageUploadConfig, locale)\n : commands;\n\n // Get group labels from locale or use defaults\n const groupLabels = locale?.slashMenu?.groups || {\n basic: 'Style',\n list: 'Lists',\n media: 'Media',\n advanced: 'Advanced',\n };\n\n return Extension.create({\n name: 'slashCommands',\n\n addOptions() {\n return {\n suggestion: {\n char: '/',\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: SlashCommand }) => {\n // For to-do lists, we simply toggle the list logic\n // If we are appending to an existing list, the cursor naturally moves to the new item\n // If we are creating a new list, the cursor stays formatting the current line\n if (props.id === 'taskList') {\n editor.chain().focus().deleteRange(range).toggleTaskList().run();\n return;\n }\n\n // For other commands, delete range and execute action\n editor.chain().focus().deleteRange(range).run();\n props.action(editor);\n },\n } as Partial<SuggestionProps>,\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n // Disable slash commands in code blocks\n allowed: ({ state, range }: { state: any; range: Range }) => {\n try {\n // Use editor instance to check if we're in a code block\n if (editor.isActive('codeBlock')) {\n return false;\n }\n // Also check the position where \"/\" was typed as a fallback\n const $pos = state.doc.resolve(range.from);\n // Check if we're inside a code block by walking up the node tree\n for (let d = $pos.depth; d >= 1; d--) {\n const node = $pos.node(d);\n if (node.type.name === 'codeBlock') {\n return false;\n }\n }\n return true;\n } catch (e) {\n // If resolution fails, allow by default\n return true;\n }\n },\n items: ({ query }: { query: string }) => filterCommands(finalCommands, query),\n render: () => {\n let component: ReactRenderer<\n { onKeyDown: (props: SuggestionKeyDownProps) => boolean },\n {\n items: SlashCommand[];\n command: (item: SlashCommand) => void;\n editor: Editor;\n query?: string;\n groupLabels?: Record<string, string>;\n }\n >;\n let popup: TippyInstance[];\n\n return {\n onStart: (props: SuggestionProps) => {\n // Check if we're in a code block - if so, don't show the menu\n if (this.editor.isActive('codeBlock')) {\n return;\n }\n\n component = new ReactRenderer(SlashMenuList, {\n props: {\n ...props,\n query: props.query,\n editor: this.editor,\n groupLabels,\n },\n editor: this.editor,\n });\n\n if (!props.clientRect) return;\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect as () => DOMRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n offset: [0, 8],\n zIndex: tokens.zIndex.dropdown,\n arrow: false,\n // Disable animations to prevent black block flash\n duration: [0, 0],\n animation: false,\n popperOptions: {\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n boundary: 'viewport',\n padding: 8,\n altAxis: true,\n },\n },\n {\n name: 'flip',\n options: {\n fallbackPlacements: ['top-start', 'bottom-end', 'top'],\n },\n },\n ],\n },\n onShow(instance) {\n // Ensure z-index is set correctly and background is transparent\n const box = instance.popper.querySelector('.tippy-box') as HTMLElement;\n if (box) {\n box.style.zIndex = String(tokens.zIndex.dropdown);\n // Ensure background is transparent to prevent black block flash\n box.style.backgroundColor = 'transparent';\n box.style.background = 'transparent';\n box.style.border = 'none';\n }\n\n // Dynamically adjust max height based on available space\n const menu = instance.popper.querySelector('.pubwave-slash-menu') as HTMLElement;\n if (menu) {\n const proseMirror = document.querySelector('.ProseMirror') as HTMLElement;\n if (proseMirror) {\n const menuRect = menu.getBoundingClientRect();\n const proseMirrorRect = proseMirror.getBoundingClientRect();\n\n // Calculate available space from menu top to editor bottom\n const availableSpace = proseMirrorRect.bottom - menuRect.top - 16;\n\n // Set max height to available space, but clamp between 200px and 280px\n const calculatedMaxHeight = Math.max(200, Math.min(280, availableSpace));\n menu.style.maxHeight = `${calculatedMaxHeight}px`;\n }\n }\n },\n });\n },\n\n onUpdate(props: SuggestionProps) {\n // Always update component props, even when items.length === 0\n // This ensures onKeyDown sees the correct empty state\n component.updateProps({\n ...props,\n query: props.query,\n editor: props.editor,\n groupLabels,\n });\n\n // If no items found, immediately hide and destroy the menu to prevent black block flash\n if (props.items.length === 0) {\n // Hide immediately without animation\n if (popup[0]) {\n popup[0].hide();\n // Force hide by setting opacity to 0 immediately\n const box = popup[0].popper.querySelector('.tippy-box') as HTMLElement;\n if (box) {\n box.style.opacity = '0';\n box.style.pointerEvents = 'none';\n }\n }\n return;\n }\n\n if (!props.clientRect) return;\n\n popup[0]?.setProps({\n getReferenceClientRect: props.clientRect as () => DOMRect,\n });\n\n // Ensure menu is shown if it was hidden\n if (!popup[0]?.state.isVisible) {\n popup[0]?.show();\n }\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (props.event.key === 'Escape') {\n popup[0]?.hide();\n return true;\n }\n\n return component.ref?.onKeyDown(props) ?? false;\n },\n\n onExit() {\n popup[0]?.destroy();\n component.destroy();\n },\n };\n },\n }),\n ];\n },\n });\n}\n\n","/**\n * Slash Menu Component\n *\n * A command menu triggered by typing \"/\" in the editor.\n * Provides quick access to block types, formatting, and actions.\n *\n * Constitution requirement (4.2):\n * - MUST trigger on \"/\" in editable text blocks\n * - MUST support keyboard navigation\n * - MUST filter by command name, alias, description\n */\n\nimport React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { SuggestionKeyDownProps } from '@tiptap/suggestion';\nimport type { SlashCommand } from './slashMenu/commands';\nimport { useScrollIntoView } from './slashMenu/useScrollIntoView';\nimport {\n menuStyle,\n groupContainerStyle,\n groupLabelStyle,\n itemStyle,\n iconStyle,\n titleStyle,\n} from './slashMenu/styles';\n\n/**\n * Slash Menu Component Props\n */\nexport interface SlashMenuListProps {\n items: SlashCommand[];\n command: (item: SlashCommand) => void;\n editor: Editor;\n query?: string;\n groupLabels?: Record<string, string>;\n}\n\n/**\n * Slash Menu List Component\n */\nexport const SlashMenuList = React.forwardRef<\n { onKeyDown: (props: SuggestionKeyDownProps) => boolean },\n SlashMenuListProps\n>(function SlashMenuList({ items, command, query = '', groupLabels: groupLabelsProp }, ref) {\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const menuRef = useRef<HTMLDivElement>(null);\n const selectedItemRef = useRef<HTMLButtonElement | null>(null);\n\n // Auto-select first item when items change and there are filtered results\n useEffect(() => {\n if (items.length > 0 && query.length > 0) {\n // If there's a query and matching items, select the first one\n setSelectedIndex(0);\n } else if (items.length === 0) {\n // If no items, clear selection\n setSelectedIndex(-1);\n } else {\n // If no query but items exist, don't auto-select\n setSelectedIndex(-1);\n }\n }, [items, query]);\n\n // Use scroll hook to handle scrolling\n useScrollIntoView(selectedIndex, menuRef, selectedItemRef);\n\n // Group items\n const groupedItems = useMemo(() => {\n const groups: Record<string, SlashCommand[]> = {};\n for (const item of items) {\n const group = groups[item.group] ?? [];\n group.push(item);\n groups[item.group] = group;\n }\n return groups;\n }, [items]);\n\n // Flat list for keyboard navigation\n const flatItems = items;\n\n const selectItem = useCallback(\n (index: number) => {\n const item = flatItems[index];\n if (item) {\n command(item);\n }\n },\n [flatItems, command]\n );\n\n // Expose keyboard handler\n React.useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: SuggestionKeyDownProps) => {\n if (flatItems.length === 0) {\n return false; // No items, let default behavior handle it (allow Enter to create new line)\n }\n\n if (event.key === 'ArrowUp') {\n setSelectedIndex((prev) => {\n if (prev < 0) {\n return flatItems.length - 1;\n }\n if (prev <= 0) {\n return 0; // Stop at top\n }\n return prev - 1;\n });\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n setSelectedIndex((prev) => {\n if (prev < 0) {\n return 0;\n }\n if (prev >= flatItems.length - 1) {\n return flatItems.length - 1; // Stop at bottom\n }\n return prev + 1;\n });\n return true;\n }\n\n if (event.key === 'Enter') {\n // Only handle Enter if an item is selected\n if (selectedIndex >= 0 && selectedIndex < flatItems.length) {\n selectItem(selectedIndex);\n return true;\n }\n // If no item is selected, allow default behavior (create new line)\n return false;\n }\n\n return false;\n },\n }));\n\n // Use groupLabels from props or fallback to defaults\n const groupLabels = groupLabelsProp || {\n basic: 'Style',\n list: 'Lists',\n media: 'Media',\n advanced: 'Advanced',\n };\n\n // Don't render if no items\n if (items.length === 0) {\n return null;\n }\n\n return (\n <div className=\"pubwave-slash-menu\" ref={menuRef} style={menuStyle} data-testid=\"slash-menu\">\n <div style={{ padding: 'var(--pubwave-spacing-1, 4px) 0' }}>\n {(() => {\n let globalIndex = 0;\n const groupOrder = ['basic', 'list', 'media', 'advanced'];\n\n return groupOrder.map((group) => {\n const groupItems = groupedItems[group];\n if (!groupItems || groupItems.length === 0) return null;\n\n return (\n <div key={group} className=\"pubwave-slash-menu__group\" style={groupContainerStyle}>\n <div className=\"pubwave-slash-menu__group-label\" style={groupLabelStyle}>\n {groupLabels[group] || group}\n </div>\n {groupItems.map((item) => {\n const currentIndex = globalIndex++;\n const isSelected = currentIndex === selectedIndex;\n return (\n <button\n key={item.id}\n ref={isSelected ? selectedItemRef : null}\n className={`pubwave-slash-menu__item ${isSelected ? 'pubwave-slash-menu__item--selected' : ''}`}\n style={{\n ...itemStyle,\n backgroundColor: isSelected\n ? 'var(--pubwave-hover-bg, #f3f4f6)'\n : 'transparent',\n }}\n onClick={() => selectItem(currentIndex)}\n onMouseEnter={() => setSelectedIndex(currentIndex)}\n >\n <span className=\"pubwave-slash-menu__item-icon\" style={iconStyle}>\n {item.icon}\n </span>\n <span className=\"pubwave-slash-menu__item-title\" style={titleStyle}>\n {item.title}\n </span>\n </button>\n );\n })}\n </div>\n );\n });\n })()}\n </div>\n </div>\n );\n});\n\n// Re-export types and functions for backward compatibility\nexport type { SlashCommand } from './slashMenu/commands';\nexport { defaultSlashCommands, createDefaultSlashCommands, filterCommands } from './slashMenu/commands';\nexport { createSlashCommandsExtension } from './slashMenu/extension';\n\nexport default SlashMenuList;\n","/**\n * Drag and Drop Plugin\n *\n * ProseMirror plugin for block-level drag and drop reordering.\n * Integrates with PM transactions to ensure proper state management.\n *\n * Key behaviors:\n * - Precise drop indicator (before/after target block)\n * - No layout jump on drag start (placeholder maintains space)\n * - Safe cancel behavior (Escape or drop outside)\n * - Selection and focus preservation after drop\n */\n\nimport type { Editor } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport type { EditorView } from '@tiptap/pm/view';\n\n/**\n * Plugin key for accessing DnD state\n */\nexport const dndPluginKey = new PluginKey('pubwave-dnd');\n\n/**\n * DnD state stored in plugin\n */\nexport interface DndState {\n /** Block currently being dragged */\n draggingBlockId: string | null;\n /** Position of the block being dragged */\n draggingBlockPos: number | null;\n /** Target position for drop (null if no valid target) */\n dropTargetPos: number | null;\n /** Whether drop is before or after the target */\n dropPosition: 'before' | 'after' | null;\n /** Whether drag was cancelled */\n cancelled: boolean;\n}\n\n/**\n * Initial DnD state\n */\nconst initialDndState: DndState = {\n draggingBlockId: null,\n draggingBlockPos: null,\n dropTargetPos: null,\n dropPosition: null,\n cancelled: false,\n};\n\n/**\n * DnD actions to update state\n */\ntype DndAction =\n | { type: 'START_DRAG'; blockId: string; pos: number }\n | { type: 'UPDATE_DROP_TARGET'; pos: number | null; position: 'before' | 'after' | null }\n | { type: 'CANCEL_DRAG' }\n | { type: 'COMPLETE_DRAG' }\n | { type: 'RESET' };\n\n/**\n * Reduce DnD state\n */\nfunction dndReducer(state: DndState, action: DndAction): DndState {\n switch (action.type) {\n case 'START_DRAG':\n return {\n ...state,\n draggingBlockId: action.blockId,\n draggingBlockPos: action.pos,\n dropTargetPos: null,\n dropPosition: null,\n cancelled: false,\n };\n case 'UPDATE_DROP_TARGET':\n return {\n ...state,\n dropTargetPos: action.pos,\n dropPosition: action.position,\n };\n case 'CANCEL_DRAG':\n return {\n ...state,\n cancelled: true,\n draggingBlockId: null,\n draggingBlockPos: null,\n dropTargetPos: null,\n dropPosition: null,\n };\n case 'COMPLETE_DRAG':\n return {\n ...state,\n draggingBlockId: null,\n draggingBlockPos: null,\n dropTargetPos: null,\n dropPosition: null,\n };\n case 'RESET':\n return initialDndState;\n default:\n return state;\n }\n}\n\n/**\n * Find top-level block node at a given document position\n * Returns the direct child of doc that contains the position\n */\nexport function findBlockAtPos(\n doc: PMNode,\n pos: number\n): { node: PMNode; pos: number } | null {\n // Clamp pos to valid range within the document\n const clampedPos = Math.max(0, Math.min(pos, doc.content.size));\n\n // Use resolve to find the block at depth 1 (direct child of doc)\n try {\n const $pos = doc.resolve(clampedPos);\n\n // 1. Check if we are inside a top-level container (List or Blockquote)\n // If so, return the container itself as the draggable unit\n if ($pos.depth >= 1) {\n const topNode = $pos.node(1);\n const containerTypes = ['taskList', 'bulletList', 'orderedList', 'blockquote'];\n if (containerTypes.includes(topNode.type.name)) {\n return { node: topNode, pos: $pos.before(1) };\n }\n }\n\n // 2. Otherwise, find the innermost block node (for blockquotes, etc.)\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.isBlock) {\n return { node, pos: $pos.before(d) };\n }\n }\n\n // 3. Fallback for depth 0 (e.g. at the very end or beginning of doc)\n if ($pos.depth === 0 && doc.childCount > 0) {\n let offset = 0;\n for (let i = 0; i < doc.childCount; i++) {\n const child = doc.child(i);\n if (offset + child.nodeSize > clampedPos) {\n return { node: child, pos: offset };\n }\n offset += child.nodeSize;\n }\n return { node: doc.lastChild!, pos: doc.content.size - doc.lastChild!.nodeSize };\n }\n\n return null;\n } catch {\n // If resolve fails, fall back to iteration\n let result: { node: PMNode; pos: number } | null = null;\n let offset = 0;\n\n for (let i = 0; i < doc.childCount; i++) {\n const child = doc.child(i);\n if (offset <= clampedPos && offset + child.nodeSize > clampedPos) {\n result = { node: child, pos: offset };\n break;\n }\n offset += child.nodeSize;\n }\n\n return result;\n }\n}\n\n/**\n * Move a block from one position to another\n */\nexport function moveBlock(\n editor: Editor,\n fromPos: number,\n toPos: number,\n position: 'before' | 'after'\n): boolean {\n const { state } = editor;\n const { tr, doc } = state;\n\n // Find the block at the source position\n // fromPos might be a position inside the block, so findBlockAtPos should find the containing block\n const sourceBlock = findBlockAtPos(doc, fromPos);\n if (!sourceBlock) {\n return false;\n }\n\n // Find the target block\n // toPos should be the position of the target block\n const targetBlock = findBlockAtPos(doc, toPos);\n if (!targetBlock) {\n return false;\n }\n\n // Calculate the actual insertion position\n let insertPos = targetBlock.pos;\n if (position === 'after') {\n insertPos = targetBlock.pos + targetBlock.node.nodeSize;\n }\n\n // If moving to the same position, do nothing\n // Check if source and target are the same block\n if (sourceBlock.pos === targetBlock.pos) {\n return false;\n }\n\n // Check if we're trying to insert at the exact same position (before or after source)\n // This handles the case where we're moving a block to immediately before/after itself\n if (\n insertPos === sourceBlock.pos ||\n insertPos === sourceBlock.pos + sourceBlock.node.nodeSize\n ) {\n return false;\n }\n\n // Store source node and positions\n const sourceNode = sourceBlock.node;\n const sourceStart = sourceBlock.pos;\n const sourceEnd = sourceBlock.pos + sourceNode.nodeSize;\n\n // Create a slice of the source block\n const slice = doc.slice(sourceStart, sourceEnd);\n\n // Calculate adjusted insert position considering deletion\n // We need to adjust the insert position based on where the source is relative to the target\n let adjustedInsertPos = insertPos;\n\n if (sourceStart < insertPos) {\n // Source is before target: after deletion, insert position decreases by source size\n adjustedInsertPos = insertPos - sourceNode.nodeSize;\n }\n // If source is after target, insertPos doesn't need adjustment\n\n // Delete source block first\n tr.delete(sourceStart, sourceEnd);\n\n // Insert at adjusted position (using slice content, not the node itself)\n // Slice.content contains Fragment, which can be inserted directly\n // Ensure the position is valid after deletion\n const maxPos = tr.doc.content.size;\n if (adjustedInsertPos < 0) {\n adjustedInsertPos = 0;\n } else if (adjustedInsertPos > maxPos) {\n adjustedInsertPos = maxPos;\n }\n\n if (adjustedInsertPos >= 0 && adjustedInsertPos <= maxPos) {\n tr.insert(adjustedInsertPos, slice.content);\n } else {\n return false;\n }\n\n // Preserve selection at the moved block using mapped positions\n tr.setSelection(state.selection.map(tr.doc, tr.mapping));\n\n // Apply the transaction\n editor.view.dispatch(tr);\n\n return true;\n}\n\n/**\n * Resolve the drop target based on the event coordinates\n * Prioritizes geometric checks for document edges to ensure reliability\n */\nfunction resolveDropTarget(\n view: EditorView,\n event: DragEvent\n): { pos: number; position: 'before' | 'after' } | null {\n const doc = view.state.doc;\n if (doc.childCount === 0) return null;\n\n // 1. Geometric Edge Detection (Priority High)\n // This handles dropping at the very top or bottom, and empty spaces\n\n // Get first block\n const firstBlockPos = 0;\n const firstBlockDom = view.nodeDOM(firstBlockPos) as HTMLElement | null;\n\n // Get last block\n let lastBlockPos = 0;\n for (let i = 0; i < doc.childCount - 1; i++) {\n lastBlockPos += doc.child(i).nodeSize;\n }\n const lastBlockDom = view.nodeDOM(lastBlockPos) as HTMLElement | null;\n\n const clientY = event.clientY;\n\n // Check top edge\n if (firstBlockDom) {\n const rect = firstBlockDom.getBoundingClientRect();\n // Use a fixed generous valid zone (50px) relative to the top of the content\n // This allows dropping \"before\" the first block even if the block is very small (like a paragraph)\n // Logic: If mouse is anywhere above the block, OR within the top 50px of the block start\n if (clientY < rect.top + 50) {\n return { pos: firstBlockPos, position: 'before' };\n }\n }\n\n // Check bottom edge\n if (lastBlockDom) {\n const rect = lastBlockDom.getBoundingClientRect();\n // Logic: If mouse is anywhere below the block, OR within the bottom 50px of the block end\n if (clientY > rect.bottom - 50) {\n return { pos: lastBlockPos, position: 'after' };\n }\n }\n\n // 2. Exact Position Detection (Priority Normal)\n // Use ProseMirror's posAtCoords for internal drops\n const posAtCoords = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n\n if (posAtCoords) {\n const block = findBlockAtPos(doc, posAtCoords.pos);\n if (block) {\n const blockDom = view.nodeDOM(block.pos) as HTMLElement | null;\n if (blockDom) {\n const rect = blockDom.getBoundingClientRect();\n const midpoint = rect.top + rect.height / 2;\n return {\n pos: block.pos,\n position: clientY < midpoint ? 'before' : 'after'\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Create the DnD ProseMirror plugin\n */\nexport function createDndPlugin(editor?: Editor): Plugin<DndState> {\n let currentState = initialDndState;\n\n return new Plugin<DndState>({\n key: dndPluginKey,\n\n state: {\n init(): DndState {\n return initialDndState;\n },\n apply(tr, value): DndState {\n // Extract state from transaction meta if present\n const meta = tr.getMeta(dndPluginKey);\n if (meta !== undefined) {\n currentState = meta as DndState;\n return meta as DndState;\n }\n // Otherwise, update currentState and return existing value\n currentState = value;\n return value;\n },\n },\n\n props: {\n handleKeyDown(view: EditorView, event: KeyboardEvent): boolean {\n // Cancel drag on Escape\n if (event.key === 'Escape' && currentState.draggingBlockId) {\n currentState = dndReducer(currentState, { type: 'CANCEL_DRAG' });\n // Dispatch a transaction to notify React components\n view.dispatch(view.state.tr.setMeta(dndPluginKey, currentState));\n return true;\n }\n return false;\n },\n\n handleDOMEvents: {\n dragover(view: EditorView, event: DragEvent): boolean {\n // Only handle our drag operations\n if (!event.dataTransfer?.types.includes('application/x-pubwave-block')) {\n return false;\n }\n\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n\n // Get current state from plugin\n const pluginState = dndPluginKey.getState(view.state) as DndState | null;\n currentState = pluginState ?? currentState;\n\n const target = resolveDropTarget(view, event);\n\n if (target) {\n currentState = dndReducer(currentState, {\n type: 'UPDATE_DROP_TARGET',\n pos: target.pos,\n position: target.position,\n });\n view.dispatch(view.state.tr.setMeta(dndPluginKey, currentState));\n } else {\n // If no valid target found but we are dragging, clear the indicator\n if (currentState.dropTargetPos !== null) {\n currentState = dndReducer(currentState, {\n type: 'UPDATE_DROP_TARGET',\n pos: null,\n position: null,\n });\n view.dispatch(view.state.tr.setMeta(dndPluginKey, currentState));\n }\n }\n\n return true;\n },\n\n drop(view: EditorView, event: DragEvent): boolean {\n // Only handle our drag operations\n const blockId = event.dataTransfer?.getData('application/x-pubwave-block');\n if (!blockId) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get current state from plugin\n const pluginState = dndPluginKey.getState(view.state) as DndState | null;\n const state = pluginState ?? currentState;\n\n // If we don't have draggingBlockPos from state, try to extract from blockId\n let draggingBlockPos = state.draggingBlockPos;\n if (draggingBlockPos === null && blockId.startsWith('block-')) {\n const extractedPos = parseInt(blockId.replace('block-', ''), 10);\n if (!isNaN(extractedPos)) {\n draggingBlockPos = extractedPos;\n }\n }\n\n if (draggingBlockPos === null) {\n return false;\n }\n\n // Use resolveDropTarget for the final drop decision\n // This ensures we don't rely on potentially stale state\n const target = resolveDropTarget(view, event);\n\n if (!target) {\n return false;\n }\n\n const { pos: dropTargetPos, position: dropPosition } = target;\n\n // Validate target is not self\n if (dropTargetPos === draggingBlockPos) {\n return false;\n }\n\n // Perform the move\n // Use editor from closure (passed when creating plugin)\n if (!editor) {\n return false;\n }\n\n const success = moveBlock(editor, draggingBlockPos, dropTargetPos, dropPosition);\n\n // Complete the drag\n currentState = dndReducer(currentState, { type: 'COMPLETE_DRAG' });\n view.dispatch(view.state.tr.setMeta(dndPluginKey, currentState));\n\n return success;\n },\n\n dragleave(_view: EditorView, event: DragEvent): boolean {\n // Clear drop target when leaving editor\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (!relatedTarget?.closest('.pubwave-editor')) {\n currentState = dndReducer(currentState, {\n type: 'UPDATE_DROP_TARGET',\n pos: null,\n position: null,\n });\n _view.dispatch(_view.state.tr.setMeta(dndPluginKey, currentState));\n }\n return false;\n },\n },\n },\n });\n}\n\n/**\n * Get the current DnD state from an editor\n */\nexport function getDndState(editor: Editor): DndState {\n const pluginState = dndPluginKey.getState(editor.state) as DndState | undefined;\n return pluginState ?? initialDndState;\n}\n\n/**\n * Start a drag operation\n */\nexport function startDrag(editor: Editor, blockId: string, pos: number): void {\n const { view } = editor;\n const action: DndAction = { type: 'START_DRAG', blockId, pos };\n const newState = dndReducer(getDndState(editor), action);\n view.dispatch(view.state.tr.setMeta(dndPluginKey, newState));\n}\n\n/**\n * Cancel a drag operation\n */\nexport function cancelDrag(editor: Editor): void {\n const { view } = editor;\n const action: DndAction = { type: 'CANCEL_DRAG' };\n const newState = dndReducer(getDndState(editor), action);\n view.dispatch(view.state.tr.setMeta(dndPluginKey, newState));\n}\n\nexport default createDndPlugin;\n","/**\n * Internationalization (i18n) Support\n * \n * Provides multi-language support for the editor.\n * Each language has its own JSON file in the locales directory.\n * Default locale is English ('en').\n */\n\nimport type { EditorLocale as EditorLocaleType } from '../types/editor';\nexport type Locale = EditorLocaleType;\n\n// Import locale JSON files\nimport enLocaleData from './locales/en.json';\nimport zhLocaleData from './locales/zh.json';\nimport zhCNLocaleData from './locales/zh-CN.json';\nimport jaLocaleData from './locales/ja.json';\nimport koLocaleData from './locales/ko.json';\nimport frLocaleData from './locales/fr.json';\nimport deLocaleData from './locales/de.json';\nimport esLocaleData from './locales/es.json';\nimport ptLocaleData from './locales/pt.json';\n\nexport interface EditorLocale {\n // Slash menu commands\n slashMenu: {\n // Command groups\n groups: {\n basic: string;\n list: string;\n media: string;\n advanced: string;\n };\n // Commands\n commands: {\n paragraph: { title: string; description: string };\n heading1: { title: string; description: string };\n heading2: { title: string; description: string };\n heading3: { title: string; description: string };\n bulletList: { title: string; description: string };\n orderedList: { title: string; description: string };\n taskList: { title: string; description: string };\n image: { title: string; description: string };\n blockquote: { title: string; description: string };\n codeBlock: { title: string; description: string };\n horizontalRule: { title: string; description: string };\n };\n };\n\n // Toolbar\n toolbar: {\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n link: string;\n turnInto: string;\n colorPicker: string;\n textColor: string;\n backgroundColor: string;\n recentlyUsed: string;\n openLink: string;\n removeLink: string;\n confirmLink: string;\n clearLink: string;\n // Block types\n blockTypes: {\n text: string;\n heading1: string;\n heading2: string;\n heading3: string;\n bulletedList: string;\n numberedList: string;\n };\n };\n\n // Accessibility labels\n aria: {\n editor: string;\n editorContent: string;\n toolbar: string;\n boldButton: string;\n italicButton: string;\n underlineButton: string;\n strikeButton: string;\n codeButton: string;\n linkButton: string;\n turnIntoButton: string;\n colorPickerButton: string;\n headingButton: string;\n paragraphButton: string;\n dragHandle: string;\n dropIndicator: string;\n blockMenu: string;\n addBlock: string;\n deleteBlock: string;\n linkDialog: string;\n linkUrlInput: string;\n linkSaveButton: string;\n linkRemoveButton: string;\n linkCancelButton: string;\n linkConfirmButton: string;\n linkOpenButton: string;\n linkClearButton: string;\n addBlockBelow: string;\n dragToMove: string;\n openLinkInNewTab: string;\n };\n\n // Placeholders\n placeholder: string;\n linkPlaceholder: string;\n}\n\n/**\n * Default English locale (loaded from JSON)\n */\nexport const enLocale: EditorLocale = enLocaleData as EditorLocale;\n\n/**\n * Locale registry\n * Maps locale codes to their JSON data\n * Note: 'zh' is Traditional Chinese, 'zh-CN' is Simplified Chinese\n */\nconst locales: Record<Locale, EditorLocale> = {\n en: enLocaleData as EditorLocale,\n 'zh': zhLocaleData as EditorLocale, // Traditional Chinese\n 'zh-CN': zhCNLocaleData as EditorLocale, // Simplified Chinese\n 'ja': jaLocaleData as EditorLocale,\n 'ko': koLocaleData as EditorLocale,\n 'fr': frLocaleData as EditorLocale,\n 'de': deLocaleData as EditorLocale,\n 'es': esLocaleData as EditorLocale,\n 'pt': ptLocaleData as EditorLocale,\n};\n\n/**\n * Get locale by language code\n * Falls back to English if locale is not found\n */\nexport function getLocale(locale?: Locale | string): EditorLocale {\n if (!locale) {\n return enLocale;\n }\n\n // Normalize locale (e.g., 'zh-CN' -> 'zh-CN', 'zh' -> 'zh')\n const normalized = locale as Locale;\n \n return locales[normalized] || enLocale;\n}\n\n/**\n * Default locale\n */\nexport const defaultLocale: Locale = 'en';\n\nexport default {\n getLocale,\n defaultLocale,\n enLocale,\n};\n","/**\n * Extensions Registry\n *\n * Composes and exports the Tiptap extensions used by the editor.\n * This provides a centralized place for extension configuration.\n */\n\nimport { Extension } from '@tiptap/core';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport History from '@tiptap/extension-history';\nimport Dropcursor from '@tiptap/extension-dropcursor';\nimport Gapcursor from '@tiptap/extension-gapcursor';\n\nimport type { BlockType, MarkType, EditorLocale as EditorLocaleCode } from '../types/editor';\nimport {\n createBlockExtensions,\n type BlockExtensionsConfig,\n} from './extensions/blocks';\nimport type { ImageUploadConfig } from '../types/editor';\nimport {\n createMarkExtensions,\n type MarkExtensionsConfig,\n} from './extensions/marks';\nimport {\n createSlashCommandsExtension,\n defaultSlashCommands,\n type SlashCommand,\n} from '../ui/SlashMenu';\nimport { createDndPlugin } from './plugins/dnd';\nimport { getLocale } from '../i18n';\n\n/**\n * Supported block types\n */\nexport const SUPPORTED_BLOCKS: readonly BlockType[] = [\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'blockquote',\n 'codeBlock',\n 'horizontalRule',\n 'image',\n] as const;\n\n/**\n * Supported mark types\n */\nexport const SUPPORTED_MARKS: readonly MarkType[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n] as const;\n\n/**\n * Configuration for creating the extension set\n */\nexport interface ExtensionConfig\n extends BlockExtensionsConfig,\n MarkExtensionsConfig {\n /**\n * Placeholder text for empty editor\n */\n placeholder?: string;\n\n /**\n * Undo/redo history depth\n * @default 100\n */\n historyDepth?: number;\n\n /**\n * Enable slash commands menu\n * @default true\n */\n enableSlashCommands?: boolean;\n\n /**\n * Custom slash commands (merged with defaults)\n */\n slashCommands?: SlashCommand[];\n\n /**\n * Image upload configuration\n */\n imageUpload?: ImageUploadConfig;\n\n /**\n * Locale for internationalization\n */\n locale?: EditorLocaleCode;\n}\n\n/**\n * Create the core extension set for the editor\n *\n * This composes all block, mark, and feature extensions into a single array.\n */\nexport function createExtensions(config: ExtensionConfig = {}): Extension[] {\n const {\n placeholder: placeholderProp,\n historyDepth = 100,\n headingLevels,\n linkOpenInNewTab,\n linkOpenOnClick,\n enableSlashCommands = true,\n slashCommands,\n imageUpload,\n locale,\n } = config;\n\n // Get placeholder from prop or locale data\n const localeData = locale ? getLocale(locale) : null;\n const placeholder = placeholderProp ?? localeData?.placeholder ?? 'Type \"/\" for commands...';\n\n const extensions: Extension[] = [\n // Block extensions (document structure + block types)\n ...createBlockExtensions({ headingLevels, imageUpload }),\n\n // Mark extensions (inline formatting)\n ...createMarkExtensions({ linkOpenInNewTab, linkOpenOnClick }),\n\n // Editor features\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'pubwave-editor--empty',\n emptyNodeClass: 'pubwave-editor__node--empty',\n }),\n History.configure({\n depth: historyDepth,\n }),\n Dropcursor.configure({\n color: 'var(--pubwave-dropcursor-color, #3b82f6)',\n width: 2,\n }),\n Gapcursor,\n\n // Drag and drop plugin\n Extension.create({\n name: 'dragAndDrop',\n addProseMirrorPlugins() {\n // Pass editor instance to the plugin\n return [createDndPlugin(this.editor)];\n },\n }),\n ];\n\n // Slash commands (optional)\n if (enableSlashCommands) {\n const localeData = locale ? getLocale(locale) : getLocale('en');\n const commands = slashCommands\n ? [...defaultSlashCommands, ...slashCommands]\n : defaultSlashCommands;\n extensions.push(createSlashCommandsExtension(commands, imageUpload, localeData));\n }\n\n return extensions as Extension[];\n}\n\n/**\n * Get the default extensions with standard configuration\n */\nexport function getDefaultExtensions(): Extension[] {\n return createExtensions();\n}\n","/**\n * Editor Creation Factory\n *\n * Provides the main factory function for creating and managing editor instances.\n * This is the primary entry point for programmatic editor creation.\n */\n\nimport { Editor, EditorOptions } from '@tiptap/core';\nimport { createExtensions } from './extensions';\nimport type { EditorConfig } from '../types/editor';\nimport { canUseDOM } from './ssr';\n\n/**\n * Create a new editor instance\n *\n * This factory function creates a configured Tiptap editor with all necessary\n * extensions and settings based on the provided configuration.\n *\n * @param config - Editor configuration options\n * @returns A configured Tiptap Editor instance\n * @throws Error if called in a non-browser environment without proper guards\n */\nexport function createEditor(config: EditorConfig = {}): Editor {\n if (!canUseDOM) {\n throw new Error(\n 'createEditor() cannot be called server-side. ' +\n 'Ensure this function is only called in client-side code (e.g., useEffect, event handlers).'\n );\n }\n\n const {\n content,\n editable = true,\n placeholder,\n autofocus = false,\n onUpdate,\n onSelectionUpdate,\n onFocus,\n onBlur,\n onCreate,\n onDestroy,\n } = config;\n\n // Create extensions with configuration\n const extensions = createExtensions({\n placeholder,\n headingLevels: [1, 2, 3],\n linkOpenInNewTab: true,\n linkOpenOnClick: true,\n });\n\n // Build Tiptap editor options\n const editorOptions: Partial<EditorOptions> = {\n extensions,\n content,\n editable,\n autofocus,\n editorProps: {\n attributes: {\n class: 'pubwave-editor__content',\n 'data-placeholder': placeholder ?? 'Start writing...',\n },\n },\n onUpdate: onUpdate\n ? ({ editor }) => {\n onUpdate({ editor });\n }\n : undefined,\n onSelectionUpdate: onSelectionUpdate\n ? ({ editor }) => {\n onSelectionUpdate({ editor });\n }\n : undefined,\n onFocus: onFocus\n ? ({ editor }) => {\n onFocus({ editor });\n }\n : undefined,\n onBlur: onBlur\n ? ({ editor }) => {\n onBlur({ editor });\n }\n : undefined,\n onCreate: onCreate\n ? ({ editor }) => {\n onCreate({ editor });\n }\n : undefined,\n onDestroy: onDestroy\n ? () => {\n onDestroy();\n }\n : undefined,\n };\n\n // Create and return the editor instance\n return new Editor(editorOptions);\n}\n\n/**\n * Destroy an editor instance and clean up resources\n *\n * @param editor - The editor instance to destroy\n */\nexport function destroyEditor(editor: Editor | null): void {\n if (editor && !editor.isDestroyed) {\n editor.destroy();\n }\n}\n\n/**\n * Check if an editor instance is in a valid state\n *\n * @param editor - The editor instance to check\n * @returns true if the editor exists and is not destroyed\n */\nexport function isEditorValid(editor: Editor | null): editor is Editor {\n return editor !== null && !editor.isDestroyed;\n}\n","/**\n * Selection State Helpers\n *\n * Provides utilities for determining selection state, which is crucial for:\n * - Toolbar visibility (selection-only rule from constitution)\n * - Determining available formatting options\n * - Drag and drop behavior\n */\n\nimport type { Editor } from '@tiptap/core';\n\n/**\n * Selection state information\n */\nexport interface SelectionState {\n /**\n * Whether there is any selection at all\n */\n hasSelection: boolean;\n\n /**\n * Whether the selection is empty (cursor only, no text selected)\n */\n isEmpty: boolean;\n\n /**\n * Whether the selection spans actual text content\n */\n hasTextContent: boolean;\n\n /**\n * Whether this is a node selection (e.g., selected image or block)\n */\n isNodeSelection: boolean;\n\n /**\n * The selected text, if any\n */\n selectedText: string;\n\n /**\n * Start position of the selection\n */\n from: number;\n\n /**\n * End position of the selection\n */\n to: number;\n\n /**\n * Whether bold mark is active in selection\n */\n isBold: boolean;\n\n /**\n * Whether italic mark is active in selection\n */\n isItalic: boolean;\n\n /**\n * Whether underline mark is active in selection\n */\n isUnderline: boolean;\n\n /**\n * Whether strike mark is active in selection\n */\n isStrike: boolean;\n\n /**\n * Whether code mark is active in selection\n */\n isCode: boolean;\n\n /**\n * Whether the selection has a link\n */\n hasLink: boolean;\n\n /**\n * Active link href if any\n */\n linkHref: string | null;\n}\n\n/**\n * Get the current selection state from the editor\n *\n * This is the primary function for determining toolbar visibility.\n * Per constitution: toolbar MUST NOT be visible when selection is empty.\n */\nexport function getSelectionState(editor: Editor): SelectionState {\n const { state } = editor;\n const { selection } = state;\n const { from, to, empty } = selection;\n\n // Get selected text if any\n const selectedText = empty ? '' : state.doc.textBetween(from, to, ' ');\n\n // Check if this is a node selection (e.g., image, video, embed)\n const isNodeSelection = selection instanceof Object && 'node' in selection;\n\n // Determine if there's actual content selected\n const hasTextContent = selectedText.length > 0;\n\n // Get mark states\n const isBold = editor.isActive('bold');\n const isItalic = editor.isActive('italic');\n const isUnderline = editor.isActive('underline');\n const isStrike = editor.isActive('strike');\n const isCode = editor.isActive('code');\n const hasLink = editor.isActive('link');\n const linkHref = hasLink\n ? (editor.getAttributes('link').href as string | null)\n : null;\n\n return {\n hasSelection: !empty || isNodeSelection,\n isEmpty: empty && !isNodeSelection,\n hasTextContent,\n isNodeSelection,\n selectedText,\n from,\n to,\n isBold,\n isItalic,\n isUnderline,\n isStrike,\n isCode,\n hasLink,\n linkHref,\n };\n}\n\n/**\n * Check if the selection is empty (cursor only)\n *\n * This is the key check for toolbar visibility.\n * Returns true when toolbar should be HIDDEN.\n */\nexport function isSelectionEmpty(editor: Editor): boolean {\n return editor.state.selection.empty;\n}\n\n/**\n * Check if the selection spans multiple blocks\n */\nexport function isMultiBlockSelection(editor: Editor): boolean {\n const { from, to } = editor.state.selection;\n const $from = editor.state.doc.resolve(from);\n const $to = editor.state.doc.resolve(to);\n\n // Compare the depth-1 ancestor (block level)\n return $from.depth > 0 && $to.depth > 0 && $from.before(1) !== $to.before(1);\n}\n\n/**\n * Check if the selection spans the entire paragraph/block\n * Used to determine if toolbar should show on double-click\n */\nexport function isFullBlockSelection(editor: Editor): boolean {\n const { from, to } = editor.state.selection;\n const $from = editor.state.doc.resolve(from);\n const $to = editor.state.doc.resolve(to);\n\n // Find the paragraph/block containing the selection\n let fromBlockStart = from;\n let fromBlockEnd = from;\n let toBlockStart = to;\n let toBlockEnd = to;\n\n // Find block boundaries for start position\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d);\n if (node.isBlock) {\n fromBlockStart = $from.start(d);\n fromBlockEnd = $from.end(d);\n break;\n }\n }\n\n // Find block boundaries for end position\n for (let d = $to.depth; d > 0; d--) {\n const node = $to.node(d);\n if (node.isBlock) {\n toBlockStart = $to.start(d);\n toBlockEnd = $to.end(d);\n break;\n }\n }\n\n // Check if selection spans entire block(s)\n // Either: selection starts at block start and ends at block end\n // Or: selection spans multiple blocks\n const spansFullFromBlock = from === fromBlockStart && to >= fromBlockEnd;\n const spansFullToBlock = to === toBlockEnd && from <= toBlockStart;\n const spansMultipleBlocks = fromBlockStart !== toBlockStart;\n\n return spansFullFromBlock || spansFullToBlock || spansMultipleBlocks;\n}\n\n/**\n * Get the block node containing the current selection\n */\nexport function getSelectedBlock(\n editor: Editor\n): { node: Editor['state']['doc'] | null; pos: number } {\n const { selection, doc } = editor.state;\n const { from } = selection;\n\n // Find the nearest block ancestor\n const $pos = doc.resolve(from);\n const depth = $pos.depth;\n\n for (let d = depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.isBlock) {\n return { node: node as unknown as Editor['state']['doc'], pos: $pos.before(d) };\n }\n }\n\n return { node: null, pos: 0 };\n}\n\n/**\n * Get all block positions in the document\n * Useful for drag and drop operations\n */\nexport function getAllBlockPositions(editor: Editor): number[] {\n const positions: number[] = [];\n const { doc } = editor.state;\n\n doc.descendants((node, pos) => {\n if (node.isBlock && node.type.name !== 'doc') {\n positions.push(pos);\n }\n return true;\n });\n\n return positions;\n}\n\n/**\n * Check if selection should trigger toolbar visibility\n *\n * Per constitution: toolbar appears ONLY on non-empty text selection.\n * - Cursor only: NO toolbar\n * - Text selected: YES toolbar\n * - Node selected (image, etc.): Context-dependent\n */\nexport function shouldShowToolbar(editor: Editor): boolean {\n const state = getSelectionState(editor);\n\n // Never show toolbar for empty selection (cursor only)\n if (state.isEmpty) {\n return false;\n }\n\n // Show toolbar for text selections\n if (state.hasTextContent) {\n return true;\n }\n\n // For node selections, don't show the text formatting toolbar\n // (They would get their own contextual controls)\n return false;\n}\n\n/**\n * Get selection coordinates for positioning UI elements (like toolbar)\n * Returns the bounding box of the current selection\n */\nexport function getSelectionBounds(\n editor: Editor\n): { top: number; left: number; right: number; bottom: number; width: number; height: number } | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const { view } = editor;\n const { from, to } = view.state.selection;\n\n if (from === to) {\n return null;\n }\n\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n\n return {\n top,\n left,\n right,\n bottom,\n width: right - left,\n height: bottom - top,\n };\n}\n","/**\n * Command Layer\n *\n * Provides wrappers around Tiptap commands for use by UI components.\n * These commands are the primary interface for triggering editor actions.\n */\n\nimport type { Editor, ChainedCommands } from '@tiptap/core';\n\n/**\n * Command result indicating success/failure\n */\nexport interface CommandResult {\n success: boolean;\n message?: string;\n}\n\n// =============================================================================\n// Text Formatting Commands\n// =============================================================================\n\n/**\n * Toggle bold formatting on the current selection\n */\nexport function toggleBold(editor: Editor): boolean {\n return editor.chain().focus().toggleBold().run();\n}\n\n/**\n * Toggle italic formatting on the current selection\n */\nexport function toggleItalic(editor: Editor): boolean {\n return editor.chain().focus().toggleItalic().run();\n}\n\n/**\n * Set a link on the current selection\n */\nexport function setLink(editor: Editor, href: string): boolean {\n if (!href) {\n return editor.chain().focus().unsetLink().run();\n }\n return editor.chain().focus().setLink({ href }).run();\n}\n\n/**\n * Remove link from the current selection\n */\nexport function unsetLink(editor: Editor): boolean {\n return editor.chain().focus().unsetLink().run();\n}\n\n// =============================================================================\n// Block Commands\n// =============================================================================\n\n/**\n * Set the current block to a paragraph\n */\nexport function setParagraph(editor: Editor): boolean {\n return editor.chain().focus().setParagraph().run();\n}\n\n/**\n * Set the current block to a heading\n */\nexport function setHeading(\n editor: Editor,\n level: 1 | 2 | 3 | 4 | 5 | 6\n): boolean {\n return editor.chain().focus().setHeading({ level }).run();\n}\n\n/**\n * Toggle heading for the current block\n */\nexport function toggleHeading(\n editor: Editor,\n level: 1 | 2 | 3 | 4 | 5 | 6\n): boolean {\n return editor.chain().focus().toggleHeading({ level }).run();\n}\n\n// =============================================================================\n// History Commands\n// =============================================================================\n\n/**\n * Undo the last action\n */\nexport function undo(editor: Editor): boolean {\n return editor.chain().focus().undo().run();\n}\n\n/**\n * Redo the last undone action\n */\nexport function redo(editor: Editor): boolean {\n return editor.chain().focus().redo().run();\n}\n\n// =============================================================================\n// Selection & Focus Commands\n// =============================================================================\n\n/**\n * Focus the editor\n */\nexport function focusEditor(\n editor: Editor,\n position?: 'start' | 'end' | 'all' | number\n): boolean {\n return editor.chain().focus(position).run();\n}\n\n/**\n * Select all content\n */\nexport function selectAll(editor: Editor): boolean {\n return editor.chain().focus().selectAll().run();\n}\n\n/**\n * Clear all formatting from the selection\n */\nexport function clearFormatting(editor: Editor): boolean {\n return editor.chain().focus().unsetAllMarks().run();\n}\n\n// =============================================================================\n// Utility Commands\n// =============================================================================\n\n/**\n * Create a chainable command sequence\n * This is useful for complex operations that need to be atomic\n */\nexport function createChain(editor: Editor): ChainedCommands {\n return editor.chain();\n}\n\n/**\n * Check if a command can be executed\n * Useful for determining button enabled/disabled state\n */\nexport function canExecute(\n editor: Editor,\n command: keyof Editor['commands']\n): boolean {\n const can = editor.can();\n const chain = can.chain().focus();\n const commandFn = (chain as Record<string, unknown>)[command];\n if (typeof commandFn !== 'function') {\n return false;\n }\n const result: unknown = (commandFn as () => unknown)();\n if (\n typeof result === 'object' &&\n result !== null &&\n 'run' in result &&\n typeof (result as { run: unknown }).run === 'function'\n ) {\n return ((result as { run: () => boolean }).run)();\n }\n return false;\n}\n\n/**\n * Check if a mark is currently active\n */\nexport function isMarkActive(editor: Editor, markType: string): boolean {\n return editor.isActive(markType);\n}\n\n/**\n * Check if a node type is currently active\n */\nexport function isNodeActive(\n editor: Editor,\n nodeType: string,\n attrs?: Record<string, unknown>\n): boolean {\n return editor.isActive(nodeType, attrs);\n}\n\n/**\n * Get current marks at the selection\n */\nexport function getActiveMarks(editor: Editor): string[] {\n const marks: string[] = [];\n if (editor.isActive('bold')) marks.push('bold');\n if (editor.isActive('italic')) marks.push('italic');\n if (editor.isActive('link')) marks.push('link');\n return marks;\n}\n\n/**\n * Get the current link href if selection is inside a link\n */\nexport function getActiveLinkHref(editor: Editor): string | null {\n const attrs = editor.getAttributes('link') as { href?: string };\n return attrs.href ?? null;\n}\n","/**\n * Read-Only Mode Guards\n *\n * Provides utilities and guards for handling read-only mode.\n * When the editor is in read-only mode, all editing affordances should be hidden.\n */\n\nimport type { Editor } from '@tiptap/core';\n\n/**\n * Check if the editor is in read-only mode\n */\nexport function isReadOnly(editor: Editor | null): boolean {\n if (!editor) return true;\n return !editor.isEditable;\n}\n\n/**\n * Check if the editor is editable (inverse of read-only)\n */\nexport function isEditable(editor: Editor | null): boolean {\n if (!editor) return false;\n return editor.isEditable;\n}\n\n/**\n * Guard function for UI components\n * Returns true if the component should be rendered (editable mode)\n */\nexport function shouldRenderEditUI(editor: Editor | null): boolean {\n return isEditable(editor);\n}\n\n/**\n * Guard function for toolbar visibility\n * Returns true if toolbar should potentially be visible\n * (Still depends on selection state)\n */\nexport function shouldAllowToolbar(editor: Editor | null): boolean {\n return isEditable(editor);\n}\n\n/**\n * Guard function for drag handles\n * Returns true if drag handles should be visible\n */\nexport function shouldShowDragHandle(editor: Editor | null): boolean {\n return isEditable(editor);\n}\n\n/**\n * Guard function for any interactive element\n * Returns true if interactive elements should be enabled\n */\nexport function shouldAllowInteraction(editor: Editor | null): boolean {\n return isEditable(editor);\n}\n\n/**\n * CSS class helper for read-only state\n */\nexport function getReadOnlyClassName(editor: Editor | null): string {\n return isReadOnly(editor) ? 'pubwave-editor--readonly' : '';\n}\n\n/**\n * Props helper for read-only mode\n * Returns props that should be applied to interactive elements\n */\nexport function getReadOnlyProps(editor: Editor | null): {\n 'aria-disabled': boolean;\n tabIndex: number;\n} {\n const readOnly = isReadOnly(editor);\n return {\n 'aria-disabled': readOnly,\n tabIndex: readOnly ? -1 : 0,\n };\n}\n\n/**\n * Event handler guard\n * Wraps an event handler to prevent execution in read-only mode\n */\nexport function guardHandler<T extends (...args: unknown[]) => void>(\n editor: Editor | null,\n handler: T\n): T | (() => void) {\n if (isReadOnly(editor)) {\n return () => {\n // No-op in read-only mode\n };\n }\n return handler;\n}\n","/**\n * Accessibility Utilities\n *\n * Provides accessibility labels and ARIA attributes for interactive controls.\n * Ensures screen reader compatibility and keyboard navigation support.\n */\n\n/**\n * Standard ARIA labels for editor controls\n */\nexport const ariaLabels = {\n // Editor\n editor: 'Rich text editor',\n editorContent: 'Editor content area',\n \n // Toolbar\n toolbar: 'Text formatting toolbar',\n boldButton: 'Toggle bold formatting',\n italicButton: 'Toggle italic formatting',\n underlineButton: 'Toggle underline formatting',\n strikeButton: 'Toggle strikethrough formatting',\n codeButton: 'Toggle inline code formatting',\n linkButton: 'Add or edit link',\n turnIntoButton: 'Turn into',\n colorPickerButton: 'Text and background color',\n headingButton: 'Set heading level',\n paragraphButton: 'Convert to paragraph',\n \n // Drag and Drop\n dragHandle: 'Drag to reorder block',\n dropIndicator: 'Drop here to move block',\n \n // Block Actions\n blockMenu: 'Block options menu',\n addBlock: 'Add new block',\n deleteBlock: 'Delete this block',\n \n // Dialogs\n linkDialog: 'Link editor dialog',\n linkUrlInput: 'Link URL input',\n linkSaveButton: 'Save link',\n linkRemoveButton: 'Remove link',\n linkCancelButton: 'Cancel link editing',\n} as const;\n\n/**\n * Keyboard shortcuts for screen reader announcements\n */\nexport const keyboardShortcuts = {\n bold: 'Cmd+B',\n italic: 'Cmd+I',\n underline: 'Cmd+U',\n strike: 'Cmd+Shift+X',\n code: 'Cmd+E',\n undo: 'Cmd+Z',\n redo: 'Cmd+Shift+Z',\n selectAll: 'Cmd+A',\n} as const;\n\n/**\n * Get full accessible label with shortcut hint\n */\nexport function getLabelWithShortcut(\n label: string,\n shortcut?: string\n): string {\n if (!shortcut) return label;\n return `${label} (${shortcut})`;\n}\n\n/**\n * Generate ID for ARIA relationships\n */\nexport function createAriaId(prefix: string, suffix?: string): string {\n const baseId = `pubwave-${prefix}`;\n return suffix ? `${baseId}-${suffix}` : baseId;\n}\n\n/**\n * ARIA live region types for dynamic content\n */\nexport type LiveRegionType = 'polite' | 'assertive' | 'off';\n\n/**\n * Get appropriate live region for content type\n */\nexport function getLiveRegion(contentType: 'notification' | 'error' | 'update'): LiveRegionType {\n switch (contentType) {\n case 'error':\n return 'assertive';\n case 'notification':\n case 'update':\n return 'polite';\n default:\n return 'polite';\n }\n}\n\n/**\n * Role definitions for custom components\n */\nexport const roles = {\n editor: 'textbox',\n toolbar: 'toolbar',\n toolbarButton: 'button',\n menu: 'menu',\n menuItem: 'menuitem',\n dialog: 'dialog',\n dragHandle: 'button',\n block: 'group',\n} as const;\n\n/**\n * Standard focus trap configuration for dialogs\n */\nexport const focusTrapConfig = {\n initialFocus: '[data-autofocus]',\n fallbackFocus: 'button',\n escapeDeactivates: true,\n clickOutsideDeactivates: true,\n};\n\n/**\n * Announces a message to screen readers\n * Uses a live region to communicate dynamic changes\n */\nexport function announceToScreenReader(\n message: string,\n priority: LiveRegionType = 'polite'\n): void {\n // Create or reuse announcement element\n let announcer = document.getElementById('pubwave-announcer');\n \n if (!announcer) {\n announcer = document.createElement('div');\n announcer.id = 'pubwave-announcer';\n announcer.setAttribute('role', 'status');\n announcer.setAttribute('aria-live', priority);\n announcer.setAttribute('aria-atomic', 'true');\n announcer.style.cssText = `\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n `;\n document.body.appendChild(announcer);\n }\n \n // Update priority if needed\n announcer.setAttribute('aria-live', priority);\n \n // Clear and set message (required for re-announcement)\n announcer.textContent = '';\n \n // Store reference for closure\n const announcerElement = announcer;\n setTimeout(() => {\n announcerElement.textContent = message;\n }, 50);\n}\n\nexport default {\n ariaLabels,\n keyboardShortcuts,\n roles,\n getLabelWithShortcut,\n createAriaId,\n getLiveRegion,\n announceToScreenReader,\n};\n","/**\n * Locale Context\n * \n * Provides locale information to editor components\n */\n\nimport { createContext, useContext } from 'react';\nimport type { EditorLocale as EditorLocaleType } from '../types/editor';\nimport { getLocale, enLocale, type EditorLocale } from '../i18n';\n\ninterface LocaleContextValue {\n locale: EditorLocale;\n}\n\nconst LocaleContext = createContext<LocaleContextValue>({\n locale: enLocale,\n});\n\nexport const LocaleProvider = LocaleContext.Provider;\n\nexport function useLocale(): EditorLocale {\n const context = useContext(LocaleContext);\n return context.locale;\n}\n\n/**\n * Get locale from locale code string\n */\nexport function useLocaleFromCode(localeCode?: EditorLocaleType | string): EditorLocale {\n return getLocale(localeCode);\n}\n","/**\n * Toolbar Button Components\n *\n * Base button and divider components for the toolbar.\n */\n\nimport React from 'react';\nimport { cn } from '../theme';\n\n/**\n * Toolbar button component\n */\nexport interface ToolbarButtonProps {\n active?: boolean;\n disabled?: boolean;\n onClick: () => void;\n 'data-tooltip'?: string;\n 'data-testid'?: string;\n 'aria-label': string;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport const ToolbarButton = React.forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n ({ active = false, disabled = false, onClick, 'data-tooltip': dataTooltip, 'data-testid': dataTestId, 'aria-label': ariaLabel, children, style }, ref) => {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'pubwave-toolbar__button',\n active && 'pubwave-toolbar__button--active',\n disabled && 'pubwave-toolbar__button--disabled'\n )}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: style?.width ?? 'var(--pubwave-button-width, 28px)',\n height: style?.height ?? 'var(--pubwave-button-height, 28px)',\n minWidth: style?.minWidth,\n padding: style?.padding ?? 0,\n border: 'none',\n borderRadius: 'var(--pubwave-radius-sm, 4px)',\n backgroundColor: 'transparent',\n color: active ? 'var(--pubwave-primary)' : 'var(--pubwave-text)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'color 0.1s ease, background-color 0.1s ease',\n ...style,\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n disabled={disabled}\n data-tooltip={dataTooltip}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n aria-pressed={active}\n onMouseDown={(e) => {\n // Prevent toolbar from hiding when clicking buttons\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {children}\n </button>\n );\n }\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\n/**\n * Toolbar divider\n */\nexport function ToolbarDivider(): React.ReactElement {\n return (\n <div\n className=\"pubwave-toolbar__divider\"\n style={{\n width: 'var(--pubwave-divider-width, 1px)',\n height: 'var(--pubwave-divider-height, 20px)',\n backgroundColor: 'var(--pubwave-border)',\n margin: '0 var(--pubwave-spacing-1, 4px)',\n }}\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n );\n}\n\n","/**\n * Position Utilities\n *\n * Shared utilities for calculating dropdown/toolbar positions\n * based on available viewport space.\n */\n\n/**\n * Calculate whether a dropdown should be positioned above or below\n * based on available viewport space.\n *\n * @param triggerTop - Top position of the trigger element (in viewport coordinates)\n * @param triggerBottom - Bottom position of the trigger element (in viewport coordinates)\n * @param dropdownHeight - Height of the dropdown (estimated or actual)\n * @param margin - Margin from the trigger element\n * @returns 'top' if should show above, 'bottom' if should show below\n */\nexport function calculateVerticalPosition(\n triggerTop: number,\n triggerBottom: number,\n dropdownHeight: number,\n margin: number = 8\n): 'top' | 'bottom' {\n const spaceAbove = triggerTop;\n const spaceBelow = window.innerHeight - triggerBottom;\n const requiredSpace = dropdownHeight + margin;\n\n // Default: try to show above (top)\n // If not enough space above but enough space below, show below\n // If not enough space below but enough space above, show above\n if (spaceAbove >= requiredSpace) {\n // Enough space above, show above\n return 'top';\n } else if (spaceBelow >= requiredSpace) {\n // Not enough space above, but enough space below, show below\n return 'bottom';\n } else if (spaceAbove >= spaceBelow) {\n // Neither side has enough space, choose the side with more space\n return 'top';\n } else {\n return 'bottom';\n }\n}\n\n/**\n * Calculate the vertical position for a dropdown relative to a trigger element.\n *\n * @param triggerRect - Bounding rectangle of the trigger element\n * @param dropdownHeight - Height of the dropdown (estimated or actual)\n * @param margin - Margin from the trigger element\n * @returns 'top' if should show above, 'bottom' if should show below\n */\nexport function calculateVerticalPositionFromRect(\n triggerRect: DOMRect,\n dropdownHeight: number,\n margin: number = 8\n): 'top' | 'bottom' {\n return calculateVerticalPosition(\n triggerRect.top,\n triggerRect.bottom,\n dropdownHeight,\n margin\n );\n}\n\n","/**\n * Positioned Dropdown Component\n *\n * A wrapper component that automatically positions a dropdown above or below\n * a trigger button based on available viewport space.\n *\n * Features:\n * - Automatically detects available space above and below the trigger\n * - Positions dropdown above (default) or below based on space\n * - Falls back to the side with more space if neither side has enough\n */\n\nimport React, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { calculateVerticalPositionFromRect } from './positionUtils';\n\nexport interface PositionedDropdownProps {\n /** Whether the dropdown is open */\n isOpen: boolean;\n /** Reference to the trigger button/element */\n buttonRef: React.RefObject<HTMLElement>;\n /** Dropdown content */\n children: ReactNode;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Horizontal alignment: 'left', 'center', or 'right' */\n align?: 'left' | 'center' | 'right';\n /** Margin from the button in pixels */\n margin?: number;\n /** Callback when clicking outside the dropdown */\n onClickOutside?: (event: MouseEvent) => void;\n /** Callback to stop propagation on dropdown click */\n onClick?: (e: React.MouseEvent) => void;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n/**\n * PositionedDropdown Component\n *\n * Automatically positions a dropdown above or below the trigger button\n * based on available viewport space.\n */\nexport function PositionedDropdown({\n isOpen,\n buttonRef,\n children,\n className,\n style,\n align = 'left',\n margin = 8,\n onClickOutside,\n onClick,\n 'data-testid': dataTestId,\n}: PositionedDropdownProps): React.ReactElement | null {\n const [position, setPosition] = useState<'top' | 'bottom'>('top');\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Calculate position (top or bottom) based on available space\n useEffect(() => {\n if (!isOpen || !buttonRef.current) return;\n\n const checkPosition = (): void => {\n if (!dropdownRef.current || !buttonRef.current) return;\n\n const buttonRect = buttonRef.current.getBoundingClientRect();\n const dropdownHeight = dropdownRef.current.offsetHeight || 300; // Fallback estimate\n const newPosition = calculateVerticalPositionFromRect(buttonRect, dropdownHeight, margin);\n setPosition(newPosition);\n };\n\n // Check immediately and after DOM updates\n checkPosition();\n const rafId = requestAnimationFrame(() => {\n checkPosition();\n });\n\n return () => cancelAnimationFrame(rafId);\n }, [isOpen, buttonRef, margin]);\n\n // Handle click outside\n useEffect(() => {\n if (!isOpen || !onClickOutside) return;\n\n const handleClickOutside = (event: MouseEvent): void => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n buttonRef.current &&\n !buttonRef.current.contains(event.target as Node)\n ) {\n onClickOutside(event);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, onClickOutside, buttonRef]);\n\n if (!isOpen) return null;\n\n // Calculate horizontal alignment\n const getHorizontalStyle = (): React.CSSProperties => {\n switch (align) {\n case 'center':\n return {\n left: '50%',\n transform: 'translateX(-50%)',\n };\n case 'right':\n return {\n right: 0,\n };\n case 'left':\n default:\n return {\n left: 0,\n };\n }\n };\n\n return (\n <div\n ref={dropdownRef}\n className={className}\n data-testid={dataTestId}\n style={{\n position: 'absolute',\n ...(position === 'top'\n ? {\n bottom: '100%',\n marginBottom: `${margin}px`,\n }\n : {\n top: '100%',\n marginTop: `${margin}px`,\n }),\n ...getHorizontalStyle(),\n ...style,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onClick?.(e);\n }}\n >\n {children}\n </div>\n );\n}\n\n","/**\n * Turn Into Button Component\n *\n * Allows converting the current block to different block types.\n */\n\nimport React, { useRef, useCallback, useMemo } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { cn, tokens, dropdownSectionHeaderStyle } from '../theme';\nimport { getLabelWithShortcut } from '../a11y';\nimport { useLocale } from '../LocaleContext';\nimport { PositionedDropdown } from '../PositionedDropdown';\nimport { ToolbarButton } from './ToolbarButton';\nimport {\n TextIcon,\n H1Icon,\n H2Icon,\n H3Icon,\n BulletListIcon,\n OrderedListIcon,\n ChevronDownIcon,\n} from './icons';\n\nexport interface TurnIntoButtonProps {\n editor: Editor;\n isOpen: boolean;\n onToggle: () => void;\n onClose: () => void;\n}\n\nexport interface BlockTypeOption {\n id: string;\n label: string;\n icon: React.ReactNode;\n action: (editor: Editor) => void;\n isActive: (editor: Editor) => boolean;\n}\n\nexport function TurnIntoButton({ editor, isOpen, onToggle, onClose }: TurnIntoButtonProps): React.ReactElement {\n const locale = useLocale();\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Get current block type\n const getCurrentBlockType = useCallback((): string => {\n if (editor.isActive('heading', { level: 1 })) return 'heading1';\n if (editor.isActive('heading', { level: 2 })) return 'heading2';\n if (editor.isActive('heading', { level: 3 })) return 'heading3';\n if (editor.isActive('bulletList')) return 'bulletList';\n if (editor.isActive('orderedList')) return 'orderedList';\n if (editor.isActive('taskList')) return 'taskList';\n if (editor.isActive('blockquote')) return 'blockquote';\n if (editor.isActive('codeBlock')) return 'codeBlock';\n return 'paragraph';\n }, [editor]);\n\n // Block type options\n const blockOptions: BlockTypeOption[] = useMemo(\n () => [\n {\n id: 'paragraph',\n label: locale.toolbar.blockTypes.text,\n icon: <TextIcon />,\n action: (ed) => ed.chain().focus().setParagraph().run(),\n isActive: (ed) => ed.isActive('paragraph'),\n },\n {\n id: 'heading1',\n label: locale.toolbar.blockTypes.heading1,\n icon: <H1Icon />,\n action: (ed) => ed.chain().focus().setHeading({ level: 1 }).run(),\n isActive: (ed) => ed.isActive('heading', { level: 1 }),\n },\n {\n id: 'heading2',\n label: locale.toolbar.blockTypes.heading2,\n icon: <H2Icon />,\n action: (ed) => ed.chain().focus().setHeading({ level: 2 }).run(),\n isActive: (ed) => ed.isActive('heading', { level: 2 }),\n },\n {\n id: 'heading3',\n label: locale.toolbar.blockTypes.heading3,\n icon: <H3Icon />,\n action: (ed) => ed.chain().focus().setHeading({ level: 3 }).run(),\n isActive: (ed) => ed.isActive('heading', { level: 3 }),\n },\n {\n id: 'bulletList',\n label: locale.toolbar.blockTypes.bulletedList,\n icon: <BulletListIcon />,\n action: (ed) => ed.chain().focus().toggleBulletList().run(),\n isActive: (ed) => ed.isActive('bulletList'),\n },\n {\n id: 'orderedList',\n label: locale.toolbar.blockTypes.numberedList,\n icon: <OrderedListIcon />,\n action: (ed) => ed.chain().focus().toggleOrderedList().run(),\n isActive: (ed) => ed.isActive('orderedList'),\n },\n ],\n [locale]\n );\n\n const currentBlockType = getCurrentBlockType();\n const currentOption = blockOptions.find((opt) => opt.id === currentBlockType);\n\n const handleOptionClick = useCallback(\n (option: BlockTypeOption) => {\n option.action(editor);\n onClose();\n // Clear selection to close toolbar after switching block type\n setTimeout(() => {\n editor.chain().blur().run();\n }, 0);\n },\n [editor, onClose]\n );\n\n // Get short label for button (use locale block types)\n const getShortLabel = (label: string): string => {\n if (label === locale.toolbar.blockTypes.heading1) return locale.toolbar.blockTypes.heading1;\n if (label === locale.toolbar.blockTypes.heading2) return locale.toolbar.blockTypes.heading2;\n if (label === locale.toolbar.blockTypes.heading3) return locale.toolbar.blockTypes.heading3;\n if (label === locale.toolbar.blockTypes.bulletedList) return locale.toolbar.blockTypes.bulletedList;\n if (label === locale.toolbar.blockTypes.numberedList) return locale.toolbar.blockTypes.numberedList;\n return locale.toolbar.blockTypes.text;\n };\n\n return (\n <div style={{ position: 'relative' }}>\n <ToolbarButton\n ref={buttonRef}\n active={isOpen}\n onClick={onToggle}\n data-tooltip={getLabelWithShortcut(locale.toolbar.turnInto)}\n data-testid=\"toolbar-turnInto\"\n aria-label={locale.aria.turnIntoButton}\n style={{ width: 'auto', minWidth: 'auto', padding: '0 8px', height: 'var(--pubwave-button-height, 28px)' }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', whiteSpace: 'nowrap' }}>\n <span style={{ fontSize: '12px', fontWeight: 500 }}>\n {currentOption ? getShortLabel(currentOption.label) : locale.toolbar.blockTypes.text}\n </span>\n <ChevronDownIcon />\n </span>\n </ToolbarButton>\n\n <PositionedDropdown\n isOpen={isOpen}\n buttonRef={buttonRef}\n align=\"left\"\n margin={8}\n onClickOutside={() => onClose()}\n className=\"pubwave-turn-into-dropdown\"\n data-testid=\"turn-into-dropdown\"\n style={{\n backgroundColor: 'var(--pubwave-surface, var(--pubwave-bg))',\n border: '1px solid var(--pubwave-border)',\n borderRadius: 'var(--pubwave-radius-lg, 8px)',\n boxShadow: 'var(--pubwave-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05))',\n padding: 'var(--pubwave-spacing-1, 4px)',\n minWidth: '240px',\n zIndex: tokens.zIndex.dropdown + 1,\n }}\n >\n <div style={dropdownSectionHeaderStyle}>\n {locale.toolbar.turnInto}\n </div>\n {blockOptions.map((option) => {\n const active = option.isActive(editor);\n return (\n <button\n key={option.id}\n type=\"button\"\n className={cn(\n 'pubwave-toolbar__turn-into-option',\n active && 'pubwave-toolbar__turn-into-option--active'\n )}\n onClick={() => handleOptionClick(option)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--pubwave-spacing-2, 8px)',\n padding: 'var(--pubwave-spacing-2, 8px) var(--pubwave-spacing-3, 12px)',\n border: 'none',\n backgroundColor: active\n ? 'var(--pubwave-primary-faded)'\n : 'transparent',\n color: active\n ? 'var(--pubwave-primary)'\n : 'var(--pubwave-text)',\n cursor: 'pointer',\n fontSize: 'var(--pubwave-font-size-base, 14px)',\n textAlign: 'left',\n borderRadius: 'var(--pubwave-border-radius-sm, 0.25rem)',\n transition: 'background-color 0.1s ease',\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '18px',\n height: '18px',\n flexShrink: 0,\n }}\n >\n {option.icon}\n </span>\n <span>{option.label}</span>\n </button>\n );\n })}\n </PositionedDropdown>\n </div>\n );\n}\n\n","/**\n * Focus Management Utilities\n *\n * Provides predictable focus restoration after common operations.\n * Ensures a stable, non-jarring editing experience per constitution requirements.\n */\n\nimport type { Editor } from '@tiptap/core';\nimport { safeRequestAnimationFrame } from '../core/ssr';\n\n/**\n * Focus position options\n */\nexport type FocusPosition = 'start' | 'end' | 'preserve' | number;\n\n/**\n * Check if editor is valid for focus operations\n */\nfunction isValidEditor(editor: Editor | null | undefined): editor is Editor {\n return Boolean(editor && !editor.isDestroyed);\n}\n\n/**\n * Focus the editor at a specific position\n */\nexport function focusAt(editor: Editor, position: FocusPosition): void {\n if (!isValidEditor(editor)) return;\n\n safeRequestAnimationFrame(() => {\n if (!isValidEditor(editor)) return;\n\n switch (position) {\n case 'start':\n editor.commands.focus('start');\n break;\n case 'end':\n editor.commands.focus('end');\n break;\n case 'preserve':\n // Focus without changing selection\n editor.commands.focus();\n break;\n default:\n // Focus at specific position\n if (typeof position === 'number') {\n editor.commands.setTextSelection(position);\n editor.commands.focus();\n }\n }\n });\n}\n\n/**\n * Restore focus after a DOM operation\n *\n * Use this after operations that might cause focus loss:\n * - Modal/dialog interactions\n * - Toolbar button clicks\n * - Context menu actions\n */\nexport function restoreFocus(editor: Editor): void {\n if (!isValidEditor(editor)) return;\n\n // Use RAF to ensure DOM has settled\n safeRequestAnimationFrame(() => {\n if (!isValidEditor(editor)) return;\n\n // If editor is not focused, focus it\n if (!editor.isFocused) {\n editor.commands.focus();\n }\n });\n}\n\n/**\n * Focus the editor after a click event\n *\n * Handles edge cases where clicking on toolbar/UI elements\n * should restore focus to the editor\n */\nexport function focusAfterClick(\n editor: Editor,\n event: React.MouseEvent\n): void {\n if (!isValidEditor(editor)) return;\n\n // Prevent default to avoid losing focus\n event.preventDefault();\n\n // Restore focus after the click event bubbles\n safeRequestAnimationFrame(() => {\n if (!isValidEditor(editor)) return;\n editor.commands.focus();\n });\n}\n\n/**\n * Keep focus within the editor\n *\n * Prevents focus from escaping during common operations\n */\nexport function maintainFocus(editor: Editor): () => void {\n if (!isValidEditor(editor)) {\n return function noOp(): void {\n // No-op when editor is invalid\n };\n }\n\n const handleFocusOut = (event: FocusEvent): void => {\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n\n // If focus is moving outside the editor container, restore it\n if (relatedTarget) {\n const editorElement = editor.view.dom.closest('.pubwave-editor');\n if (editorElement && !editorElement.contains(relatedTarget)) {\n // Check if focus is moving to a toolbar or other editor UI\n const isEditorUI = relatedTarget.closest(\n '.pubwave-toolbar, .pubwave-menu, .pubwave-dialog'\n );\n\n if (!isEditorUI) {\n // Focus has left the editor area completely\n // Don't restore - user intentionally clicked elsewhere\n }\n }\n }\n };\n\n const editorElement = editor.view.dom;\n editorElement.addEventListener('focusout', handleFocusOut);\n\n return () => {\n editorElement.removeEventListener('focusout', handleFocusOut);\n };\n}\n\n/**\n * Save and restore selection state\n *\n * Useful for operations that need to temporarily change selection\n * then restore it (e.g., inserting content at cursor)\n */\nexport interface SavedSelection {\n from: number;\n to: number;\n empty: boolean;\n}\n\nexport function saveSelection(editor: Editor): SavedSelection | null {\n if (!isValidEditor(editor)) return null;\n\n const { from, to, empty } = editor.state.selection;\n return { from, to, empty };\n}\n\nexport function restoreSelection(\n editor: Editor,\n savedSelection: SavedSelection | null\n): void {\n if (!isValidEditor(editor) || !savedSelection) return;\n\n const { from, to } = savedSelection;\n const docSize = editor.state.doc.content.size;\n\n // Clamp positions to valid range\n const safeFrom = Math.min(from, docSize);\n const safeTo = Math.min(to, docSize);\n\n editor.commands.setTextSelection({ from: safeFrom, to: safeTo });\n}\n\n/**\n * Handle focus for selection clear\n *\n * When selection is cleared (e.g., clicking in empty space),\n * ensure cursor is placed at a sensible position\n */\nexport function handleSelectionClear(editor: Editor): void {\n if (!isValidEditor(editor)) return;\n\n const { selection } = editor.state;\n\n // If selection is at a valid position, just focus\n if (selection.$anchor.pos > 0) {\n editor.commands.focus();\n return;\n }\n\n // If cursor is at invalid position, move to end\n editor.commands.focus('end');\n}\n\n/**\n * Create a focus trap within the editor UI\n *\n * Useful for modals/dialogs that should trap focus\n */\nexport function createFocusTrap(\n container: HTMLElement\n): { activate: () => void; deactivate: () => void } {\n const focusableElements = container.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab') return;\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n return {\n activate(): void {\n container.addEventListener('keydown', handleKeyDown);\n firstElement?.focus();\n },\n deactivate(): void {\n container.removeEventListener('keydown', handleKeyDown);\n },\n };\n}\n","/**\n * Link Button Component\n *\n * Button that opens a dropdown for adding/editing/removing links.\n */\n\nimport React, { useRef, useState, useEffect, useCallback } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport tippy, { Instance as TippyInstance } from 'tippy.js';\nimport { tokens } from '../theme';\nimport { getLabelWithShortcut } from '../a11y';\nimport { useLocale } from '../LocaleContext';\nimport { PositionedDropdown } from '../PositionedDropdown';\nimport { safeRequestAnimationFrame } from '../../core/ssr';\nimport { saveSelection, restoreSelection, type SavedSelection } from '../focus';\nimport type { SelectionState } from '../../core/selection';\nimport { ToolbarButton } from './ToolbarButton';\nimport { LinkIcon, ExternalLinkIcon, CheckIcon, ClearIcon } from './icons';\n\nexport interface LinkButtonProps {\n editor: Editor;\n isOpen: boolean;\n onToggle: () => void;\n onClose: () => void;\n selectionState: SelectionState | null;\n}\n\nexport function LinkButton({ editor, isOpen, onToggle, onClose, selectionState }: LinkButtonProps): React.ReactElement {\n const locale = useLocale();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const tippyInstancesRef = useRef<TippyInstance[]>([]);\n const savedSelectionRef = useRef<SavedSelection | null>(null);\n const [linkUrl, setLinkUrl] = useState<string>('');\n const hasLink = selectionState?.hasLink ?? false;\n const currentLinkHref = selectionState?.linkHref ?? null;\n\n // Initialize link URL when dropdown opens and save selection\n useEffect(() => {\n if (isOpen) {\n // Save selection state before opening dropdown\n savedSelectionRef.current = saveSelection(editor);\n \n if (currentLinkHref) {\n setLinkUrl(currentLinkHref);\n } else {\n setLinkUrl('');\n }\n // Focus input after a short delay to ensure dropdown is rendered\n setTimeout(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, 50);\n } else {\n // Clear saved selection when dropdown closes\n savedSelectionRef.current = null;\n }\n }, [isOpen, currentLinkHref, editor]);\n\n // Initialize tooltips for dropdown buttons\n useEffect(() => {\n if (!isOpen) {\n // Clean up tooltips when dropdown is closed\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n return;\n }\n\n // Clean up previous instances\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n\n // Use requestAnimationFrame to ensure dropdown and conditional buttons are rendered\n safeRequestAnimationFrame(() => {\n safeRequestAnimationFrame(() => {\n if (!dropdownRef.current) return;\n\n // Find all buttons with data-tooltip attribute in the dropdown\n const buttons = dropdownRef.current.querySelectorAll<HTMLElement>('[data-tooltip]');\n \n buttons.forEach((button) => {\n const tooltipText = button.getAttribute('data-tooltip');\n if (tooltipText) {\n const instance = tippy(button, {\n content: tooltipText,\n placement: 'top',\n delay: [300, 0],\n duration: [200, 150],\n theme: 'light-border',\n });\n tippyInstancesRef.current.push(instance);\n }\n });\n });\n });\n\n // Cleanup on unmount or when dropdown closes\n return () => {\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n };\n }, [isOpen, locale, linkUrl, currentLinkHref]);\n\n const handleSubmit = useCallback((e?: React.FormEvent): void => {\n e?.preventDefault();\n if (!linkUrl.trim()) {\n // If empty, remove link\n // First restore selection if we have a saved one\n if (savedSelectionRef.current) {\n restoreSelection(editor, savedSelectionRef.current);\n }\n // Then remove the link\n editor.chain().focus().unsetLink().run();\n // Restore selection again after operation\n if (savedSelectionRef.current) {\n safeRequestAnimationFrame(() => {\n safeRequestAnimationFrame(() => {\n restoreSelection(editor, savedSelectionRef.current);\n });\n });\n }\n onClose();\n return;\n }\n\n // Normalize URL (add protocol if missing)\n let normalizedUrl = linkUrl.trim();\n if (!/^https?:\\/\\//i.test(normalizedUrl) && !normalizedUrl.startsWith('/') && !normalizedUrl.startsWith('#')) {\n normalizedUrl = `https://${normalizedUrl}`;\n }\n\n // First restore selection if we have a saved one\n if (savedSelectionRef.current) {\n restoreSelection(editor, savedSelectionRef.current);\n }\n // Then set the link\n editor.chain().focus().setLink({ href: normalizedUrl }).run();\n // Restore selection again after operation\n if (savedSelectionRef.current) {\n safeRequestAnimationFrame(() => {\n safeRequestAnimationFrame(() => {\n restoreSelection(editor, savedSelectionRef.current);\n });\n });\n }\n onClose();\n }, [editor, linkUrl, onClose]);\n\n const handleOpenLink = useCallback((): void => {\n const urlToOpen = linkUrl.trim() || currentLinkHref;\n if (urlToOpen) {\n // Normalize URL if needed\n let normalizedUrl = urlToOpen;\n if (!/^https?:\\/\\//i.test(normalizedUrl) && !normalizedUrl.startsWith('/') && !normalizedUrl.startsWith('#')) {\n normalizedUrl = `https://${normalizedUrl}`;\n }\n window.open(normalizedUrl, '_blank', 'noopener,noreferrer');\n }\n }, [linkUrl, currentLinkHref]);\n\n const handleClear = useCallback((): void => {\n setLinkUrl('');\n inputRef.current?.focus();\n }, []);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n editor.chain().focus().run();\n }\n }, [handleSubmit, onClose, editor]);\n\n return (\n <div style={{ position: 'relative' }}>\n <ToolbarButton\n ref={buttonRef}\n active={hasLink}\n onClick={onToggle}\n data-tooltip={getLabelWithShortcut(locale.toolbar.link)}\n data-testid=\"toolbar-link\"\n aria-label={locale.aria.linkButton}\n >\n <LinkIcon />\n </ToolbarButton>\n\n <PositionedDropdown\n isOpen={isOpen}\n buttonRef={buttonRef}\n align=\"left\"\n margin={8}\n onClickOutside={() => onClose()}\n className=\"pubwave-link-dropdown\"\n style={{\n backgroundColor: 'var(--pubwave-surface, var(--pubwave-bg))',\n border: '1px solid var(--pubwave-border)',\n borderRadius: 'var(--pubwave-radius-lg, 8px)',\n boxShadow: 'var(--pubwave-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05))',\n padding: 'var(--pubwave-spacing-2, 8px)',\n minWidth: '280px',\n zIndex: tokens.zIndex.dropdown + 1,\n }}\n >\n <div ref={dropdownRef}>\n <form onSubmit={handleSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={linkUrl}\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={locale.linkPlaceholder}\n data-testid=\"link-input\"\n aria-label={locale.aria.linkUrlInput}\n style={{\n flex: 1,\n padding: '6px 100px 6px 8px',\n border: '1px solid var(--pubwave-border)',\n borderRadius: 'var(--pubwave-radius-sm, 4px)',\n fontSize: 'var(--pubwave-font-size-base, 14px)',\n backgroundColor: 'var(--pubwave-bg)',\n color: 'var(--pubwave-text)',\n outline: 'none',\n }}\n />\n <div style={{ position: 'absolute', right: '4px', display: 'flex', alignItems: 'center', gap: '2px' }}>\n <button\n type=\"button\"\n onClick={handleSubmit}\n data-tooltip={locale.toolbar.confirmLink}\n data-testid=\"link-confirm-button\"\n aria-label={locale.aria.linkConfirmButton}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: 'var(--pubwave-radius-sm, 4px)',\n backgroundColor: 'transparent',\n color: 'var(--pubwave-text)',\n cursor: 'pointer',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--pubwave-hover, rgba(0, 0, 0, 0.05))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <CheckIcon />\n </button>\n {(linkUrl.trim() || currentLinkHref) && (\n <button\n type=\"button\"\n onClick={handleOpenLink}\n data-tooltip={locale.toolbar.openLink}\n data-testid=\"link-open-button\"\n aria-label={locale.aria.linkOpenButton}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: 'var(--pubwave-radius-sm, 4px)',\n backgroundColor: 'transparent',\n color: 'var(--pubwave-text)',\n cursor: 'pointer',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--pubwave-hover, rgba(0, 0, 0, 0.05))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <ExternalLinkIcon />\n </button>\n )}\n <button\n type=\"button\"\n onClick={handleClear}\n data-tooltip={locale.toolbar.clearLink}\n data-testid=\"link-clear-button\"\n aria-label={locale.aria.linkClearButton}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: 'var(--pubwave-radius-sm, 4px)',\n backgroundColor: 'transparent',\n color: 'var(--pubwave-text)',\n cursor: 'pointer',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--pubwave-hover, rgba(0, 0, 0, 0.05))';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <ClearIcon />\n </button>\n </div>\n </div>\n </form>\n </div>\n </PositionedDropdown>\n </div>\n );\n}\n\n","/**\n * Color Picker Component\n *\n * A color picker with:\n * - Recently used colors\n * - Text color options\n * - Background color options\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport tippy, { Instance as TippyInstance } from 'tippy.js';\nimport 'tippy.js/dist/tippy.css';\nimport { tokens, dropdownSectionHeaderStyle } from './theme';\nimport { PositionedDropdown } from './PositionedDropdown';\nimport { useLocale } from './LocaleContext';\n\nexport interface ColorPickerProps {\n editor: Editor;\n onClose?: () => void;\n buttonRef?: React.RefObject<HTMLElement>;\n}\n\n// Color palettes based on the image description\nconst TEXT_COLORS = [\n { name: 'Default', value: null, color: '#1f2937' }, // Black\n { name: 'Gray', value: '#6b7280', color: '#6b7280' },\n { name: 'Brown', value: '#92400e', color: '#92400e' },\n { name: 'Orange', value: '#ea580c', color: '#ea580c' },\n { name: 'Orange Dark', value: '#c2410c', color: '#c2410c' },\n { name: 'Green', value: '#16a34a', color: '#16a34a' },\n { name: 'Blue', value: '#2563eb', color: '#2563eb' },\n { name: 'Purple', value: '#9333ea', color: '#9333ea' },\n { name: 'Pink', value: '#ec4899', color: '#ec4899' },\n { name: 'Red', value: '#dc2626', color: '#dc2626' },\n];\n\nconst BACKGROUND_COLORS = [\n { name: 'Default', value: null, color: '#ffffff' }, // White\n { name: 'Gray', value: '#f3f4f6', color: '#f3f4f6' },\n { name: 'Peach', value: '#fed7aa', color: '#fed7aa' },\n { name: 'Orange', value: '#fdba74', color: '#fdba74' },\n { name: 'Yellow', value: '#fde047', color: '#fde047' },\n { name: 'Green', value: '#86efac', color: '#86efac' },\n { name: 'Blue', value: '#93c5fd', color: '#93c5fd' },\n { name: 'Purple', value: '#c084fc', color: '#c084fc' },\n { name: 'Pink', value: '#f9a8d4', color: '#f9a8d4' },\n { name: 'Red', value: '#fca5a5', color: '#fca5a5' },\n];\n\n// Storage key for recent colors\nconst RECENT_COLORS_STORAGE_KEY = 'pubwave-editor-recent-colors';\nconst MAX_RECENT_COLORS = 5;\n\n// Load recent colors from localStorage\nfunction loadRecentColors(): Array<{ type: 'text' | 'background'; value: string }> {\n if (typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(RECENT_COLORS_STORAGE_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\n// Save recent colors to localStorage\nfunction saveRecentColors(colors: Array<{ type: 'text' | 'background'; value: string }>): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(RECENT_COLORS_STORAGE_KEY, JSON.stringify(colors));\n } catch {\n // Ignore storage errors\n }\n}\n\nexport function ColorPicker({ editor, onClose, buttonRef }: ColorPickerProps): React.ReactElement {\n const locale = useLocale();\n const [recentColors, setRecentColors] = useState<Array<{ type: 'text' | 'background'; value: string }>>([]);\n const pickerRef = useRef<HTMLDivElement>(null);\n const tippyInstancesRef = useRef<TippyInstance[]>([]);\n\n // Load recent colors from localStorage after mount (SSR-safe)\n useEffect(() => {\n const loaded = loadRecentColors();\n if (loaded.length > 0) {\n setRecentColors(loaded);\n }\n }, []);\n\n // Get current colors from selection\n const getCurrentTextColor = (): string | null => {\n try {\n const attrs = editor.getAttributes('textColor');\n return attrs?.color || null;\n } catch {\n // If mark is not active, getAttributes might throw or return empty\n return null;\n }\n };\n\n const getCurrentBackgroundColor = (): string | null => {\n try {\n const attrs = editor.getAttributes('backgroundColor');\n return attrs?.backgroundColor || null;\n } catch {\n // If mark is not active, getAttributes might throw or return empty\n return null;\n }\n };\n\n const currentTextColor = getCurrentTextColor();\n const currentBackgroundColor = getCurrentBackgroundColor();\n\n // Handle text color selection\n const handleTextColorSelect = (color: string | null): void => {\n if (color === null) {\n editor.chain().focus().unsetColor().run();\n } else {\n editor.chain().focus().setColor(color).run();\n // Add to recent colors and save to localStorage\n setRecentColors((prev) => {\n const newRecent = [{ type: 'text' as const, value: color }, ...prev.filter((c) => !(c.type === 'text' && c.value === color))];\n const limited = newRecent.slice(0, MAX_RECENT_COLORS);\n saveRecentColors(limited);\n return limited;\n });\n }\n // Don't close on selection - only close on outside click\n };\n\n // Handle background color selection\n const handleBackgroundColorSelect = (color: string | null): void => {\n if (color === null) {\n editor.chain().focus().unsetBackgroundColor().run();\n } else {\n editor.chain().focus().setBackgroundColor(color).run();\n // Add to recent colors and save to localStorage\n setRecentColors((prev) => {\n const newRecent = [{ type: 'background' as const, value: color }, ...prev.filter((c) => !(c.type === 'background' && c.value === color))];\n const limited = newRecent.slice(0, MAX_RECENT_COLORS);\n saveRecentColors(limited);\n return limited;\n });\n }\n // Don't close on selection - only close on outside click\n };\n\n\n // Initialize tooltips for all color buttons\n useEffect(() => {\n if (!pickerRef.current) return;\n\n // Clean up previous instances\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n\n // Use requestAnimationFrame to ensure DOM is updated\n requestAnimationFrame(() => {\n if (!pickerRef.current) return;\n\n // Find all buttons with data-tooltip attribute\n const buttons = pickerRef.current.querySelectorAll<HTMLElement>('[data-tooltip]');\n \n buttons.forEach((button) => {\n const tooltipText = button.getAttribute('data-tooltip');\n if (tooltipText) {\n const instance = tippy(button, {\n content: tooltipText,\n placement: 'top',\n delay: [300, 0],\n duration: [200, 150],\n theme: 'light-border',\n });\n tippyInstancesRef.current.push(instance);\n }\n });\n });\n\n // Cleanup on unmount\n return () => {\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n };\n }, [recentColors, currentTextColor, currentBackgroundColor, locale]);\n\n\n return (\n <PositionedDropdown\n isOpen={true}\n buttonRef={buttonRef!}\n align=\"center\"\n margin={8}\n onClickOutside={() => onClose?.()}\n className=\"pubwave-color-picker\"\n data-testid=\"color-picker\"\n style={{\n backgroundColor: 'var(--pubwave-bg, #ffffff)',\n border: '1px solid var(--pubwave-border, #e5e7eb)',\n borderRadius: 'var(--pubwave-radius-lg, 8px)',\n boxShadow: 'var(--pubwave-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1))',\n padding: '12px',\n minWidth: '240px',\n zIndex: tokens.zIndex.dropdown + 1,\n }}\n >\n <div ref={pickerRef}>\n {/* Recently used colors */}\n {recentColors.length > 0 && (\n <div style={{ marginBottom: '16px' }}>\n <div\n style={{\n ...dropdownSectionHeaderStyle,\n paddingLeft: 0,\n paddingRight: 0,\n marginBottom: '8px',\n }}\n >\n {locale.toolbar.recentlyUsed}\n </div>\n <div style={{ display: 'flex', gap: '6px', flexWrap: 'wrap' }}>\n {recentColors.map((recent, index) => (\n <button\n key={`${recent.type}-${recent.value}-${index}`}\n type=\"button\"\n onClick={() => {\n if (recent.type === 'text') {\n handleTextColorSelect(recent.value);\n } else {\n handleBackgroundColorSelect(recent.value);\n }\n }}\n style={{\n width: '24px',\n height: '24px',\n borderRadius: '4px',\n border: '1px solid var(--pubwave-border, #e5e7eb)',\n backgroundColor: recent.type === 'background' ? recent.value : '#ffffff',\n cursor: 'pointer',\n padding: recent.type === 'text' ? '4px' : 0,\n display: recent.type === 'text' ? 'flex' : 'block',\n alignItems: recent.type === 'text' ? 'center' : 'normal',\n justifyContent: recent.type === 'text' ? 'center' : 'normal',\n }}\n data-tooltip={recent.type === 'text' ? `${recent.value} text` : `${recent.value} background`}\n >\n {recent.type === 'text' && (\n <span\n style={{\n fontSize: '12px',\n fontWeight: 500,\n color: recent.value,\n lineHeight: 1,\n }}\n >\n A\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Text color section */}\n <div style={{ marginBottom: '16px' }}>\n <div\n style={{\n ...dropdownSectionHeaderStyle,\n paddingLeft: 0,\n paddingRight: 0,\n marginBottom: '8px',\n }}\n >\n {locale.toolbar.textColor}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: '6px' }}>\n {TEXT_COLORS.map((colorOption) => {\n const isActive = currentTextColor === colorOption.value;\n return (\n <button\n key={colorOption.name}\n type=\"button\"\n onClick={() => handleTextColorSelect(colorOption.value)}\n style={{\n width: '100%',\n aspectRatio: '1',\n borderRadius: '4px',\n border: isActive ? '2px solid var(--pubwave-primary, #3b82f6)' : '1px solid var(--pubwave-border, #e5e7eb)',\n backgroundColor: '#ffffff',\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n data-tooltip={colorOption.value ? `${colorOption.name} text` : 'Default text'}\n >\n <span\n style={{\n fontSize: '12px',\n fontWeight: 500,\n color: colorOption.color,\n }}\n >\n A\n </span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Background color section */}\n <div>\n <div\n style={{\n ...dropdownSectionHeaderStyle,\n paddingLeft: 0,\n paddingRight: 0,\n marginBottom: '8px',\n }}\n >\n {locale.toolbar.backgroundColor}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: '6px' }}>\n {BACKGROUND_COLORS.map((colorOption) => {\n const isActive = currentBackgroundColor === colorOption.value;\n return (\n <button\n key={colorOption.name}\n type=\"button\"\n onClick={() => handleBackgroundColorSelect(colorOption.value)}\n style={{\n width: '100%',\n aspectRatio: '1',\n borderRadius: '4px',\n border: isActive ? '2px solid var(--pubwave-primary, #3b82f6)' : '1px solid var(--pubwave-border, #e5e7eb)',\n backgroundColor: colorOption.color,\n cursor: 'pointer',\n padding: 0,\n }}\n data-tooltip={colorOption.value ? `${colorOption.name} background` : 'Default background'}\n />\n );\n })}\n </div>\n </div>\n </div>\n </PositionedDropdown>\n );\n}\n\n","/**\n * Color Picker Button Component\n *\n * Button that opens a color picker dropdown for text and background colors.\n */\n\nimport React, { useRef } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { ColorPicker } from '../ColorPicker';\nimport { ToolbarButton } from './ToolbarButton';\nimport { ColorIcon } from './icons';\nimport { getLabelWithShortcut } from '../a11y';\nimport { useLocale } from '../LocaleContext';\n\nexport interface ColorPickerButtonProps {\n editor: Editor;\n isOpen: boolean;\n onToggle: () => void;\n onClose: () => void;\n}\n\nexport function ColorPickerButton({ editor, isOpen, onToggle, onClose }: ColorPickerButtonProps): React.ReactElement {\n const locale = useLocale();\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Get current colors to show in icon\n const getCurrentTextColor = (): string | null => {\n try {\n const attrs = editor.getAttributes('textColor');\n return attrs?.color || null;\n } catch {\n return null;\n }\n };\n\n const getCurrentBackgroundColor = (): string | null => {\n try {\n // First check if backgroundColor mark is active in the selection\n if (!editor.isActive('backgroundColor')) {\n return null;\n }\n const attrs = editor.getAttributes('backgroundColor');\n return attrs?.backgroundColor || null;\n } catch {\n return null;\n }\n };\n\n const currentTextColor = getCurrentTextColor();\n const currentBackgroundColor = getCurrentBackgroundColor();\n const hasColor = currentTextColor || currentBackgroundColor;\n\n // Use current text color for icon, or get theme text color from computed style\n const getThemeTextColor = (): string => {\n if (typeof window === 'undefined') return '#1f2937'; // SSR fallback\n const editor = document.querySelector('.pubwave-editor');\n if (editor) {\n const computed = window.getComputedStyle(editor);\n return computed.getPropertyValue('--pubwave-text').trim() || '#1f2937';\n }\n return '#1f2937';\n };\n const iconTextColor = currentTextColor || getThemeTextColor();\n // Use current background color for icon if it exists, otherwise transparent (default)\n const iconBackgroundColor = currentBackgroundColor;\n\n return (\n <div style={{ position: 'relative' }}>\n <ToolbarButton\n ref={buttonRef}\n active={!!hasColor}\n onClick={onToggle}\n data-tooltip={getLabelWithShortcut(locale.toolbar.textColor)}\n data-testid=\"toolbar-colorPicker\"\n aria-label={locale.aria.colorPickerButton}\n >\n <ColorIcon textColor={iconTextColor} backgroundColor={iconBackgroundColor} />\n </ToolbarButton>\n {isOpen && (\n <ColorPicker\n editor={editor}\n onClose={onClose}\n buttonRef={buttonRef}\n />\n )}\n </div>\n );\n}\n\n","/**\n * Default Toolbar Content\n *\n * Default toolbar content with basic formatting buttons.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { getLabelWithShortcut, keyboardShortcuts } from '../a11y';\nimport { useLocale } from '../LocaleContext';\nimport type { SelectionState } from '../../core/selection';\nimport { ToolbarButton, ToolbarDivider } from './ToolbarButton';\nimport { TurnIntoButton } from './TurnIntoButton';\nimport { LinkButton } from './LinkButton';\nimport { ColorPickerButton } from './ColorPickerButton';\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikeIcon,\n CodeIcon,\n} from './icons';\n\nexport interface DefaultToolbarContentProps {\n editor: Editor;\n selectionState: SelectionState | null;\n}\n\nexport function DefaultToolbarContent({\n editor,\n selectionState,\n}: DefaultToolbarContentProps): React.ReactElement {\n const locale = useLocale();\n // Manage dropdown state centrally - only one can be open at a time\n const [openDropdown, setOpenDropdown] = useState<'turnInto' | 'link' | 'colorPicker' | null>(null);\n\n const handleBold = useCallback((): void => {\n setOpenDropdown(null); // Close any open dropdown\n editor.chain().focus().toggleBold().run();\n }, [editor]);\n\n const handleItalic = useCallback((): void => {\n setOpenDropdown(null); // Close any open dropdown\n editor.chain().focus().toggleItalic().run();\n }, [editor]);\n\n const handleUnderline = useCallback((): void => {\n setOpenDropdown(null); // Close any open dropdown\n editor.chain().focus().toggleUnderline().run();\n }, [editor]);\n\n const handleStrike = useCallback((): void => {\n setOpenDropdown(null); // Close any open dropdown\n editor.chain().focus().toggleStrike().run();\n }, [editor]);\n\n const handleCode = useCallback((): void => {\n setOpenDropdown(null); // Close any open dropdown\n editor.chain().focus().toggleCode().run();\n }, [editor]);\n\n const handleTurnIntoToggle = useCallback((): void => {\n setOpenDropdown((prev) => (prev === 'turnInto' ? null : 'turnInto'));\n }, []);\n\n const handleLinkToggle = useCallback((): void => {\n setOpenDropdown((prev) => (prev === 'link' ? null : 'link'));\n }, []);\n\n const handleColorPickerToggle = useCallback((): void => {\n setOpenDropdown((prev) => (prev === 'colorPicker' ? null : 'colorPicker'));\n }, []);\n\n const isBold = selectionState?.isBold ?? false;\n const isItalic = selectionState?.isItalic ?? false;\n const isUnderline = selectionState?.isUnderline ?? false;\n const isStrike = selectionState?.isStrike ?? false;\n const isCode = selectionState?.isCode ?? false;\n\n return (\n <>\n <TurnIntoButton \n editor={editor} \n isOpen={openDropdown === 'turnInto'}\n onToggle={handleTurnIntoToggle}\n onClose={() => setOpenDropdown(null)}\n />\n <ToolbarDivider />\n <ToolbarButton\n active={isBold}\n onClick={handleBold}\n data-tooltip={getLabelWithShortcut(locale.toolbar.bold, keyboardShortcuts.bold)}\n data-testid=\"toolbar-bold\"\n aria-label={locale.aria.boldButton}\n >\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton\n active={isItalic}\n onClick={handleItalic}\n data-tooltip={getLabelWithShortcut(locale.toolbar.italic, keyboardShortcuts.italic)}\n data-testid=\"toolbar-italic\"\n aria-label={locale.aria.italicButton}\n >\n <ItalicIcon />\n </ToolbarButton>\n <ToolbarButton\n active={isUnderline}\n onClick={handleUnderline}\n data-tooltip={getLabelWithShortcut(locale.toolbar.underline, keyboardShortcuts.underline)}\n data-testid=\"toolbar-underline\"\n aria-label={locale.aria.underlineButton}\n >\n <UnderlineIcon />\n </ToolbarButton>\n <ToolbarButton\n active={isStrike}\n onClick={handleStrike}\n data-tooltip={getLabelWithShortcut(locale.toolbar.strike, keyboardShortcuts.strike)}\n data-testid=\"toolbar-strike\"\n aria-label={locale.aria.strikeButton}\n >\n <StrikeIcon />\n </ToolbarButton>\n <ToolbarButton\n active={isCode}\n onClick={handleCode}\n data-tooltip={getLabelWithShortcut(locale.toolbar.code, keyboardShortcuts.code)}\n data-testid=\"toolbar-code\"\n aria-label={locale.aria.codeButton}\n >\n <CodeIcon />\n </ToolbarButton>\n <ToolbarDivider />\n <LinkButton \n editor={editor} \n isOpen={openDropdown === 'link'}\n onToggle={handleLinkToggle}\n onClose={() => setOpenDropdown(null)}\n selectionState={selectionState}\n />\n <ColorPickerButton \n editor={editor} \n isOpen={openDropdown === 'colorPicker'}\n onToggle={handleColorPickerToggle}\n onClose={() => setOpenDropdown(null)}\n />\n </>\n );\n}\n\n","/**\n * Toolbar Position Utilities\n *\n * Functions for calculating toolbar position based on selection coordinates.\n */\n\nimport type { Editor } from '@tiptap/core';\nimport { calculateVerticalPosition } from '../positionUtils';\n\n/**\n * Toolbar position calculated relative to viewport\n */\nexport interface ToolbarPosition {\n top: number;\n left: number;\n visible: boolean;\n}\n\n/**\n * Default offset from selection bounds\n */\nexport const TOOLBAR_OFFSET = 8;\n\n/**\n * Check if editor is valid for operations\n */\nexport function isEditorReady(editor: Editor): boolean {\n return !editor.isDestroyed;\n}\n\n/**\n * Calculate toolbar position based on selection coordinates\n */\nexport function calculatePosition(\n editor: Editor,\n toolbarEl: HTMLElement | null\n): ToolbarPosition {\n if (!toolbarEl) {\n return { top: 0, left: 0, visible: false };\n }\n\n const { view } = editor;\n const { from, to } = view.state.selection;\n\n // Get the coordinates of the selection\n const start = view.coordsAtPos(from);\n const end = view.coordsAtPos(to);\n\n // Calculate selection bounds\n const selectionTop = Math.min(start.top, end.top);\n const selectionLeft = Math.min(start.left, end.left);\n const selectionRight = Math.max(start.right, end.right);\n\n // Get toolbar dimensions\n const toolbarRect = toolbarEl.getBoundingClientRect();\n const toolbarWidth = toolbarRect.width;\n const toolbarHeight = toolbarRect.height;\n\n // Position above the selection, centered\n const centerX = (selectionLeft + selectionRight) / 2;\n let left = centerX - toolbarWidth / 2;\n \n // Calculate vertical position using shared utility\n const selectionBottom = Math.max(start.bottom, end.bottom);\n const verticalPosition = calculateVerticalPosition(\n selectionTop,\n selectionBottom,\n toolbarHeight,\n TOOLBAR_OFFSET\n );\n \n let top: number;\n if (verticalPosition === 'top') {\n top = selectionTop - toolbarHeight - TOOLBAR_OFFSET;\n } else {\n top = selectionBottom + TOOLBAR_OFFSET;\n }\n\n // Clamp to viewport bounds\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n\n // Keep toolbar within horizontal viewport\n if (left < padding) {\n left = padding;\n } else if (left + toolbarWidth > viewportWidth - padding) {\n left = viewportWidth - toolbarWidth - padding;\n }\n\n // Keep toolbar within vertical viewport\n if (top < padding) {\n top = padding;\n } else if (top + toolbarHeight > viewportHeight - padding) {\n top = viewportHeight - toolbarHeight - padding;\n }\n\n return { top, left, visible: true };\n}\n\n","/**\n * Bubble Toolbar Component\n *\n * A contextual floating toolbar that appears when text is selected.\n * Follows the constitution requirement: toolbar visibility is purely selection-driven,\n * never on cursor-only state.\n *\n * Key behaviors:\n * - Appears only when text is selected (non-empty selection)\n * - Hidden immediately when selection is cleared\n * - Positioned near the selection without flicker\n * - Reflects current mark state (bold/italic/link active)\n */\n\nimport React, {\n useEffect,\n useState,\n useRef,\n useCallback,\n useMemo,\n} from 'react';\nimport type { Editor } from '@tiptap/core';\nimport tippy, { Instance as TippyInstance } from 'tippy.js';\nimport 'tippy.js/dist/tippy.css';\nimport { cn, tokens } from './theme';\nimport { ariaLabels } from './a11y';\nimport { getSelectionState, shouldShowToolbar } from '../core/selection';\nimport type { SelectionState } from '../core/selection';\nimport { safeRequestAnimationFrame } from '../core/ssr';\nimport { useLocale } from './LocaleContext';\nimport { DefaultToolbarContent } from './toolbar/DefaultToolbarContent';\nimport { calculatePosition, isEditorReady, type ToolbarPosition } from './toolbar/position';\n\n// Re-export ToolbarPosition for backward compatibility\nexport type { ToolbarPosition } from './toolbar/position';\n\nexport interface BubbleToolbarProps {\n /** The Tiptap editor instance */\n editor: Editor;\n /** Additional CSS class names */\n className?: string;\n /** Custom toolbar content (renders default if not provided) */\n children?: React.ReactNode;\n /** Callback when toolbar visibility changes */\n onVisibilityChange?: (visible: boolean) => void;\n}\n\n/**\n * BubbleToolbar - Selection-driven floating toolbar\n */\nexport function BubbleToolbar({\n editor,\n className,\n children,\n onVisibilityChange,\n}: BubbleToolbarProps): React.ReactElement | null {\n const toolbarRef = useRef<HTMLDivElement>(null);\n const isMouseDownRef = useRef(false);\n const lastMouseUpTimeRef = useRef(0);\n const mouseDownInEditorRef = useRef(false);\n const [position, setPosition] = useState<ToolbarPosition>({\n top: 0,\n left: 0,\n visible: false,\n });\n const [selectionState, setSelectionState] = useState<SelectionState | null>(\n null\n );\n const [allowShow, setAllowShow] = useState(false);\n const tippyInstancesRef = useRef<TippyInstance[]>([]);\n\n // Track whether toolbar should be visible\n const shouldShow = useMemo(() => {\n if (!isEditorReady(editor)) return false;\n // Only show if mouse is up and we allow showing\n if (isMouseDownRef.current || !allowShow) return false;\n // Depend on selectionState to trigger recalculation\n void selectionState;\n return shouldShowToolbar(editor);\n }, [editor, selectionState, allowShow]);\n\n // Update selection state when editor selection changes\n const updateSelectionState = useCallback((): void => {\n if (!isEditorReady(editor)) return;\n\n const newState = getSelectionState(editor);\n setSelectionState(newState);\n }, [editor]);\n\n // Update position when selection changes\n const updatePosition = useCallback((): void => {\n if (!shouldShow || !toolbarRef.current) {\n setPosition((prev) => ({ ...prev, visible: false }));\n return;\n }\n\n safeRequestAnimationFrame(() => {\n if (!isEditorReady(editor)) return;\n\n const newPosition = calculatePosition(editor, toolbarRef.current);\n setPosition(newPosition);\n });\n }, [editor, shouldShow]);\n\n // Track mouse down/up events\n useEffect(() => {\n if (!isEditorReady(editor)) return;\n\n const editorElement = editor.view.dom;\n const editorContainer = editorElement.closest('.pubwave-editor') as HTMLElement | null;\n\n const handleMouseDown = (e: MouseEvent): void => {\n // Check if mouse down is inside toolbar - if so, don't hide it\n const target = e.target as HTMLElement | null;\n const toolbarElement = toolbarRef.current;\n if (toolbarElement && target && toolbarElement.contains(target)) {\n // Click is inside toolbar, don't hide it\n isMouseDownRef.current = false;\n return;\n }\n\n // Check if mouse down is inside editor\n if (editorContainer && target && editorContainer.contains(target)) {\n mouseDownInEditorRef.current = true;\n } else {\n mouseDownInEditorRef.current = false;\n }\n \n isMouseDownRef.current = true;\n setAllowShow(false); // Hide toolbar immediately when mouse is pressed\n };\n\n const handleMouseUp = (e: MouseEvent): void => {\n const now = Date.now();\n const timeSinceLastUp = now - lastMouseUpTimeRef.current;\n const isDoubleClick = timeSinceLastUp < 300;\n lastMouseUpTimeRef.current = now;\n\n // Check if mouse up is inside toolbar - if so, don't process it\n const target = e.target as HTMLElement | null;\n const toolbarElement = toolbarRef.current;\n if (toolbarElement && target && toolbarElement.contains(target)) {\n // Click is inside toolbar, keep it visible\n isMouseDownRef.current = false;\n return;\n }\n\n isMouseDownRef.current = false;\n\n // Only check selection if mouse was down in editor\n if (!mouseDownInEditorRef.current) {\n setAllowShow(false);\n return;\n }\n\n // After mouse up, wait a bit for selection to complete, then check\n // For double-click, wait a bit longer to ensure the selection from double-click is finalized\n const delay = isDoubleClick ? 100 : 10;\n setTimeout(() => {\n if (!isEditorReady(editor)) return;\n \n // Check if there's actual selected content (even after double-click)\n if (shouldShowToolbar(editor)) {\n updateSelectionState();\n setAllowShow(true);\n safeRequestAnimationFrame(() => {\n updatePosition();\n });\n } else {\n setAllowShow(false);\n setPosition((prev) => ({ ...prev, visible: false }));\n }\n }, delay);\n };\n\n // Listen to mouse events on document\n document.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [editor, updateSelectionState, updatePosition]);\n\n // Subscribe to editor updates (only when mouse is up)\n useEffect(() => {\n if (!isEditorReady(editor)) return;\n\n // Initial state\n updateSelectionState();\n\n // Listen for selection and transaction updates\n const handleUpdate = (): void => {\n // Only update if mouse is not pressed and we allow showing\n if (!isMouseDownRef.current && allowShow) {\n updateSelectionState();\n }\n };\n\n const handleSelectionUpdate = (): void => {\n // Only update if mouse is not pressed\n if (!isMouseDownRef.current) {\n updateSelectionState();\n // Check if we should show toolbar based on current selection\n if (shouldShowToolbar(editor)) {\n setAllowShow(true);\n } else {\n setAllowShow(false);\n }\n // Delay position update to ensure DOM is ready\n safeRequestAnimationFrame(() => {\n updatePosition();\n });\n }\n };\n\n const handleBlur = (): void => {\n // Don't hide toolbar if focus moved to toolbar\n // Use setTimeout to check if focus is now on toolbar\n setTimeout(() => {\n const activeElement = document.activeElement;\n const toolbarElement = toolbarRef.current;\n if (toolbarElement && activeElement && toolbarElement.contains(activeElement)) {\n // Focus is on toolbar, don't hide it\n return;\n }\n // Hide toolbar when editor loses focus\n setAllowShow(false);\n handleUpdate();\n }, 0);\n };\n\n editor.on('update', handleUpdate);\n editor.on('selectionUpdate', handleSelectionUpdate);\n editor.on('focus', handleSelectionUpdate);\n editor.on('blur', handleBlur);\n\n return () => {\n editor.off('update', handleUpdate);\n editor.off('selectionUpdate', handleSelectionUpdate);\n editor.off('focus', handleSelectionUpdate);\n editor.off('blur', handleBlur);\n };\n }, [editor, updateSelectionState, updatePosition, allowShow]);\n\n // Update position when shouldShow changes\n useEffect(() => {\n updatePosition();\n onVisibilityChange?.(shouldShow);\n }, [shouldShow, updatePosition, onVisibilityChange]);\n\n // Handle window resize and scroll\n useEffect(() => {\n if (!shouldShow) return;\n\n const handleReposition = (): void => {\n updatePosition();\n };\n\n window.addEventListener('resize', handleReposition);\n window.addEventListener('scroll', handleReposition, true);\n\n return () => {\n window.removeEventListener('resize', handleReposition);\n window.removeEventListener('scroll', handleReposition, true);\n };\n }, [shouldShow, updatePosition]);\n\n // Get locale for tooltip re-initialization\n const locale = useLocale();\n\n // Initialize tooltips for all toolbar buttons\n useEffect(() => {\n if (!shouldShow || !position.visible || !toolbarRef.current) {\n // Clean up tooltips when toolbar is hidden\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n return;\n }\n\n // Clean up previous instances\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n\n // Use requestAnimationFrame to ensure DOM is updated with new locale values\n safeRequestAnimationFrame(() => {\n if (!toolbarRef.current) return;\n\n // Find all buttons with data-tooltip attribute\n const buttons = toolbarRef.current.querySelectorAll<HTMLElement>('[data-tooltip]');\n \n buttons.forEach((button) => {\n const tooltipText = button.getAttribute('data-tooltip');\n if (tooltipText) {\n const instance = tippy(button, {\n content: tooltipText,\n placement: 'top',\n delay: [300, 0],\n duration: [200, 150],\n theme: 'light-border',\n });\n tippyInstancesRef.current.push(instance);\n }\n });\n });\n\n // Cleanup on unmount or when toolbar hides\n return () => {\n tippyInstancesRef.current.forEach((instance) => instance.destroy());\n tippyInstancesRef.current = [];\n };\n }, [shouldShow, position.visible, locale]);\n\n // Don't render anything if editor is not ready\n if (!isEditorReady(editor)) {\n return null;\n }\n\n // Render toolbar (hidden initially for position calculation)\n return (\n <div\n ref={toolbarRef}\n className={cn(\n 'pubwave-toolbar',\n shouldShow && position.visible\n ? 'pubwave-toolbar--visible'\n : 'pubwave-toolbar--hidden',\n className\n )}\n style={{\n position: 'fixed',\n top: position.top,\n left: position.left,\n zIndex: tokens.zIndex.toolbar,\n opacity: shouldShow && position.visible ? 1 : 0,\n pointerEvents: shouldShow && position.visible ? 'auto' : 'none',\n transform:\n shouldShow && position.visible\n ? 'translateY(0)'\n : 'translateY(4px)',\n transition: `opacity ${tokens.transition.fast}, transform ${tokens.transition.fast}`,\n // Ensure toolbar is above editor container and can receive clicks\n isolation: 'isolate',\n }}\n role=\"toolbar\"\n aria-label={ariaLabels.toolbar}\n aria-hidden={!shouldShow || !position.visible}\n data-testid=\"bubble-toolbar\"\n >\n <div\n className=\"pubwave-toolbar__content\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 0,\n padding: 'var(--pubwave-spacing-1, 4px)',\n backgroundColor: 'var(--pubwave-surface, var(--pubwave-bg))',\n color: 'var(--pubwave-text)',\n border: '1px solid var(--pubwave-border)',\n borderRadius: 'var(--pubwave-radius-lg, 8px)',\n boxShadow: 'var(--pubwave-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05))',\n }}\n >\n {children ?? (\n <DefaultToolbarContent\n editor={editor}\n selectionState={selectionState}\n />\n )}\n </div>\n </div>\n );\n}\n\nexport default BubbleToolbar;\n","/**\n * Block Handle Component\n *\n * A Notion-style block handle with:\n * - \"+\" button to add new blocks (opens slash menu)\n * - \"⋮⋮\" grip button for drag & drop\n *\n * Appears on the left side of blocks when hovered.\n */\n\nimport React, { useEffect, useRef, useCallback, useState } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { tokens } from '../theme';\nimport { startDrag, findBlockAtPos } from '../../core/plugins/dnd';\n\nexport interface BlockHandleProps {\n /** The Tiptap editor instance */\n editor: Editor;\n}\n\n/**\n * Find the closest block-level element from mouse position\n */\n/**\n * Find the innermost block element from mouse position\n */\nfunction getClosestBlock(target: EventTarget | null, proseMirror: HTMLElement, editor: Editor): HTMLElement | null {\n if (!target || !(target instanceof Node)) return null;\n\n try {\n // Get position in the document from DOM element\n const pos = editor.view.posAtDOM(target as Node, 0);\n const $pos = editor.state.doc.resolve(pos);\n\n // 1. Check if we are inside a top-level container (List or Blockquote)\n if ($pos.depth >= 1) {\n const topNode = $pos.node(1);\n const containerTypes = ['taskList', 'bulletList', 'orderedList', 'blockquote'];\n if (containerTypes.includes(topNode.type.name)) {\n const containerDom = editor.view.nodeDOM($pos.before(1)) as HTMLElement | null;\n if (containerDom && proseMirror.contains(containerDom)) {\n return containerDom;\n }\n }\n }\n\n // 2. Otherwise, walk from innermost depth towards root to find the first block node\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.isBlock) {\n const blockPos = $pos.before(d);\n // Map back to DOM element\n const blockDom = editor.view.nodeDOM(blockPos) as HTMLElement | null;\n if (blockDom && proseMirror.contains(blockDom)) {\n return blockDom;\n }\n }\n }\n } catch (err) {\n // Fallback for simple DOM-based approach\n let current: HTMLElement | null = target instanceof HTMLElement ? target : target.parentElement;\n while (current && current.parentElement) {\n if (current.parentElement === proseMirror) {\n return current;\n }\n current = current.parentElement;\n }\n }\n\n return null;\n}\n\n/**\n * BlockHandle Component - Notion-style block controls\n */\nexport function BlockHandle({ editor }: BlockHandleProps): React.ReactElement | null {\n const containerRef = useRef<HTMLDivElement>(null);\n const currentBlockRef = useRef<HTMLElement | null>(null);\n const isDraggingRef = useRef(false);\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [visible, setVisible] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [position, setPosition] = useState({ top: 0 });\n\n // Position the handle next to the current block (relative to editor container)\n const updatePosition = useCallback(() => {\n const container = containerRef.current;\n const block = currentBlockRef.current;\n if (!container || !block) return;\n\n // Get the editor container (parent of ProseMirror)\n const editorContainer = container.closest('.pubwave-editor') as HTMLElement | null;\n if (!editorContainer) return;\n\n const editorRect = editorContainer.getBoundingClientRect();\n\n // Calculate vertical position (aligned to top of block)\n // Try to get line-height for better alignment with the first line of text\n let offset = 14; // Default fallback (half of standard line height approx)\n\n let target = block;\n // For container blocks (lists, blockquotes), align with the first child (e.g. the first list item)\n if (['UL', 'OL', 'BLOCKQUOTE'].includes(block.tagName) && block.firstElementChild instanceof HTMLElement) {\n target = block.firstElementChild as HTMLElement;\n }\n const targetRect = target.getBoundingClientRect();\n\n try {\n const style = window.getComputedStyle(target);\n const lineHeightStr = style.lineHeight;\n if (lineHeightStr && lineHeightStr !== 'normal') {\n const lineHeight = parseFloat(lineHeightStr);\n if (!isNaN(lineHeight)) {\n offset = lineHeight / 2;\n }\n } else {\n // If normal, estimate based on font size\n const fontSize = parseFloat(style.fontSize);\n if (!isNaN(fontSize)) {\n offset = (fontSize * 1.5) / 2;\n }\n }\n } catch (e) {\n // Fallback\n }\n\n // Adjust for some specific block types like headings that might have different internal padding\n // For now, computed line-height should handle headings reasonably well\n\n // Position relative to the editor container\n const top = targetRect.top - editorRect.top + offset;\n\n setPosition({ top });\n }, []);\n\n // Show handle for a block\n const showHandle = useCallback((block: HTMLElement) => {\n currentBlockRef.current = block;\n setVisible(true);\n // Use setTimeout to ensure DOM is ready and layout is stable\n setTimeout(updatePosition, 0);\n }, [updatePosition]);\n\n // Hide handle\n const hideHandle = useCallback(() => {\n if (!isDraggingRef.current) {\n currentBlockRef.current = null;\n setVisible(false);\n }\n }, []);\n\n // Clear hide timeout helper\n const clearHideTimeout = useCallback((): void => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }, []);\n\n // Handle mouse tracking - use mouseover/mouseout for better performance\n useEffect(() => {\n const proseMirror = editor.view.dom;\n const editorContainer = proseMirror.closest('.pubwave-editor') as HTMLElement | null;\n if (!editorContainer) return;\n\n const onMouseOver = (e: MouseEvent): void => {\n if (isDraggingRef.current) return;\n\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n // Clear pending hide\n clearHideTimeout();\n\n // If mouse is over the handle itself, do nothing (keep it visible)\n if (target.closest('.pubwave-block-handle')) {\n return;\n }\n\n // Only process blocks within ProseMirror (not the handle)\n if (!proseMirror.contains(target)) {\n return;\n }\n\n const block = getClosestBlock(target, proseMirror, editor);\n if (block) {\n // If moving between children of the same block (e.g. list items), \n // getClosestBlock returns the same parent (UL).\n // We only need to trigger showHandle if the block reference changes\n // OR if we want to ensure position is correct (though position shouldn't change for same block)\n\n if (block !== currentBlockRef.current) {\n showHandle(block);\n } else {\n // If hovering same block, just keep it visible\n setVisible(true);\n }\n }\n };\n\n const onMouseOut = (e: MouseEvent): void => {\n if (isDraggingRef.current) return;\n\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n\n // If no related target, mouse left the window\n if (!relatedTarget) {\n clearHideTimeout();\n hideTimeoutRef.current = setTimeout(() => {\n hideHandle();\n }, 150);\n return;\n }\n\n // Check if moving to the handle itself or any of its children\n if (relatedTarget.closest('.pubwave-block-handle')) {\n return;\n }\n\n // Check if still inside ProseMirror\n // Note: we might be moving from LI to another LI in same UL.\n // getClosestBlock for relatedTarget will return the same UL.\n // So we shouldn't hide if we are still in the same top-level block.\n\n if (proseMirror.contains(relatedTarget)) {\n // Check if we are still strictly inside the editor\n // But we might have left the \"current block\".\n // Let onMouseOver handle the switch.\n return;\n }\n\n // Check if still inside editor container\n if (relatedTarget.closest('.pubwave-editor')) {\n return;\n }\n\n // Mouse left the editor entirely\n clearHideTimeout();\n hideTimeoutRef.current = setTimeout(() => {\n hideHandle();\n }, 150);\n };\n\n proseMirror.addEventListener('mouseover', onMouseOver);\n proseMirror.addEventListener('mouseout', onMouseOut);\n\n // Hide handle when user starts typing (distraction-free writing)\n // Hide handle when user starts typing (distraction-free writing)\n // Only hide if the document actually changed to avoid hiding on clicks/selection\n const handleTransaction = ({ transaction }: { transaction: any }) => {\n if (transaction.docChanged && !isDraggingRef.current) {\n hideHandle();\n }\n };\n\n editor.on('transaction', handleTransaction);\n\n return () => {\n proseMirror.removeEventListener('mouseover', onMouseOver);\n proseMirror.removeEventListener('mouseout', onMouseOut);\n editor.off('transaction', handleTransaction);\n clearHideTimeout();\n };\n }, [editor, showHandle, hideHandle, clearHideTimeout]);\n\n // Handle scroll - update position\n useEffect(() => {\n if (!visible) return;\n\n const onScroll = () => {\n if (currentBlockRef.current) {\n updatePosition();\n }\n };\n\n window.addEventListener('scroll', onScroll, true);\n return () => window.removeEventListener('scroll', onScroll, true);\n }, [visible, updatePosition]);\n\n // Handle add block click - insert paragraph and focus\n const handleAdd = useCallback(() => {\n const block = currentBlockRef.current;\n if (!block) return;\n\n try {\n // Get the position after this block\n const pos = editor.view.posAtDOM(block, 0);\n const resolvedPos = editor.state.doc.resolve(pos);\n // Find the top-level block\n let blockPos = pos;\n for (let i = resolvedPos.depth; i > 0; i--) {\n const node = resolvedPos.node(i);\n if (node.isBlock) {\n blockPos = resolvedPos.start(i);\n break;\n }\n }\n const afterBlockPos = editor.state.doc.resolve(blockPos);\n const after = afterBlockPos.after(1);\n\n // Insert a new paragraph after this block\n editor\n .chain()\n .focus()\n .insertContentAt(after, { type: 'paragraph' })\n .setTextSelection(after + 1)\n .run();\n\n // Trigger slash command by inserting /\n setTimeout(() => {\n editor.commands.insertContent('/');\n }, 10);\n } catch (err) {\n console.error('Failed to add block:', err);\n }\n }, [editor]);\n\n // Drag start\n const handleDragStart = useCallback((e: React.DragEvent) => {\n const block = currentBlockRef.current;\n if (!block) return;\n\n isDraggingRef.current = true;\n // Delay setting isDragging to true to allow the browser to initiate the drag\n // If the element becomes invisible immediately, the drag might be aborted\n requestAnimationFrame(() => {\n setIsDragging(true);\n });\n\n // Get block position - we need the actual block start position\n const pos = editor.view.posAtDOM(block, 0);\n\n // Use findBlockAtPos to get the actual block start position\n // This ensures we always use the block's start position, not an internal position\n const blockInfo = findBlockAtPos(editor.state.doc, pos);\n\n if (!blockInfo) {\n return;\n }\n\n const blockPos = blockInfo.pos;\n\n // Initialize drag state in the DnD plugin\n const blockId = `block-${blockPos}`;\n startDrag(editor, blockId, blockPos);\n\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('application/x-pubwave-block', blockId);\n\n // Add dragging class\n block.classList.add('pubwave-block--dragging');\n\n // Set drag image\n const dragImage = block.cloneNode(true) as HTMLElement;\n dragImage.classList.add('pubwave-block--drag-preview');\n dragImage.style.opacity = '1';\n\n // Force gray color and variables on the ghost to override editor styles\n const applyGhostStyles = (el: HTMLElement) => {\n el.style.setProperty('color', '#9b9a97', 'important');\n el.style.setProperty('border-color', '#9b9a97', 'important');\n el.style.setProperty('--pubwave-text', '#9b9a97', 'important');\n Array.from(el.children).forEach(child => {\n if (child instanceof HTMLElement) applyGhostStyles(child);\n });\n };\n applyGhostStyles(dragImage);\n\n // Copy width to ensure correct layout\n const rect = block.getBoundingClientRect();\n dragImage.style.width = `${rect.width}px`;\n // Reset positioning if the block had it (though usually blocks are static)\n dragImage.style.position = 'static';\n dragImage.style.transform = 'none';\n\n // Wrap in editor structure to preserve styles (CSS scopes)\n const wrapper = document.createElement('div');\n wrapper.className = 'pubwave-editor';\n const content = document.createElement('div');\n content.className = 'pubwave-editor__content';\n const pm = document.createElement('div');\n pm.className = 'ProseMirror';\n\n // Reconstruct hierarchy\n pm.appendChild(dragImage);\n content.appendChild(pm);\n wrapper.appendChild(content);\n\n // Position off-screen\n wrapper.style.position = 'absolute';\n wrapper.style.top = '-9999px';\n wrapper.style.left = '-9999px';\n\n // Add to body so it renders styles\n document.body.appendChild(wrapper);\n\n // Use the clone as the drag image\n e.dataTransfer.setDragImage(dragImage, 0, 0);\n\n // Clean up\n setTimeout(() => {\n document.body.removeChild(wrapper);\n }, 0);\n }, [editor]);\n\n // Drag end\n const handleDragEnd = useCallback(() => {\n isDraggingRef.current = false;\n setIsDragging(false);\n if (currentBlockRef.current) {\n currentBlockRef.current.classList.remove('pubwave-block--dragging');\n }\n // Also hide handle after drop for a cleaner transition\n setVisible(false);\n }, []);\n\n if (!visible) return null;\n\n return (\n <div\n ref={containerRef}\n className=\"pubwave-block-handle\"\n data-testid=\"block-handle\"\n style={{\n position: 'absolute',\n left: 'calc(var(--pubwave-container-padding-left, 140px) - 80px)',\n top: `${position.top}px`,\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n pointerEvents: 'auto',\n transition: `opacity ${tokens.transition.fast}`,\n zIndex: tokens.zIndex.dragHandle,\n opacity: visible && !isDragging ? 1 : 0,\n }}\n onMouseEnter={(e) => {\n // Clear any pending hide when mouse enters handle\n e.stopPropagation();\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }}\n onMouseLeave={(e) => {\n e.stopPropagation();\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n // Only hide if mouse leaves to outside the editor\n if (!relatedTarget?.closest('.pubwave-editor')) {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n hideTimeoutRef.current = setTimeout(() => {\n hideHandle();\n }, 150);\n }\n }}\n >\n {/* Add button */}\n <button\n type=\"button\"\n className=\"pubwave-block-handle__add\"\n onClick={handleAdd}\n data-testid=\"add-block-button\"\n style={{\n width: 'var(--pubwave-button-width, 28px)',\n height: 'var(--pubwave-button-height, 28px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: `var(--pubwave-text-muted, ${tokens.colors.textMuted})`,\n cursor: 'pointer',\n transition: `background-color ${tokens.transition.fast}, color ${tokens.transition.fast}`,\n }}\n title=\"Add block\"\n aria-label=\"Add block below\"\n >\n <PlusIcon />\n </button>\n\n {/* Drag handle */}\n <div\n className=\"pubwave-block-handle__drag\"\n draggable\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n data-testid=\"drag-handle\"\n style={{\n // Hit area (minimum 44px for accessibility)\n // Use padding to increase hit area while keeping visual size at 28px\n width: '44px',\n height: '44px',\n padding: '8px', // (44 - 28) / 2 = 8px padding on each side\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: tokens.borderRadius.sm,\n background: 'transparent',\n color: `var(--pubwave-text-muted, ${tokens.colors.textMuted})`,\n cursor: 'grab',\n transition: `background-color ${tokens.transition.fast}, color ${tokens.transition.fast}`,\n }}\n role=\"button\"\n tabIndex={0}\n title=\"Drag to move\"\n aria-label=\"Drag to reorder block\"\n >\n <GripIcon />\n </div>\n </div>\n );\n}\n\nfunction PlusIcon(): React.ReactElement {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" />\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction GripIcon(): React.ReactElement {\n return (\n <svg width=\"12\" height=\"18\" viewBox=\"0 0 10 16\" fill=\"currentColor\">\n <circle cx=\"2\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"2\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"2\" cy=\"13\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"13\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport default BlockHandle;\n","/**\n * Drop Indicator Component\n *\n * Visual indicator showing where a dragged block will be dropped.\n * Provides clear before/after positioning feedback.\n *\n * Key behaviors:\n * - Clearly visible line showing insertion point\n * - Animates in smoothly (no jarring appearance)\n * - Shows before or after target block\n * - Disappears immediately when drag ends\n */\n\nimport React from 'react';\nimport { cn, tokens } from '../theme';\n\nexport interface DropIndicatorProps {\n /** Whether the indicator is visible */\n visible: boolean;\n /** Position relative to target block */\n position: 'before' | 'after';\n /** Additional CSS class names */\n className?: string;\n}\n\n/**\n * DropIndicator - Visual drop target indicator\n */\nexport function DropIndicator({\n visible,\n position,\n className,\n}: DropIndicatorProps): React.ReactElement {\n return (\n <div\n className={cn(\n 'pubwave-drop-indicator',\n visible && 'pubwave-drop-indicator--visible',\n `pubwave-drop-indicator--${position}`,\n className\n )}\n data-testid=\"drop-indicator\"\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: '2px',\n backgroundColor: `var(--pubwave-drop-indicator-color, ${tokens.colors.dropIndicator})`,\n borderRadius: '1px',\n\n // Position based on before/after\n ...(position === 'before'\n ? { top: '-1px' }\n : { bottom: '-1px' }),\n\n // Visibility and animation\n opacity: visible ? 1 : 0,\n transform: visible ? 'scaleX(1)' : 'scaleX(0.8)',\n transition: `opacity ${tokens.transition.fast}, transform ${tokens.transition.fast}`,\n\n // Ensure it's above other content\n zIndex: 10,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n >\n {/* Optional: End caps for visual polish */}\n <IndicatorCap position=\"left\" visible={visible} />\n <IndicatorCap position=\"right\" visible={visible} />\n </div>\n );\n}\n\n/**\n * Small circular cap at the end of the indicator\n */\ninterface IndicatorCapProps {\n position: 'left' | 'right';\n visible: boolean;\n}\n\nfunction IndicatorCap({ position, visible }: IndicatorCapProps): React.ReactElement {\n return (\n <div\n className={`pubwave-drop-indicator__cap pubwave-drop-indicator__cap--${position}`}\n style={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n ...(position === 'left' ? { left: '-4px' } : { right: '-4px' }),\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: `var(--pubwave-drop-indicator-color, ${tokens.colors.dropIndicator})`,\n opacity: visible ? 1 : 0,\n transition: `opacity ${tokens.transition.fast}`,\n }}\n />\n );\n}\n\nexport default DropIndicator;\n","/**\n * Drop Indicator Overlay Component\n *\n * Renders the visible drop line indicator using React.\n * Subscribes to the DnD plugin state for position updates.\n * Calculates precise DOM position relative to the editor container.\n */\n\nimport React, { useEffect, useState } from 'react';\nimport type { Editor } from '@tiptap/core';\nimport { dndPluginKey, DndState } from '../../core/plugins/dnd';\nimport { DropIndicator } from './DropIndicator';\n\nexport interface DropIndicatorOverlayProps {\n editor: Editor;\n}\n\nexport function DropIndicatorOverlay({ editor }: DropIndicatorOverlayProps): React.ReactElement | null {\n const [dndState, setDndState] = useState<DndState | null>(null);\n const [position, setPosition] = useState<{ top: number; width: number; left: number } | null>(null);\n\n // Subscribe to editor updates to get the plugin state\n useEffect(() => {\n // Initial state\n const pluginState = dndPluginKey.getState(editor.state) as DndState | undefined;\n if (pluginState) {\n setDndState(pluginState);\n }\n\n // Subscribe to transactions\n const handleUpdate = () => {\n const newState = dndPluginKey.getState(editor.state) as DndState | undefined;\n // Simple shallow comparison to avoid unnecessary renders\n if (newState && (\n newState.dropTargetPos !== dndState?.dropTargetPos ||\n newState.dropPosition !== dndState?.dropPosition\n )) {\n setDndState(newState);\n }\n };\n\n editor.on('transaction', handleUpdate);\n return () => {\n editor.off('transaction', handleUpdate);\n };\n }, [editor, dndState]);\n\n // Update DOM position when state changes\n useEffect(() => {\n if (!dndState?.dropTargetPos || !dndState.dropPosition) {\n setPosition(null);\n return;\n }\n\n // We need to wait for DOM to be ready, potential layout shift?\n // Use requestAnimationFrame to ensure we measure after any potential renders\n const frameId = requestAnimationFrame(() => {\n const view = editor.view;\n const pos = dndState.dropTargetPos;\n\n if (pos === null) return;\n\n // Find the approximate DOM node for this position\n // For block drops, we usually want the block node itself\n let domNode = view.nodeDOM(pos) as HTMLElement | null;\n\n // Ensure we have an HTML element\n if (!domNode && pos > 0) {\n // Retry slightly differently if needed, but nodeDOM usually works for block starts\n // Or find node at pos\n const node = view.domAtPos(pos).node as HTMLElement;\n if (node instanceof HTMLElement) domNode = node;\n }\n\n // If still no node, fallback or abort\n if (!domNode || !(domNode instanceof HTMLElement)) {\n return;\n }\n\n // Check content rect\n const rect = domNode.getBoundingClientRect();\n const editorRect = view.dom.closest('.pubwave-editor')?.getBoundingClientRect();\n\n if (!editorRect) return;\n\n // Standard offset 0.5em approx 8px\n const OFFSET = 8;\n\n let top = 0;\n if (dndState.dropPosition === 'before') {\n top = rect.top - editorRect.top - OFFSET;\n } else {\n top = rect.bottom - editorRect.top + OFFSET;\n }\n\n setPosition({\n top,\n left: rect.left - editorRect.left,\n width: rect.width,\n });\n });\n\n return () => cancelAnimationFrame(frameId);\n }, [dndState, editor]);\n\n if (!dndState?.dropTargetPos || !dndState.dropPosition || !position) {\n return null;\n }\n\n // Reuse the existing DropIndicator UI but position it ourselves\n return (\n <div\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n width: position.width,\n height: '2px', // Container for the indicator line\n pointerEvents: 'none',\n zIndex: 50, // High z-index to show above everything\n }}\n >\n <DropIndicator visible={true} position={dndState.dropPosition} className=\"pubwave-drop-indicator--overlay\" />\n </div>\n );\n}\n","/**\n * PubwaveEditor React Component\n *\n * The main React component for rendering the Pubwave Editor.\n * This is the primary entry point for React applications.\n *\n * FR-008 Compliance (No Persistent Clutter):\n * - BubbleToolbar: appears only on non-empty text selection\n * - DragHandle: appears only on block hover\n * - DropIndicator: appears only during active drag\n * - Toast: auto-dismisses after display duration\n *\n * All UI elements are contextual - no always-visible toolbars or controls\n * that would contradict the minimal, content-first design intent.\n */\n\nimport { forwardRef, useImperativeHandle, useCallback, useState, useEffect } from 'react';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport type { JSONContent } from '@tiptap/core';\n\nimport { createExtensions } from '../core/extensions';\nimport type { EditorTheme, EditorAPI, ImageUploadConfig } from '../types/editor';\nimport { getReadOnlyClassName } from './readOnlyGuards';\nimport { ariaLabels } from './a11y';\nimport { BubbleToolbar } from './BubbleToolbar';\nimport { BlockHandle } from './dnd/BlockHandle';\nimport { DropIndicatorOverlay } from './dnd/DropIndicatorOverlay';\nimport { LocaleProvider } from './LocaleContext';\nimport { getLocale } from '../i18n';\n\n/**\n * Props for the PubwaveEditor component\n */\nexport interface PubwaveEditorProps {\n /**\n * Initial content in Tiptap JSON format\n */\n content?: JSONContent;\n\n /**\n * Whether the editor is in read-only mode\n * @default false\n */\n editable?: boolean;\n\n /**\n * Placeholder text shown when the editor is empty\n */\n placeholder?: string;\n\n /**\n * Theme configuration\n */\n theme?: EditorTheme;\n\n /**\n * Enable autofocus on mount\n * @default false\n */\n autofocus?: boolean | 'start' | 'end';\n\n /**\n * Callback when content changes\n */\n onChange?: (content: JSONContent) => void;\n\n /**\n * Callback when selection changes\n */\n onSelectionChange?: () => void;\n\n /**\n * Callback when editor gains focus\n */\n onFocus?: () => void;\n\n /**\n * Callback when editor loses focus\n */\n onBlur?: () => void;\n\n /**\n * Callback when editor is ready\n */\n onReady?: (api: EditorAPI) => void;\n\n /**\n * Image upload configuration\n * If not provided, images will be converted to base64 by default\n */\n imageUpload?: ImageUploadConfig;\n\n /**\n * Additional CSS class for the container\n */\n className?: string;\n\n /**\n * Editor container width\n * Can be a CSS value like '100%', '1200px', '90vw', etc.\n * @default '100%'\n */\n width?: string;\n\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\n/**\n * PubwaveEditor Component\n *\n * A Notion-level block editor with:\n * - Premium writing experience\n * - Selection-only formatting toolbar\n * - Block drag & drop\n * - Full theme customization via CSS tokens\n */\nexport const PubwaveEditor = forwardRef<EditorAPI | null, PubwaveEditorProps>(\n function PubwaveEditor(props, ref) {\n const {\n content,\n editable = true,\n placeholder,\n theme,\n autofocus = false,\n imageUpload,\n onChange,\n onSelectionChange,\n onFocus,\n onBlur,\n onReady,\n className,\n width,\n 'data-testid': testId = 'pubwave-editor',\n } = props;\n\n // Get locale from theme or use default (needed for extensions)\n const locale = getLocale(theme?.locale);\n \n // Get placeholder from prop or locale data (prioritize locale for i18n)\n // Only use locale.placeholder if placeholder prop is not provided\n const placeholderText = placeholder ?? locale.placeholder ?? 'Start writing...';\n\n // Create Tiptap editor instance\n const editor = useEditor({\n extensions: createExtensions({\n placeholder: placeholderText,\n headingLevels: [1, 2, 3],\n linkOpenInNewTab: true,\n linkOpenOnClick: true,\n imageUpload,\n locale: theme?.locale,\n }),\n content,\n editable,\n autofocus,\n // Set immediatelyRender to false for SSR compatibility\n // This prevents hydration mismatches in Next.js and other SSR frameworks\n immediatelyRender: false,\n editorProps: {\n attributes: {\n class: `pubwave-editor__content ${theme?.contentClassName ?? ''}`.trim(),\n 'data-placeholder': placeholderText,\n },\n },\n onUpdate: ({ editor }) => {\n onChange?.(editor.getJSON());\n },\n onSelectionUpdate: () => {\n onSelectionChange?.();\n },\n onFocus: () => {\n onFocus?.();\n },\n onBlur: () => {\n onBlur?.();\n },\n onCreate: ({ editor }) => {\n // Build the public API\n const api = createEditorAPI(editor);\n onReady?.(api);\n },\n });\n\n // Create the public API\n const createEditorAPI = useCallback(\n (tiptapEditor: typeof editor): EditorAPI => ({\n getState: () => ({\n selection: {\n hasSelection: !tiptapEditor?.state.selection.empty,\n isMultiBlock: false,\n from: tiptapEditor?.state.selection.from ?? 0,\n to: tiptapEditor?.state.selection.to ?? 0,\n isEmpty: tiptapEditor?.state.selection.empty ?? true,\n },\n marks: {\n isBold: tiptapEditor?.isActive('bold') ?? false,\n isItalic: tiptapEditor?.isActive('italic') ?? false,\n isLink: tiptapEditor?.isActive('link') ?? false,\n linkHref: tiptapEditor\n ? (tiptapEditor.getAttributes('link') as { href?: string }).href\n : undefined,\n },\n isFocused: tiptapEditor?.isFocused ?? false,\n isEditable: tiptapEditor?.isEditable ?? false,\n isEmpty: tiptapEditor?.isEmpty ?? true,\n characterCount: 0, // Character count requires extension, not included by default\n }),\n getJSON: () => tiptapEditor?.getJSON() ?? { type: 'doc', content: [] },\n getHTML: () => tiptapEditor?.getHTML() ?? '',\n getText: () => tiptapEditor?.getText() ?? '',\n setContent: (newContent) => tiptapEditor?.commands.setContent(newContent),\n clearContent: () => tiptapEditor?.commands.clearContent(),\n setEditable: (value) => tiptapEditor?.setEditable(value),\n focus: (position) => {\n if (position === 'start') {\n tiptapEditor?.commands.focus('start');\n } else if (position === 'end') {\n tiptapEditor?.commands.focus('end');\n } else {\n tiptapEditor?.commands.focus();\n }\n },\n blur: () => tiptapEditor?.commands.blur(),\n toggleBold: () => tiptapEditor?.chain().focus().toggleBold().run(),\n toggleItalic: () => tiptapEditor?.chain().focus().toggleItalic().run(),\n setLink: (href) => {\n if (href) {\n tiptapEditor?.chain().focus().setLink({ href }).run();\n } else {\n tiptapEditor?.chain().focus().unsetLink().run();\n }\n },\n destroy: () => tiptapEditor?.destroy(),\n tiptapEditor: tiptapEditor ?? null,\n }),\n []\n );\n\n // Expose API via ref\n useImperativeHandle<EditorAPI | null, EditorAPI | null>(\n ref,\n () => (editor ? createEditorAPI(editor) : null),\n [editor, createEditorAPI]\n );\n\n // Track if component has mounted (for SSR hydration)\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Update data-placeholder attribute when locale changes\n useEffect(() => {\n if (!editor?.view?.dom) return;\n \n const editorElement = editor.view.dom as HTMLElement;\n if (editorElement) {\n editorElement.setAttribute('data-placeholder', placeholderText);\n }\n }, [editor, placeholderText, theme?.locale]);\n\n // Build class names\n const containerClassName = [\n 'pubwave-editor',\n theme?.classNamePrefix ?? '',\n theme?.containerClassName ?? '',\n editor ? getReadOnlyClassName(editor) : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build CSS variables from theme colors\n const themeStyles: React.CSSProperties & Record<string, string> = {\n position: 'relative',\n overflow: 'visible',\n };\n\n // Apply width if provided (use CSS variable for better override capability)\n if (width) {\n themeStyles['--pubwave-container-width'] = width;\n themeStyles.width = width;\n // If width is set, also set max-width to the same value to override CSS default\n // This ensures width takes effect even when max-width would otherwise limit it\n themeStyles['--pubwave-container-max-width'] = width;\n themeStyles.maxWidth = width;\n }\n\n if (theme?.colors) {\n const { colors } = theme;\n // Determine if text is light (dark theme) or dark (light theme) for hover color\n // Light text colors typically start with 'f' (high hex values) or 'e' (very light)\n const textColor = colors.text || '#1f2937';\n const normalizedColor = textColor.toLowerCase().trim();\n // Check if it's a light color by examining the hex values\n // Light colors have high RGB values (f, e, d, c, b, a in hex)\n const isLightText = \n normalizedColor.startsWith('#f') || \n normalizedColor.startsWith('#e') ||\n normalizedColor.includes('f1') || \n normalizedColor.includes('f3') || \n normalizedColor.includes('f0') || \n normalizedColor.includes('fdf') || \n normalizedColor.includes('ffb') ||\n normalizedColor.includes('ffc') ||\n normalizedColor.includes('ffd') ||\n normalizedColor.includes('ffe') ||\n normalizedColor.includes('fff') ||\n normalizedColor.includes('e0') || \n normalizedColor.includes('e5') ||\n normalizedColor.includes('ecf') ||\n normalizedColor.includes('eef');\n \n // If background is a gradient, apply it directly; otherwise use CSS variable\n if (colors.background) {\n if (colors.background.includes('gradient')) {\n themeStyles.background = colors.background;\n // For gradient backgrounds, we need to set surface color for dropdowns\n // Use a semi-transparent white/black overlay based on text color brightness\n if (isLightText) {\n // Light text means dark background, use dark surface for dropdowns\n themeStyles['--pubwave-surface'] = 'rgba(38, 38, 38, 0.95)';\n themeStyles['--pubwave-bg'] = '#1a1a1a';\n } else {\n // Dark text means light background, use white surface\n themeStyles['--pubwave-surface'] = 'rgba(255, 255, 255, 0.95)';\n themeStyles['--pubwave-bg'] = '#ffffff';\n }\n } else {\n themeStyles['--pubwave-bg'] = colors.background;\n themeStyles['--pubwave-surface'] = colors.background;\n }\n }\n if (colors.text) {\n themeStyles['--pubwave-text'] = colors.text;\n }\n if (colors.textMuted) {\n themeStyles['--pubwave-text-muted'] = colors.textMuted;\n }\n if (colors.border) {\n themeStyles['--pubwave-border'] = colors.border;\n }\n if (colors.primary) {\n themeStyles['--pubwave-primary'] = colors.primary;\n }\n // Only set linkColor if explicitly provided, otherwise CSS will use primary as fallback\n if (colors.linkColor) {\n themeStyles['--pubwave-link-color'] = colors.linkColor;\n }\n // Set hover color based on text color brightness\n // If text is light (dark theme), use light hover; if text is dark (light theme), use dark hover\n if (isLightText) {\n // Light text means dark background, use light hover\n themeStyles['--pubwave-hover'] = 'rgba(255, 255, 255, 0.1)';\n } else {\n // Dark text means light background, use dark hover\n themeStyles['--pubwave-hover'] = 'rgba(0, 0, 0, 0.05)';\n }\n }\n\n // Apply background image if provided\n if (theme?.backgroundImage) {\n const bgImage = theme.backgroundImage;\n const options = theme.backgroundImageOptions || {};\n \n // Build background-image CSS value\n // Support both URL strings and full CSS background-image values\n if (bgImage.startsWith('url(') || bgImage.includes('gradient') || bgImage.includes('linear-gradient') || bgImage.includes('radial-gradient')) {\n // Already a valid CSS background-image value\n themeStyles.backgroundImage = bgImage;\n } else {\n // Assume it's a URL string, wrap it in url()\n themeStyles.backgroundImage = `url(${bgImage})`;\n }\n\n // Apply background image options\n if (options.repeat !== undefined) {\n themeStyles.backgroundRepeat = options.repeat;\n } else {\n themeStyles.backgroundRepeat = 'no-repeat';\n }\n\n if (options.position !== undefined) {\n themeStyles.backgroundPosition = options.position;\n } else {\n themeStyles.backgroundPosition = 'center';\n }\n\n if (options.size !== undefined) {\n themeStyles.backgroundSize = options.size;\n } else {\n themeStyles.backgroundSize = 'cover';\n }\n\n if (options.attachment !== undefined) {\n themeStyles.backgroundAttachment = options.attachment;\n } else {\n themeStyles.backgroundAttachment = 'scroll';\n }\n }\n\n // During SSR or before hydration, render a placeholder that matches the expected structure\n if (!isMounted || !editor) {\n return (\n <LocaleProvider value={{ locale }}>\n <div\n className={containerClassName}\n data-testid={testId}\n role=\"application\"\n aria-label={ariaLabels.editor}\n style={themeStyles}\n />\n </LocaleProvider>\n );\n }\n\n return (\n <LocaleProvider value={{ locale }}>\n <div\n className={containerClassName}\n data-testid={testId}\n role=\"application\"\n aria-label={ariaLabels.editor}\n style={themeStyles}\n >\n <EditorContent editor={editor} />\n {/* Bubble toolbar - appears only on non-empty text selection (US2) */}\n {editable && <BubbleToolbar editor={editor} />}\n {/* Block handles - + and drag grip appear on block hover (US3) */}\n {editable && <BlockHandle editor={editor} />}\n {/* Drop indicator - appears during drag (US4) */}\n {editable && <DropIndicatorOverlay editor={editor} />}\n </div>\n </LocaleProvider>\n );\n }\n);\n\n// Default export for convenience\nexport default PubwaveEditor;\n","/**\n * Toolbar Actions\n *\n * Action handlers for the bubble toolbar, wired to the command layer.\n * Each action preserves focus and provides feedback for accessibility.\n */\n\nimport type { Editor } from '@tiptap/core';\nimport { restoreFocus } from '../focus';\n\n/**\n * Action result for feedback\n */\nexport interface ActionResult {\n success: boolean;\n message?: string;\n}\n\n/**\n * Check if editor is valid for operations\n */\nfunction isEditorReady(editor: Editor): boolean {\n return !editor.isDestroyed;\n}\n\n/**\n * Toggle bold mark on selection\n */\nexport function toggleBold(editor: Editor): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n const success = editor.chain().focus().toggleBold().run();\n restoreFocus(editor);\n\n return {\n success,\n message: success ? 'Bold toggled' : 'Could not toggle bold',\n };\n}\n\n/**\n * Toggle italic mark on selection\n */\nexport function toggleItalic(editor: Editor): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n const success = editor.chain().focus().toggleItalic().run();\n restoreFocus(editor);\n\n return {\n success,\n message: success ? 'Italic toggled' : 'Could not toggle italic',\n };\n}\n\n/**\n * Set a link on the selection\n */\nexport function setLink(editor: Editor, href: string): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n if (!href.trim()) {\n return { success: false, message: 'URL is required' };\n }\n\n // Normalize URL (add protocol if missing)\n let normalizedHref = href.trim();\n if (!/^https?:\\/\\//i.test(normalizedHref) && !normalizedHref.startsWith('/')) {\n normalizedHref = `https://${normalizedHref}`;\n }\n\n const success = editor\n .chain()\n .focus()\n .setLink({ href: normalizedHref })\n .run();\n\n restoreFocus(editor);\n\n return {\n success,\n message: success ? 'Link added' : 'Could not add link',\n };\n}\n\n/**\n * Remove link from selection\n */\nexport function removeLink(editor: Editor): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n const success = editor.chain().focus().unsetLink().run();\n restoreFocus(editor);\n\n return {\n success,\n message: success ? 'Link removed' : 'Could not remove link',\n };\n}\n\n/**\n * Toggle link - prompts for URL if adding, removes if already linked\n */\nexport function toggleLink(\n editor: Editor,\n promptFn: (message: string) => string | null = window.prompt.bind(window)\n): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n // Check if current selection has a link using editor API\n const hasLink = editor.isActive('link');\n\n if (hasLink) {\n return removeLink(editor);\n }\n\n // Prompt for URL\n const url = promptFn('Enter URL:');\n\n if (!url) {\n restoreFocus(editor);\n return { success: false, message: 'Link cancelled' };\n }\n\n return setLink(editor, url);\n}\n\n/**\n * Set heading level\n */\nexport function setHeading(editor: Editor, level: 1 | 2 | 3): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n const success = editor.chain().focus().setHeading({ level }).run();\n restoreFocus(editor);\n\n const levelStr = String(level);\n return {\n success,\n message: success ? `Heading ${levelStr} applied` : 'Could not set heading',\n };\n}\n\n/**\n * Set paragraph (remove heading)\n */\nexport function setParagraph(editor: Editor): ActionResult {\n if (!isEditorReady(editor)) {\n return { success: false, message: 'Editor not available' };\n }\n\n const success = editor.chain().focus().setParagraph().run();\n restoreFocus(editor);\n\n return {\n success,\n message: success ? 'Paragraph applied' : 'Could not set paragraph',\n };\n}\n\n/**\n * Action factory for creating toolbar action handlers\n * Returns a function that can be used as onClick handler\n */\nexport function createActionHandler(\n editor: Editor,\n action: (editor: Editor) => ActionResult,\n onResult?: (result: ActionResult) => void\n): () => void {\n return (): void => {\n const result = action(editor);\n onResult?.(result);\n };\n}\n\n/**\n * Toolbar action descriptors for dynamic toolbar generation\n */\nexport interface ToolbarActionDescriptor {\n id: string;\n label: string;\n shortcut?: string;\n icon: string;\n action: (editor: Editor) => ActionResult;\n isActive: (editor: Editor) => boolean;\n isDisabled?: (editor: Editor) => boolean;\n}\n\n/**\n * Default toolbar actions\n */\nexport const defaultToolbarActions: ToolbarActionDescriptor[] = [\n {\n id: 'bold',\n label: 'Bold',\n shortcut: 'Cmd+B',\n icon: 'bold',\n action: toggleBold,\n isActive: (editor) => editor.isActive('bold'),\n },\n {\n id: 'italic',\n label: 'Italic',\n shortcut: 'Cmd+I',\n icon: 'italic',\n action: toggleItalic,\n isActive: (editor) => editor.isActive('italic'),\n },\n {\n id: 'link',\n label: 'Link',\n icon: 'link',\n action: (editor) => toggleLink(editor),\n isActive: (editor) => editor.isActive('link'),\n },\n];\n","/**\n * Drag Handle Component\n *\n * A visible drag affordance for block reordering.\n * Appears on block hover with adequate hit area for mouse and touch.\n *\n * Key behaviors:\n * - Visible on block hover (not always visible)\n * - Large enough hit area (44x44px minimum for touch)\n * - Clear drag cursor feedback\n * - Does not interfere with text selection\n */\n\nimport React, { useCallback, useRef, useState } from 'react';\nimport { cn, tokens } from '../theme';\nimport { ariaLabels } from '../a11y';\n\nexport interface DragHandleProps {\n /** Block ID for drag identification */\n blockId: string;\n /** Whether the block is currently hovered */\n isHovered: boolean;\n /** Whether a drag is currently in progress */\n isDragging?: boolean;\n /** Callback when drag starts */\n onDragStart?: (blockId: string, event: React.DragEvent) => void;\n /** Callback when drag ends */\n onDragEnd?: (blockId: string, event: React.DragEvent) => void;\n /** Additional CSS class names */\n className?: string;\n}\n\n/**\n * Minimum hit area for accessibility (44x44px)\n */\nconst MIN_HIT_AREA = '44px';\n\n/**\n * Visual handle size (smaller than hit area)\n */\nconst VISUAL_HANDLE_SIZE = '20px';\n\n/**\n * DragHandle - Block drag affordance\n */\nexport function DragHandle({\n blockId,\n isHovered,\n isDragging = false,\n onDragStart,\n onDragEnd,\n className,\n}: DragHandleProps): React.ReactElement {\n const handleRef = useRef<HTMLDivElement>(null);\n const [isPressed, setIsPressed] = useState(false);\n\n const handleDragStart = useCallback(\n (event: React.DragEvent): void => {\n // Set drag data\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', blockId);\n event.dataTransfer.setData('application/x-pubwave-block', blockId);\n\n // Create a custom drag image if supported\n if (handleRef.current) {\n const rect = handleRef.current.getBoundingClientRect();\n event.dataTransfer.setDragImage(\n handleRef.current,\n rect.width / 2,\n rect.height / 2\n );\n }\n\n onDragStart?.(blockId, event);\n },\n [blockId, onDragStart]\n );\n\n const handleDragEnd = useCallback(\n (event: React.DragEvent): void => {\n setIsPressed(false);\n onDragEnd?.(blockId, event);\n },\n [blockId, onDragEnd]\n );\n\n const handleMouseDown = useCallback((): void => {\n setIsPressed(true);\n }, []);\n\n const handleMouseUp = useCallback((): void => {\n setIsPressed(false);\n }, []);\n\n // Determine visibility based on hover and drag state\n const isVisible = isHovered || isDragging;\n\n return (\n <div\n ref={handleRef}\n className={cn(\n 'pubwave-drag-handle',\n isVisible && 'pubwave-drag-handle--visible',\n isDragging && 'pubwave-drag-handle--dragging',\n isPressed && 'pubwave-drag-handle--pressed',\n className\n )}\n data-testid=\"drag-handle\"\n style={{\n // Position to the left of the block\n position: 'absolute',\n left: '-32px',\n top: '50%',\n transform: 'translateY(-50%)',\n\n // Hit area (larger than visual)\n width: MIN_HIT_AREA,\n height: MIN_HIT_AREA,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n // Visual styling\n cursor: isDragging ? 'grabbing' : 'grab',\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${tokens.transition.fast}`,\n\n // Ensure clickable without stealing text selection\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n draggable={true}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n role=\"button\"\n aria-label={ariaLabels.dragHandle}\n tabIndex={isVisible ? 0 : -1}\n >\n {/* Visual handle (smaller than hit area) */}\n <div\n className=\"pubwave-drag-handle__visual\"\n style={{\n width: VISUAL_HANDLE_SIZE,\n height: VISUAL_HANDLE_SIZE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: tokens.borderRadius.sm,\n backgroundColor: isPressed\n ? `var(--pubwave-drag-handle-active-bg, ${tokens.colors.focus})`\n : 'transparent',\n transition: `background-color ${tokens.transition.fast}`,\n }}\n >\n <DragIcon />\n </div>\n </div>\n );\n}\n\n/**\n * Drag icon - 6 dots in 2x3 grid\n */\nfunction DragIcon(): React.ReactElement {\n return (\n <svg\n width=\"12\"\n height=\"16\"\n viewBox=\"0 0 12 16\"\n fill=\"currentColor\"\n style={{\n color: `var(--pubwave-drag-handle-color, ${tokens.colors.textMuted})`,\n }}\n >\n {/* Left column */}\n <circle cx=\"3\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"13\" r=\"1.5\" />\n {/* Right column */}\n <circle cx=\"9\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"13\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport default DragHandle;\n","/**\n * Auto-scroll Utility\n *\n * Enables automatic scrolling when dragging near viewport edges.\n * Essential for long documents where blocks need to be moved across visible area.\n *\n * Key behaviors:\n * - Smooth scrolling that accelerates near edges\n * - Works with both window and container scrolling\n * - Cleans up properly when drag ends\n */\n\nimport { safeRequestAnimationFrame } from '../../core/ssr';\n\n/**\n * Edge detection threshold in pixels\n */\nconst EDGE_THRESHOLD = 50;\n\n/**\n * Maximum scroll speed in pixels per frame\n */\nconst MAX_SCROLL_SPEED = 15;\n\n/**\n * Auto-scroll state\n */\ninterface AutoScrollState {\n isActive: boolean;\n direction: 'up' | 'down' | null;\n speed: number;\n animationId: number | null;\n}\n\n/**\n * Calculate scroll speed based on distance from edge\n */\nfunction calculateSpeed(distanceFromEdge: number): number {\n // Closer to edge = faster scrolling\n const normalized = 1 - distanceFromEdge / EDGE_THRESHOLD;\n return Math.round(normalized * MAX_SCROLL_SPEED);\n}\n\n/**\n * Create an auto-scroll controller for drag operations\n */\nexport function createAutoScroller(\n scrollContainer?: HTMLElement | null\n): {\n start: () => void;\n update: (clientY: number) => void;\n stop: () => void;\n} {\n const state: AutoScrollState = {\n isActive: false,\n direction: null,\n speed: 0,\n animationId: null,\n };\n\n /**\n * Get the scroll target (container or window)\n */\n const getScrollTarget = (): HTMLElement | Window => {\n return scrollContainer ?? window;\n };\n\n /**\n * Get viewport bounds for edge detection\n */\n const getViewportBounds = (): { top: number; bottom: number } => {\n if (scrollContainer) {\n const rect = scrollContainer.getBoundingClientRect();\n return { top: rect.top, bottom: rect.bottom };\n }\n return { top: 0, bottom: window.innerHeight };\n };\n\n /**\n * Perform the scroll animation frame\n */\n const scrollFrame = (): void => {\n if (!state.isActive || state.direction === null) {\n return;\n }\n\n const target = getScrollTarget();\n const scrollAmount = state.direction === 'up' ? -state.speed : state.speed;\n\n if (target === window) {\n window.scrollBy(0, scrollAmount);\n } else if (target instanceof HTMLElement) {\n target.scrollTop += scrollAmount;\n }\n\n // Continue scrolling\n state.animationId = safeRequestAnimationFrame(scrollFrame);\n };\n\n return {\n /**\n * Start auto-scroll monitoring\n */\n start(): void {\n state.isActive = true;\n },\n\n /**\n * Update auto-scroll based on cursor position\n */\n update(clientY: number): void {\n if (!state.isActive) return;\n\n const bounds = getViewportBounds();\n const distanceFromTop = clientY - bounds.top;\n const distanceFromBottom = bounds.bottom - clientY;\n\n // Determine scroll direction and speed\n if (distanceFromTop < EDGE_THRESHOLD) {\n state.direction = 'up';\n state.speed = calculateSpeed(distanceFromTop);\n } else if (distanceFromBottom < EDGE_THRESHOLD) {\n state.direction = 'down';\n state.speed = calculateSpeed(distanceFromBottom);\n } else {\n state.direction = null;\n state.speed = 0;\n }\n\n // Start or stop scrolling based on direction\n if (state.direction !== null && state.animationId === null) {\n state.animationId = safeRequestAnimationFrame(scrollFrame);\n } else if (state.direction === null && state.animationId !== null) {\n cancelAnimationFrame(state.animationId);\n state.animationId = null;\n }\n },\n\n /**\n * Stop auto-scroll\n */\n stop(): void {\n state.isActive = false;\n state.direction = null;\n state.speed = 0;\n\n if (state.animationId !== null) {\n cancelAnimationFrame(state.animationId);\n state.animationId = null;\n }\n },\n };\n}\n\n/**\n * React hook for auto-scroll during drag operations\n */\nexport function useAutoScroll(\n scrollContainer?: HTMLElement | null\n): {\n startAutoScroll: () => void;\n updateAutoScroll: (event: { clientY: number }) => void;\n stopAutoScroll: () => void;\n} {\n // Create scroller instance (stable reference via closure)\n let scroller: ReturnType<typeof createAutoScroller> | null = null;\n\n const getScroller = (): ReturnType<typeof createAutoScroller> => {\n scroller ??= createAutoScroller(scrollContainer);\n return scroller;\n };\n\n return {\n startAutoScroll(): void {\n getScroller().start();\n },\n\n updateAutoScroll(event: { clientY: number }): void {\n getScroller().update(event.clientY);\n },\n\n stopAutoScroll(): void {\n getScroller().stop();\n scroller = null;\n },\n };\n}\n\nexport default createAutoScroller;\n","/**\n * Toast Component\n *\n * Simple toast notification for feedback messages.\n * Used for DnD error messages and other transient notifications.\n *\n * Key behaviors:\n * - Appears at bottom of editor\n * - Auto-dismisses after timeout\n * - Accessible (role=\"status\")\n */\n\nimport React, { useEffect, useState, useCallback } from 'react';\nimport { cn, tokens } from './theme';\n\nexport interface ToastProps {\n /** Toast message content */\n message: string;\n /** Toast type for styling */\n type?: 'info' | 'success' | 'error' | 'warning';\n /** Auto-dismiss duration in ms (0 = no auto-dismiss) */\n duration?: number;\n /** Callback when toast is dismissed */\n onDismiss?: () => void;\n /** Additional CSS class names */\n className?: string;\n}\n\n/**\n * Default auto-dismiss duration\n */\nconst DEFAULT_DURATION = 3000;\n\n/**\n * Toast - Transient notification component\n */\nexport function Toast({\n message,\n type = 'info',\n duration = DEFAULT_DURATION,\n onDismiss,\n className,\n}: ToastProps): React.ReactElement {\n const [isVisible, setIsVisible] = useState(true);\n\n // Auto-dismiss effect\n useEffect(() => {\n if (duration <= 0) return;\n\n const timer = setTimeout(() => {\n setIsVisible(false);\n onDismiss?.();\n }, duration);\n\n return () => {\n clearTimeout(timer);\n };\n }, [duration, onDismiss]);\n\n const handleDismiss = useCallback((): void => {\n setIsVisible(false);\n onDismiss?.();\n }, [onDismiss]);\n\n const typeColors = {\n info: tokens.colors.text,\n success: 'var(--pubwave-color-success, #10b981)',\n error: tokens.colors.error,\n warning: 'var(--pubwave-color-warning, #f59e0b)',\n };\n\n return (\n <div\n className={cn(\n 'pubwave-toast',\n `pubwave-toast--${type}`,\n isVisible ? 'pubwave-toast--visible' : 'pubwave-toast--hidden',\n className\n )}\n style={{\n position: 'fixed',\n bottom: '24px',\n left: '50%',\n transform: `translateX(-50%) translateY(${isVisible ? '0' : '16px'})`,\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n backgroundColor: `var(--pubwave-toast-bg, ${tokens.colors.surface})`,\n border: `1px solid var(--pubwave-toast-border, ${tokens.colors.border})`,\n borderRadius: tokens.borderRadius.md,\n boxShadow: tokens.shadow.md,\n color: typeColors[type],\n fontSize: tokens.typography.fontSizeSmall,\n opacity: isVisible ? 1 : 0,\n transition: `opacity ${tokens.transition.normal}, transform ${tokens.transition.normal}`,\n zIndex: 100,\n maxWidth: '400px',\n textAlign: 'center',\n }}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className=\"pubwave-toast__message\">{message}</span>\n <button\n type=\"button\"\n className=\"pubwave-toast__dismiss\"\n onClick={handleDismiss}\n style={{\n marginLeft: tokens.spacing.sm,\n padding: '0 4px',\n background: 'none',\n border: 'none',\n color: tokens.colors.textMuted,\n cursor: 'pointer',\n fontSize: '16px',\n lineHeight: 1,\n }}\n aria-label=\"Dismiss\"\n >\n ×\n </button>\n </div>\n );\n}\n\n/**\n * Toast container for managing multiple toasts\n */\nexport interface ToastItem {\n id: string;\n message: string;\n type?: 'info' | 'success' | 'error' | 'warning';\n duration?: number;\n}\n\nexport interface ToastContainerProps {\n toasts: ToastItem[];\n onDismiss: (id: string) => void;\n}\n\nexport function ToastContainer({\n toasts,\n onDismiss,\n}: ToastContainerProps): React.ReactElement {\n return (\n <div className=\"pubwave-toast-container\">\n {toasts.map((toast, index) => {\n const bottomOffset = 24 + index * 56;\n const zIndexValue = 100 - index;\n return (\n <div\n key={toast.id}\n style={{\n position: 'fixed',\n bottom: `${String(bottomOffset)}px`,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: zIndexValue,\n }}\n >\n <Toast\n message={toast.message}\n type={toast.type}\n duration={toast.duration}\n onDismiss={() => {\n onDismiss(toast.id);\n }}\n />\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Create a toast ID\n */\nexport function createToastId(): string {\n const timestamp = String(Date.now());\n const random = Math.random().toString(36).slice(2, 9);\n return `toast-${timestamp}-${random}`;\n}\n\nexport default Toast;\n"],"names":["uploadImage","isElement","name","effect","style","getBasePlacement","window","min","max","mathMax","mathMin","toPaddingObject","popperOffsets","offset","popper","hash","clippingParents","reference","allPlacements","placements","placement","_loop","_i","checks","debounce","fn","merged","defaultModifiers","createPopper","options","state","noopFn","computeStyles","applyStyles","flip","preventOverflow","arrow","hide","TIPPY_DEFAULT_APPEND_TO","setDefaultProps","pluginProps","innerHTML","box","content","setContent","aria","id","onTrigger","instance","onFirstUpdate","_a","SlashMenuList","placeholder","localeData","onCreate","onDestroy","start","end","top","bottom","left","right","toggleBold","toggleItalic","setLink","setParagraph","setHeading","onClickOutside","editorElement","editor","isEditorReady","PubwaveEditor"],"mappings":"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","x_google_ignoreList":[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}
|