@openim/im-composer 1.0.2 → 1.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/extensions/common/CompositionExtension.ts","../src/extensions/common/KeymapExtension.ts","../src/extensions/plain/PlainTextExtension.ts","../src/extensions/plain/MentionExtension.ts","../src/components/QuoteNodeView.tsx","../src/extensions/plain/QuoteExtension.ts","../src/utils/mention.ts","../src/hooks/usePlainEditor.ts","../src/utils/attachment.ts","../src/hooks/useAttachments.ts","../src/components/MentionList.tsx","../src/components/MentionPopover.tsx","../src/components/AttachmentPreview.tsx","../src/components/tiptap-ui-primitive/spacer/spacer.tsx","../src/lib/tiptap-utils.ts","../src/components/tiptap-ui-primitive/separator/separator.tsx","../src/hooks/use-menu-navigation.ts","../src/hooks/use-composed-ref.ts","../src/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/tiptap-ui-primitive/button/button.tsx","../src/components/tiptap-icons/close-icon.tsx","../src/components/tiptap-node/image-upload-node/image-upload-node.tsx","../src/components/tiptap-node/image-upload-node/image-upload-node-extension.ts","../src/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts","../src/components/tiptap-icons/chevron-down-icon.tsx","../src/hooks/use-tiptap-editor.ts","../src/components/tiptap-ui-primitive/badge/badge.tsx","../src/components/tiptap-ui/heading-button/heading-button.tsx","../src/components/tiptap-icons/heading-one-icon.tsx","../src/components/tiptap-icons/heading-two-icon.tsx","../src/components/tiptap-icons/heading-three-icon.tsx","../src/components/tiptap-icons/heading-four-icon.tsx","../src/components/tiptap-icons/heading-five-icon.tsx","../src/components/tiptap-icons/heading-six-icon.tsx","../src/components/tiptap-ui/heading-button/use-heading.ts","../src/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx","../src/components/tiptap-ui-primitive/card/card.tsx","../src/components/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx","../src/components/tiptap-icons/heading-icon.tsx","../src/components/tiptap-ui/heading-dropdown-menu/use-heading-dropdown-menu.ts","../src/components/tiptap-ui/image-upload-button/image-upload-button.tsx","../src/hooks/use-is-breakpoint.ts","../src/components/tiptap-icons/image-plus-icon.tsx","../src/components/tiptap-ui/image-upload-button/use-image-upload.ts","../src/components/tiptap-ui/list-button/list-button.tsx","../src/components/tiptap-icons/list-icon.tsx","../src/components/tiptap-icons/list-ordered-icon.tsx","../src/components/tiptap-icons/list-todo-icon.tsx","../src/components/tiptap-ui/list-button/use-list.ts","../src/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu.ts","../src/components/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/tiptap-ui/blockquote-button/blockquote-button.tsx","../src/components/tiptap-icons/blockquote-icon.tsx","../src/components/tiptap-ui/blockquote-button/use-blockquote.ts","../src/components/tiptap-ui/code-block-button/code-block-button.tsx","../src/components/tiptap-icons/code-block-icon.tsx","../src/components/tiptap-ui/code-block-button/use-code-block.ts","../src/components/tiptap-icons/ban-icon.tsx","../src/components/tiptap-icons/highlighter-icon.tsx","../src/components/tiptap-ui-primitive/popover/popover.tsx","../src/components/tiptap-ui/color-highlight-button/color-highlight-button.tsx","../src/components/tiptap-ui/color-highlight-button/use-color-highlight.ts","../src/components/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx","../src/components/tiptap-icons/corner-down-left-icon.tsx","../src/components/tiptap-icons/external-link-icon.tsx","../src/components/tiptap-icons/link-icon.tsx","../src/components/tiptap-icons/trash-icon.tsx","../src/components/tiptap-ui-primitive/input/input.tsx","../src/components/tiptap-ui/link-popover/link-popover.tsx","../src/components/tiptap-ui/link-popover/use-link-popover.ts","../src/components/tiptap-ui/mark-button/mark-button.tsx","../src/components/tiptap-icons/bold-icon.tsx","../src/components/tiptap-icons/code2-icon.tsx","../src/components/tiptap-icons/italic-icon.tsx","../src/components/tiptap-icons/strike-icon.tsx","../src/components/tiptap-icons/subscript-icon.tsx","../src/components/tiptap-icons/superscript-icon.tsx","../src/components/tiptap-icons/underline-icon.tsx","../src/components/tiptap-ui/mark-button/use-mark.ts","../src/components/tiptap-ui/text-align-button/text-align-button.tsx","../src/components/tiptap-icons/align-center-icon.tsx","../src/components/tiptap-icons/align-justify-icon.tsx","../src/components/tiptap-icons/align-left-icon.tsx","../src/components/tiptap-icons/align-right-icon.tsx","../src/components/tiptap-ui/text-align-button/use-text-align.ts","../src/components/tiptap-ui/undo-redo-button/undo-redo-button.tsx","../src/components/tiptap-icons/redo2-icon.tsx","../src/components/tiptap-icons/undo2-icon.tsx","../src/components/tiptap-ui/undo-redo-button/use-undo-redo.ts","../src/contexts/LocaleContext.tsx","../src/components/RichEditor.tsx","../src/components/IMComposer.tsx","../src/components/QuoteBar.tsx","../src/utils/markdown.ts","../src/utils/security.ts"],"names":["defaultLocale","compositionPluginKey","PluginKey","CompositionExtension","Extension","extension","Plugin","KeymapExtension","getSend","send","isSendKey","event","isNewlineKey","editor","commands","plainTextPluginKey","serializeToPlainText","slice","text","isFirst","node","child","PlainTextExtension","view","clipboardData","files","state","dispatch","tr","schema","lines","nodes","line","index","fragment","dataTransfer","mentionPluginKey","Node","element","attributes","HTMLAttributes","mergeAttributes","isMention","selection","empty","anchor","pos","createMentionExtension","options","currentState","updateState","updates","Mention","query","items","props","wrappedCommand","member","selectedMember","range","mentionCount","QuoteNodeView","selected","title","content","jsxs","NodeViewWrapper","jsx","e","QuoteExtension","ReactNodeViewRenderer","firstNode","$anchor","quoteSize","extractPlainTextWithMentions","mentions","plainText","doc","lastWasMention","userId","display","start","mentionText","end","utf16Length","str","validateMentionIndices","mention","extracted","expected","createMentionInfo","startIndex","getQuoteFromEditor","usePlainEditor","placeholder","sendKeymap","onSend","enableMention","mentionProvider","maxMentions","onMentionStateChange","onPasteFiles","isUploading","disabled","onChange","onQuoteRemoved","mentionListOpenRef","useRef","compositionRef","sendKeymapRef","onSendRef","handleMentionStateChange","useCallback","extensions","useMemo","exts","Document","Paragraph","Text","HardBreak","History","Placeholder","useEditor","editorElement","isComposing","isMentionListOpen","exportPayload","attachments","quote","getDraft","setDraft","draft","insertMention","insertQuote","removeQuote","getQuote","setText","insertText","clear","focus","generateAttachmentId","createAttachment","file","isImage","revokeAttachmentUrl","attachment","revokeAllAttachmentUrls","matchesMimeType","mime","pattern","prefix","isMimeTypeAllowed","allowedTypes","validateFile","currentCount","formatFileSize","bytes","k","sizes","i","useAttachments","maxAttachments","maxFileSize","allowedMimeTypes","onLimitExceeded","setAttachmentsState","useState","attachmentsRef","useEffect","addFiles","fileArray","currentAttachments","newAttachments","validationError","updated","removeAttachment","id","a","clearAttachments","setAttachments","currentIds","toRevoke","processedAttachments","att","getAttachments","MentionList","selectedIndex","loading","error","onSelect","onHover","renderItem","locale","noResults","loadingText","errorText","listRef","itemRefs","selectedItem","isSelected","el","getCursorRect","from","coords","MentionPopover","mentionState","placement","portalContainer","zIndex","isPositioned","setIsPositioned","cursorRectRef","floatingPlacement","fallbackPlacements","virtualReference","refs","floatingStyles","update","useFloating","offset","flip","shift","size","availableHeight","elements","autoUpdate","useLayoutEffect","frame","rect","FloatingPortal","AttachmentPreview","onRemove","removeLabel","FileIcon","CloseIcon","Spacer","orientation","style","computedStyle","MAX_FILE_SIZE","MAC_SYMBOLS","cn","classes","isMac","formatShortcutKey","key","capitalize","lowerKey","parseShortcutKeys","shortcutKeys","delimiter","isMarkInSchema","markName","isNodeInSchema","nodeName","focusNextNode","nextSel","Selection","paragraphType","para","$inside","TextSelection","isValidPosition","isExtensionAvailable","extensionNames","names","found","name","ext","findNodeAtPosition","position","findNodePosition","nodePos","hasValidNode","hasValidPos","foundPos","foundNode","currentNode","nodeAtPos","isNodeTypeSelected","nodeTypeNames","checkAncestorNodes","NodeSelection","selectedNode","$from","depth","ancestorNode","selectionWithinConvertibleTypes","types","allowed","nodeType","AllSelection","valid","ATTR_WHITESPACE","isAllowedUri","uri","protocols","allowedProtocols","sanitizeUrl","inputUrl","baseUrl","url","Separator","forwardRef","decorative","className","divProps","ref","semanticProps","useMenuNavigation","containerRef","onClose","autoSelectFirstItem","setSelectedIndex","handleKeyboardNavigation","moveNext","currentIndex","movePrev","targetElement","updateRef","value","useComposedRef","libRef","userRef","prevUserRef","instance","useToolbarNavigation","toolbarRef","setItems","collectItems","toolbar","updateItems","observer","handleFocus","target","handleBlur","Toolbar","children","variant","composedRef","ToolbarGroup","ToolbarSeparator","useTooltip","initialOpen","controlledOpen","setControlledOpen","delay","closeDelay","uncontrolledOpen","setUncontrolledOpen","open","setOpen","data","context","hover","useHover","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","TooltipContext","createContext","useTooltipContext","useContext","Tooltip","tooltip","FloatingDelayGroup","TooltipTrigger","asChild","propRef","childrenRef","isValidElement","version","useMergeRefs","dataAttributes","cloneElement","TooltipContent","portal","portalProps","ShortcutDisplay","shortcuts","Fragment","Button","showTooltip","ariaLabel","ButtonGroup","memo","useFileUpload","fileItems","setFileItems","uploadFile","abortController","fileId","newFileItem","prev","progress","item","uploadPromises","fileToRemove","CloudUploadIcon","FileCornerIcon","isFileAccepted","accept","t","acceptType","baseType","ImageUploadDragArea","onFile","isDragOver","setIsDragOver","isDragActive","setIsDragActive","ImageUploadPreview","fileItem","DropZoneContent","maxSize","limit","ImageUploadNode","inputRef","uploadOptions","uploadFiles","removeFileItem","clearAllFiles","handleUpload","urls","imageNodes","filename","handleChange","handleClick","hasFiles","nodeAfter","nodeEl","firstChild","HorizontalRule","TiptapHorizontalRule","ChevronDownIcon","useTiptapEditor","providedEditor","coreEditor","useCurrentEditor","mainEditor","useEditorState","Badge","appearance","trimText","HeadingShortcutBadge","level","HEADING_SHORTCUT_KEYS","HeadingButton","hideWhenUnavailable","onToggled","showShortcut","onClick","buttonProps","isVisible","canToggle","isActive","handleToggle","label","Icon","useHeading","HeadingOneIcon","HeadingTwoIcon","HeadingThreeIcon","HeadingFourIcon","HeadingFiveIcon","HeadingSixIcon","headingIcons","turnInto","isHeadingActive","l","toggleHeading","levels","toggleLevel","chain","lastChild","to","resolvedFrom","resolvedTo","shouldShowButton","config","setIsVisible","canToggleState","handleSelectionUpdate","success","DropdownMenu","B","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuItem","DropdownMenuSubContent","DropdownMenuContent","sideOffset","Card","CardHeader","CardBody","CardItemGroup","CardGroupLabel","CardFooter","HeadingDropdownMenu","onOpenChange","labels","isOpen","setIsOpen","useHeadingDropdownMenu","handleOpenChange","HeadingIcon","getActiveHeadingLevel","activeLevel","ImageShortcutBadge","IMAGE_UPLOAD_SHORTCUT_KEY","ImageUploadButton","onInserted","CustomIcon","canInsert","handleImage","useImageUpload","useIsBreakpoint","mode","breakpoint","matches","setMatches","mql","ImagePlusIcon","canInsertImage","isImageActive","insertImage","isMobile","useHotkeys","ListShortcutBadge","type","LIST_SHORTCUT_KEYS","ListButton","useList","ListIcon","ListOrderedIcon","ListTodoIcon","listIcons","listLabels","canToggleList","isListActive","toggleList","toggle","listOptions","canToggleAnyList","listTypes","isAnyListActive","getFilteredListOptions","availableTypes","option","shouldShowListDropdown","params","listInSchema","canToggleAny","getActiveListType","useListDropdownMenu","filteredLists","isAnyActive","activeType","activeList","ListDropdownMenu","handleOnOpenChange","BlockquoteShortcutBadge","BLOCKQUOTE_SHORTCUT_KEY","BlockquoteButton","useBlockquote","BlockquoteIcon","canToggleBlockquote","toggleBlockquote","CodeBlockShortcutBadge","CODE_BLOCK_SHORTCUT_KEY","CodeBlockButton","useCodeBlock","CodeBlockIcon","toggleCodeBlock","BanIcon","HighlighterIcon","Popover","ue","PopoverTrigger","PopoverContent","align","ColorHighlightShortcutBadge","COLOR_HIGHLIGHT_SHORTCUT_KEY","ColorHighlightButton","highlightColor","onApplied","canColorHighlight","handleColorHighlight","useColorHighlight","buttonStyle","HIGHLIGHT_COLORS","pickHighlightColorsByValue","values","colorMap","color","isColorHighlightActive","$pos","removeHighlight","canColorHighlightState","highlightMarkType","handleRemoveHighlight","ColorHighlightPopoverButton","ColorHighlightPopoverContent","colors","removeTooltip","menuItems","highlightedElement","ColorHighlightPopover","CornerDownLeftIcon","ExternalLinkIcon","LinkIcon","TrashIcon","Input","InputGroup","LinkButton","LinkMain","setUrl","setLink","removeLink","openLink","applyTooltip","openTooltip","handleKeyDown","LinkPopover","onSetLink","autoOpenOnLinkActive","canSet","useLinkPopover","nextIsOpen","handleSetLink","canSetLink","isLinkActive","shouldShowLinkButton","useLinkHandler","href","updateLinkState","isEmpty","features","safeUrl","useLinkState","linkHandler","MarkShortcutBadge","MARK_SHORTCUT_KEYS","MarkButton","handleMark","useMark","BoldIcon","Code2Icon","ItalicIcon","StrikeIcon","SubscriptIcon","SuperscriptIcon","UnderlineIcon","markIcons","canToggleMark","isMarkActive","toggleMark","getFormattedMarkName","TextAlignShortcutBadge","TEXT_ALIGN_SHORTCUT_KEYS","TextAlignButton","onAligned","handleTextAlign","canAlign","useTextAlign","AlignCenterIcon","AlignJustifyIcon","AlignLeftIcon","AlignRightIcon","textAlignIcons","textAlignLabels","canSetTextAlign","hasSetTextAlign","isTextAlignActive","setTextAlign","HistoryShortcutBadge","action","UNDO_REDO_SHORTCUT_KEYS","UndoRedoButton","onExecuted","handleAction","canExecute","useUndoRedo","Redo2Icon","Undo2Icon","historyActionLabels","historyIcons","canExecuteUndoRedoAction","executeUndoRedoAction","handleUpdate","LocaleContext","LocaleProvider","mergedLocale","useLocale","RichToolbar","RichEditor","uploadImage","onUploadingChange","uploadingCountRef","pasteUploads","setPasteUploads","handleImageUpload","onProgress","abortSignal","result","imagePos","imageFiles","uploadId","next","coordinates","transaction","isMod","StarterKit","TextAlign","TaskList","TaskItem","Highlight","Typography","Superscript","Subscript","Image","useImperativeHandle","markdown","EditorContext","EditorContent","IMComposer","controlledMode","defaultMode","onContextMenu","renderMentionItem","mentionPlacement","enableAttachments","attachmentPreviewPlacement","onAttachmentLimitExceeded","onFilesChange","showAttachmentPreview","keymap","customLocale","internalMode","setInternalMode","setMentionState","uploadingCount","setUploadingCount","richEditorRef","getPlaceholder","handlePlainSend","payload","plainEditor","handleRichSend","handleMentionSelect","s","atts","renderPlainMode","renderRichMode","QuoteBar","editorToMarkdown","nodeToMarkdown","parts","childNodeToMarkdown","paragraphContent","inlineContentToMarkdown","listToMarkdown","language","code","src","alt","titlePart","formatTextWithMarks","marker","indent","itemMarker","childOffset","childIndex","escapeMarkdown","marks","b","order","mark","markdownToEditorContent","codeLines","headingMatch","parseInlineContent","quoteLines","itemText","orderedMatch","remaining","patterns","earliestMatch","earliestIndex","match","ALLOWED_LINK_PROTOCOLS","ALLOWED_IMAGE_PROTOCOLS","isAllowedLinkProtocol","parsed","isAllowedImageProtocol","sanitizeLinkUrl","trimmedUrl","sanitizeImageUrl"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode, MouseEventHandler } from 'react';\n\n// ============================================================================\n// Attachment Types\n// ============================================================================\n\n/**\n * Represents a file attachment in plain mode\n */\nexport interface Attachment {\n /** Unique identifier generated by the component */\n id: string;\n /** Original File object */\n file: File;\n /** File name */\n name: string;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mime: string;\n /** File last modified timestamp */\n lastModified?: number;\n /** Preview URL for images (objectURL) */\n previewUrl?: string;\n}\n\n// ============================================================================\n// Mention Types\n// ============================================================================\n\n/**\n * Information about a mention in the message\n */\nexport interface MentionInfo {\n /** User ID */\n userId: string;\n /** Display name */\n display: string;\n /** Start index in plainText (UTF-16, inclusive) */\n start: number;\n /** End index in plainText (UTF-16, exclusive) */\n end: number;\n}\n\n/**\n * Member data for mention suggestions\n */\nexport interface Member {\n /** Unique user identifier */\n userId: string;\n /** Display name shown in the editor */\n display: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n}\n\n// ============================================================================\n// Quote Types\n// ============================================================================\n\n/**\n * Quoted message information\n */\nexport interface QuoteInfo {\n /** Quote title, e.g., \"Reply to Alice:\" */\n title: string;\n /** Quoted content */\n content: string;\n}\n\n// ============================================================================\n// Payload Types\n// ============================================================================\n\n/**\n * Result from image upload handler\n */\nexport interface UploadImageResult {\n /** URL of the uploaded image */\n url: string;\n /** Optional alt text */\n alt?: string;\n}\n\n/**\n * Progress callback for image upload\n */\nexport interface UploadProgressEvent {\n /** Upload progress percentage (0-100) */\n progress: number;\n}\n\n/**\n * Image upload function type with optional progress callback\n */\nexport type UploadImageFn = (\n file: File,\n onProgress?: (event: UploadProgressEvent) => void\n) => Promise<UploadImageResult>;\n\n/**\n * Payload for plain text mode messages\n */\nexport interface PlainMessagePayload {\n type: 'text';\n /** Plain text with mentions as @userId */\n plainText: string;\n /** List of mentions with their positions */\n mentions: MentionInfo[];\n /** List of attached files */\n attachments: Attachment[];\n /** Quoted message (if any) */\n quote?: QuoteInfo;\n}\n\n/**\n * Payload for rich text mode messages (Markdown)\n */\nexport interface MarkdownMessagePayload {\n type: 'markdown';\n /** Markdown content */\n markdown: string;\n}\n\n/**\n * Union type for all message payloads\n */\nexport type MessagePayload = PlainMessagePayload | MarkdownMessagePayload;\n\n// ============================================================================\n// Draft Types\n// ============================================================================\n\n/**\n * Draft state for saving/restoring editor content\n */\nexport interface ComposerDraft {\n /** Editor mode */\n mode?: EditorMode;\n /** Serialized editor state (JSON string from getJSON) - deprecated, use json */\n editorState?: string;\n /** Editor JSON content */\n json?: Record<string, unknown>;\n /** Attachments (plain mode only) */\n attachments?: Attachment[];\n /** Quick restore text for plain mode */\n text?: string;\n /** Quote information (plain mode only) */\n quote?: QuoteInfo;\n}\n\n// ============================================================================\n// Locale Types\n// ============================================================================\n\n/**\n * Locale strings for internationalization\n */\nexport interface IMComposerLocale {\n /** Placeholder text for plain mode */\n placeholderPlain?: string;\n /** Placeholder text for rich mode */\n placeholderRich?: string;\n /** No results found in mention list */\n mentionNoResults?: string;\n /** Loading text for mention list */\n mentionLoading?: string;\n /** Error text for mention list */\n mentionError?: string;\n /** Remove attachment button label */\n removeAttachment?: string;\n /** Remove quote button label */\n removeQuote?: string;\n /** Upload failed message */\n uploadFailed?: string;\n /** Uploading text */\n uploading?: string;\n\n // Toolbar buttons\n /** Undo button */\n undo?: string;\n /** Redo button */\n redo?: string;\n /** Heading dropdown */\n heading?: string;\n /** Heading 1 */\n heading1?: string;\n /** Heading 2 */\n heading2?: string;\n /** Heading 3 */\n heading3?: string;\n /** Heading 4 */\n heading4?: string;\n /** Paragraph */\n paragraph?: string;\n /** List dropdown */\n list?: string;\n /** Bullet list */\n bulletList?: string;\n /** Ordered list */\n orderedList?: string;\n /** Task list */\n taskList?: string;\n /** Blockquote button */\n blockquote?: string;\n /** Code block button */\n codeBlock?: string;\n /** Bold button */\n bold?: string;\n /** Italic button */\n italic?: string;\n /** Strikethrough button */\n strike?: string;\n /** Inline code button */\n code?: string;\n /** Underline button */\n underline?: string;\n /** Highlight button */\n highlight?: string;\n /** Remove highlight */\n removeHighlight?: string;\n /** Link button */\n link?: string;\n /** Link input placeholder */\n linkPlaceholder?: string;\n /** Apply link */\n applyLink?: string;\n /** Open link */\n openLink?: string;\n /** Remove link */\n removeLink?: string;\n /** Superscript button */\n superscript?: string;\n /** Subscript button */\n subscript?: string;\n /** Align left button */\n alignLeft?: string;\n /** Align center button */\n alignCenter?: string;\n /** Align right button */\n alignRight?: string;\n /** Align justify button */\n alignJustify?: string;\n /** Insert image button */\n insertImage?: string;\n /** Upload image */\n uploadImage?: string;\n /** Click to upload */\n clickToUpload?: string;\n /** Or drag and drop */\n orDragAndDrop?: string;\n /** Maximum files */\n maxFiles?: string;\n /** Clear all */\n clearAll?: string;\n}\n\n/**\n * Default English locale\n */\nexport const defaultLocale: IMComposerLocale = {\n placeholderPlain: 'Type a message...',\n placeholderRich: 'Write something...',\n mentionNoResults: 'No results found',\n mentionLoading: 'Loading...',\n mentionError: 'Failed to load',\n removeAttachment: 'Remove',\n removeQuote: 'Remove quote',\n uploadFailed: 'Upload failed',\n uploading: 'Uploading...',\n\n // Toolbar buttons\n undo: 'Undo',\n redo: 'Redo',\n heading: 'Heading',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n paragraph: 'Paragraph',\n list: 'List',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n code: 'Code',\n underline: 'Underline',\n highlight: 'Highlight',\n removeHighlight: 'Remove Highlight',\n link: 'Link',\n linkPlaceholder: 'Paste a link...',\n applyLink: 'Apply',\n openLink: 'Open in new window',\n removeLink: 'Remove link',\n superscript: 'Superscript',\n subscript: 'Subscript',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n insertImage: 'Insert Image',\n uploadImage: 'Upload Image',\n clickToUpload: 'Click to upload',\n orDragAndDrop: 'or drag and drop',\n maxFiles: 'Maximum {limit} file(s), {size}MB each',\n clearAll: 'Clear All',\n};\n\n// ============================================================================\n// Props Types\n// ============================================================================\n\n/**\n * Send keymap configuration\n */\nexport type SendKeymap = 'enter' | 'ctrlEnter' | 'cmdEnter';\n\n/**\n * Editor mode\n */\nexport type EditorMode = 'plain' | 'rich';\n\n/**\n * Attachment limit exceeded reason\n */\nexport type AttachmentLimitReason = 'count' | 'size' | 'mime';\n\n/**\n * Main component props\n */\nexport interface IMComposerProps {\n // Mode\n /** Controlled mode */\n mode?: EditorMode;\n /** Default mode for uncontrolled usage */\n defaultMode?: EditorMode;\n\n // Callbacks\n /** Called when user triggers send action */\n onSend?: (payload: PlainMessagePayload | MarkdownMessagePayload) => void;\n /** Called when editor content changes */\n onChange?: () => void;\n /** Context menu handler */\n onContextMenu?: MouseEventHandler<HTMLDivElement>;\n /** Called when quote is removed */\n onQuoteRemoved?: () => void;\n\n // Plain Mode - Mention\n /** Enable @mention feature */\n enableMention?: boolean;\n /** Async provider for mention suggestions */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Maximum number of mentions allowed */\n maxMentions?: number;\n /** Custom render function for mention list items */\n renderMentionItem?: (props: { member: Member; isSelected: boolean }) => ReactNode;\n /** Mention list placement relative to cursor: 'top' or 'bottom' */\n mentionPlacement?: 'top' | 'bottom';\n\n // Plain Mode - Attachments\n /** Enable file attachments */\n enableAttachments?: boolean;\n /** Attachment preview bar placement */\n attachmentPreviewPlacement?: 'top' | 'bottom';\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Allowed MIME types (supports wildcards like \"image/*\") */\n allowedMimeTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Called when attachment limit is exceeded */\n onAttachmentLimitExceeded?: (reason: AttachmentLimitReason, file: File) => void;\n /** Called when attachments change */\n onFilesChange?: (attachments: Attachment[]) => void;\n /** Show attachment preview bar */\n showAttachmentPreview?: boolean;\n\n // Rich Mode\n /** Markdown options */\n markdownOptions?: {\n enabledSyntax?: string[];\n };\n /** Image upload handler with optional progress callback */\n uploadImage?: UploadImageFn;\n\n // Keymap\n /** Keymap configuration */\n keymap?: {\n send?: SendKeymap;\n };\n\n // Common\n /** Placeholder text (string or per-mode object) */\n placeholder?: string | { plain?: string; rich?: string };\n /** Disable the editor */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n\n // i18n\n /** Locale strings */\n locale?: IMComposerLocale;\n}\n\n// ============================================================================\n// Ref Types\n// ============================================================================\n\n/**\n * Methods exposed via ref\n */\nexport interface IMComposerRef {\n /** Focus the editor */\n focus: () => void;\n /** Clear the editor content */\n clear: () => void;\n /** Export current content as payload. Returns null if empty or uploading */\n exportPayload: () => PlainMessagePayload | MarkdownMessagePayload | null;\n\n // Rich mode\n /** Import markdown content (rich mode only) */\n importMarkdown: (markdown: string) => void;\n\n // Attachments (plain mode only)\n /** Get current attachments */\n getAttachments: () => Attachment[];\n /** Set attachments */\n setAttachments: (attachments: Attachment[]) => void;\n /** Add files to attachments */\n addFiles: (files: FileList | File[]) => void;\n /** Remove a specific attachment by ID */\n removeAttachment: (id: string) => void;\n /** Clear all attachments */\n clearAttachments: () => void;\n\n // Quote (plain mode only)\n /** Insert or replace a quote */\n insertQuote: (title: string, content: string) => void;\n\n // Mention (plain mode only)\n /** Programmatically insert a mention */\n insertMention: (userId: string, display: string) => void;\n\n // Draft\n /** Get current draft state */\n getDraft: () => ComposerDraft;\n /** Restore from draft state */\n setDraft: (draft: ComposerDraft) => void;\n\n // Text operations\n /** Set text content (with optional mentions for plain mode) */\n setText: (text: string, mentions?: Member[]) => void;\n /** Insert text at cursor */\n insertText: (text: string) => void;\n}\n\n// ============================================================================\n// Internal Types (not exported from main entry)\n// ============================================================================\n\n/**\n * @internal Mention suggestion state\n */\nexport interface MentionSuggestionState {\n active: boolean;\n query: string;\n items: Member[];\n selectedIndex: number;\n loading: boolean;\n error: boolean;\n /** Command to insert a mention (replaces @ trigger) */\n command: ((member: { userId: string; display: string }) => void) | null;\n}\n\n/**\n * @internal Composition state for IME handling\n */\nexport interface CompositionState {\n isComposing: boolean;\n}\n\n/**\n * @internal Upload state for images\n */\nexport interface UploadState {\n uploadingCount: number;\n}\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport interface CompositionExtensionStorage {\n isComposing: boolean;\n}\n\nexport const compositionPluginKey = new PluginKey('composition');\n\n/**\n * Extension to track IME composition state.\n * This is critical for handling CJK input correctly.\n */\nexport const CompositionExtension = Extension.create<{}, CompositionExtensionStorage>({\n name: 'composition',\n\n addStorage() {\n return {\n isComposing: false,\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n\n return [\n new Plugin({\n key: compositionPluginKey,\n props: {\n handleDOMEvents: {\n compositionstart: () => {\n extension.storage.isComposing = true;\n return false;\n },\n compositionend: () => {\n extension.storage.isComposing = false;\n return false;\n },\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport type { SendKeymap } from '../../types';\n\nexport interface KeymapExtensionOptions {\n /** Send keymap configuration (can be a function for dynamic value) */\n send: SendKeymap | (() => SendKeymap);\n /** Callback when send is triggered */\n onSend?: () => void;\n /** Check if mention list is open */\n isMentionListOpen?: () => boolean;\n /** Check if uploading */\n isUploading?: () => boolean;\n /** Check if composing (IME) */\n isComposing?: () => boolean;\n}\n\nexport interface KeymapExtensionStorage {\n options: KeymapExtensionOptions;\n}\n\nexport const keymapPluginKey = new PluginKey('imKeymap');\n\n/**\n * Extension to handle send/newline keyboard shortcuts with proper priority.\n *\n * Priority order (as per PRD):\n * 1. IME composing → ignore all shortcuts\n * 2. Mention list open → ↑↓ Enter Esc for navigation\n * 3. Uploading → disable send\n * 4. Editor default behavior\n * 5. Send keymap\n */\nexport const KeymapExtension = Extension.create<KeymapExtensionOptions, KeymapExtensionStorage>({\n name: 'imKeymap',\n\n addOptions() {\n return {\n send: 'enter',\n onSend: undefined,\n isMentionListOpen: () => false,\n isUploading: () => false,\n isComposing: () => false,\n };\n },\n\n addStorage() {\n return {\n options: this.options,\n };\n },\n\n addKeyboardShortcuts() {\n const getSend = (): SendKeymap => {\n const { send } = this.options;\n return typeof send === 'function' ? send() : send;\n };\n\n const isSendKey = (event: KeyboardEvent): boolean => {\n const send = getSend();\n\n switch (send) {\n case 'enter':\n return event.key === 'Enter' && !event.shiftKey && !event.ctrlKey && !event.metaKey;\n case 'ctrlEnter':\n return event.key === 'Enter' && event.ctrlKey;\n case 'cmdEnter':\n return event.key === 'Enter' && event.metaKey;\n default:\n return false;\n }\n };\n\n const isNewlineKey = (event: KeyboardEvent): boolean => {\n const send = getSend();\n\n switch (send) {\n case 'enter':\n return event.key === 'Enter' && event.shiftKey;\n case 'ctrlEnter':\n case 'cmdEnter':\n return event.key === 'Enter' && !event.ctrlKey && !event.metaKey;\n default:\n return false;\n }\n };\n\n return {\n Enter: ({ editor }) => {\n const event = (editor.view.dom.ownerDocument.defaultView as Window & { event?: KeyboardEvent })?.event;\n if (!event) return false;\n\n // Priority 1: IME composing\n if (this.options.isComposing?.()) {\n return false;\n }\n\n // Priority 2: Mention list open (handled by mention extension)\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n // Check for send\n if (isSendKey(event)) {\n // Priority 3: Uploading\n if (this.options.isUploading?.()) {\n return true; // Block send but consume the event\n }\n\n // Priority 5: Send\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n // Check for newline\n if (isNewlineKey(event)) {\n return editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ]);\n }\n\n return false;\n },\n\n 'Shift-Enter': ({ editor }) => {\n const send = getSend();\n\n if (this.options.isComposing?.()) {\n return false;\n }\n\n // For 'enter' mode, Shift+Enter creates newline\n if (send === 'enter') {\n return editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ]);\n }\n\n return false;\n },\n\n 'Mod-Enter': ({ editor }) => {\n if (this.options.isComposing?.()) {\n return false;\n }\n\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n const send = getSend();\n\n // Mod-Enter is Cmd+Enter on Mac, Ctrl+Enter on Windows/Linux\n if (send === 'cmdEnter' || send === 'ctrlEnter') {\n if (this.options.isUploading?.()) {\n return true;\n }\n\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n return false;\n },\n\n // Explicit Ctrl-Enter for Mac (where Mod is Cmd)\n 'Ctrl-Enter': () => {\n if (this.options.isComposing?.()) {\n return false;\n }\n\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n const send = getSend();\n\n if (send === 'ctrlEnter') {\n if (this.options.isUploading?.()) {\n return true;\n }\n\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n return false;\n },\n };\n },\n});\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport interface PlainTextExtensionOptions {\n /** Callback when files are pasted */\n onPasteFiles?: (files: File[]) => void;\n}\n\nexport const plainTextPluginKey = new PluginKey('plainText');\n\n/**\n * Serialize document slice to plain text with single newlines between paragraphs.\n */\nfunction serializeToPlainText(slice: any): string {\n let text = '';\n let isFirst = true;\n\n slice.content.forEach((node: any) => {\n if (node.type.name === 'quote') {\n // Skip quote nodes in clipboard\n return;\n }\n\n if (node.type.name === 'paragraph') {\n if (!isFirst) {\n text += '\\n';\n }\n isFirst = false;\n\n node.content?.forEach((child: any) => {\n if (child.isText) {\n text += child.text || '';\n } else if (child.type.name === 'mention') {\n text += `@${child.attrs.display || child.attrs.userId}`;\n } else if (child.type.name === 'hardBreak') {\n text += '\\n';\n }\n });\n }\n });\n\n return text;\n}\n\n/**\n * Extension for plain text mode.\n * Handles paste events to ensure plain text only and file detection.\n */\nexport const PlainTextExtension = Extension.create<PlainTextExtensionOptions>({\n name: 'plainText',\n\n addOptions() {\n return {\n onPasteFiles: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n\n return [\n new Plugin({\n key: plainTextPluginKey,\n props: {\n handlePaste: (view, event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n // Check for files\n const files = Array.from(clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n extension.options.onPasteFiles?.(files);\n return true;\n }\n\n // Force plain text paste (strip formatting, keep newlines)\n const text = clipboardData.getData('text/plain');\n if (text) {\n event.preventDefault();\n\n const { state, dispatch } = view;\n const { tr, schema } = state;\n\n // Split by newlines and create paragraphs\n const lines = text.split(/\\r?\\n/);\n const nodes: any[] = [];\n\n lines.forEach((line, index) => {\n if (index > 0) {\n // Add hard break for newlines within the paste\n nodes.push(schema.nodes.hardBreak?.create() || schema.text('\\n'));\n }\n if (line) {\n nodes.push(schema.text(line));\n }\n });\n\n if (nodes.length > 0) {\n const fragment = state.schema.nodes.doc.create(\n null,\n state.schema.nodes.paragraph.create(null, nodes)\n );\n const slice = fragment.slice(1, fragment.content.size - 1);\n dispatch(tr.replaceSelection(slice));\n }\n\n return true;\n }\n\n return false;\n },\n\n // Disable dropping rich content\n handleDrop: (view, event) => {\n const dataTransfer = event.dataTransfer;\n if (!dataTransfer) return false;\n\n const files = Array.from(dataTransfer.files);\n if (files.length > 0) {\n event.preventDefault();\n extension.options.onPasteFiles?.(files);\n return true;\n }\n\n return false;\n },\n\n // Custom clipboard text serializer to avoid double newlines\n clipboardTextSerializer: (slice) => {\n return serializeToPlainText(slice);\n },\n },\n }),\n ];\n },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\nimport { PluginKey } from '@tiptap/pm/state';\nimport Mention from '@tiptap/extension-mention';\nimport type { SuggestionProps, SuggestionKeyDownProps } from '@tiptap/suggestion';\nimport type { Member, MentionSuggestionState } from '../../types';\n\nexport interface MentionExtensionOptions {\n /** Provider for mention suggestions */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Maximum number of mentions allowed */\n maxMentions?: number;\n /** Callback when mention state changes */\n onMentionStateChange?: (state: MentionSuggestionState) => void;\n /** Check if composing */\n isComposing?: () => boolean;\n}\n\nexport const mentionPluginKey = new PluginKey('mentionSuggestion');\n\n/**\n * Custom mention node that extends Tiptap's Mention.\n * The node is atomic (cursor cannot enter) and stores both userId and display.\n */\nexport const MentionNode = Node.create({\n name: 'mention',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderLabel: ({ node }: { node: any }) => `@${node.attrs.display}`,\n suggestion: {},\n };\n },\n\n group: 'inline',\n inline: true,\n selectable: false,\n atom: true, // Cannot be split, cursor cannot enter\n\n addAttributes() {\n return {\n userId: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-user-id'),\n renderHTML: (attributes) => ({\n 'data-user-id': attributes.userId,\n }),\n },\n display: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-display'),\n renderHTML: (attributes) => ({\n 'data-display': attributes.display,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'span',\n mergeAttributes(\n { 'data-type': this.name, class: 'im-mention' },\n this.options.HTMLAttributes,\n HTMLAttributes\n ),\n `@${node.attrs.display}`,\n ];\n },\n\n renderText({ node }) {\n // Output format: @{userId} (with trailing space handled during export)\n return `@${node.attrs.userId}`;\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText('', pos, pos + node.nodeSize);\n return false;\n }\n return true;\n });\n\n return isMention;\n }),\n };\n },\n});\n\n/**\n * Create mention extension with suggestion functionality.\n */\nexport function createMentionExtension(options: MentionExtensionOptions) {\n let currentState = {\n active: false,\n query: '',\n items: [] as Member[],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null as ((member: { userId: string; display: string }) => void) | null,\n };\n\n const updateState = (updates: Partial<typeof currentState>) => {\n currentState = { ...currentState, ...updates };\n options.onMentionStateChange?.(currentState);\n };\n\n return Mention.extend({\n name: 'mention',\n\n addOptions() {\n return {\n ...this.parent?.(),\n suggestion: {\n char: '@',\n pluginKey: mentionPluginKey,\n\n items: async ({ query }: { query: string }): Promise<Member[]> => {\n if (!options.mentionProvider) {\n return [];\n }\n\n updateState({ loading: true, error: false, query });\n\n try {\n const items = await options.mentionProvider(query);\n updateState({ items, loading: false });\n return items;\n } catch {\n updateState({ error: true, loading: false, items: [] });\n return [];\n }\n },\n\n render: () => {\n return {\n onStart: (props: SuggestionProps) => {\n // Wrap command to match our interface\n const wrappedCommand = (member: { userId: string; display: string }) => {\n (props.command as any)({\n userId: member.userId,\n display: member.display,\n });\n };\n\n updateState({\n active: true,\n query: props.query,\n selectedIndex: 0,\n command: wrappedCommand,\n });\n },\n\n onUpdate: (props: SuggestionProps) => {\n // Wrap command to match our interface\n const wrappedCommand = (member: { userId: string; display: string }) => {\n (props.command as any)({\n userId: member.userId,\n display: member.display,\n });\n };\n\n updateState({\n query: props.query,\n selectedIndex: 0,\n command: wrappedCommand,\n });\n },\n\n onKeyDown: (props: SuggestionKeyDownProps): boolean => {\n const { event } = props;\n\n // Don't handle keys during IME composition\n if (options.isComposing?.() || event.isComposing) {\n return false;\n }\n\n if (event.key === 'ArrowUp') {\n updateState({\n selectedIndex:\n (currentState.selectedIndex - 1 + currentState.items.length) %\n currentState.items.length,\n });\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n updateState({\n selectedIndex: (currentState.selectedIndex + 1) % currentState.items.length,\n });\n return true;\n }\n\n if (event.key === 'Enter') {\n const selectedMember = currentState.items[currentState.selectedIndex];\n if (selectedMember && currentState.command) {\n currentState.command({\n userId: selectedMember.userId,\n display: selectedMember.display,\n });\n }\n return true;\n }\n\n if (event.key === 'Escape') {\n updateState({ active: false, command: null });\n return true;\n }\n\n return false;\n },\n\n onExit: () => {\n updateState({\n active: false,\n query: '',\n items: [],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null,\n });\n },\n };\n },\n\n command: ({ editor, range, props }: { editor: any; range: any; props: any }) => {\n // Check mention limit\n if (options.maxMentions) {\n let mentionCount = 0;\n editor.state.doc.descendants((node: any) => {\n if (node.type.name === 'mention') {\n mentionCount++;\n }\n });\n if (mentionCount >= options.maxMentions) {\n return;\n }\n }\n\n // Insert mention node without trailing space\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: 'mention',\n attrs: {\n userId: props.userId,\n display: props.display,\n },\n },\n ])\n .run();\n },\n },\n };\n },\n\n addAttributes() {\n return {\n userId: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-user-id'),\n renderHTML: (attributes) => ({\n 'data-user-id': attributes.userId,\n }),\n },\n display: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-display'),\n renderHTML: (attributes) => ({\n 'data-display': attributes.display,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'span',\n mergeAttributes(\n { 'data-type': this.name, class: 'im-mention' },\n HTMLAttributes\n ),\n `@${node.attrs.display}`,\n ];\n },\n });\n}\n\nexport { mentionPluginKey as MentionPluginKey };\n","import React from 'react';\nimport { NodeViewWrapper, type NodeViewProps } from '@tiptap/react';\n\n/**\n * React NodeView component for rendering quote nodes in the editor.\n */\nexport function QuoteNodeView({ node, editor, selected }: NodeViewProps) {\n const { title, content } = node.attrs;\n\n const handleRemove = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n editor.commands.removeQuote();\n };\n\n return (\n <NodeViewWrapper\n className={`im-quote-node ${selected ? 'im-quote-node--selected' : ''}`}\n data-type=\"quote\"\n >\n <div className=\"im-quote-node__content\">\n <span className=\"im-quote-node__title\">{title}</span>\n <span className=\"im-quote-node__text\">{content}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-quote-node__remove-btn\"\n onClick={handleRemove}\n contentEditable={false}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n </NodeViewWrapper>\n );\n}\n","import { Node, mergeAttributes } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { QuoteNodeView } from '../../components/QuoteNodeView';\n\nexport interface QuoteExtensionOptions {\n /** Callback when quote is removed */\n onQuoteRemoved?: () => void;\n /** Remove button label */\n removeLabel?: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n quote: {\n /** Insert a quote at the start of the document */\n insertQuote: (title: string, content: string) => ReturnType;\n /** Remove the quote */\n removeQuote: () => ReturnType;\n };\n }\n}\n\n/**\n * Quote node extension for displaying quoted messages in the editor.\n * The quote is always at the top of the document and can be selected/deleted.\n */\nexport const QuoteExtension = Node.create<QuoteExtensionOptions>({\n name: 'quote',\n\n addOptions() {\n return {\n onQuoteRemoved: undefined,\n removeLabel: 'Remove quote',\n };\n },\n\n group: 'block',\n atom: true,\n selectable: true,\n draggable: false,\n\n addAttributes() {\n return {\n title: {\n default: '',\n parseHTML: (element) => element.getAttribute('data-title'),\n renderHTML: (attributes) => ({\n 'data-title': attributes.title,\n }),\n },\n content: {\n default: '',\n parseHTML: (element) => element.getAttribute('data-content'),\n renderHTML: (attributes) => ({\n 'data-content': attributes.content,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"quote\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({ 'data-type': 'quote', class: 'im-quote-node' }, HTMLAttributes),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(QuoteNodeView);\n },\n\n addCommands() {\n return {\n insertQuote:\n (title: string, content: string) =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const node = this.type.create({ title, content });\n // Check if first node is already a quote\n const firstNode = tr.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n // Replace existing quote\n tr.replaceWith(0, firstNode.nodeSize, node);\n } else {\n // Insert at the beginning\n tr.insert(0, node);\n }\n }\n return true;\n },\n\n removeQuote:\n () =>\n ({ tr, dispatch, state }) => {\n if (dispatch) {\n const firstNode = state.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n tr.delete(0, firstNode.nodeSize);\n this.options.onQuoteRemoved?.();\n }\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: ({ editor }) => {\n const { selection } = editor.state;\n const { $anchor, empty } = selection;\n const firstNode = editor.state.doc.firstChild;\n\n // If quote node is selected, delete it\n if (firstNode?.type.name === 'quote') {\n const quoteSize = firstNode.nodeSize;\n\n // Cursor is right after quote (at start of first paragraph)\n if (empty && $anchor.pos === quoteSize + 1) {\n editor.commands.removeQuote();\n return true;\n }\n\n // Quote is selected\n const node = editor.state.doc.nodeAt(selection.from);\n if (node?.type.name === 'quote') {\n editor.commands.removeQuote();\n return true;\n }\n }\n\n return false;\n },\n Delete: ({ editor }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.from);\n if (node?.type.name === 'quote') {\n editor.commands.removeQuote();\n return true;\n }\n return false;\n },\n };\n },\n});\n","import type { Editor } from '@tiptap/core';\nimport type { MentionInfo } from '../types';\n\n/**\n * Extract plain text and mention information from the editor.\n * Mention tokens are output as @{userId} followed by a space.\n *\n * @param editor Tiptap editor instance\n * @returns Object containing plainText and mentions array with UTF-16 indices\n */\nexport function extractPlainTextWithMentions(editor: Editor): {\n plainText: string;\n mentions: MentionInfo[];\n} {\n const mentions: MentionInfo[] = [];\n let plainText = '';\n\n const doc = editor.state.doc;\n\n // Track if we need to add space after mention\n let lastWasMention = false;\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'mention') {\n const userId = node.attrs.userId;\n const display = node.attrs.display;\n\n // Calculate start index (UTF-16)\n const start = plainText.length;\n\n // Mention text format: @{userId}\n const mentionText = `@${userId}`;\n plainText += mentionText;\n\n // End index (exclusive)\n const end = plainText.length;\n\n mentions.push({\n userId,\n display,\n start,\n end,\n });\n\n lastWasMention = true;\n return false; // Don't descend into mention node\n }\n\n if (node.isText) {\n const text = node.text || '';\n // If last was mention and text doesn't start with space, add one\n if (lastWasMention && text.length > 0 && !text.startsWith(' ')) {\n plainText += ' ';\n }\n plainText += text;\n lastWasMention = false;\n return false;\n }\n\n if (node.type.name === 'hardBreak') {\n // Add space after mention if needed before the line break\n if (lastWasMention) {\n plainText += ' ';\n }\n plainText += '\\n';\n lastWasMention = false;\n return false;\n }\n\n if (node.type.name === 'paragraph') {\n // Add space after mention if needed, then add newline before paragraph (except first)\n if (plainText.length > 0) {\n if (lastWasMention) {\n plainText += ' ';\n }\n if (!plainText.endsWith('\\n')) {\n plainText += '\\n';\n }\n }\n lastWasMention = false;\n return true; // Descend into paragraph\n }\n\n return true;\n });\n\n // If document ends with a mention, add trailing space\n if (lastWasMention) {\n plainText += ' ';\n }\n\n return { plainText: plainText.trim(), mentions };\n}\n\n/**\n * Calculate UTF-16 code unit length of a string.\n * JavaScript strings are already in UTF-16, so this is just the length.\n */\nexport function utf16Length(str: string): number {\n return str.length;\n}\n\n/**\n * Check if mention indices are valid and aligned with the plainText.\n */\nexport function validateMentionIndices(\n plainText: string,\n mentions: MentionInfo[]\n): boolean {\n for (const mention of mentions) {\n if (mention.start < 0 || mention.end > plainText.length || mention.start >= mention.end) {\n return false;\n }\n\n // Check that the text at the indices matches the expected format\n const extracted = plainText.slice(mention.start, mention.end);\n const expected = `@${mention.userId}`;\n\n if (extracted !== expected) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Create a mention info object with calculated indices.\n */\nexport function createMentionInfo(\n userId: string,\n display: string,\n startIndex: number\n): MentionInfo {\n const mentionText = `@${userId}`;\n return {\n userId,\n display,\n start: startIndex,\n end: startIndex + utf16Length(mentionText),\n };\n}\n\n/**\n * Parse text with @userId mentions and return structured data.\n * This is useful for restoring content from plainText.\n */\nexport function parseMentionsFromText(\n text: string,\n knownMembers: Map<string, string>\n): {\n plainText: string;\n mentions: MentionInfo[];\n} {\n const mentions: MentionInfo[] = [];\n const mentionRegex = /@(\\w+)/g;\n let match;\n\n while ((match = mentionRegex.exec(text)) !== null) {\n const userId = match[1];\n const display = knownMembers.get(userId) || userId;\n\n mentions.push({\n userId,\n display,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n\n return { plainText: text, mentions };\n}\n","import { useRef, useCallback, useMemo } from 'react';\nimport { useEditor } from '@tiptap/react';\nimport Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport History from '@tiptap/extension-history';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { CompositionExtension } from '../extensions/common/CompositionExtension';\nimport { KeymapExtension } from '../extensions/common/KeymapExtension';\nimport { PlainTextExtension } from '../extensions/plain/PlainTextExtension';\nimport { createMentionExtension } from '../extensions/plain/MentionExtension';\nimport { QuoteExtension } from '../extensions/plain/QuoteExtension';\nimport type {\n Member,\n MentionSuggestionState,\n SendKeymap,\n ComposerDraft,\n PlainMessagePayload,\n Attachment,\n QuoteInfo,\n} from '../types';\nimport { extractPlainTextWithMentions } from '../utils/mention';\n\n/** Helper to get quote from editor */\nfunction getQuoteFromEditor(editor: ReturnType<typeof useEditor>): QuoteInfo | undefined {\n if (!editor) return undefined;\n const firstNode = editor.state.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n return {\n title: firstNode.attrs.title,\n content: firstNode.attrs.content,\n };\n }\n return undefined;\n}\n\nexport interface UsePlainEditorOptions {\n /** Placeholder text */\n placeholder?: string;\n /** Keymap for send */\n sendKeymap?: SendKeymap;\n /** Called when send is triggered */\n onSend?: () => void;\n /** Enable mention */\n enableMention?: boolean;\n /** Mention provider */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Max mentions */\n maxMentions?: number;\n /** Called when mention state changes */\n onMentionStateChange?: (state: MentionSuggestionState) => void;\n /** Called when files are pasted */\n onPasteFiles?: (files: File[]) => void;\n /** Get current uploading state */\n isUploading?: () => boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Called on content change */\n onChange?: () => void;\n /** Called when quote is removed */\n onQuoteRemoved?: () => void;\n}\n\nexport interface UsePlainEditorReturn {\n /** Tiptap editor instance */\n editor: ReturnType<typeof useEditor>;\n /** Check if composing (IME) */\n isComposing: () => boolean;\n /** Check if mention list is open */\n isMentionListOpen: () => boolean;\n /** Export payload */\n exportPayload: (attachments: Attachment[]) => PlainMessagePayload | null;\n /** Get draft */\n getDraft: (attachments: Attachment[]) => ComposerDraft;\n /** Set draft */\n setDraft: (draft: ComposerDraft) => void;\n /** Insert mention programmatically */\n insertMention: (userId: string, display: string) => void;\n /** Insert quote */\n insertQuote: (title: string, content: string) => void;\n /** Remove quote */\n removeQuote: () => void;\n /** Get current quote */\n getQuote: () => QuoteInfo | undefined;\n /** Set text content */\n setText: (text: string) => void;\n /** Insert text at cursor */\n insertText: (text: string) => void;\n /** Clear editor */\n clear: () => void;\n /** Focus editor */\n focus: () => void;\n}\n\n/**\n * Hook for managing plain text editor.\n */\nexport function usePlainEditor(options: UsePlainEditorOptions = {}): UsePlainEditorReturn {\n const {\n placeholder = 'Type a message...',\n sendKeymap = 'enter',\n onSend,\n enableMention = true,\n mentionProvider,\n maxMentions,\n onMentionStateChange,\n onPasteFiles,\n isUploading = () => false,\n disabled = false,\n onChange,\n onQuoteRemoved,\n } = options;\n\n const mentionListOpenRef = useRef(false);\n const compositionRef = useRef(false);\n const sendKeymapRef = useRef(sendKeymap);\n const onSendRef = useRef(onSend);\n\n // Keep refs in sync\n sendKeymapRef.current = sendKeymap;\n onSendRef.current = onSend;\n\n // Track mention list state\n const handleMentionStateChange = useCallback(\n (state: MentionSuggestionState) => {\n mentionListOpenRef.current = state.active;\n onMentionStateChange?.(state);\n },\n [onMentionStateChange]\n );\n\n const extensions = useMemo(() => {\n const exts = [\n Document,\n Paragraph,\n Text,\n HardBreak,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CompositionExtension.configure({\n // Track composition state\n }),\n PlainTextExtension.configure({\n onPasteFiles,\n }),\n KeymapExtension.configure({\n send: () => sendKeymapRef.current,\n onSend: () => onSendRef.current?.(),\n isMentionListOpen: () => mentionListOpenRef.current,\n isUploading,\n isComposing: () => compositionRef.current,\n }),\n QuoteExtension.configure({\n onQuoteRemoved,\n }),\n ];\n\n if (enableMention) {\n exts.push(\n createMentionExtension({\n mentionProvider,\n maxMentions,\n onMentionStateChange: handleMentionStateChange,\n isComposing: () => compositionRef.current,\n })\n );\n }\n\n return exts;\n }, [\n placeholder,\n enableMention,\n mentionProvider,\n maxMentions,\n handleMentionStateChange,\n onPasteFiles,\n isUploading,\n onQuoteRemoved,\n ]);\n\n const editor = useEditor({\n extensions,\n editable: !disabled,\n onUpdate: () => {\n onChange?.();\n },\n onCreate: ({ editor }) => {\n // Update composition state from editor storage\n const updateComposition = () => {\n const storage = editor.storage as unknown as Record<string, { isComposing?: boolean } | undefined>;\n compositionRef.current = storage.composition?.isComposing ?? false;\n };\n\n // Listen for composition events\n const editorElement = editor.view.dom;\n editorElement.addEventListener('compositionstart', () => {\n compositionRef.current = true;\n });\n editorElement.addEventListener('compositionend', () => {\n compositionRef.current = false;\n });\n },\n });\n\n const isComposing = useCallback(() => {\n return compositionRef.current;\n }, []);\n\n const isMentionListOpen = useCallback(() => {\n return mentionListOpenRef.current;\n }, []);\n\n const exportPayload = useCallback(\n (attachments: Attachment[]): PlainMessagePayload | null => {\n if (!editor) return null;\n\n const { plainText, mentions } = extractPlainTextWithMentions(editor);\n const quote = getQuoteFromEditor(editor);\n\n // Empty text and no attachments → null\n if (!plainText.trim() && attachments.length === 0) {\n return null;\n }\n\n return {\n type: 'text',\n plainText,\n mentions,\n attachments,\n quote,\n };\n },\n [editor]\n );\n\n const getDraft = useCallback(\n (attachments: Attachment[]): ComposerDraft => {\n if (!editor) {\n return {\n mode: 'plain',\n };\n }\n\n const { plainText } = extractPlainTextWithMentions(editor);\n const quote = getQuoteFromEditor(editor);\n\n // Return empty draft if everything is empty\n const isEmpty = !plainText.trim() && !quote && attachments.length === 0;\n if (isEmpty) {\n return {\n mode: 'plain',\n };\n }\n\n return {\n mode: 'plain',\n editorState: JSON.stringify(editor.getJSON()),\n attachments,\n text: plainText,\n quote,\n };\n },\n [editor]\n );\n\n const setDraft = useCallback(\n (draft: ComposerDraft) => {\n if (!editor) return;\n\n try {\n if (draft.json) {\n editor.commands.setContent(draft.json);\n } else if (draft.editorState) {\n const content = JSON.parse(draft.editorState);\n editor.commands.setContent(content);\n }\n } catch (e) {\n console.error('Failed to restore draft:', e);\n }\n },\n [editor]\n );\n\n const insertMention = useCallback(\n (userId: string, display: string) => {\n if (!editor) return;\n\n editor\n .chain()\n .focus()\n .insertContent([\n {\n type: 'mention',\n attrs: { userId, display },\n },\n { type: 'text', text: ' ' },\n ])\n .run();\n },\n [editor]\n );\n\n const insertQuote = useCallback(\n (title: string, content: string) => {\n if (!editor) return;\n // Use queueMicrotask to avoid flushSync warning from ReactNodeViewRenderer\n queueMicrotask(() => {\n editor.commands.insertQuote(title, content);\n });\n },\n [editor]\n );\n\n const removeQuote = useCallback(() => {\n if (!editor) return;\n editor.commands.removeQuote();\n }, [editor]);\n\n const getQuote = useCallback((): QuoteInfo | undefined => {\n return getQuoteFromEditor(editor);\n }, [editor]);\n\n const setText = useCallback(\n (text: string) => {\n if (!editor) return;\n\n editor.commands.setContent({\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n });\n },\n [editor]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (!editor) return;\n editor.commands.insertContent(text);\n },\n [editor]\n );\n\n const clear = useCallback(() => {\n if (!editor) return;\n editor.commands.clearContent();\n }, [editor]);\n\n const focus = useCallback(() => {\n if (!editor) return;\n editor.commands.focus();\n }, [editor]);\n\n return {\n editor,\n isComposing,\n isMentionListOpen,\n exportPayload,\n getDraft,\n setDraft,\n insertMention,\n insertQuote,\n removeQuote,\n getQuote,\n setText,\n insertText,\n clear,\n focus,\n };\n}\n","import type { Attachment, AttachmentLimitReason } from '../types';\n\n/**\n * Generate a unique ID for attachments.\n */\nexport function generateAttachmentId(): string {\n return `att_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Create an Attachment object from a File.\n */\nexport function createAttachment(file: File): Attachment {\n const isImage = file.type.startsWith('image/');\n\n return {\n id: generateAttachmentId(),\n file,\n name: file.name,\n size: file.size,\n mime: file.type,\n lastModified: file.lastModified,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n };\n}\n\n/**\n * Revoke object URL for an attachment.\n */\nexport function revokeAttachmentUrl(attachment: Attachment): void {\n if (attachment.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n}\n\n/**\n * Revoke all object URLs for a list of attachments.\n */\nexport function revokeAllAttachmentUrls(attachments: Attachment[]): void {\n attachments.forEach(revokeAttachmentUrl);\n}\n\n/**\n * Check if a MIME type matches an allowed pattern.\n * Supports wildcards like \"image/*\".\n */\nexport function matchesMimeType(mime: string, pattern: string): boolean {\n if (pattern === '*/*' || pattern === '*') {\n return true;\n }\n\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return mime.startsWith(prefix + '/');\n }\n\n return mime === pattern;\n}\n\n/**\n * Check if a MIME type is allowed by any of the patterns.\n */\nexport function isMimeTypeAllowed(mime: string, allowedTypes?: string[]): boolean {\n if (!allowedTypes || allowedTypes.length === 0) {\n return true;\n }\n\n return allowedTypes.some((pattern) => matchesMimeType(mime, pattern));\n}\n\n/**\n * Validate a file against attachment constraints.\n * Returns the reason for rejection, or null if valid.\n */\nexport function validateFile(\n file: File,\n currentCount: number,\n options: {\n maxAttachments?: number;\n maxFileSize?: number;\n allowedMimeTypes?: string[];\n }\n): AttachmentLimitReason | null {\n // Check count limit\n if (options.maxAttachments !== undefined && currentCount >= options.maxAttachments) {\n return 'count';\n }\n\n // Check file size\n if (options.maxFileSize !== undefined && file.size > options.maxFileSize) {\n return 'size';\n }\n\n // Check MIME type\n if (!isMimeTypeAllowed(file.type, options.allowedMimeTypes)) {\n return 'mime';\n }\n\n return null;\n}\n\n/**\n * Format file size for display.\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Attachment, AttachmentLimitReason } from '../types';\nimport {\n createAttachment,\n revokeAttachmentUrl,\n revokeAllAttachmentUrls,\n validateFile,\n} from '../utils/attachment';\n\nexport interface UseAttachmentsOptions {\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Allowed MIME types */\n allowedMimeTypes?: string[];\n /** Called when limit is exceeded */\n onLimitExceeded?: (reason: AttachmentLimitReason, file: File) => void;\n /** Called when attachments change */\n onChange?: (attachments: Attachment[]) => void;\n}\n\nexport interface UseAttachmentsReturn {\n /** Current attachments */\n attachments: Attachment[];\n /** Add files to attachments */\n addFiles: (files: FileList | File[]) => void;\n /** Remove attachment by ID */\n removeAttachment: (id: string) => void;\n /** Clear all attachments */\n clearAttachments: () => void;\n /** Set attachments directly */\n setAttachments: (attachments: Attachment[]) => void;\n /** Get current attachments */\n getAttachments: () => Attachment[];\n}\n\n/**\n * Hook for managing file attachments with proper objectURL lifecycle.\n */\nexport function useAttachments(options: UseAttachmentsOptions = {}): UseAttachmentsReturn {\n const {\n maxAttachments = 10,\n maxFileSize,\n allowedMimeTypes,\n onLimitExceeded,\n onChange,\n } = options;\n\n const [attachments, setAttachmentsState] = useState<Attachment[]>([]);\n const attachmentsRef = useRef<Attachment[]>([]);\n\n // Keep ref in sync with state\n useEffect(() => {\n attachmentsRef.current = attachments;\n }, [attachments]);\n\n // Cleanup all URLs on unmount\n useEffect(() => {\n return () => {\n revokeAllAttachmentUrls(attachmentsRef.current);\n };\n }, []);\n\n const addFiles = useCallback(\n (files: FileList | File[]) => {\n const fileArray = Array.from(files);\n const currentAttachments = attachmentsRef.current;\n const newAttachments: Attachment[] = [];\n let currentCount = currentAttachments.length;\n\n for (const file of fileArray) {\n const validationError = validateFile(file, currentCount, {\n maxAttachments,\n maxFileSize,\n allowedMimeTypes,\n });\n\n if (validationError) {\n onLimitExceeded?.(validationError, file);\n continue;\n }\n\n const attachment = createAttachment(file);\n newAttachments.push(attachment);\n currentCount++;\n }\n\n if (newAttachments.length > 0) {\n const updated = [...currentAttachments, ...newAttachments];\n setAttachmentsState(updated);\n onChange?.(updated);\n }\n },\n [maxAttachments, maxFileSize, allowedMimeTypes, onLimitExceeded, onChange]\n );\n\n const removeAttachment = useCallback(\n (id: string) => {\n const attachment = attachmentsRef.current.find((a) => a.id === id);\n if (attachment) {\n revokeAttachmentUrl(attachment);\n }\n\n const updated = attachmentsRef.current.filter((a) => a.id !== id);\n setAttachmentsState(updated);\n onChange?.(updated);\n },\n [onChange]\n );\n\n const clearAttachments = useCallback(() => {\n revokeAllAttachmentUrls(attachmentsRef.current);\n setAttachmentsState([]);\n onChange?.([]);\n }, [onChange]);\n\n const setAttachments = useCallback(\n (newAttachments: Attachment[]) => {\n // Revoke URLs for attachments being removed\n const currentIds = new Set(newAttachments.map((a) => a.id));\n const toRevoke = attachmentsRef.current.filter((a) => !currentIds.has(a.id));\n revokeAllAttachmentUrls(toRevoke);\n\n // Regenerate previewUrl for images if file exists but previewUrl is missing/invalid\n const processedAttachments = newAttachments.map((att) => {\n if (att.file && att.mime.startsWith('image/')) {\n return {\n ...att,\n previewUrl: URL.createObjectURL(att.file),\n };\n }\n return att;\n });\n\n setAttachmentsState(processedAttachments);\n onChange?.(processedAttachments);\n },\n [onChange]\n );\n\n const getAttachments = useCallback(() => {\n return attachmentsRef.current;\n }, []);\n\n return {\n attachments,\n addFiles,\n removeAttachment,\n clearAttachments,\n setAttachments,\n getAttachments,\n };\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { Member } from '../types';\n\nexport interface MentionListProps {\n /** List of member suggestions */\n items: Member[];\n /** Currently selected index */\n selectedIndex: number;\n /** Loading state */\n loading: boolean;\n /** Error state */\n error: boolean;\n /** Called when item is clicked */\n onSelect: (member: Member) => void;\n /** Called when mouse enters an item */\n onHover: (index: number) => void;\n /** Custom render function */\n renderItem?: (props: { member: Member; isSelected: boolean }) => React.ReactNode;\n /** Locale strings */\n locale?: {\n noResults?: string;\n loading?: string;\n error?: string;\n };\n}\n\n/**\n * Mention suggestion list component.\n */\nexport function MentionList({\n items,\n selectedIndex,\n loading,\n error,\n onSelect,\n onHover,\n renderItem,\n locale = {},\n}: MentionListProps) {\n const {\n noResults = 'No results found',\n loading: loadingText = 'Loading...',\n error: errorText = 'Failed to load',\n } = locale;\n\n const listRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Auto-scroll to selected item when selectedIndex changes\n useEffect(() => {\n const selectedItem = itemRefs.current[selectedIndex];\n if (selectedItem && listRef.current && typeof selectedItem.scrollIntoView === 'function') {\n // Use scrollIntoView with block: 'nearest' to only scroll if needed\n selectedItem.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }, [selectedIndex]);\n\n // Reset refs array when items change\n useEffect(() => {\n itemRefs.current = itemRefs.current.slice(0, items.length);\n }, [items.length]);\n\n if (loading) {\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n <div className=\"im-mention-list__status\">{loadingText}</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n <div className=\"im-mention-list__status\">{errorText}</div>\n </div>\n );\n }\n\n if (items.length === 0) {\n return (\n null\n );\n }\n\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n {items.map((member, index) => {\n const isSelected = index === selectedIndex;\n\n if (renderItem) {\n return (\n <div\n key={member.userId}\n ref={(el) => { itemRefs.current[index] = el; }}\n className={`im-mention-list__item ${isSelected ? 'im-mention-list__item--selected' : ''}`}\n onClick={() => onSelect(member)}\n onMouseEnter={() => onHover(index)}\n >\n {renderItem({ member, isSelected })}\n </div>\n );\n }\n\n return (\n <div\n key={member.userId}\n ref={(el) => { itemRefs.current[index] = el; }}\n className={`im-mention-list__item ${isSelected ? 'im-mention-list__item--selected' : ''}`}\n onClick={() => onSelect(member)}\n onMouseEnter={() => onHover(index)}\n >\n {member.avatarUrl && (\n <img\n src={member.avatarUrl}\n alt={member.display}\n className=\"im-mention-list__avatar\"\n />\n )}\n <span className=\"im-mention-list__display\">{member.display}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n FloatingPortal,\n type Placement,\n} from '@floating-ui/react';\nimport type { Editor } from '@tiptap/react';\nimport type { MentionSuggestionState } from '../types';\nimport { MentionList, type MentionListProps } from './MentionList';\n\nexport interface MentionPopoverProps extends Omit<MentionListProps, 'items' | 'selectedIndex' | 'loading' | 'error'> {\n /** Mention state from editor */\n mentionState: MentionSuggestionState;\n /** The Tiptap editor instance */\n editor: Editor | null;\n /** Placement of the popover relative to cursor: 'top' or 'bottom' */\n placement?: 'top' | 'bottom';\n /** Container element for portal (defaults to document.body) */\n portalContainer?: HTMLElement | null;\n /** Z-index for the popover */\n zIndex?: number;\n}\n\n/**\n * Get cursor bounding rect from the Tiptap editor.\n */\nfunction getCursorRect(editor: Editor | null): DOMRect | null {\n if (!editor || !editor.view) return null;\n\n try {\n const { state } = editor.view;\n const { from } = state.selection;\n\n // Get coordinates at the cursor position\n const coords = editor.view.coordsAtPos(from);\n\n // Create a DOMRect-like object\n return new DOMRect(coords.left, coords.top, 1, coords.bottom - coords.top);\n } catch {\n return null;\n }\n}\n\n/**\n * MentionPopover - A floating popover for mention suggestions.\n * Uses Portal to render outside the DOM hierarchy, avoiding overflow:hidden issues.\n */\nexport function MentionPopover({\n mentionState,\n editor,\n placement = 'bottom',\n portalContainer,\n zIndex = 9999,\n onSelect,\n onHover,\n renderItem,\n locale,\n}: MentionPopoverProps) {\n const [isPositioned, setIsPositioned] = useState(false);\n const cursorRectRef = useRef<DOMRect | null>(null);\n\n // Convert placement to floating-ui placement\n const floatingPlacement: Placement = placement === 'top' ? 'top-start' : 'bottom-start';\n const fallbackPlacements: Placement[] = placement === 'top'\n ? ['bottom-start', 'top-end', 'bottom-end']\n : ['top-start', 'bottom-end', 'top-end'];\n\n // Virtual reference element that always reads from ref\n const virtualReference = useRef({\n getBoundingClientRect: () => cursorRectRef.current || new DOMRect(0, 0, 0, 0),\n }).current;\n\n const { refs, floatingStyles, update } = useFloating({\n open: mentionState.active && isPositioned,\n placement: floatingPlacement,\n middleware: [\n offset(4),\n flip({\n fallbackPlacements,\n }),\n shift({ padding: 8 }),\n size({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.min(availableHeight - 16, 300)}px`,\n });\n },\n padding: 8,\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n // Set virtual reference once\n useEffect(() => {\n refs.setReference(virtualReference);\n }, [refs, virtualReference]);\n\n // Update cursor position when mention becomes active or query changes\n useLayoutEffect(() => {\n if (mentionState.active && editor) {\n // Use requestAnimationFrame to ensure DOM is updated\n const frame = requestAnimationFrame(() => {\n const rect = getCursorRect(editor);\n if (rect) {\n cursorRectRef.current = rect;\n setIsPositioned(true);\n update?.();\n }\n });\n return () => cancelAnimationFrame(frame);\n } else {\n cursorRectRef.current = null;\n setIsPositioned(false);\n }\n }, [mentionState.active, mentionState.query, editor, update]);\n\n // Update position when items change (list height may change)\n useEffect(() => {\n if (mentionState.active && isPositioned && update) {\n update();\n }\n }, [mentionState.items, mentionState.loading, update, mentionState.active, isPositioned]);\n\n // Don't render if not active or not positioned\n if (!mentionState.active || !isPositioned) {\n return null;\n }\n\n return (\n <FloatingPortal root={portalContainer}>\n <div\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex,\n }}\n className=\"im-mention-popover\"\n >\n <MentionList\n items={mentionState.items}\n selectedIndex={mentionState.selectedIndex}\n loading={mentionState.loading}\n error={mentionState.error}\n onSelect={onSelect}\n onHover={onHover}\n renderItem={renderItem}\n locale={locale}\n />\n </div>\n </FloatingPortal>\n );\n}\n","import React from 'react';\nimport type { Attachment } from '../types';\nimport { formatFileSize } from '../utils/attachment';\n\nexport interface AttachmentPreviewProps {\n /** List of attachments */\n attachments: Attachment[];\n /** Called when remove button is clicked */\n onRemove: (id: string) => void;\n /** Placement position */\n placement?: 'top' | 'bottom';\n /** Remove button label */\n removeLabel?: string;\n}\n\n/**\n * Attachment preview bar component.\n */\nexport function AttachmentPreview({\n attachments,\n onRemove,\n placement = 'bottom',\n removeLabel = 'Remove',\n}: AttachmentPreviewProps) {\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div className={`im-attachment-preview im-attachment-preview--${placement}`}>\n {attachments.map((attachment) => (\n <div key={attachment.id} className=\"im-attachment-preview__item\">\n {attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt={attachment.name}\n className=\"im-attachment-preview__thumbnail\"\n />\n ) : (\n <div className=\"im-attachment-preview__file-icon\">\n <FileIcon />\n </div>\n )}\n <div className=\"im-attachment-preview__info\">\n <span className=\"im-attachment-preview__name\" title={attachment.name}>\n {attachment.name}\n </span>\n <span className=\"im-attachment-preview__size\">{formatFileSize(attachment.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-attachment-preview__remove-btn\"\n onClick={() => onRemove(attachment.id)}\n aria-label={removeLabel}\n >\n <CloseIcon />\n </button>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FileIcon() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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","\"use client\"\n\nexport type SpacerOrientation = \"horizontal\" | \"vertical\"\n\nexport interface SpacerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: SpacerOrientation\n size?: string | number\n}\n\nexport function Spacer({\n orientation = \"horizontal\",\n size,\n style = {},\n ...props\n}: SpacerProps) {\n const computedStyle = {\n ...style,\n ...(orientation === \"horizontal\" && !size && { flex: 1 }),\n ...(size && {\n width: orientation === \"vertical\" ? \"1px\" : size,\n height: orientation === \"horizontal\" ? \"1px\" : size,\n }),\n }\n\n return <div {...props} style={computedStyle} />\n}\n","import type { Node as PMNode } from \"@tiptap/pm/model\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport {\n AllSelection,\n NodeSelection,\n Selection,\n TextSelection,\n} from \"@tiptap/pm/state\"\nimport { cellAround, CellSelection } from \"@tiptap/pm/tables\"\nimport {\n findParentNodeClosestToPos,\n type Editor,\n type NodeWithPos,\n} from \"@tiptap/react\"\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\n\nexport const MAC_SYMBOLS: Record<string, string> = {\n mod: \"⌘\",\n command: \"⌘\",\n meta: \"⌘\",\n ctrl: \"⌃\",\n control: \"⌃\",\n alt: \"⌥\",\n option: \"⌥\",\n shift: \"⇧\",\n backspace: \"Del\",\n delete: \"⌦\",\n enter: \"⏎\",\n escape: \"⎋\",\n capslock: \"⇪\",\n} as const\n\nexport const SR_ONLY = {\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 whiteSpace: \"nowrap\",\n borderWidth: 0,\n} as const\n\nexport function cn(\n ...classes: (string | boolean | undefined | null)[]\n): string {\n return classes.filter(Boolean).join(\" \")\n}\n\n/**\n * Determines if the current platform is macOS\n * @returns boolean indicating if the current platform is Mac\n */\nexport function isMac(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n navigator.platform.toLowerCase().includes(\"mac\")\n )\n}\n\n/**\n * Formats a shortcut key based on the platform (Mac or non-Mac)\n * @param key - The key to format (e.g., \"ctrl\", \"alt\", \"shift\")\n * @param isMac - Boolean indicating if the platform is Mac\n * @param capitalize - Whether to capitalize the key (default: true)\n * @returns Formatted shortcut key symbol\n */\nexport const formatShortcutKey = (\n key: string,\n isMac: boolean,\n capitalize: boolean = true\n) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || (capitalize ? key.toUpperCase() : key)\n }\n\n return capitalize ? key.charAt(0).toUpperCase() + key.slice(1) : key\n}\n\n/**\n * Parses a shortcut key string into an array of formatted key symbols\n * @param shortcutKeys - The string of shortcut keys (e.g., \"ctrl-alt-shift\")\n * @param delimiter - The delimiter used to split the keys (default: \"-\")\n * @param capitalize - Whether to capitalize the keys (default: true)\n * @returns Array of formatted shortcut key symbols\n */\nexport const parseShortcutKeys = (props: {\n shortcutKeys: string | undefined\n delimiter?: string\n capitalize?: boolean\n}) => {\n const { shortcutKeys, delimiter = \"+\", capitalize = true } = props\n\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split(delimiter)\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac(), capitalize))\n}\n\n/**\n * Checks if a mark exists in the editor schema\n * @param markName - The name of the mark to check\n * @param editor - The editor instance\n * @returns boolean indicating if the mark exists in the schema\n */\nexport const isMarkInSchema = (\n markName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.marks.get(markName) !== undefined\n}\n\n/**\n * Checks if a node exists in the editor schema\n * @param nodeName - The name of the node to check\n * @param editor - The editor instance\n * @returns boolean indicating if the node exists in the schema\n */\nexport const isNodeInSchema = (\n nodeName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.nodes.get(nodeName) !== undefined\n}\n\n/**\n * Moves the focus to the next node in the editor\n * @param editor - The editor instance\n * @returns boolean indicating if the focus was moved\n */\nexport function focusNextNode(editor: Editor) {\n const { state, view } = editor\n const { doc, selection } = state\n\n const nextSel = Selection.findFrom(selection.$to, 1, true)\n if (nextSel) {\n view.dispatch(state.tr.setSelection(nextSel).scrollIntoView())\n return true\n }\n\n const paragraphType = state.schema.nodes.paragraph\n if (!paragraphType) {\n console.warn(\"No paragraph node type found in schema.\")\n return false\n }\n\n const end = doc.content.size\n const para = paragraphType.create()\n let tr = state.tr.insert(end, para)\n\n // Place the selection inside the new paragraph\n const $inside = tr.doc.resolve(end + 1)\n tr = tr.setSelection(TextSelection.near($inside)).scrollIntoView()\n view.dispatch(tr)\n return true\n}\n\n/**\n * Checks if a value is a valid number (not null, undefined, or NaN)\n * @param value - The value to check\n * @returns boolean indicating if the value is a valid number\n */\nexport function isValidPosition(pos: number | null | undefined): pos is number {\n return typeof pos === \"number\" && pos >= 0\n}\n\n/**\n * Checks if one or more extensions are registered in the Tiptap editor.\n * @param editor - The Tiptap editor instance\n * @param extensionNames - A single extension name or an array of names to check\n * @returns True if at least one of the extensions is available, false otherwise\n */\nexport function isExtensionAvailable(\n editor: Editor | null,\n extensionNames: string | string[]\n): boolean {\n if (!editor) return false\n\n const names = Array.isArray(extensionNames)\n ? extensionNames\n : [extensionNames]\n\n const found = names.some((name) =>\n editor.extensionManager.extensions.some((ext) => ext.name === name)\n )\n\n if (!found) {\n console.warn(\n `None of the extensions [${names.join(\", \")}] were found in the editor schema. Ensure they are included in the editor configuration.`\n )\n }\n\n return found\n}\n\n/**\n * Finds a node at the specified position with error handling\n * @param editor The Tiptap editor instance\n * @param position The position in the document to find the node\n * @returns The node at the specified position, or null if not found\n */\nexport function findNodeAtPosition(editor: Editor, position: number) {\n try {\n const node = editor.state.doc.nodeAt(position)\n if (!node) {\n console.warn(`No node found at position ${position}`)\n return null\n }\n return node\n } catch (error) {\n console.error(`Error getting node at position ${position}:`, error)\n return null\n }\n}\n\n/**\n * Finds the position and instance of a node in the document\n * @param props Object containing editor, node (optional), and nodePos (optional)\n * @param props.editor The Tiptap editor instance\n * @param props.node The node to find (optional if nodePos is provided)\n * @param props.nodePos The position of the node to find (optional if node is provided)\n * @returns An object with the position and node, or null if not found\n */\nexport function findNodePosition(props: {\n editor: Editor | null\n node?: PMNode | null\n nodePos?: number | null\n}): { pos: number; node: PMNode } | null {\n const { editor, node, nodePos } = props\n\n if (!editor || !editor.state?.doc) return null\n\n // Zero is valid position\n const hasValidNode = node !== undefined && node !== null\n const hasValidPos = isValidPosition(nodePos)\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n // First search for the node in the document if we have a node\n if (hasValidNode) {\n let foundPos = -1\n let foundNode: PMNode | null = null\n\n editor.state.doc.descendants((currentNode, pos) => {\n // TODO: Needed?\n // if (currentNode.type && currentNode.type.name === node!.type.name) {\n if (currentNode === node) {\n foundPos = pos\n foundNode = currentNode\n return false\n }\n return true\n })\n\n if (foundPos !== -1 && foundNode !== null) {\n return { pos: foundPos, node: foundNode }\n }\n }\n\n // If we have a valid position, use findNodeAtPosition\n if (hasValidPos) {\n const nodeAtPos = findNodeAtPosition(editor, nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n }\n\n return null\n}\n\n/**\n * Determines whether the current selection contains a node whose type matches\n * any of the provided node type names.\n * @param editor Tiptap editor instance\n * @param nodeTypeNames List of node type names to match against\n * @param checkAncestorNodes Whether to check ancestor node types up the depth chain\n */\nexport function isNodeTypeSelected(\n editor: Editor | null,\n nodeTypeNames: string[] = [],\n checkAncestorNodes: boolean = false\n): boolean {\n if (!editor || !editor.state.selection) return false\n\n const { selection } = editor.state\n if (selection.empty) return false\n\n // Direct node selection check\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n return selectedNode ? nodeTypeNames.includes(selectedNode.type.name) : false\n }\n\n // Depth-based ancestor node check\n if (checkAncestorNodes) {\n const { $from } = selection\n for (let depth = $from.depth; depth > 0; depth--) {\n const ancestorNode = $from.node(depth)\n if (nodeTypeNames.includes(ancestorNode.type.name)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check whether the current selection is fully within nodes\n * whose type names are in the provided `types` list.\n *\n * - NodeSelection → checks the selected node.\n * - Text/AllSelection → ensures all textblocks within [from, to) are allowed.\n */\nexport function selectionWithinConvertibleTypes(\n editor: Editor,\n types: string[] = []\n): boolean {\n if (!editor || types.length === 0) return false\n\n const { state } = editor\n const { selection } = state\n const allowed = new Set(types)\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node?.type?.name\n return !!nodeType && allowed.has(nodeType)\n }\n\n if (selection instanceof TextSelection || selection instanceof AllSelection) {\n let valid = true\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.isTextblock && !allowed.has(node.type.name)) {\n valid = false\n return false // stop early\n }\n return valid\n })\n return valid\n }\n\n return false\n}\n\n/**\n * Handles image upload with progress tracking and abort capability\n * @param file The file to upload\n * @param onProgress Optional callback for tracking upload progress\n * @param abortSignal Optional AbortSignal for cancelling the upload\n * @returns Promise resolving to the URL of the uploaded image\n */\nexport const handleImageUpload = async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n): Promise<string> => {\n // Validate file\n if (!file) {\n throw new Error(\"No file provided\")\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(\n `File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`\n )\n }\n\n // For demo/testing: Simulate upload progress. In production, replace the following code\n // with your own upload implementation.\n for (let progress = 0; progress <= 100; progress += 10) {\n if (abortSignal?.aborted) {\n throw new Error(\"Upload cancelled\")\n }\n await new Promise((resolve) => setTimeout(resolve, 500))\n onProgress?.({ progress })\n }\n\n return \"/images/tiptap-ui-placeholder-image.jpg\"\n}\n\ntype ProtocolOptions = {\n /**\n * The protocol scheme to be registered.\n * @default '''\n * @example 'ftp'\n * @example 'git'\n */\n scheme: string\n\n /**\n * If enabled, it allows optional slashes after the protocol.\n * @default false\n * @example true\n */\n optionalSlashes?: boolean\n}\n\ntype ProtocolConfig = Array<ProtocolOptions | string>\n\nconst ATTR_WHITESPACE =\n // eslint-disable-next-line no-control-regex\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n\nexport function isAllowedUri(\n uri: string | undefined,\n protocols?: ProtocolConfig\n) {\n const allowedProtocols: string[] = [\n \"http\",\n \"https\",\n \"ftp\",\n \"ftps\",\n \"mailto\",\n \"tel\",\n \"callto\",\n \"sms\",\n \"cid\",\n \"xmpp\",\n ]\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol =\n typeof protocol === \"string\" ? protocol : protocol.scheme\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol)\n }\n })\n }\n\n return (\n !uri ||\n uri.replace(ATTR_WHITESPACE, \"\").match(\n new RegExp(\n // eslint-disable-next-line no-useless-escape\n `^(?:(?:${allowedProtocols.join(\"|\")}):|[^a-z]|[a-z0-9+.\\-]+(?:[^a-z+.\\-:]|$))`,\n \"i\"\n )\n )\n )\n}\n\nexport function sanitizeUrl(\n inputUrl: string,\n baseUrl: string,\n protocols?: ProtocolConfig\n): string {\n try {\n const url = new URL(inputUrl, baseUrl)\n\n if (isAllowedUri(url.href, protocols)) {\n return url.href\n }\n } catch {\n // If URL creation fails, it's considered invalid\n }\n return \"#\"\n}\n\n/**\n * Update a single attribute on multiple nodes.\n *\n * @param tr - The transaction to mutate\n * @param targets - Array of { node, pos }\n * @param attrName - Attribute key to update\n * @param next - New value OR updater function receiving previous value\n * Pass `undefined` to remove the attribute.\n * @returns true if at least one node was updated, false otherwise\n */\nexport function updateNodesAttr<A extends string = string, V = unknown>(\n tr: Transaction,\n targets: readonly NodeWithPos[],\n attrName: A,\n next: V | ((prev: V | undefined) => V | undefined)\n): boolean {\n if (!targets.length) return false\n\n let changed = false\n\n for (const { pos } of targets) {\n // Always re-read from the transaction's current doc\n const currentNode = tr.doc.nodeAt(pos)\n if (!currentNode) continue\n\n const prevValue = (currentNode.attrs as Record<string, unknown>)[\n attrName\n ] as V | undefined\n const resolvedNext =\n typeof next === \"function\"\n ? (next as (p: V | undefined) => V | undefined)(prevValue)\n : next\n\n if (prevValue === resolvedNext) continue\n\n const nextAttrs: Record<string, unknown> = { ...currentNode.attrs }\n if (resolvedNext === undefined) {\n // Remove the key entirely instead of setting null\n delete nextAttrs[attrName]\n } else {\n nextAttrs[attrName] = resolvedNext\n }\n\n tr.setNodeMarkup(pos, undefined, nextAttrs)\n changed = true\n }\n\n return changed\n}\n\n/**\n * Selects the entire content of the current block node if the selection is empty.\n * If the selection is not empty, it does nothing.\n * @param editor The Tiptap editor instance\n */\nexport function selectCurrentBlockContent(editor: Editor) {\n const { selection, doc } = editor.state\n\n if (!selection.empty) return\n\n const $pos = selection.$from\n let blockNode = null\n let blockPos = -1\n\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n const pos = $pos.start(depth)\n\n if (node.isBlock && node.textContent.trim()) {\n blockNode = node\n blockPos = pos\n break\n }\n }\n\n if (blockNode && blockPos >= 0) {\n const from = blockPos\n const to = blockPos + blockNode.nodeSize - 2 // -2 to exclude the closing tag\n\n if (from < to) {\n const $from = doc.resolve(from)\n const $to = doc.resolve(to)\n const newSelection = TextSelection.between($from, $to, 1)\n\n if (newSelection && !selection.eq(newSelection)) {\n editor.view.dispatch(editor.state.tr.setSelection(newSelection))\n }\n }\n }\n}\n\n/**\n * Retrieves all nodes of specified types from the current selection.\n * @param selection The current editor selection\n * @param allowedNodeTypes An array of node type names to look for (e.g., [\"image\", \"table\"])\n * @returns An array of objects containing the node and its position\n */\nexport function getSelectedNodesOfType(\n selection: Selection,\n allowedNodeTypes: string[]\n): NodeWithPos[] {\n const results: NodeWithPos[] = []\n const allowed = new Set(allowedNodeTypes)\n\n if (selection instanceof CellSelection) {\n selection.forEachCell((node: PMNode, pos: number) => {\n if (allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n })\n return results\n }\n\n if (selection instanceof NodeSelection) {\n const { node, from: pos } = selection\n if (node && allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n return results\n }\n\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n const cellNode = selection.$anchor.doc.nodeAt(cell.pos)\n if (cellNode && allowed.has(cellNode.type.name)) {\n results.push({ node: cellNode, pos: cell.pos })\n return results\n }\n }\n\n // Fallback: find parent nodes of allowed types\n const parentNode = findParentNodeClosestToPos($anchor, (node) =>\n allowed.has(node.type.name)\n )\n\n if (parentNode) {\n results.push({ node: parentNode.node, pos: parentNode.pos })\n }\n\n return results\n}\n","import { forwardRef } from \"react\"\nimport \"@/components/tiptap-ui-primitive/separator/separator.scss\"\nimport { cn } from \"@/lib/tiptap-utils\"\n\nexport type Orientation = \"horizontal\" | \"vertical\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation\n decorative?: boolean\n}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ decorative, orientation = \"vertical\", className, ...divProps }, ref) => {\n const ariaOrientation = orientation === \"vertical\" ? orientation : undefined\n const semanticProps = decorative\n ? { role: \"none\" }\n : { \"aria-orientation\": ariaOrientation, role: \"separator\" }\n\n return (\n <div\n className={cn(\"tiptap-separator\", className)}\n data-orientation={orientation}\n {...semanticProps}\n {...divProps}\n ref={ref}\n />\n )\n }\n)\n\nSeparator.displayName = \"Separator\"\n","import type { Editor } from \"@tiptap/react\"\nimport { useEffect, useState } from \"react\"\n\ntype Orientation = \"horizontal\" | \"vertical\" | \"both\"\n\ninterface MenuNavigationOptions<T> {\n /**\n * The Tiptap editor instance, if using with a Tiptap editor.\n */\n editor?: Editor | null\n /**\n * Reference to the container element for handling keyboard events.\n */\n containerRef?: React.RefObject<HTMLElement | null>\n /**\n * Search query that affects the selected item.\n */\n query?: string\n /**\n * Array of items to navigate through.\n */\n items: T[]\n /**\n * Callback fired when an item is selected.\n */\n onSelect?: (item: T) => void\n /**\n * Callback fired when the menu should close.\n */\n onClose?: () => void\n /**\n * The navigation orientation of the menu.\n * @default \"vertical\"\n */\n orientation?: Orientation\n /**\n * Whether to automatically select the first item when the menu opens.\n * @default true\n */\n autoSelectFirstItem?: boolean\n}\n\n/**\n * Hook that implements keyboard navigation for dropdown menus and command palettes.\n *\n * Handles arrow keys, tab, home/end, enter for selection, and escape to close.\n * Works with both Tiptap editors and regular DOM elements.\n *\n * @param options - Configuration options for the menu navigation\n * @returns Object containing the selected index and a setter function\n */\nexport function useMenuNavigation<T>({\n editor,\n containerRef,\n query,\n items,\n onSelect,\n onClose,\n orientation = \"vertical\",\n autoSelectFirstItem = true,\n}: MenuNavigationOptions<T>) {\n const [selectedIndex, setSelectedIndex] = useState<number>(\n autoSelectFirstItem ? 0 : -1\n )\n\n useEffect(() => {\n const handleKeyboardNavigation = (event: KeyboardEvent) => {\n if (!items.length) return false\n\n const moveNext = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return 0\n return (currentIndex + 1) % items.length\n })\n\n const movePrev = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return items.length - 1\n return (currentIndex - 1 + items.length) % items.length\n })\n\n switch (event.key) {\n case \"ArrowUp\": {\n if (orientation === \"horizontal\") return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case \"ArrowDown\": {\n if (orientation === \"horizontal\") return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case \"ArrowLeft\": {\n if (orientation === \"vertical\") return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case \"ArrowRight\": {\n if (orientation === \"vertical\") return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case \"Tab\": {\n event.preventDefault()\n if (event.shiftKey) {\n movePrev()\n } else {\n moveNext()\n }\n return true\n }\n\n case \"Home\": {\n event.preventDefault()\n setSelectedIndex(0)\n return true\n }\n\n case \"End\": {\n event.preventDefault()\n setSelectedIndex(items.length - 1)\n return true\n }\n\n case \"Enter\": {\n if (event.isComposing) return false\n event.preventDefault()\n if (selectedIndex !== -1 && items[selectedIndex]) {\n onSelect?.(items[selectedIndex])\n }\n return true\n }\n\n case \"Escape\": {\n event.preventDefault()\n onClose?.()\n return true\n }\n\n default:\n return false\n }\n }\n\n let targetElement: HTMLElement | null = null\n\n if (editor) {\n targetElement = editor.view.dom\n } else if (containerRef?.current) {\n targetElement = containerRef.current\n }\n\n if (targetElement) {\n targetElement.addEventListener(\"keydown\", handleKeyboardNavigation, true)\n\n return () => {\n targetElement?.removeEventListener(\n \"keydown\",\n handleKeyboardNavigation,\n true\n )\n }\n }\n\n return undefined\n }, [\n editor,\n containerRef,\n items,\n selectedIndex,\n onSelect,\n onClose,\n orientation,\n ])\n\n useEffect(() => {\n if (query) {\n setSelectedIndex(autoSelectFirstItem ? 0 : -1)\n }\n }, [query, autoSelectFirstItem])\n\n return {\n selectedIndex: items.length ? selectedIndex : undefined,\n setSelectedIndex,\n }\n}\n","\"use client\"\n\nimport { useCallback, useRef } from \"react\"\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\ntype UserRef<T> =\n | ((instance: T | null) => void)\n | React.RefObject<T | null>\n | null\n | undefined\n\nconst updateRef = <T>(ref: NonNullable<UserRef<T>>, value: T | null) => {\n if (typeof ref === \"function\") {\n ref(value)\n } else if (ref && typeof ref === \"object\" && \"current\" in ref) {\n // Safe assignment without MutableRefObject\n ;(ref as { current: T | null }).current = value\n }\n}\n\nexport const useComposedRef = <T extends HTMLElement>(\n libRef: React.RefObject<T | null>,\n userRef: UserRef<T>\n) => {\n const prevUserRef = useRef<UserRef<T>>(null)\n\n return useCallback(\n (instance: T | null) => {\n if (libRef && \"current\" in libRef) {\n ;(libRef as { current: T | null }).current = instance\n }\n\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null)\n }\n\n prevUserRef.current = userRef\n\n if (userRef) {\n updateRef(userRef, instance)\n }\n },\n [libRef, userRef]\n )\n}\n\nexport default useComposedRef\n","import { forwardRef, useCallback, useEffect, useRef, useState } from \"react\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport \"@/components/tiptap-ui-primitive/toolbar/toolbar.scss\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport { useMenuNavigation } from \"@/hooks/use-menu-navigation\"\nimport { useComposedRef } from \"@/hooks/use-composed-ref\"\n\ntype BaseProps = React.HTMLAttributes<HTMLDivElement>\n\ninterface ToolbarProps extends BaseProps {\n variant?: \"floating\" | \"fixed\"\n}\n\nconst useToolbarNavigation = (\n toolbarRef: React.RefObject<HTMLDivElement | null>\n) => {\n const [items, setItems] = useState<HTMLElement[]>([])\n\n const collectItems = useCallback(() => {\n if (!toolbarRef.current) return []\n return Array.from(\n toolbarRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [role=\"button\"]:not([disabled]), [tabindex=\"0\"]:not([disabled])'\n )\n )\n }, [toolbarRef])\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const updateItems = () => setItems(collectItems())\n\n updateItems()\n const observer = new MutationObserver(updateItems)\n observer.observe(toolbar, { childList: true, subtree: true })\n\n return () => observer.disconnect()\n }, [collectItems, toolbarRef])\n\n const { selectedIndex } = useMenuNavigation<HTMLElement>({\n containerRef: toolbarRef,\n items,\n orientation: \"horizontal\",\n onSelect: (el) => el.click(),\n autoSelectFirstItem: false,\n })\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target))\n target.setAttribute(\"data-focus-visible\", \"true\")\n }\n\n const handleBlur = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target)) target.removeAttribute(\"data-focus-visible\")\n }\n\n toolbar.addEventListener(\"focus\", handleFocus, true)\n toolbar.addEventListener(\"blur\", handleBlur, true)\n\n return () => {\n toolbar.removeEventListener(\"focus\", handleFocus, true)\n toolbar.removeEventListener(\"blur\", handleBlur, true)\n }\n }, [toolbarRef])\n\n useEffect(() => {\n if (selectedIndex !== undefined && items[selectedIndex]) {\n items[selectedIndex].focus()\n }\n }, [selectedIndex, items])\n}\n\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n ({ children, className, variant = \"fixed\", ...props }, ref) => {\n const toolbarRef = useRef<HTMLDivElement>(null)\n const composedRef = useComposedRef(toolbarRef, ref)\n useToolbarNavigation(toolbarRef)\n\n return (\n <div\n ref={composedRef}\n role=\"toolbar\"\n aria-label=\"toolbar\"\n data-variant={variant}\n className={cn(\"tiptap-toolbar\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nToolbar.displayName = \"Toolbar\"\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, BaseProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\"tiptap-toolbar-group\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nToolbarGroup.displayName = \"ToolbarGroup\"\n\nexport const ToolbarSeparator = forwardRef<HTMLDivElement, BaseProps>(\n ({ ...props }, ref) => (\n <Separator ref={ref} orientation=\"vertical\" decorative {...props} />\n )\n)\nToolbarSeparator.displayName = \"ToolbarSeparator\"\n","\"use client\"\n\nimport {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n useState,\n version,\n} from \"react\"\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingPortal,\n type Placement,\n type UseFloatingReturn,\n type ReferenceType,\n FloatingDelayGroup,\n} from \"@floating-ui/react\"\nimport \"@/components/tiptap-ui-primitive/tooltip/tooltip.scss\"\n\ninterface TooltipProviderProps {\n children: React.ReactNode\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n onOpenChange?: (open: boolean) => void\n delay?: number\n closeDelay?: number\n timeout?: number\n useDelayGroup?: boolean\n}\n\ninterface TooltipTriggerProps\n extends Omit<React.HTMLProps<HTMLElement>, \"ref\"> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps\n extends Omit<React.HTMLProps<HTMLDivElement>, \"ref\"> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, \"children\">\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (\n userProps?: React.HTMLProps<HTMLElement>\n ) => Record<string, unknown>\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLDivElement>\n ) => Record<string, unknown>\n}\n\nfunction useTooltip({\n initialOpen = false,\n placement = \"top\",\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n delay = 600,\n closeDelay = 0,\n}: Omit<TooltipProviderProps, \"children\"> = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState<boolean>(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(4),\n flip({\n crossAxis: placement.includes(\"-\"),\n fallbackAxisSideDirection: \"start\",\n padding: 4,\n }),\n shift({ padding: 4 }),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n mouseOnly: true,\n move: false,\n restMs: delay,\n enabled: controlledOpen == null,\n delay: {\n close: closeDelay,\n },\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: \"tooltip\" })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = useContext(TooltipContext)\n\n if (context == null) {\n throw new Error(\"Tooltip components must be wrapped in <TooltipProvider />\")\n }\n\n return context\n}\n\nexport function Tooltip({ children, ...props }: TooltipProviderProps) {\n const tooltip = useTooltip(props)\n\n if (!props.useDelayGroup) {\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n }\n\n return (\n <FloatingDelayGroup\n delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }}\n timeoutMs={props.timeout}\n >\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = forwardRef<HTMLElement, TooltipTriggerProps>(\n function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = isValidElement(children)\n ? parseInt(version, 10) >= 19\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as { props: { ref?: React.Ref<any> } }).props.ref\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n const dataAttributes = {\n \"data-tooltip-state\": context.open ? \"open\" : \"closed\",\n }\n\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === \"object\" ? children.props : {}),\n ...dataAttributes,\n })\n )\n }\n\n return (\n <button\n ref={ref}\n data-tooltip-state={context.open ? \"open\" : \"closed\"}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nexport const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent(\n { style, children, portal = true, portalProps = {}, ...props },\n propRef\n ) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open) return null\n\n const content = (\n <div\n ref={ref}\n style={{\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n className=\"tiptap-tooltip\"\n >\n {children}\n </div>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nTooltip.displayName = \"Tooltip\"\nTooltipTrigger.displayName = \"TooltipTrigger\"\nTooltipContent.displayName = \"TooltipContent\"\n","import { forwardRef, Fragment, useMemo } from \"react\"\n\n// --- Tiptap UI Primitive ---\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/tiptap-ui-primitive/tooltip\"\n\n// --- Lib ---\nimport { cn, parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\nimport \"@/components/tiptap-ui-primitive/button/button-colors.scss\"\nimport \"@/components/tiptap-ui-primitive/button/button-group.scss\"\nimport \"@/components/tiptap-ui-primitive/button/button.scss\"\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({\n shortcuts,\n}) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n children,\n tooltip,\n showTooltip = true,\n shortcutKeys,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const shortcuts = useMemo<string[]>(\n () => parseShortcutKeys({ shortcutKeys }),\n [shortcutKeys]\n )\n\n if (!tooltip || !showTooltip) {\n return (\n <button\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </TooltipTrigger>\n <TooltipContent>\n {tooltip}\n <ShortcutDisplay shortcuts={shortcuts} />\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport const ButtonGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, children, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-button-group\", className)}\n data-orientation={orientation}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n )\n})\nButtonGroup.displayName = \"ButtonGroup\"\n\nexport default Button\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CloseIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M18.7071 6.70711C19.0976 6.31658 19.0976 5.68342 18.7071 5.29289C18.3166 4.90237 17.6834 4.90237 17.2929 5.29289L12 10.5858L6.70711 5.29289C6.31658 4.90237 5.68342 4.90237 5.29289 5.29289C4.90237 5.68342 4.90237 6.31658 5.29289 6.70711L10.5858 12L5.29289 17.2929C4.90237 17.6834 4.90237 18.3166 5.29289 18.7071C5.68342 19.0976 6.31658 19.0976 6.70711 18.7071L12 13.4142L17.2929 18.7071C17.6834 19.0976 18.3166 19.0976 18.7071 18.7071C19.0976 18.3166 19.0976 17.6834 18.7071 17.2929L13.4142 12L18.7071 6.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCloseIcon.displayName = \"CloseIcon\"\n","\"use client\"\n\nimport React, { useRef, useState } from \"react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { CloseIcon } from \"@/components/tiptap-icons/close-icon\"\nimport \"@/components/tiptap-node/image-upload-node/image-upload-node.scss\"\nimport { focusNextNode, isValidPosition } from \"@/lib/tiptap-utils\"\n\nexport interface FileItem {\n /**\n * Unique identifier for the file item\n */\n id: string\n /**\n * The actual File object being uploaded\n */\n file: File\n /**\n * Current upload progress as a percentage (0-100)\n */\n progress: number\n /**\n * Current status of the file upload process\n * @default \"uploading\"\n */\n status: \"uploading\" | \"success\" | \"error\"\n\n /**\n * URL to the uploaded file, available after successful upload\n * @optional\n */\n url?: string\n /**\n * Controller that can be used to abort the upload process\n * @optional\n */\n abortController?: AbortController\n}\n\nexport interface UploadOptions {\n /**\n * Maximum allowed file size in bytes\n */\n maxSize: number\n /**\n * Maximum number of files that can be uploaded\n */\n limit: number\n /**\n * String specifying acceptable file types (MIME types or extensions)\n * @example \".jpg,.png,image/jpeg\" or \"image/*\"\n */\n accept: string\n /**\n * Function that handles the actual file upload process\n * @param {File} file - The file to be uploaded\n * @param {Function} onProgress - Callback function to report upload progress\n * @param {AbortSignal} signal - Signal that can be used to abort the upload\n * @returns {Promise<string>} Promise resolving to the URL of the uploaded file\n */\n upload: (\n file: File,\n onProgress: (event: { progress: number }) => void,\n signal: AbortSignal\n ) => Promise<string>\n /**\n * Callback triggered when a file is uploaded successfully\n * @param {string} url - URL of the successfully uploaded file\n * @optional\n */\n onSuccess?: (url: string) => void\n /**\n * Callback triggered when an error occurs during upload\n * @param {Error} error - The error that occurred\n * @optional\n */\n onError?: (error: Error) => void\n}\n\n/**\n * Custom hook for managing multiple file uploads with progress tracking and cancellation\n */\nfunction useFileUpload(options: UploadOptions) {\n const [fileItems, setFileItems] = useState<FileItem[]>([])\n\n const uploadFile = async (file: File): Promise<string | null> => {\n if (file.size > options.maxSize) {\n const error = new Error(\n `File size exceeds maximum allowed (${options.maxSize / 1024 / 1024}MB)`\n )\n options.onError?.(error)\n return null\n }\n\n const abortController = new AbortController()\n const fileId = crypto.randomUUID()\n\n const newFileItem: FileItem = {\n id: fileId,\n file,\n progress: 0,\n status: \"uploading\",\n abortController,\n }\n\n setFileItems((prev) => [...prev, newFileItem])\n\n try {\n if (!options.upload) {\n throw new Error(\"Upload function is not defined\")\n }\n\n const url = await options.upload(\n file,\n ({ progress }) => {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId ? { ...item, progress: Math.round(progress) } : item\n )\n )\n },\n abortController.signal\n )\n\n if (!url) throw new Error(\"Upload failed: No URL returned\")\n\n if (!abortController.signal.aborted) {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId\n ? { ...item, status: \"success\", url, progress: 100 }\n : item\n )\n )\n options.onSuccess?.(url)\n return url\n }\n\n return null\n } catch (error) {\n if (!abortController.signal.aborted) {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId\n ? { ...item, status: \"error\", progress: 0 }\n : item\n )\n )\n options.onError?.(\n error instanceof Error ? error : new Error(\"Upload failed\")\n )\n }\n return null\n }\n }\n\n const uploadFiles = async (files: File[]): Promise<string[]> => {\n if (!files || files.length === 0) {\n options.onError?.(new Error(\"No files to upload\"))\n return []\n }\n\n if (options.limit && files.length > options.limit) {\n options.onError?.(\n new Error(\n `Maximum ${options.limit} file${options.limit === 1 ? \"\" : \"s\"} allowed`\n )\n )\n return []\n }\n\n // Upload all files concurrently\n const uploadPromises = files.map((file) => uploadFile(file))\n const results = await Promise.all(uploadPromises)\n\n // Filter out null results (failed uploads)\n return results.filter((url): url is string => url !== null)\n }\n\n const removeFileItem = (fileId: string) => {\n setFileItems((prev) => {\n const fileToRemove = prev.find((item) => item.id === fileId)\n if (fileToRemove?.abortController) {\n fileToRemove.abortController.abort()\n }\n if (fileToRemove?.url) {\n URL.revokeObjectURL(fileToRemove.url)\n }\n return prev.filter((item) => item.id !== fileId)\n })\n }\n\n const clearAllFiles = () => {\n fileItems.forEach((item) => {\n if (item.abortController) {\n item.abortController.abort()\n }\n if (item.url) {\n URL.revokeObjectURL(item.url)\n }\n })\n setFileItems([])\n }\n\n return {\n fileItems,\n uploadFiles,\n removeFileItem,\n clearAllFiles,\n }\n}\n\nconst CloudUploadIcon: React.FC = () => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n className=\"tiptap-image-upload-icon\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.1953 4.41771C10.3478 4.08499 9.43578 3.94949 8.5282 4.02147C7.62062 4.09345 6.74133 4.37102 5.95691 4.83316C5.1725 5.2953 4.50354 5.92989 4.00071 6.68886C3.49788 7.44783 3.17436 8.31128 3.05465 9.2138C2.93495 10.1163 3.0222 11.0343 3.3098 11.8981C3.5974 12.7619 4.07781 13.5489 4.71463 14.1995C5.10094 14.5942 5.09414 15.2274 4.69945 15.6137C4.30476 16 3.67163 15.9932 3.28532 15.5985C2.43622 14.731 1.79568 13.6816 1.41221 12.5299C1.02875 11.3781 0.91241 10.1542 1.07201 8.95084C1.23162 7.74748 1.66298 6.59621 2.33343 5.58425C3.00387 4.57229 3.89581 3.72617 4.9417 3.10998C5.98758 2.4938 7.15998 2.1237 8.37008 2.02773C9.58018 1.93176 10.7963 2.11243 11.9262 2.55605C13.0561 2.99968 14.0703 3.69462 14.8919 4.58825C15.5423 5.29573 16.0585 6.11304 16.4177 7.00002H17.4999C18.6799 6.99991 19.8288 7.37933 20.7766 8.08222C21.7245 8.78515 22.4212 9.7743 22.7637 10.9036C23.1062 12.0328 23.0765 13.2423 22.6788 14.3534C22.2812 15.4644 21.5367 16.4181 20.5554 17.0736C20.0962 17.3803 19.4752 17.2567 19.1684 16.7975C18.8617 16.3382 18.9853 15.7172 19.4445 15.4105C20.069 14.9934 20.5427 14.3865 20.7958 13.6794C21.0488 12.9724 21.0678 12.2027 20.8498 11.4841C20.6318 10.7655 20.1885 10.136 19.5853 9.6887C18.9821 9.24138 18.251 8.99993 17.5001 9.00002H15.71C15.2679 9.00002 14.8783 8.70973 14.7518 8.28611C14.4913 7.41374 14.0357 6.61208 13.4195 5.94186C12.8034 5.27164 12.0427 4.75043 11.1953 4.41771Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11 14.4142V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V14.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L12.7078 11.2936C12.7054 11.2912 12.703 11.2888 12.7005 11.2864C12.5208 11.1099 12.2746 11.0008 12.003 11L12 11L11.997 11C11.8625 11.0004 11.7343 11.0273 11.6172 11.0759C11.502 11.1236 11.3938 11.1937 11.2995 11.2864C11.297 11.2888 11.2946 11.2912 11.2922 11.2936L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L11 14.4142Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nconst FileIcon: React.FC = () => (\n <svg\n width=\"43\"\n height=\"57\"\n viewBox=\"0 0 43 57\"\n fill=\"currentColor\"\n className=\"tiptap-image-upload-dropzone-rect-primary\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0.75 10.75C0.75 5.64137 4.89137 1.5 10 1.5H32.3431C33.2051 1.5 34.0317 1.84241 34.6412 2.4519L40.2981 8.10876C40.9076 8.71825 41.25 9.5449 41.25 10.4069V46.75C41.25 51.8586 37.1086 56 32 56H10C4.89137 56 0.75 51.8586 0.75 46.75V10.75Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n)\n\nconst FileCornerIcon: React.FC = () => (\n <svg\n width=\"10\"\n height=\"10\"\n className=\"tiptap-image-upload-dropzone-rect-secondary\"\n viewBox=\"0 0 10 10\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0.75H0.343146C1.40401 0.75 2.42143 1.17143 3.17157 1.92157L8.82843 7.57843C9.57857 8.32857 10 9.34599 10 10.4069V10.75H4C1.79086 10.75 0 8.95914 0 6.75V0.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\ninterface ImageUploadDragAreaProps {\n /**\n * Callback function triggered when files are dropped or selected\n * @param {File[]} files - Array of File objects that were dropped or selected\n */\n onFile: (files: File[]) => void\n /**\n * Accepted file types (MIME types)\n * @default \"image/*\"\n */\n accept?: string\n /**\n * Optional child elements to render inside the drag area\n * @optional\n * @default undefined\n */\n children?: React.ReactNode\n}\n\n/**\n * Check if a file matches the accept pattern\n */\nconst isFileAccepted = (file: File, accept: string): boolean => {\n if (!accept || accept === '*' || accept === '*/*') return true\n\n const acceptTypes = accept.split(',').map(t => t.trim())\n\n return acceptTypes.some(acceptType => {\n if (acceptType.endsWith('/*')) {\n // Handle wildcard like \"image/*\"\n const baseType = acceptType.slice(0, -2)\n return file.type.startsWith(baseType)\n }\n if (acceptType.startsWith('.')) {\n // Handle extension like \".jpg\"\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase())\n }\n // Handle exact MIME type\n return file.type === acceptType\n })\n}\n\n/**\n * A component that creates a drag-and-drop area for image uploads\n */\nconst ImageUploadDragArea: React.FC<ImageUploadDragAreaProps> = ({\n onFile,\n accept = \"image/*\",\n children,\n}) => {\n const [isDragOver, setIsDragOver] = useState(false)\n const [isDragActive, setIsDragActive] = useState(false)\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(true)\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragActive(false)\n setIsDragOver(false)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(true)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n setIsDragOver(false)\n\n const files = Array.from(e.dataTransfer.files).filter(file =>\n isFileAccepted(file, accept)\n )\n if (files.length > 0) {\n onFile(files)\n }\n }\n\n return (\n <div\n className={`tiptap-image-upload-drag-area ${isDragActive ? \"drag-active\" : \"\"} ${isDragOver ? \"drag-over\" : \"\"}`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </div>\n )\n}\n\ninterface ImageUploadPreviewProps {\n /**\n * The file item to preview\n */\n fileItem: FileItem\n /**\n * Callback to remove this file from upload queue\n */\n onRemove: () => void\n}\n\n/**\n * Component that displays a preview of an uploading file with progress\n */\nconst ImageUploadPreview: React.FC<ImageUploadPreviewProps> = ({\n fileItem,\n onRemove,\n}) => {\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n }\n\n return (\n <div className=\"tiptap-image-upload-preview\">\n {fileItem.status === \"uploading\" && (\n <div\n className=\"tiptap-image-upload-progress\"\n style={{ width: `${fileItem.progress}%` }}\n />\n )}\n\n <div className=\"tiptap-image-upload-preview-content\">\n <div className=\"tiptap-image-upload-file-info\">\n <div className=\"tiptap-image-upload-file-icon\">\n <CloudUploadIcon />\n </div>\n <div className=\"tiptap-image-upload-details\">\n <span className=\"tiptap-image-upload-text\">\n {fileItem.file.name}\n </span>\n <span className=\"tiptap-image-upload-subtext\">\n {formatFileSize(fileItem.file.size)}\n </span>\n </div>\n </div>\n <div className=\"tiptap-image-upload-actions\">\n {fileItem.status === \"uploading\" && (\n <span className=\"tiptap-image-upload-progress-text\">\n {fileItem.progress}%\n </span>\n )}\n <Button\n type=\"button\"\n data-style=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <CloseIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nconst DropZoneContent: React.FC<{\n maxSize: number\n limit: number\n locale?: {\n clickToUpload?: string\n orDragAndDrop?: string\n maxFiles?: string\n }\n}> = ({ maxSize, limit, locale }) => (\n <>\n <div className=\"tiptap-image-upload-dropzone\">\n <FileIcon />\n <FileCornerIcon />\n <div className=\"tiptap-image-upload-icon-container\">\n <CloudUploadIcon />\n </div>\n </div>\n\n <div className=\"tiptap-image-upload-content\">\n <span className=\"tiptap-image-upload-text\">\n <em>{locale?.clickToUpload ?? \"Click to upload\"}</em> {locale?.orDragAndDrop ?? \"or drag and drop\"}\n </span>\n <span className=\"tiptap-image-upload-subtext\">\n {locale?.maxFiles\n ? locale.maxFiles\n .replace(\"{limit}\", String(limit))\n .replace(\"{size}\", String(maxSize / 1024 / 1024))\n : `Maximum ${limit} file${limit === 1 ? \"\" : \"s\"}, ${maxSize / 1024 / 1024}MB each.`}\n </span>\n </div>\n </>\n)\n\nexport const ImageUploadNode: React.FC<NodeViewProps> = (props) => {\n const { accept, limit, maxSize } = props.node.attrs\n const inputRef = useRef<HTMLInputElement>(null)\n const extension = props.extension\n const locale = extension.options.locale\n\n const uploadOptions: UploadOptions = {\n maxSize,\n limit,\n accept,\n upload: extension.options.upload,\n onSuccess: extension.options.onSuccess,\n onError: extension.options.onError,\n }\n\n const { fileItems, uploadFiles, removeFileItem, clearAllFiles } =\n useFileUpload(uploadOptions)\n\n const handleUpload = async (files: File[]) => {\n const urls = await uploadFiles(files)\n\n if (urls.length > 0) {\n const pos = props.getPos()\n\n if (isValidPosition(pos)) {\n const imageNodes = urls.map((url, index) => {\n const filename =\n files[index]?.name.replace(/\\.[^/.]+$/, \"\") || \"unknown\"\n return {\n type: extension.options.type,\n attrs: {\n ...extension.options,\n src: url,\n alt: filename,\n title: filename,\n },\n }\n })\n\n props.editor\n .chain()\n .focus()\n .deleteRange({ from: pos, to: pos + props.node.nodeSize })\n .insertContentAt(pos, imageNodes)\n .run()\n\n focusNextNode(props.editor)\n }\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) {\n extension.options.onError?.(new Error(\"No file selected\"))\n return\n }\n handleUpload(Array.from(files))\n }\n\n const handleClick = () => {\n if (inputRef.current && fileItems.length === 0) {\n inputRef.current.value = \"\"\n inputRef.current.click()\n }\n }\n\n const hasFiles = fileItems.length > 0\n\n return (\n <NodeViewWrapper\n className=\"tiptap-image-upload\"\n tabIndex={0}\n onClick={handleClick}\n >\n {!hasFiles && (\n <ImageUploadDragArea onFile={handleUpload} accept={accept}>\n <DropZoneContent maxSize={maxSize} limit={limit} locale={locale} />\n </ImageUploadDragArea>\n )}\n\n {hasFiles && (\n <div className=\"tiptap-image-upload-previews\">\n {fileItems.length > 1 && (\n <div className=\"tiptap-image-upload-header\">\n <span>{locale?.uploading ?? \"Uploading\"} {fileItems.length} files</span>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n clearAllFiles()\n }}\n >\n {locale?.clearAll ?? \"Clear All\"}\n </Button>\n </div>\n )}\n {fileItems.map((fileItem) => (\n <ImageUploadPreview\n key={fileItem.id}\n fileItem={fileItem}\n onRemove={() => removeFileItem(fileItem.id)}\n />\n ))}\n </div>\n )}\n\n <input\n ref={inputRef}\n name=\"file\"\n accept={accept}\n type=\"file\"\n multiple={limit > 1}\n onChange={handleChange}\n onClick={(e: React.MouseEvent<HTMLInputElement>) => e.stopPropagation()}\n />\n </NodeViewWrapper>\n )\n}\n","import { mergeAttributes, Node } from \"@tiptap/react\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { ImageUploadNode as ImageUploadNodeComponent } from \"@/components/tiptap-node/image-upload-node/image-upload-node\"\nimport type { NodeType } from \"@tiptap/pm/model\"\n\nexport type UploadFunction = (\n file: File,\n onProgress: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n) => Promise<string>\n\nexport interface ImageUploadNodeOptions {\n /**\n * The type of the node.\n * @default 'image'\n */\n type?: string | NodeType | undefined\n /**\n * Acceptable file types for upload.\n * @default 'image/*'\n */\n accept?: string\n /**\n * Maximum number of files that can be uploaded.\n * @default 1\n */\n limit?: number\n /**\n * Maximum file size in bytes (0 for unlimited).\n * @default 0\n */\n maxSize?: number\n /**\n * Function to handle the upload process.\n */\n upload?: UploadFunction\n /**\n * Callback for upload errors.\n */\n onError?: (error: Error) => void\n /**\n * Callback for successful uploads.\n */\n onSuccess?: (url: string) => void\n /**\n * HTML attributes to add to the image element.\n * @default {}\n * @example { class: 'foo' }\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n HTMLAttributes: Record<string, any>\n /**\n * Locale strings for i18n\n */\n locale?: {\n clickToUpload?: string\n orDragAndDrop?: string\n maxFiles?: string\n clearAll?: string\n uploading?: string\n }\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n imageUpload: {\n setImageUploadNode: (options?: ImageUploadNodeOptions) => ReturnType\n }\n }\n}\n\n/**\n * A Tiptap node extension that creates an image upload component.\n * @see registry/tiptap-node/image-upload-node/image-upload-node\n */\nexport const ImageUploadNode = Node.create<ImageUploadNodeOptions>({\n name: \"imageUpload\",\n\n group: \"block\",\n\n draggable: true,\n\n selectable: true,\n\n atom: true,\n\n addOptions() {\n return {\n type: \"image\",\n accept: \"image/*\",\n limit: 1,\n maxSize: 0,\n upload: undefined,\n onError: undefined,\n onSuccess: undefined,\n HTMLAttributes: {},\n locale: undefined,\n }\n },\n\n addAttributes() {\n return {\n accept: {\n default: this.options.accept,\n },\n limit: {\n default: this.options.limit,\n },\n maxSize: {\n default: this.options.maxSize,\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"image-upload\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes({ \"data-type\": \"image-upload\" }, HTMLAttributes),\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageUploadNodeComponent)\n },\n\n addCommands() {\n return {\n setImageUploadNode:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n }\n },\n\n /**\n * Adds Enter key handler to trigger the upload component when it's selected.\n */\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n const { selection } = editor.state\n const { nodeAfter } = selection.$from\n\n if (\n nodeAfter &&\n nodeAfter.type.name === \"imageUpload\" &&\n editor.isActive(\"imageUpload\")\n ) {\n const nodeEl = editor.view.nodeDOM(selection.$from.pos)\n if (nodeEl && nodeEl instanceof HTMLElement) {\n // Since NodeViewWrapper is wrapped with a div, we need to click the first child\n const firstChild = nodeEl.firstChild\n if (firstChild && firstChild instanceof HTMLElement) {\n firstChild.click()\n return true\n }\n }\n }\n return false\n },\n }\n },\n})\n\nexport default ImageUploadNode\n","import { mergeAttributes } from \"@tiptap/react\"\nimport TiptapHorizontalRule from \"@tiptap/extension-horizontal-rule\"\n\nexport const HorizontalRule = TiptapHorizontalRule.extend({\n renderHTML() {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, { \"data-type\": this.name }),\n [\"hr\"],\n ]\n },\n})\n\nexport default HorizontalRule\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ChevronDownIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.29289 8.29289C5.68342 7.90237 6.31658 7.90237 6.70711 8.29289L12 13.5858L17.2929 8.29289C17.6834 7.90237 18.3166 7.90237 18.7071 8.29289C19.0976 8.68342 19.0976 9.31658 18.7071 9.70711L12.7071 15.7071C12.3166 16.0976 11.6834 16.0976 11.2929 15.7071L5.29289 9.70711C4.90237 9.31658 4.90237 8.68342 5.29289 8.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nChevronDownIcon.displayName = \"ChevronDownIcon\"\n","import type { Editor } from \"@tiptap/react\"\nimport { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { useMemo } from \"react\"\n\n/**\n * Hook that provides access to a Tiptap editor instance.\n *\n * Accepts an optional editor instance directly, or falls back to retrieving\n * the editor from the Tiptap context if available. This allows components\n * to work both when given an editor directly and when used within a Tiptap\n * editor context.\n *\n * @param providedEditor - Optional editor instance to use instead of the context editor\n * @returns The provided editor or the editor from context, whichever is available\n */\nexport function useTiptapEditor(providedEditor?: Editor | null): {\n editor: Editor | null\n editorState?: Editor[\"state\"]\n canCommand?: Editor[\"can\"]\n} {\n const { editor: coreEditor } = useCurrentEditor()\n const mainEditor = useMemo(\n () => providedEditor || coreEditor,\n [providedEditor, coreEditor]\n )\n\n const editorState = useEditorState({\n editor: mainEditor,\n selector(context) {\n if (!context.editor) {\n return {\n editor: null,\n editorState: undefined,\n canCommand: undefined,\n }\n }\n\n return {\n editor: context.editor,\n editorState: context.editor.state,\n canCommand: context.editor.can,\n }\n },\n })\n\n return editorState || { editor: null }\n}\n","import { forwardRef } from \"react\"\nimport \"@/components/tiptap-ui-primitive/badge/badge-colors.scss\"\nimport \"@/components/tiptap-ui-primitive/badge/badge-group.scss\"\nimport \"@/components/tiptap-ui-primitive/badge/badge.scss\"\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"ghost\" | \"white\" | \"gray\" | \"green\" | \"default\"\n size?: \"default\" | \"small\"\n appearance?: \"default\" | \"subdued\" | \"emphasized\"\n trimText?: boolean\n}\n\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n (\n {\n variant,\n size = \"default\",\n appearance = \"default\",\n trimText = false,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={`tiptap-badge ${className || \"\"}`}\n data-style={variant}\n data-size={size}\n data-appearance={appearance}\n data-text-trim={trimText ? \"on\" : \"off\"}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nBadge.displayName = \"Badge\"\n\nexport default Badge\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type {\n Level,\n UseHeadingConfig,\n} from \"@/components/tiptap-ui/heading-button\"\nimport {\n HEADING_SHORTCUT_KEYS,\n useHeading,\n} from \"@/components/tiptap-ui/heading-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\nexport interface HeadingButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HeadingShortcutBadge({\n level,\n shortcutKeys = HEADING_SHORTCUT_KEYS[level],\n}: {\n level: Level\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling heading in a Tiptap editor.\n *\n * For custom button implementations, use the `useHeading` hook instead.\n */\nexport const HeadingButton = forwardRef<HTMLButtonElement, HeadingButtonProps>(\n (\n {\n editor: providedEditor,\n level,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n Icon,\n shortcutKeys,\n } = useHeading({\n editor,\n level,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HeadingShortcutBadge level={level} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nHeadingButton.displayName = \"HeadingButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingOneIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0001 10C21.0001 9.63121 20.7971 9.29235 20.472 9.11833C20.1468 8.94431 19.7523 8.96338 19.4454 9.16795L16.4454 11.168C15.9859 11.4743 15.8617 12.0952 16.1681 12.5547C16.4744 13.0142 17.0953 13.1384 17.5548 12.8321L19.0001 11.8685V18C19.0001 18.5523 19.4478 19 20.0001 19C20.5524 19 21.0001 18.5523 21.0001 18V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingOneIcon.displayName = \"HeadingOneIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingTwoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22.0001 12C22.0001 10.7611 21.1663 9.79297 20.0663 9.42632C18.9547 9.05578 17.6171 9.28724 16.4001 10.2C15.9582 10.5314 15.8687 11.1582 16.2001 11.6C16.5314 12.0418 17.1582 12.1314 17.6001 11.8C18.383 11.2128 19.0455 11.1942 19.4338 11.3237C19.8339 11.457 20.0001 11.7389 20.0001 12C20.0001 12.4839 19.8554 12.7379 19.6537 12.9481C19.4275 13.1837 19.1378 13.363 18.7055 13.6307C18.6313 13.6767 18.553 13.7252 18.4701 13.777C17.9572 14.0975 17.3128 14.5261 16.8163 15.2087C16.3007 15.9177 16.0001 16.8183 16.0001 18C16.0001 18.5523 16.4478 19 17.0001 19H21.0001C21.5523 19 22.0001 18.5523 22.0001 18C22.0001 17.4477 21.5523 17 21.0001 17H18.131C18.21 16.742 18.3176 16.5448 18.4338 16.385C18.6873 16.0364 19.0429 15.7775 19.5301 15.473C19.5898 15.4357 19.6536 15.3966 19.7205 15.3556C20.139 15.0992 20.6783 14.7687 21.0964 14.3332C21.6447 13.7621 22.0001 13.0161 22.0001 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingTwoIcon.displayName = \"HeadingTwoIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingThreeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4608 11.2169C19.1135 11.0531 18.5876 11.0204 18.0069 11.3619C17.5309 11.642 16.918 11.4831 16.638 11.007C16.358 10.531 16.5169 9.91809 16.9929 9.63807C18.1123 8.97962 19.3364 8.94691 20.314 9.40808C21.2839 9.86558 21.9999 10.818 21.9999 12C21.9999 12.7957 21.6838 13.5587 21.1212 14.1213C20.5586 14.6839 19.7956 15 18.9999 15C18.4476 15 17.9999 14.5523 17.9999 14C17.9999 13.4477 18.4476 13 18.9999 13C19.2651 13 19.5195 12.8947 19.707 12.7071C19.8946 12.5196 19.9999 12.2652 19.9999 12C19.9999 11.6821 19.8159 11.3844 19.4608 11.2169Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.0001 14C18.0001 13.4477 18.4478 13 19.0001 13C19.7957 13 20.5588 13.3161 21.1214 13.8787C21.684 14.4413 22.0001 15.2043 22.0001 16C22.0001 17.2853 21.2767 18.3971 20.1604 18.8994C19.0257 19.41 17.642 19.2315 16.4001 18.3C15.9582 17.9686 15.8687 17.3418 16.2001 16.9C16.5314 16.4582 17.1582 16.3686 17.6001 16.7C18.3581 17.2685 18.9744 17.24 19.3397 17.0756C19.7234 16.9029 20.0001 16.5147 20.0001 16C20.0001 15.7348 19.8947 15.4804 19.7072 15.2929C19.5196 15.1054 19.2653 15 19.0001 15C18.4478 15 18.0001 14.5523 18.0001 14Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingThreeIcon.displayName = \"HeadingThreeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFourIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 9C17.5523 9 18 9.44772 18 10V13H20V10C20 9.44772 20.4477 9 21 9C21.5523 9 22 9.44772 22 10V18C22 18.5523 21.5523 19 21 19C20.4477 19 20 18.5523 20 18V15H17C16.4477 15 16 14.5523 16 14V10C16 9.44772 16.4477 9 17 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFourIcon.displayName = \"HeadingFourIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFiveIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M16 10C16 9.44772 16.4477 9 17 9H21C21.5523 9 22 9.44772 22 10C22 10.5523 21.5523 11 21 11H18V12H18.3C20.2754 12 22 13.4739 22 15.5C22 17.5261 20.2754 19 18.3 19C17.6457 19 17.0925 18.8643 16.5528 18.5944C16.0588 18.3474 15.8586 17.7468 16.1055 17.2528C16.3525 16.7588 16.9532 16.5586 17.4472 16.8056C17.7074 16.9357 17.9542 17 18.3 17C19.3246 17 20 16.2739 20 15.5C20 14.7261 19.3246 14 18.3 14H17C16.4477 14 16 13.5523 16 13L16 12.9928V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFiveIcon.displayName = \"HeadingFiveIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingSixIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.7071 9.29289C21.0976 9.68342 21.0976 10.3166 20.7071 10.7071C19.8392 11.575 19.2179 12.2949 18.7889 13.0073C18.8587 13.0025 18.929 13 19 13C20.6569 13 22 14.3431 22 16C22 17.6569 20.6569 19 19 19C17.3431 19 16 17.6569 16 16C16 14.6007 16.2837 13.4368 16.8676 12.3419C17.4384 11.2717 18.2728 10.3129 19.2929 9.29289C19.6834 8.90237 20.3166 8.90237 20.7071 9.29289ZM19 17C18.4477 17 18 16.5523 18 16C18 15.4477 18.4477 15 19 15C19.5523 15 20 15.4477 20 16C20 16.5523 19.5523 17 19 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingSixIcon.displayName = \"HeadingSixIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HeadingOneIcon } from \"@/components/tiptap-icons/heading-one-icon\"\nimport { HeadingTwoIcon } from \"@/components/tiptap-icons/heading-two-icon\"\nimport { HeadingThreeIcon } from \"@/components/tiptap-icons/heading-three-icon\"\nimport { HeadingFourIcon } from \"@/components/tiptap-icons/heading-four-icon\"\nimport { HeadingFiveIcon } from \"@/components/tiptap-icons/heading-five-icon\"\nimport { HeadingSixIcon } from \"@/components/tiptap-icons/heading-six-icon\"\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\n/**\n * Configuration for the heading functionality\n */\nexport interface UseHeadingConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The heading level.\n */\n level: Level\n /**\n * Whether the button should hide when heading is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful heading toggle.\n */\n onToggled?: () => void\n}\n\nexport const headingIcons = {\n 1: HeadingOneIcon,\n 2: HeadingTwoIcon,\n 3: HeadingThreeIcon,\n 4: HeadingFourIcon,\n 5: HeadingFiveIcon,\n 6: HeadingSixIcon,\n}\n\nexport const HEADING_SHORTCUT_KEYS: Record<Level, string> = {\n 1: \"ctrl+alt+1\",\n 2: \"ctrl+alt+2\",\n 3: \"ctrl+alt+3\",\n 4: \"ctrl+alt+4\",\n 5: \"ctrl+alt+5\",\n 6: \"ctrl+alt+6\",\n}\n\n/**\n * Checks if heading can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n level?: Level,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"heading\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return level\n ? editor.can().setNode(\"heading\", { level })\n : editor.can().setNode(\"heading\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set heading directly on the selection,\n // or we can clear formatting/nodes to arrive at a heading.\n return level\n ? editor.can().setNode(\"heading\", { level }) || editor.can().clearNodes()\n : editor.can().setNode(\"heading\") || editor.can().clearNodes()\n}\n\n/**\n * Checks if heading is currently active\n */\nexport function isHeadingActive(\n editor: Editor | null,\n level?: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (Array.isArray(level)) {\n return level.some((l) => editor.isActive(\"heading\", { level: l }))\n }\n\n return level\n ? editor.isActive(\"heading\", { level })\n : editor.isActive(\"heading\")\n}\n\n/**\n * Toggles heading in the editor\n */\nexport function toggleHeading(\n editor: Editor | null,\n level: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n const levels = Array.isArray(level) ? level : [level]\n const toggleLevel = levels.find((l) => canToggle(editor, l))\n\n if (!toggleLevel) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const isActive = levels.some((l) =>\n editor.isActive(\"heading\", { level: l })\n )\n\n const toggle = isActive\n ? chain.setNode(\"paragraph\")\n : chain.setNode(\"heading\", { level: toggleLevel })\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the heading button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n level?: Level | Level[]\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, level, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"heading\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n if (Array.isArray(level)) {\n return level.some((l) => canToggle(editor, l))\n }\n return canToggle(editor, level)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides heading functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleHeadingButton() {\n * const { isVisible, isActive, handleToggle, Icon } = useHeading({ level: 1 })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Heading 1\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingButton() {\n * const { isVisible, isActive, handleToggle, label, Icon } = useHeading({\n * level: 2,\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Heading toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Toggle Heading 2\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useHeading(config: UseHeadingConfig) {\n const {\n editor: providedEditor,\n level,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor, level)\n const isActive = isHeadingActive(editor, level)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, level, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, level, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleHeading(editor, level)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, level, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: `Heading ${level}`,\n shortcutKeys: HEADING_SHORTCUT_KEYS[level],\n Icon: headingIcons[level],\n }\n}\n","import { forwardRef } from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.scss\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root modal={false} {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal {...props} />\n}\n\nconst DropdownMenuTrigger = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>(({ ...props }, ref) => <DropdownMenuPrimitive.Trigger ref={ref} {...props} />)\nDropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuItem = DropdownMenuPrimitive.Item\n\nconst DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger\n\nconst DropdownMenuSubContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {\n portal?: boolean | React.ComponentProps<typeof DropdownMenuPortal>\n }\n>(({ className, portal = true, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\n portal?: boolean\n }\n>(({ className, sideOffset = 4, portal = false, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n onCloseAutoFocus={(e) => e.preventDefault()}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuGroup,\n DropdownMenuSub,\n DropdownMenuPortal,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\"\n\nimport { forwardRef } from \"react\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/card/card.scss\"\n\nconst Card = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return <div ref={ref} className={cn(\"tiptap-card\", className)} {...props} />\n }\n)\nCard.displayName = \"Card\"\n\nconst CardHeader = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-header\", className)}\n {...props}\n />\n )\n }\n)\nCardHeader.displayName = \"CardHeader\"\n\nconst CardBody = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"tiptap-card-body\", className)} {...props} />\n )\n }\n)\nCardBody.displayName = \"CardBody\"\n\nconst CardItemGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-orientation={orientation}\n className={cn(\"tiptap-card-item-group\", className)}\n {...props}\n />\n )\n})\nCardItemGroup.displayName = \"CardItemGroup\"\n\nconst CardGroupLabel = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-group-label\", className)}\n {...props}\n />\n )\n }\n)\nCardGroupLabel.displayName = \"CardGroupLabel\"\n\nconst CardFooter = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-footer\", className)}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardBody, CardItemGroup, CardGroupLabel }\n","import { forwardRef, useCallback, useState } from \"react\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"@/components/tiptap-icons/chevron-down-icon\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport { HeadingButton } from \"@/components/tiptap-ui/heading-button\"\nimport type { UseHeadingDropdownMenuConfig } from \"@/components/tiptap-ui/heading-dropdown-menu\"\nimport { useHeadingDropdownMenu } from \"@/components/tiptap-ui/heading-dropdown-menu\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"@/components/tiptap-ui-primitive/card\"\n\nexport interface HeadingDropdownMenuProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingDropdownMenuConfig {\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Labels for dropdown items\n */\n labels?: {\n heading1?: string\n heading2?: string\n heading3?: string\n heading4?: string\n heading5?: string\n heading6?: string\n paragraph?: string\n }\n}\n\n/**\n * Dropdown menu component for selecting heading levels in a Tiptap editor.\n *\n * For custom dropdown implementations, use the `useHeadingDropdownMenu` hook instead.\n */\nexport const HeadingDropdownMenu = forwardRef<\n HTMLButtonElement,\n HeadingDropdownMenuProps\n>(\n (\n {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n portal = false,\n onOpenChange,\n labels,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState<boolean>(false)\n const { isVisible, isActive, canToggle, Icon } = useHeadingDropdownMenu({\n editor,\n levels,\n hideWhenUnavailable,\n })\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!editor || !canToggle) return\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [canToggle, editor, onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu modal open={isOpen} onOpenChange={handleOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"Format text as heading\"\n aria-pressed={isActive}\n tooltip=\"Heading\"\n {...buttonProps}\n ref={ref}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {levels.map((level) => (\n <DropdownMenuItem key={`heading-${level}`} asChild>\n <HeadingButton\n editor={editor}\n level={level}\n text={labels?.[`heading${level}` as keyof typeof labels] ?? `Heading ${level}`}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n)\n\nHeadingDropdownMenu.displayName = \"HeadingDropdownMenu\"\n\nexport default HeadingDropdownMenu\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M6 3C6.55228 3 7 3.44772 7 4V11H17V4C17 3.44772 17.4477 3 18 3C18.5523 3 19 3.44772 19 4V20C19 20.5523 18.5523 21 18 21C17.4477 21 17 20.5523 17 20V13H7V20C7 20.5523 6.55228 21 6 21C5.44772 21 5 20.5523 5 20V4C5 3.44772 5.44772 3 6 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingIcon.displayName = \"HeadingIcon\"\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { HeadingIcon } from \"@/components/tiptap-icons/heading-icon\"\n\n// --- Tiptap UI ---\nimport {\n headingIcons,\n type Level,\n isHeadingActive,\n canToggle,\n shouldShowButton,\n} from \"@/components/tiptap-ui/heading-button\"\n\n/**\n * Configuration for the heading dropdown menu functionality\n */\nexport interface UseHeadingDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Available heading levels to show in the dropdown\n * @default [1, 2, 3, 4, 5, 6]\n */\n levels?: Level[]\n /**\n * Whether the dropdown should hide when headings are not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * Gets the currently active heading level from the available levels\n */\nexport function getActiveHeadingLevel(\n editor: Editor | null,\n levels: Level[] = [1, 2, 3, 4, 5, 6]\n): Level | undefined {\n if (!editor || !editor.isEditable) return undefined\n return levels.find((level) => isHeadingActive(editor, level))\n}\n\n/**\n * Custom hook that provides heading dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * isAnyHeadingActive,\n * canToggle,\n * levels,\n * } = useHeadingDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * } = useHeadingDropdownMenu({\n * editor: myEditor,\n * levels: [1, 2, 3],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useHeadingDropdownMenu(config?: UseHeadingDropdownMenuConfig) {\n const {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const activeLevel = getActiveHeadingLevel(editor, levels)\n const isActive = isHeadingActive(editor)\n const canToggleState = canToggle(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, level: levels })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, levels])\n\n return {\n isVisible,\n activeLevel,\n isActive,\n canToggle: canToggleState,\n levels,\n label: \"Heading\",\n Icon: activeLevel ? headingIcons[activeLevel] : HeadingIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseImageUploadConfig } from \"@/components/tiptap-ui/image-upload-button\"\nimport {\n IMAGE_UPLOAD_SHORTCUT_KEY,\n useImageUpload,\n} from \"@/components/tiptap-ui/image-upload-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface ImageUploadButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseImageUploadConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n /**\n * Optional custom icon component to render instead of the default.\n */\n icon?: React.MemoExoticComponent<IconComponent> | React.FC<IconProps>\n}\n\nexport function ImageShortcutBadge({\n shortcutKeys = IMAGE_UPLOAD_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for uploading/inserting images in a Tiptap editor.\n *\n * For custom button implementations, use the `useImage` hook instead.\n */\nexport const ImageUploadButton = forwardRef<\n HTMLButtonElement,\n ImageUploadButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onInserted,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canInsert,\n handleImage,\n label,\n isActive,\n shortcutKeys,\n Icon,\n } = useImageUpload({\n editor,\n hideWhenUnavailable,\n onInserted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleImage()\n },\n [handleImage, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const RenderIcon = CustomIcon ?? Icon\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canInsert}\n data-disabled={!canInsert}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && <ImageShortcutBadge shortcutKeys={shortcutKeys} />}\n </>\n )}\n </Button>\n )\n }\n)\n\nImageUploadButton.displayName = \"ImageUploadButton\"\n","import { useEffect, useState } from \"react\"\n\ntype BreakpointMode = \"min\" | \"max\"\n\n/**\n * Hook to detect whether the current viewport matches a given breakpoint rule.\n * Example:\n * useIsBreakpoint(\"max\", 768) // true when width < 768\n * useIsBreakpoint(\"min\", 1024) // true when width >= 1024\n */\nexport function useIsBreakpoint(\n mode: BreakpointMode = \"max\",\n breakpoint = 768\n) {\n const [matches, setMatches] = useState<boolean | undefined>(undefined)\n\n useEffect(() => {\n const query =\n mode === \"min\"\n ? `(min-width: ${breakpoint}px)`\n : `(max-width: ${breakpoint - 1}px)`\n\n const mql = window.matchMedia(query)\n const onChange = (e: MediaQueryListEvent) => setMatches(e.matches)\n\n // Set initial value\n setMatches(mql.matches)\n\n // Add listener\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [mode, breakpoint])\n\n return !!matches\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ImagePlusIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20 2C20 1.44772 19.5523 1 19 1C18.4477 1 18 1.44772 18 2V4H16C15.4477 4 15 4.44772 15 5C15 5.55228 15.4477 6 16 6H18V8C18 8.55228 18.4477 9 19 9C19.5523 9 20 8.55228 20 8V6H22C22.5523 6 23 5.55228 23 5C23 4.44772 22.5523 4 22 4H20V2ZM5 4C4.73478 4 4.48043 4.10536 4.29289 4.29289C4.10536 4.48043 4 4.73478 4 5V19C4 19.2652 4.10536 19.5196 4.29289 19.7071C4.48043 19.8946 4.73478 20 5 20H5.58579L14.379 11.2068C14.9416 10.6444 15.7045 10.3284 16.5 10.3284C17.2955 10.3284 18.0584 10.6444 18.621 11.2068L20 12.5858V12C20 11.4477 20.4477 11 21 11C21.5523 11 22 11.4477 22 12V14.998C22 14.9994 22 15.0007 22 15.002V19C22 19.7957 21.6839 20.5587 21.1213 21.1213C20.5587 21.6839 19.7957 22 19 22H6.00219C6.00073 22 5.99927 22 5.99781 22H5C4.20435 22 3.44129 21.6839 2.87868 21.1213C2.31607 20.5587 2 19.7957 2 19V5C2 4.20435 2.31607 3.44129 2.87868 2.87868C3.44129 2.31607 4.20435 2 5 2H12C12.5523 2 13 2.44772 13 3C13 3.55228 12.5523 4 12 4H5ZM8.41422 20H19C19.2652 20 19.5196 19.8946 19.7071 19.7071C19.8946 19.5196 20 19.2652 20 19V15.4142L17.207 12.6212C17.0195 12.4338 16.7651 12.3284 16.5 12.3284C16.2349 12.3284 15.9806 12.4337 15.7931 12.6211L8.41422 20ZM6.87868 6.87868C7.44129 6.31607 8.20435 6 9 6C9.79565 6 10.5587 6.31607 11.1213 6.87868C11.6839 7.44129 12 8.20435 12 9C12 9.79565 11.6839 10.5587 11.1213 11.1213C10.5587 11.6839 9.79565 12 9 12C8.20435 12 7.44129 11.6839 6.87868 11.1213C6.31607 10.5587 6 9.79565 6 9C6 8.20435 6.31607 7.44129 6.87868 6.87868ZM9 8C8.73478 8 8.48043 8.10536 8.29289 8.29289C8.10536 8.48043 8 8.73478 8 9C8 9.26522 8.10536 9.51957 8.29289 9.70711C8.48043 9.89464 8.73478 10 9 10C9.26522 10 9.51957 9.89464 9.70711 9.70711C9.89464 9.51957 10 9.26522 10 9C10 8.73478 9.89464 8.48043 9.70711 8.29289C9.51957 8.10536 9.26522 8 9 8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nImagePlusIcon.displayName = \"ImagePlusIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { ImagePlusIcon } from \"@/components/tiptap-icons/image-plus-icon\"\n\nexport const IMAGE_UPLOAD_SHORTCUT_KEY = \"mod+shift+i\"\n\n/**\n * Configuration for the image upload functionality\n */\nexport interface UseImageUploadConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when insertion is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful image insertion.\n */\n onInserted?: () => void\n}\n\n/**\n * Checks if image can be inserted in the current editor state\n */\nexport function canInsertImage(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"imageUpload\")) return false\n\n return editor.can().insertContent({ type: \"imageUpload\" })\n}\n\n/**\n * Checks if image is currently active\n */\nexport function isImageActive(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"imageUpload\")\n}\n\n/**\n * Inserts an image in the editor\n */\nexport function insertImage(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canInsertImage(editor)) return false\n\n try {\n return editor\n .chain()\n .focus()\n .insertContent({\n type: \"imageUpload\",\n })\n .run()\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the image button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"imageUpload\")) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canInsertImage(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides image functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleImageButton() {\n * const { isVisible, handleImage } = useImage()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleImage}>Add Image</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedImageButton() {\n * const { isVisible, handleImage, label, isActive } = useImage({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onInserted: () => console.log('Image inserted!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleImage}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Add Image\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useImageUpload(config?: UseImageUploadConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onInserted,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canInsert = canInsertImage(editor)\n const isActive = isImageActive(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleImage = useCallback(() => {\n if (!editor) return false\n\n const success = insertImage(editor)\n if (success) {\n onInserted?.()\n }\n return success\n }, [editor, onInserted])\n\n useHotkeys(\n IMAGE_UPLOAD_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleImage()\n },\n {\n enabled: isVisible && canInsert,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleImage,\n canInsert,\n label: \"Add image\",\n shortcutKeys: IMAGE_UPLOAD_SHORTCUT_KEY,\n Icon: ImagePlusIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\n// --- Tiptap UI ---\nimport type { ListType, UseListConfig } from \"@/components/tiptap-ui/list-button\"\nimport { LIST_SHORTCUT_KEYS, useList } from \"@/components/tiptap-ui/list-button\"\n\nexport interface ListButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseListConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ListShortcutBadge({\n type,\n shortcutKeys = LIST_SHORTCUT_KEYS[type],\n}: {\n type: ListType\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling lists in a Tiptap editor.\n *\n * For custom button implementations, use the `useList` hook instead.\n */\nexport const ListButton = forwardRef<HTMLButtonElement, ListButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useList({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ListShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nListButton.displayName = \"ListButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 6C7 5.44772 7.44772 5 8 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H8C7.44772 7 7 6.55228 7 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 12C7 11.4477 7.44772 11 8 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H8C7.44772 13 7 12.5523 7 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 18C7 17.4477 7.44772 17 8 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H8C7.44772 19 7 18.5523 7 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H3.01C3.56228 5 4.01 5.44772 4.01 6C4.01 6.55228 3.56228 7 3.01 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H3.01C3.56228 11 4.01 11.4477 4.01 12C4.01 12.5523 3.56228 13 3.01 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H3.01C3.56228 17 4.01 17.4477 4.01 18C4.01 18.5523 3.56228 19 3.01 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListIcon.displayName = \"ListIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListOrderedIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 6C9 5.44772 9.44772 5 10 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H10C9.44772 7 9 6.55228 9 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 12C9 11.4477 9.44772 11 10 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H10C9.44772 13 9 12.5523 9 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 18C9 17.4477 9.44772 17 10 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H10C9.44772 19 9 18.5523 9 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 6C3 5.44772 3.44772 5 4 5H5C5.55228 5 6 5.44772 6 6V10C6 10.5523 5.55228 11 5 11C4.44772 11 4 10.5523 4 10V7C3.44772 7 3 6.55228 3 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 10C3 9.44772 3.44772 9 4 9H6C6.55228 9 7 9.44772 7 10C7 10.5523 6.55228 11 6 11H4C3.44772 11 3 10.5523 3 10Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.82219 13.0431C6.54543 13.4047 6.99997 14.1319 6.99997 15C6.99997 15.5763 6.71806 16.0426 6.48747 16.35C6.31395 16.5814 6.1052 16.8044 5.91309 17H5.99997C6.55226 17 6.99997 17.4477 6.99997 18C6.99997 18.5523 6.55226 19 5.99997 19H3.99997C3.44769 19 2.99997 18.5523 2.99997 18C2.99997 17.4237 3.28189 16.9575 3.51247 16.65C3.74323 16.3424 4.03626 16.0494 4.26965 15.8161C4.27745 15.8083 4.2852 15.8006 4.29287 15.7929C4.55594 15.5298 4.75095 15.3321 4.88748 15.15C4.96287 15.0495 4.99021 14.9922 4.99911 14.9714C4.99535 14.9112 4.9803 14.882 4.9739 14.8715C4.96613 14.8588 4.95382 14.845 4.92776 14.8319C4.87723 14.8067 4.71156 14.7623 4.44719 14.8944C3.95321 15.1414 3.35254 14.9412 3.10555 14.4472C2.85856 13.9533 3.05878 13.3526 3.55276 13.1056C4.28839 12.7378 5.12272 12.6934 5.82219 13.0431Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListOrderedIcon.displayName = \"ListOrderedIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListTodoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 4.89543 2.89543 4 4 4H8C9.10457 4 10 4.89543 10 6V10C10 11.1046 9.10457 12 8 12H4C2.89543 12 2 11.1046 2 10V6ZM8 6H4V10H8V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 14.2929C10.0976 14.6834 10.0976 15.3166 9.70711 15.7071L5.70711 19.7071C5.31658 20.0976 4.68342 20.0976 4.29289 19.7071L2.29289 17.7071C1.90237 17.3166 1.90237 16.6834 2.29289 16.2929C2.68342 15.9024 3.31658 15.9024 3.70711 16.2929L5 17.5858L8.29289 14.2929C8.68342 13.9024 9.31658 13.9024 9.70711 14.2929Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 6C12 5.44772 12.4477 5 13 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H13C12.4477 7 12 6.55228 12 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 12C12 11.4477 12.4477 11 13 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H13C12.4477 13 12 12.5523 12 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 18C12 17.4477 12.4477 17 13 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H13C12.4477 19 12 18.5523 12 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListTodoIcon.displayName = \"ListTodoIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"@/components/tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"@/components/tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"@/components/tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\nexport type ListType = \"bulletList\" | \"orderedList\" | \"taskList\"\n\n/**\n * Configuration for the list functionality\n */\nexport interface UseListConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of list to toggle.\n */\n type: ListType\n /**\n * Whether the button should hide when list is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\nexport const listIcons = {\n bulletList: ListIcon,\n orderedList: ListOrderedIcon,\n taskList: ListTodoIcon,\n}\n\nexport const listLabels: Record<ListType, string> = {\n bulletList: \"Bullet List\",\n orderedList: \"Ordered List\",\n taskList: \"Task List\",\n}\n\nexport const LIST_SHORTCUT_KEYS: Record<ListType, string> = {\n bulletList: \"mod+shift+8\",\n orderedList: \"mod+shift+7\",\n taskList: \"mod+shift+9\",\n}\n\n/**\n * Checks if a list can be toggled in the current editor state\n */\nexport function canToggleList(\n editor: Editor | null,\n type: ListType,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n if (!turnInto) {\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList()\n case \"orderedList\":\n return editor.can().toggleOrderedList()\n case \"taskList\":\n return editor.can().toggleList(\"taskList\", \"taskItem\")\n default:\n return false\n }\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set list directly on the selection,\n // or we can clear formatting/nodes to arrive at a list.\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList() || editor.can().clearNodes()\n case \"orderedList\":\n return editor.can().toggleOrderedList() || editor.can().clearNodes()\n case \"taskList\":\n return (\n editor.can().toggleList(\"taskList\", \"taskItem\") ||\n editor.can().clearNodes()\n )\n default:\n return false\n }\n}\n\n/**\n * Checks if list is currently active\n */\nexport function isListActive(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n\n switch (type) {\n case \"bulletList\":\n return editor.isActive(\"bulletList\")\n case \"orderedList\":\n return editor.isActive(\"orderedList\")\n case \"taskList\":\n return editor.isActive(\"taskList\")\n default:\n return false\n }\n}\n\n/**\n * Toggles list in the editor\n */\nexport function toggleList(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleList(editor, type)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n if (editor.isActive(type)) {\n // Unwrap list\n chain\n .liftListItem(\"listItem\")\n .lift(\"bulletList\")\n .lift(\"orderedList\")\n .lift(\"taskList\")\n .run()\n } else {\n // Wrap in specific list type\n const toggleMap: Record<ListType, () => typeof chain> = {\n bulletList: () => chain.toggleBulletList(),\n orderedList: () => chain.toggleOrderedList(),\n taskList: () => chain.toggleList(\"taskList\", \"taskItem\"),\n }\n\n const toggle = toggleMap[type]\n if (!toggle) return false\n\n toggle().run()\n }\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the list button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: ListType\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleList(editor, type)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides list functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleListButton() {\n * const { isVisible, handleToggle, isActive } = useList({ type: \"bulletList\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Bullet List</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListButton() {\n * const { isVisible, handleToggle, label, isActive } = useList({\n * type: \"orderedList\",\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('List toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle List\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useList(config: UseListConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleList(editor, type)\n const isActive = isListActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleList(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: listLabels[type],\n shortcutKeys: LIST_SHORTCUT_KEYS[type],\n Icon: listIcons[type],\n }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"@/components/tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"@/components/tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"@/components/tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport { isNodeInSchema } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport {\n canToggleList,\n isListActive,\n listIcons,\n type ListType,\n} from \"@/components/tiptap-ui/list-button\"\n\n/**\n * Configuration for the list dropdown menu functionality\n */\nexport interface UseListDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The list types to display in the dropdown.\n * @default [\"bulletList\", \"orderedList\", \"taskList\"]\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport interface ListOption {\n label: string\n type: ListType\n icon: React.ElementType\n}\n\nexport const listOptions: ListOption[] = [\n {\n label: \"Bullet List\",\n type: \"bulletList\",\n icon: ListIcon,\n },\n {\n label: \"Ordered List\",\n type: \"orderedList\",\n icon: ListOrderedIcon,\n },\n {\n label: \"Task List\",\n type: \"taskList\",\n icon: ListTodoIcon,\n },\n]\n\nexport function canToggleAnyList(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => canToggleList(editor, type))\n}\n\nexport function isAnyListActive(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => isListActive(editor, type))\n}\n\nexport function getFilteredListOptions(\n availableTypes: ListType[]\n): typeof listOptions {\n return listOptions.filter(\n (option) => !option.type || availableTypes.includes(option.type)\n )\n}\n\nexport function shouldShowListDropdown(params: {\n editor: Editor | null\n listTypes: ListType[]\n hideWhenUnavailable: boolean\n listInSchema: boolean\n canToggleAny: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, listInSchema, canToggleAny } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleAny\n }\n\n return true\n}\n\n/**\n * Gets the currently active list type from the available types\n */\nexport function getActiveListType(\n editor: Editor | null,\n availableTypes: ListType[]\n): ListType | undefined {\n if (!editor || !editor.isEditable) return undefined\n return availableTypes.find((type) => isListActive(editor, type))\n}\n\n/**\n * Custom hook that provides list dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * isAnyActive,\n * canToggleAny,\n * filteredLists,\n * } = useListDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * } = useListDropdownMenu({\n * editor: myEditor,\n * types: [\"bulletList\", \"orderedList\"],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useListDropdownMenu(config?: UseListDropdownMenuConfig) {\n const {\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const listInSchema = types.some((type) => isNodeInSchema(type, editor))\n\n const filteredLists = useMemo(() => getFilteredListOptions(types), [types])\n\n const canToggleAny = canToggleAnyList(editor, types)\n const isAnyActive = isAnyListActive(editor, types)\n const activeType = getActiveListType(editor, types)\n const activeList = filteredLists.find((option) => option.type === activeType)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowListDropdown({\n editor,\n listTypes: types,\n hideWhenUnavailable,\n listInSchema,\n canToggleAny,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [canToggleAny, editor, hideWhenUnavailable, listInSchema, types])\n\n return {\n isVisible,\n activeType,\n isActive: isAnyActive,\n canToggle: canToggleAny,\n types,\n filteredLists,\n label: \"List\",\n Icon: activeList ? listIcons[activeList.type] : ListIcon,\n }\n}\n","import { useCallback, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"@/components/tiptap-icons/chevron-down-icon\"\n\n// --- Tiptap UI ---\nimport { ListButton, type ListType } from \"@/components/tiptap-ui/list-button\"\n\nimport { useListDropdownMenu } from \"@/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"@/components/tiptap-ui-primitive/card\"\n\nexport interface ListDropdownMenuProps extends Omit<ButtonProps, \"type\"> {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor\n /**\n * The list types to display in the dropdown.\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n /**\n * Labels for dropdown items\n */\n labels?: {\n bulletList?: string\n orderedList?: string\n taskList?: string\n }\n}\n\nexport function ListDropdownMenu({\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n onOpenChange,\n portal = false,\n labels,\n ...props\n}: ListDropdownMenuProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const { filteredLists, canToggle, isActive, isVisible, Icon } =\n useListDropdownMenu({\n editor,\n types,\n hideWhenUnavailable,\n })\n\n const handleOnOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"List options\"\n tooltip=\"List\"\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {filteredLists.map((option) => (\n <DropdownMenuItem key={option.type} asChild>\n <ListButton\n editor={editor}\n type={option.type}\n text={labels?.[option.type] ?? option.label}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ListDropdownMenu\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Tiptap UI ---\nimport type { UseBlockquoteConfig } from \"@/components/tiptap-ui/blockquote-button\"\nimport {\n BLOCKQUOTE_SHORTCUT_KEY,\n useBlockquote,\n} from \"@/components/tiptap-ui/blockquote-button\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface BlockquoteButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseBlockquoteConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function BlockquoteShortcutBadge({\n shortcutKeys = BLOCKQUOTE_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling blockquote in a Tiptap editor.\n *\n * For custom button implementations, use the `useBlockquote` hook instead.\n */\nexport const BlockquoteButton = forwardRef<\n HTMLButtonElement,\n BlockquoteButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useBlockquote({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"Blockquote\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <BlockquoteShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nBlockquoteButton.displayName = \"BlockquoteButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BlockquoteIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 6C8 5.44772 8.44772 5 9 5H16C16.5523 5 17 5.44772 17 6C17 6.55228 16.5523 7 16 7H9C8.44772 7 8 6.55228 8 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 3C4.55228 3 5 3.44772 5 4L5 20C5 20.5523 4.55229 21 4 21C3.44772 21 3 20.5523 3 20L3 4C3 3.44772 3.44772 3 4 3Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H20C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 18C8 17.4477 8.44772 17 9 17H16C16.5523 17 17 17.4477 17 18C17 18.5523 16.5523 19 16 19H9C8.44772 19 8 18.5523 8 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBlockquoteIcon.displayName = \"BlockquoteIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BlockquoteIcon } from \"@/components/tiptap-icons/blockquote-icon\"\n\n// --- UI Utils ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\nexport const BLOCKQUOTE_SHORTCUT_KEY = \"mod+shift+b\"\n\n/**\n * Configuration for the blockquote functionality\n */\nexport interface UseBlockquoteConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when blockquote is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if blockquote can be toggled in the current editor state\n */\nexport function canToggleBlockquote(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"blockquote\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleWrap(\"blockquote\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can wrap in blockquote directly on the selection,\n // or we can clear formatting/nodes to arrive at a blockquote.\n return editor.can().toggleWrap(\"blockquote\") || editor.can().clearNodes()\n}\n\n/**\n * Toggles blockquote formatting for a specific node or the current selection\n */\nexport function toggleBlockquote(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleBlockquote(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"blockquote\")\n ? chain.lift(\"blockquote\")\n : chain.wrapIn(\"blockquote\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the blockquote button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"blockquote\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleBlockquote(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides blockquote functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleBlockquoteButton() {\n * const { isVisible, handleToggle, isActive } = useBlockquote()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Blockquote</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedBlockquoteButton() {\n * const { isVisible, handleToggle, label, isActive } = useBlockquote({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Blockquote toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Blockquote\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useBlockquote(config?: UseBlockquoteConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleBlockquote(editor)\n const isActive = editor?.isActive(\"blockquote\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleBlockquote(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: \"Blockquote\",\n shortcutKeys: BLOCKQUOTE_SHORTCUT_KEY,\n Icon: BlockquoteIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type { UseCodeBlockConfig } from \"@/components/tiptap-ui/code-block-button\"\nimport {\n CODE_BLOCK_SHORTCUT_KEY,\n useCodeBlock,\n} from \"@/components/tiptap-ui/code-block-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface CodeBlockButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseCodeBlockConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function CodeBlockShortcutBadge({\n shortcutKeys = CODE_BLOCK_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling code block in a Tiptap editor.\n *\n * For custom button implementations, use the `useCodeBlock` hook instead.\n */\nexport const CodeBlockButton = forwardRef<\n HTMLButtonElement,\n CodeBlockButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useCodeBlock({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n disabled={!canToggle}\n data-disabled={!canToggle}\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"Code Block\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <CodeBlockShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nCodeBlockButton.displayName = \"CodeBlockButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CodeBlockIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.70711 2.29289C7.09763 2.68342 7.09763 3.31658 6.70711 3.70711L4.41421 6L6.70711 8.29289C7.09763 8.68342 7.09763 9.31658 6.70711 9.70711C6.31658 10.0976 5.68342 10.0976 5.29289 9.70711L2.29289 6.70711C1.90237 6.31658 1.90237 5.68342 2.29289 5.29289L5.29289 2.29289C5.68342 1.90237 6.31658 1.90237 6.70711 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.2929 2.29289C10.6834 1.90237 11.3166 1.90237 11.7071 2.29289L14.7071 5.29289C15.0976 5.68342 15.0976 6.31658 14.7071 6.70711L11.7071 9.70711C11.3166 10.0976 10.6834 10.0976 10.2929 9.70711C9.90237 9.31658 9.90237 8.68342 10.2929 8.29289L12.5858 6L10.2929 3.70711C9.90237 3.31658 9.90237 2.68342 10.2929 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17 4C17 3.44772 17.4477 3 18 3H19C20.6569 3 22 4.34315 22 6V18C22 19.6569 20.6569 21 19 21H5C3.34315 21 2 19.6569 2 18V12C2 11.4477 2.44772 11 3 11C3.55228 11 4 11.4477 4 12V18C4 18.5523 4.44772 19 5 19H19C19.5523 19 20 18.5523 20 18V6C20 5.44772 19.5523 5 19 5H18C17.4477 5 17 4.55228 17 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCodeBlockIcon.displayName = \"CodeBlockIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { CodeBlockIcon } from \"@/components/tiptap-icons/code-block-icon\"\n\nexport const CODE_BLOCK_SHORTCUT_KEY = \"mod+alt+c\"\n\n/**\n * Configuration for the code block functionality\n */\nexport interface UseCodeBlockConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when code block is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful code block toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if code block can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"codeBlock\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleNode(\"codeBlock\", \"paragraph\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can toggle code block directly on the selection,\n // or we can clear formatting/nodes to arrive at a code block.\n return (\n editor.can().toggleNode(\"codeBlock\", \"paragraph\") ||\n editor.can().clearNodes()\n )\n}\n\n/**\n * Toggles code block in the editor\n */\nexport function toggleCodeBlock(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggle(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"codeBlock\")\n ? chain.setNode(\"paragraph\")\n : chain.toggleNode(\"codeBlock\", \"paragraph\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the code block button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"codeBlock\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggle(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides code block functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleCodeBlockButton() {\n * const { isVisible, isActive, handleToggle } = useCodeBlock()\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * Code Block\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedCodeBlockButton() {\n * const { isVisible, isActive, handleToggle, label } = useCodeBlock({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Code block toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Code Block\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useCodeBlock(config?: UseCodeBlockConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor)\n const isActive = editor?.isActive(\"codeBlock\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleCodeBlock(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: \"Code Block\",\n shortcutKeys: CODE_BLOCK_SHORTCUT_KEY,\n Icon: CodeBlockIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BanIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.43471 4.01458C4.34773 4.06032 4.26607 4.11977 4.19292 4.19292C4.11977 4.26607 4.06032 4.34773 4.01458 4.43471C2.14611 6.40628 1 9.0693 1 12C1 18.0751 5.92487 23 12 23C14.9306 23 17.5936 21.854 19.5651 19.9856C19.6522 19.9398 19.7339 19.8803 19.8071 19.8071C19.8803 19.7339 19.9398 19.6522 19.9856 19.5651C21.854 17.5936 23 14.9306 23 12C23 5.92487 18.0751 1 12 1C9.0693 1 6.40628 2.14611 4.43471 4.01458ZM6.38231 4.9681C7.92199 3.73647 9.87499 3 12 3C16.9706 3 21 7.02944 21 12C21 14.125 20.2635 16.078 19.0319 17.6177L6.38231 4.9681ZM17.6177 19.0319C16.078 20.2635 14.125 21 12 21C7.02944 21 3 16.9706 3 12C3 9.87499 3.73647 7.92199 4.9681 6.38231L17.6177 19.0319Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBanIcon.displayName = \"BanIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HighlighterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.7072 4.70711C15.0977 4.31658 15.0977 3.68342 14.7072 3.29289C14.3167 2.90237 13.6835 2.90237 13.293 3.29289L8.69294 7.89286L8.68594 7.9C8.13626 8.46079 7.82837 9.21474 7.82837 10C7.82837 10.2306 7.85491 10.4584 7.90631 10.6795L2.29289 16.2929C2.10536 16.4804 2 16.7348 2 17V20C2 20.5523 2.44772 21 3 21H12C12.2652 21 12.5196 20.8946 12.7071 20.7071L15.3205 18.0937C15.5416 18.1452 15.7695 18.1717 16.0001 18.1717C16.7853 18.1717 17.5393 17.8639 18.1001 17.3142L22.7072 12.7071C23.0977 12.3166 23.0977 11.6834 22.7072 11.2929C22.3167 10.9024 21.6835 10.9024 21.293 11.2929L16.6971 15.8887C16.5105 16.0702 16.2605 16.1717 16.0001 16.1717C15.7397 16.1717 15.4897 16.0702 15.303 15.8887L10.1113 10.697C9.92992 10.5104 9.82837 10.2604 9.82837 10C9.82837 9.73963 9.92992 9.48958 10.1113 9.30297L14.7072 4.70711ZM13.5858 17L9.00004 12.4142L4 17.4142V19H11.5858L13.5858 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHighlighterIcon.displayName = \"HighlighterIcon\"\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/popover/popover.scss\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align={align}\n sideOffset={sideOffset}\n className={cn(\"tiptap-popover\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","import { forwardRef, useCallback, useMemo } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseColorHighlightConfig } from \"@/components/tiptap-ui/color-highlight-button\"\nimport {\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n useColorHighlight,\n} from \"@/components/tiptap-ui/color-highlight-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\n// --- Styles ---\nimport \"@/components/tiptap-ui/color-highlight-button/color-highlight-button.scss\"\n\nexport interface ColorHighlightButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseColorHighlightConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ColorHighlightShortcutBadge({\n shortcutKeys = COLOR_HIGHLIGHT_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for applying color highlights in a Tiptap editor.\n *\n * Supports two highlighting modes:\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n *\n * For custom button implementations, use the `useColorHighlight` hook instead.\n *\n * @example\n * ```tsx\n * // Mark-based highlighting (default)\n * <ColorHighlightButton highlightColor=\"yellow\" />\n *\n * // Node-based background coloring\n * <ColorHighlightButton\n * highlightColor=\"var(--tt-color-highlight-blue)\"\n * mode=\"node\"\n * />\n *\n * // With custom callback\n * <ColorHighlightButton\n * highlightColor=\"red\"\n * mode=\"mark\"\n * onApplied={({ color, mode }) => console.log(`Applied ${color} in ${mode} mode`)}\n * />\n * ```\n */\nexport const ColorHighlightButton = forwardRef<\n HTMLButtonElement,\n ColorHighlightButtonProps\n>(\n (\n {\n editor: providedEditor,\n highlightColor,\n text,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n showShortcut = false,\n onClick,\n children,\n style,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canColorHighlight,\n isActive,\n handleColorHighlight,\n label,\n shortcutKeys,\n } = useColorHighlight({\n editor,\n highlightColor,\n label: text || `Toggle highlight (${highlightColor})`,\n hideWhenUnavailable,\n mode,\n onApplied,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleColorHighlight()\n },\n [handleColorHighlight, onClick]\n )\n\n const buttonStyle = useMemo(\n () =>\n ({\n ...style,\n \"--highlight-color\": highlightColor,\n }) as React.CSSProperties,\n [highlightColor, style]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canColorHighlight}\n data-disabled={!canColorHighlight}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n style={buttonStyle}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <span\n className=\"tiptap-button-highlight\"\n style={\n { \"--highlight-color\": highlightColor } as React.CSSProperties\n }\n />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ColorHighlightShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nColorHighlightButton.displayName = \"ColorHighlightButton\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n isExtensionAvailable,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HighlighterIcon } from \"@/components/tiptap-icons/highlighter-icon\"\n\nexport const COLOR_HIGHLIGHT_SHORTCUT_KEY = \"mod+shift+h\"\nexport const HIGHLIGHT_COLORS = [\n {\n label: \"Default background\",\n value: \"var(--tt-bg-color)\",\n border: \"var(--tt-bg-color-contrast)\",\n },\n {\n label: \"Gray background\",\n value: \"var(--tt-color-highlight-gray)\",\n border: \"var(--tt-color-highlight-gray-contrast)\",\n },\n {\n label: \"Brown background\",\n value: \"var(--tt-color-highlight-brown)\",\n border: \"var(--tt-color-highlight-brown-contrast)\",\n },\n {\n label: \"Orange background\",\n value: \"var(--tt-color-highlight-orange)\",\n border: \"var(--tt-color-highlight-orange-contrast)\",\n },\n {\n label: \"Yellow background\",\n value: \"var(--tt-color-highlight-yellow)\",\n border: \"var(--tt-color-highlight-yellow-contrast)\",\n },\n {\n label: \"Green background\",\n value: \"var(--tt-color-highlight-green)\",\n border: \"var(--tt-color-highlight-green-contrast)\",\n },\n {\n label: \"Blue background\",\n value: \"var(--tt-color-highlight-blue)\",\n border: \"var(--tt-color-highlight-blue-contrast)\",\n },\n {\n label: \"Purple background\",\n value: \"var(--tt-color-highlight-purple)\",\n border: \"var(--tt-color-highlight-purple-contrast)\",\n },\n {\n label: \"Pink background\",\n value: \"var(--tt-color-highlight-pink)\",\n border: \"var(--tt-color-highlight-pink-contrast)\",\n },\n {\n label: \"Red background\",\n value: \"var(--tt-color-highlight-red)\",\n border: \"var(--tt-color-highlight-red-contrast)\",\n },\n]\nexport type HighlightColor = (typeof HIGHLIGHT_COLORS)[number]\n\nexport type HighlightMode = \"mark\" | \"node\"\n\n/**\n * Configuration for the color highlight functionality\n */\nexport interface UseColorHighlightConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The color to apply when toggling the highlight.\n */\n highlightColor?: string\n /**\n * Optional label to display alongside the icon.\n */\n label?: string\n /**\n * Whether the button should hide when the mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * The highlighting mode to use.\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n * @default \"mark\"\n */\n mode?: HighlightMode\n /**\n * Called when the highlight is applied.\n */\n onApplied?: ({\n color,\n label,\n mode,\n }: {\n color: string\n label: string\n mode: HighlightMode\n }) => void\n}\n\nexport function pickHighlightColorsByValue(values: string[]) {\n const colorMap = new Map(\n HIGHLIGHT_COLORS.map((color) => [color.value, color])\n )\n return values\n .map((value) => colorMap.get(value))\n .filter((color): color is (typeof HIGHLIGHT_COLORS)[number] => !!color)\n}\n\n/**\n * Checks if highlight can be applied based on the mode and current editor state\n */\nexport function canColorHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (\n !isMarkInSchema(\"highlight\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n return editor.can().setMark(\"highlight\")\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n\n try {\n return editor.can().toggleNodeBackgroundColor(\"test\")\n } catch {\n return false\n }\n }\n}\n\n/**\n * Checks if highlight is currently active\n */\nexport function isColorHighlightActive(\n editor: Editor | null,\n highlightColor?: string,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n return highlightColor\n ? editor.isActive(\"highlight\", { color: highlightColor })\n : editor.isActive(\"highlight\")\n } else {\n if (!highlightColor) return false\n\n try {\n const { state } = editor\n const { selection } = state\n\n const $pos = selection.$anchor\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n if (node && node.attrs?.backgroundColor === highlightColor) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n }\n}\n\n/**\n * Removes highlight based on the mode\n */\nexport function removeHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canColorHighlight(editor, mode)) return false\n\n if (mode === \"mark\") {\n return editor.chain().focus().unsetMark(\"highlight\").run()\n } else {\n return editor.chain().focus().unsetNodeBackgroundColor().run()\n }\n}\n\n/**\n * Determines if the highlight button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n mode: HighlightMode\n}): boolean {\n const { editor, hideWhenUnavailable, mode } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (!isMarkInSchema(\"highlight\", editor)) return false\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canColorHighlight(editor, mode)\n }\n\n return true\n}\n\nexport function useColorHighlight(config: UseColorHighlightConfig) {\n const {\n editor: providedEditor,\n label,\n highlightColor,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canColorHighlightState = canColorHighlight(editor, mode)\n const isActive = isColorHighlightActive(editor, highlightColor, mode)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, mode }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, mode])\n\n const handleColorHighlight = useCallback(() => {\n if (!editor || !canColorHighlightState || !highlightColor || !label)\n return false\n\n if (mode === \"mark\") {\n if (editor.state.storedMarks) {\n const highlightMarkType = editor.schema.marks.highlight\n if (highlightMarkType) {\n editor.view.dispatch(\n editor.state.tr.removeStoredMark(highlightMarkType)\n )\n }\n }\n\n setTimeout(() => {\n const success = editor\n .chain()\n .focus()\n .toggleMark(\"highlight\", { color: highlightColor })\n .run()\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }, 0)\n\n return true\n } else {\n const success = editor\n .chain()\n .focus()\n .toggleNodeBackgroundColor(highlightColor)\n .run()\n\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }\n }, [canColorHighlightState, highlightColor, editor, label, onApplied, mode])\n\n const handleRemoveHighlight = useCallback(() => {\n const success = removeHighlight(editor, mode)\n if (success) {\n onApplied?.({ color: \"\", label: \"Remove highlight\", mode })\n }\n return success\n }, [editor, onApplied, mode])\n\n useHotkeys(\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleColorHighlight()\n },\n {\n enabled: isVisible && canColorHighlightState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleColorHighlight,\n handleRemoveHighlight,\n canColorHighlight: canColorHighlightState,\n label: label || `Highlight`,\n shortcutKeys: COLOR_HIGHLIGHT_SHORTCUT_KEY,\n Icon: HighlighterIcon,\n mode,\n }\n}\n","import { forwardRef, useMemo, useRef, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useMenuNavigation } from \"@/hooks/use-menu-navigation\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BanIcon } from \"@/components/tiptap-icons/ban-icon\"\nimport { HighlighterIcon } from \"@/components/tiptap-icons/highlighter-icon\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"@/components/tiptap-ui-primitive/popover\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"@/components/tiptap-ui-primitive/card\"\n\n// --- Tiptap UI ---\nimport type {\n HighlightColor,\n UseColorHighlightConfig,\n} from \"@/components/tiptap-ui/color-highlight-button\"\nimport {\n ColorHighlightButton,\n pickHighlightColorsByValue,\n useColorHighlight,\n} from \"@/components/tiptap-ui/color-highlight-button\"\n\nexport interface ColorHighlightPopoverContentProps {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n /**\n * Tooltip for remove highlight button\n */\n removeTooltip?: string\n}\n\nexport interface ColorHighlightPopoverProps\n extends Omit<ButtonProps, \"type\">,\n Pick<\n UseColorHighlightConfig,\n \"editor\" | \"hideWhenUnavailable\" | \"onApplied\"\n > {\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n /**\n * Tooltip for remove highlight button\n */\n removeTooltip?: string\n}\n\nexport const ColorHighlightPopoverButton = forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Highlight text\"\n tooltip=\"Highlight\"\n ref={ref}\n {...props}\n >\n {children ?? <HighlighterIcon className=\"tiptap-button-icon\" />}\n </Button>\n))\n\nColorHighlightPopoverButton.displayName = \"ColorHighlightPopoverButton\"\n\nexport function ColorHighlightPopoverContent({\n editor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n removeTooltip = \"Remove highlight\",\n}: ColorHighlightPopoverContentProps) {\n const { handleRemoveHighlight } = useColorHighlight({ editor })\n const isMobile = useIsBreakpoint()\n const containerRef = useRef<HTMLDivElement>(null)\n\n const menuItems = useMemo(\n () => [...colors, { label: removeTooltip, value: \"none\" }],\n [colors, removeTooltip]\n )\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n orientation: \"both\",\n onSelect: (item) => {\n if (!containerRef.current) return false\n const highlightedElement = containerRef.current.querySelector(\n '[data-highlighted=\"true\"]'\n ) as HTMLElement\n if (highlightedElement) highlightedElement.click()\n if (item.value === \"none\") handleRemoveHighlight()\n return true\n },\n autoSelectFirstItem: false,\n })\n\n return (\n <Card\n ref={containerRef}\n tabIndex={0}\n style={isMobile ? { boxShadow: \"none\", border: 0 } : {}}\n >\n <CardBody style={isMobile ? { padding: 0 } : {}}>\n <CardItemGroup orientation=\"horizontal\">\n <ButtonGroup orientation=\"horizontal\">\n {colors.map((color, index) => (\n <ColorHighlightButton\n key={color.value}\n editor={editor}\n highlightColor={color.value}\n tooltip={color.label}\n aria-label={`${color.label} highlight color`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n />\n ))}\n </ButtonGroup>\n <Separator />\n <ButtonGroup orientation=\"horizontal\">\n <Button\n onClick={handleRemoveHighlight}\n aria-label={removeTooltip}\n tooltip={removeTooltip}\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n data-style=\"ghost\"\n data-highlighted={selectedIndex === colors.length}\n >\n <BanIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\nexport function ColorHighlightPopover({\n editor: providedEditor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n hideWhenUnavailable = false,\n onApplied,\n removeTooltip,\n ...props\n}: ColorHighlightPopoverProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n const { isVisible, canColorHighlight, isActive, label, Icon } =\n useColorHighlight({\n editor,\n hideWhenUnavailable,\n onApplied,\n })\n\n if (!isVisible) return null\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <ColorHighlightPopoverButton\n disabled={!canColorHighlight}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canColorHighlight}\n aria-pressed={isActive}\n aria-label={label}\n tooltip={label}\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n </ColorHighlightPopoverButton>\n </PopoverTrigger>\n <PopoverContent aria-label=\"Highlight colors\">\n <ColorHighlightPopoverContent editor={editor} colors={colors} removeTooltip={removeTooltip} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default ColorHighlightPopover\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CornerDownLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M21 4C21 3.44772 20.5523 3 20 3C19.4477 3 19 3.44772 19 4V11C19 11.7956 18.6839 12.5587 18.1213 13.1213C17.5587 13.6839 16.7956 14 16 14H6.41421L9.70711 10.7071C10.0976 10.3166 10.0976 9.68342 9.70711 9.29289C9.31658 8.90237 8.68342 8.90237 8.29289 9.29289L3.29289 14.2929C2.90237 14.6834 2.90237 15.3166 3.29289 15.7071L8.29289 20.7071C8.68342 21.0976 9.31658 21.0976 9.70711 20.7071C10.0976 20.3166 10.0976 19.6834 9.70711 19.2929L6.41421 16H16C17.3261 16 18.5979 15.4732 19.5355 14.5355C20.4732 13.5979 21 12.3261 21 11V4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCornerDownLeftIcon.displayName = \"CornerDownLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ExternalLinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14 3C14 2.44772 14.4477 2 15 2H21C21.5523 2 22 2.44772 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L10.7071 14.7071C10.3166 15.0976 9.68342 15.0976 9.29289 14.7071C8.90237 14.3166 8.90237 13.6834 9.29289 13.2929L18.5858 4H15C14.4477 4 14 3.55228 14 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.29289 7.29289C4.48043 7.10536 4.73478 7 5 7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H5C4.20435 5 3.44129 5.31607 2.87868 5.87868C2.31607 6.44129 2 7.20435 2 8V19C2 19.7957 2.31607 20.5587 2.87868 21.1213C3.44129 21.6839 4.20435 22 5 22H16C16.7957 22 17.5587 21.6839 18.1213 21.1213C18.6839 20.5587 19 19.7957 19 19V13C19 12.4477 18.5523 12 18 12C17.4477 12 17 12.4477 17 13V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V8C4 7.73478 4.10536 7.48043 4.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nExternalLinkIcon.displayName = \"ExternalLinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const LinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M16.9958 1.06669C15.4226 1.05302 13.907 1.65779 12.7753 2.75074L12.765 2.76086L11.045 4.47086C10.6534 4.86024 10.6515 5.49341 11.0409 5.88507C11.4303 6.27673 12.0634 6.27858 12.4551 5.88919L14.1697 4.18456C14.9236 3.45893 15.9319 3.05752 16.9784 3.06662C18.0272 3.07573 19.0304 3.49641 19.772 4.23804C20.5137 4.97967 20.9344 5.98292 20.9435 7.03171C20.9526 8.07776 20.5515 9.08563 19.8265 9.83941L16.833 12.8329C16.4274 13.2386 15.9393 13.5524 15.4019 13.7529C14.8645 13.9533 14.2903 14.0359 13.7181 13.9949C13.146 13.9539 12.5894 13.7904 12.0861 13.5154C11.5827 13.2404 11.1444 12.8604 10.8008 12.401C10.47 11.9588 9.84333 11.8685 9.40108 12.1993C8.95883 12.5301 8.86849 13.1568 9.1993 13.599C9.71464 14.288 10.3721 14.858 11.1272 15.2705C11.8822 15.683 12.7171 15.9283 13.5753 15.9898C14.4334 16.0513 15.2948 15.9274 16.1009 15.6267C16.907 15.326 17.639 14.8555 18.2473 14.247L21.2472 11.2471L21.2593 11.2347C22.3523 10.1031 22.9571 8.58751 22.9434 7.01433C22.9297 5.44115 22.2987 3.93628 21.1863 2.82383C20.0738 1.71138 18.5689 1.08036 16.9958 1.06669Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10.4247 8.0102C9.56657 7.94874 8.70522 8.07256 7.89911 8.37326C7.09305 8.67395 6.36096 9.14458 5.75272 9.753L2.75285 12.7529L2.74067 12.7653C1.64772 13.8969 1.04295 15.4125 1.05662 16.9857C1.07029 18.5589 1.70131 20.0637 2.81376 21.1762C3.9262 22.2886 5.43108 22.9196 7.00426 22.9333C8.57744 22.947 10.0931 22.3422 11.2247 21.2493L11.2371 21.2371L12.9471 19.5271C13.3376 19.1366 13.3376 18.5034 12.9471 18.1129C12.5565 17.7223 11.9234 17.7223 11.5328 18.1129L9.82932 19.8164C9.07555 20.5414 8.06768 20.9425 7.02164 20.9334C5.97285 20.9243 4.9696 20.5036 4.22797 19.762C3.48634 19.0203 3.06566 18.0171 3.05655 16.9683C3.04746 15.9222 3.44851 14.9144 4.17355 14.1606L7.16719 11.167C7.5727 10.7613 8.06071 10.4476 8.59811 10.2471C9.13552 10.0467 9.70976 9.96412 10.2819 10.0051C10.854 10.0461 11.4106 10.2096 11.9139 10.4846C12.4173 10.7596 12.8556 11.1397 13.1992 11.599C13.53 12.0412 14.1567 12.1316 14.5989 11.8007C15.0412 11.4699 15.1315 10.8433 14.8007 10.401C14.2854 9.71205 13.6279 9.14198 12.8729 8.72948C12.1178 8.31697 11.2829 8.07166 10.4247 8.0102Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nLinkIcon.displayName = \"LinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TrashIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 5V4C7 3.17477 7.40255 2.43324 7.91789 1.91789C8.43324 1.40255 9.17477 1 10 1H14C14.8252 1 15.5668 1.40255 16.0821 1.91789C16.5975 2.43324 17 3.17477 17 4V5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H20V20C20 20.8252 19.5975 21.5668 19.0821 22.0821C18.5668 22.5975 17.8252 23 17 23H7C6.17477 23 5.43324 22.5975 4.91789 22.0821C4.40255 21.5668 4 20.8252 4 20V7H3C2.44772 7 2 6.55228 2 6C2 5.44772 2.44772 5 3 5H7ZM9 4C9 3.82523 9.09745 3.56676 9.33211 3.33211C9.56676 3.09745 9.82523 3 10 3H14C14.1748 3 14.4332 3.09745 14.6679 3.33211C14.9025 3.56676 15 3.82523 15 4V5H9V4ZM6 7V20C6 20.1748 6.09745 20.4332 6.33211 20.6679C6.56676 20.9025 6.82523 21 7 21H17C17.1748 21 17.4332 20.9025 17.6679 20.6679C17.9025 20.4332 18 20.1748 18 20V7H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTrashIcon.displayName = \"TrashIcon\"\n","import { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/input/input.scss\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input type={type} className={cn(\"tiptap-input\", className)} {...props} />\n )\n}\n\nfunction InputGroup({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"tiptap-input-group\", className)} {...props}>\n {children}\n </div>\n )\n}\n\nexport { Input, InputGroup }\n","\"use client\"\n\nimport { forwardRef, useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { CornerDownLeftIcon } from \"@/components/tiptap-icons/corner-down-left-icon\"\nimport { ExternalLinkIcon } from \"@/components/tiptap-icons/external-link-icon\"\nimport { LinkIcon } from \"@/components/tiptap-icons/link-icon\"\nimport { TrashIcon } from \"@/components/tiptap-icons/trash-icon\"\n\n// --- Tiptap UI ---\nimport type { UseLinkPopoverConfig } from \"@/components/tiptap-ui/link-popover\"\nimport { useLinkPopover } from \"@/components/tiptap-ui/link-popover\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/tiptap-ui-primitive/popover\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"@/components/tiptap-ui-primitive/card\"\nimport { Input, InputGroup } from \"@/components/tiptap-ui-primitive/input\"\n\nexport interface LinkMainProps {\n /**\n * The URL to set for the link.\n */\n url: string\n /**\n * Function to update the URL state.\n */\n setUrl: React.Dispatch<React.SetStateAction<string | null>>\n /**\n * Function to set the link in the editor.\n */\n setLink: () => void\n /**\n * Function to remove the link from the editor.\n */\n removeLink: () => void\n /**\n * Function to open the link.\n */\n openLink: () => void\n /**\n * Whether the link is currently active in the editor.\n */\n isActive: boolean\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Tooltip for apply button\n */\n applyTooltip?: string\n /**\n * Tooltip for open link button\n */\n openTooltip?: string\n /**\n * Tooltip for remove link button\n */\n removeTooltip?: string\n}\n\nexport interface LinkPopoverProps\n extends Omit<ButtonProps, \"type\">,\n UseLinkPopoverConfig {\n /**\n * Callback for when the popover opens or closes.\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to automatically open the popover when a link is active.\n * @default true\n */\n autoOpenOnLinkActive?: boolean\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Tooltip for apply button\n */\n applyTooltip?: string\n /**\n * Tooltip for open link button\n */\n openTooltip?: string\n /**\n * Tooltip for remove link button\n */\n removeTooltip?: string\n}\n\n/**\n * Link button component for triggering the link popover\n */\nexport const LinkButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Link\"\n tooltip=\"Link\"\n ref={ref}\n {...props}\n >\n {children || <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n )\n }\n)\n\nLinkButton.displayName = \"LinkButton\"\n\n/**\n * Main content component for the link popover\n */\nconst LinkMain: React.FC<LinkMainProps> = ({\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n isActive,\n placeholder = \"Paste a link...\",\n applyTooltip = \"Apply link\",\n openTooltip = \"Open in new window\",\n removeTooltip = \"Remove link\",\n}) => {\n const isMobile = useIsBreakpoint()\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault()\n setLink()\n }\n }\n\n return (\n <Card\n style={{\n ...(isMobile ? { boxShadow: \"none\", border: 0 } : {}),\n }}\n >\n <CardBody\n style={{\n ...(isMobile ? { padding: 0 } : {}),\n }}\n >\n <CardItemGroup orientation=\"horizontal\">\n <InputGroup>\n <Input\n type=\"url\"\n placeholder={placeholder}\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n </InputGroup>\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={setLink}\n title={applyTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n\n <Separator />\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={openLink}\n title={openTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n\n <Button\n type=\"button\"\n onClick={removeLink}\n title={removeTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\n/**\n * Link content component for standalone use\n */\nexport const LinkContent: React.FC<{\n editor?: Editor | null\n}> = ({ editor }) => {\n const linkPopover = useLinkPopover({\n editor,\n })\n\n return <LinkMain {...linkPopover} />\n}\n\n/**\n * Link popover component for Tiptap editors.\n *\n * For custom popover implementations, use the `useLinkPopover` hook instead.\n */\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n (\n {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n onOpenChange,\n autoOpenOnLinkActive = true,\n onClick,\n children,\n placeholder,\n applyTooltip,\n openTooltip,\n removeTooltip,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const {\n isVisible,\n canSet,\n isActive,\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n label,\n Icon,\n } = useLinkPopover({\n editor,\n hideWhenUnavailable,\n onSetLink,\n })\n\n const handleOnOpenChange = useCallback(\n (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n onOpenChange?.(nextIsOpen)\n },\n [onOpenChange]\n )\n\n const handleSetLink = useCallback(() => {\n setLink()\n setIsOpen(false)\n }, [setLink])\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n setIsOpen(!isOpen)\n },\n [onClick, isOpen]\n )\n\n useEffect(() => {\n if (autoOpenOnLinkActive && isActive) {\n setIsOpen(true)\n }\n }, [autoOpenOnLinkActive, isActive])\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOnOpenChange}>\n <PopoverTrigger asChild>\n <LinkButton\n disabled={!canSet}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canSet}\n aria-label={label}\n aria-pressed={isActive}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? <Icon className=\"tiptap-button-icon\" />}\n </LinkButton>\n </PopoverTrigger>\n\n <PopoverContent>\n <LinkMain\n url={url}\n setUrl={setUrl}\n setLink={handleSetLink}\n removeLink={removeLink}\n openLink={openLink}\n isActive={isActive}\n placeholder={placeholder}\n applyTooltip={applyTooltip}\n openTooltip={openTooltip}\n removeTooltip={removeTooltip}\n />\n </PopoverContent>\n </Popover>\n )\n }\n)\n\nLinkPopover.displayName = \"LinkPopover\"\n\nexport default LinkPopover\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { LinkIcon } from \"@/components/tiptap-icons/link-icon\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n sanitizeUrl,\n} from \"@/lib/tiptap-utils\"\n\n/**\n * Configuration for the link popover functionality\n */\nexport interface UseLinkPopoverConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the link popover when not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Configuration for the link handler functionality\n */\nexport interface LinkHandlerProps {\n /**\n * The Tiptap editor instance.\n */\n editor: Editor | null\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Checks if a link can be set in the current editor state\n */\nexport function canSetLink(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n // The third argument 'true' checks whether the current selection is inside an image caption, and prevents setting a link there\n // If the selection is inside an image caption, we can't set a link\n if (isNodeTypeSelected(editor, [\"image\"], true)) return false\n return editor.can().setMark(\"link\")\n}\n\n/**\n * Checks if a link is currently active in the editor\n */\nexport function isLinkActive(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"link\")\n}\n\n/**\n * Determines if the link button should be shown\n */\nexport function shouldShowLinkButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n const linkInSchema = isMarkInSchema(\"link\", editor)\n\n if (!linkInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetLink(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook for handling link operations in a Tiptap editor\n */\nexport function useLinkHandler(props: LinkHandlerProps) {\n const { editor, onSetLink } = props\n const [url, setUrl] = useState<string | null>(null)\n\n useEffect(() => {\n if (!editor) return\n\n // Get URL immediately on mount\n const { href } = editor.getAttributes(\"link\")\n\n if (isLinkActive(editor) && url === null) {\n setUrl(href || \"\")\n }\n }, [editor, url])\n\n useEffect(() => {\n if (!editor) return\n\n const updateLinkState = () => {\n const { href } = editor.getAttributes(\"link\")\n setUrl(href || \"\")\n }\n\n editor.on(\"selectionUpdate\", updateLinkState)\n return () => {\n editor.off(\"selectionUpdate\", updateLinkState)\n }\n }, [editor])\n\n const setLink = useCallback(() => {\n if (!url || !editor) return\n\n const { selection } = editor.state\n const isEmpty = selection.empty\n\n let chain = editor.chain().focus()\n\n chain = chain.extendMarkRange(\"link\").setLink({ href: url })\n\n if (isEmpty) {\n chain = chain.insertContent({ type: \"text\", text: url })\n }\n\n chain.run()\n\n setUrl(null)\n\n onSetLink?.()\n }, [editor, onSetLink, url])\n\n const removeLink = useCallback(() => {\n if (!editor) return\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .unsetLink()\n .setMeta(\"preventAutolink\", true)\n .run()\n setUrl(\"\")\n }, [editor])\n\n const openLink = useCallback(\n (target: string = \"_blank\", features: string = \"noopener,noreferrer\") => {\n if (!url) return\n\n const safeUrl = sanitizeUrl(url, window.location.href)\n if (safeUrl !== \"#\") {\n window.open(safeUrl, target, features)\n }\n },\n [url]\n )\n\n return {\n url: url || \"\",\n setUrl,\n setLink,\n removeLink,\n openLink,\n }\n}\n\n/**\n * Custom hook for link popover state management\n */\nexport function useLinkState(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}) {\n const { editor, hideWhenUnavailable = false } = props\n\n const canSet = canSetLink(editor)\n const isActive = isLinkActive(editor)\n\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowLinkButton({\n editor,\n hideWhenUnavailable,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n return {\n isVisible,\n canSet,\n isActive,\n }\n}\n\n/**\n * Main hook that provides link popover functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover()\n *\n * if (!isVisible) return null\n *\n * return <button disabled={!canSet}>Link</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onSetLink: () => console.log('Link set!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * disabled={!canSet}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * {label}\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useLinkPopover(config?: UseLinkPopoverConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const { isVisible, canSet, isActive } = useLinkState({\n editor,\n hideWhenUnavailable,\n })\n\n const linkHandler = useLinkHandler({\n editor,\n onSetLink,\n })\n\n return {\n isVisible,\n canSet,\n isActive,\n label: \"Link\",\n Icon: LinkIcon,\n ...linkHandler,\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { Mark, UseMarkConfig } from \"@/components/tiptap-ui/mark-button\"\nimport { MARK_SHORTCUT_KEYS, useMark } from \"@/components/tiptap-ui/mark-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface MarkButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseMarkConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function MarkShortcutBadge({\n type,\n shortcutKeys = MARK_SHORTCUT_KEYS[type],\n}: {\n type: Mark\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling marks in a Tiptap editor.\n *\n * For custom button implementations, use the `useMark` hook instead.\n */\nexport const MarkButton = forwardRef<HTMLButtonElement, MarkButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleMark,\n label,\n canToggle,\n isActive,\n Icon,\n shortcutKeys,\n } = useMark({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleMark()\n },\n [handleMark, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canToggle}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canToggle}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <MarkShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nMarkButton.displayName = \"MarkButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BoldIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 2.5C5.17157 2.5 4.5 3.17157 4.5 4V20C4.5 20.8284 5.17157 21.5 6 21.5H15C16.4587 21.5 17.8576 20.9205 18.8891 19.8891C19.9205 18.8576 20.5 17.4587 20.5 16C20.5 14.5413 19.9205 13.1424 18.8891 12.1109C18.6781 11.9 18.4518 11.7079 18.2128 11.5359C19.041 10.5492 19.5 9.29829 19.5 8C19.5 6.54131 18.9205 5.14236 17.8891 4.11091C16.8576 3.07946 15.4587 2.5 14 2.5H6ZM14 10.5C14.663 10.5 15.2989 10.2366 15.7678 9.76777C16.2366 9.29893 16.5 8.66304 16.5 8C16.5 7.33696 16.2366 6.70107 15.7678 6.23223C15.2989 5.76339 14.663 5.5 14 5.5H7.5V10.5H14ZM7.5 18.5V13.5H15C15.663 13.5 16.2989 13.7634 16.7678 14.2322C17.2366 14.7011 17.5 15.337 17.5 16C17.5 16.663 17.2366 17.2989 16.7678 17.7678C16.2989 18.2366 15.663 18.5 15 18.5H7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBoldIcon.displayName = \"BoldIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Code2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.4545 4.2983C15.6192 3.77115 15.3254 3.21028 14.7983 3.04554C14.2712 2.88081 13.7103 3.1746 13.5455 3.70175L8.54554 19.7017C8.38081 20.2289 8.6746 20.7898 9.20175 20.9545C9.72889 21.1192 10.2898 20.8254 10.4545 20.2983L15.4545 4.2983Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6.70711 7.29289C7.09763 7.68342 7.09763 8.31658 6.70711 8.70711L3.41421 12L6.70711 15.2929C7.09763 15.6834 7.09763 16.3166 6.70711 16.7071C6.31658 17.0976 5.68342 17.0976 5.29289 16.7071L1.29289 12.7071C0.902369 12.3166 0.902369 11.6834 1.29289 11.2929L5.29289 7.29289C5.68342 6.90237 6.31658 6.90237 6.70711 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17.2929 7.29289C17.6834 6.90237 18.3166 6.90237 18.7071 7.29289L22.7071 11.2929C23.0976 11.6834 23.0976 12.3166 22.7071 12.7071L18.7071 16.7071C18.3166 17.0976 17.6834 17.0976 17.2929 16.7071C16.9024 16.3166 16.9024 15.6834 17.2929 15.2929L20.5858 12L17.2929 8.70711C16.9024 8.31658 16.9024 7.68342 17.2929 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCode2Icon.displayName = \"Code2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ItalicIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.0222 3H19C19.5523 3 20 3.44772 20 4C20 4.55228 19.5523 5 19 5H15.693L10.443 19H14C14.5523 19 15 19.4477 15 20C15 20.5523 14.5523 21 14 21H9.02418C9.00802 21.0004 8.99181 21.0004 8.97557 21H5C4.44772 21 4 20.5523 4 20C4 19.4477 4.44772 19 5 19H8.30704L13.557 5H10C9.44772 5 9 4.55228 9 4C9 3.44772 9.44772 3 10 3H14.9782C14.9928 2.99968 15.0075 2.99967 15.0222 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nItalicIcon.displayName = \"ItalicIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const StrikeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.00039 3H16.0001C16.5524 3 17.0001 3.44772 17.0001 4C17.0001 4.55229 16.5524 5 16.0001 5H9.00011C8.68006 4.99983 8.36412 5.07648 8.07983 5.22349C7.79555 5.37051 7.55069 5.5836 7.36585 5.84487C7.181 6.10614 7.06155 6.40796 7.01754 6.72497C6.97352 7.04198 7.00623 7.36492 7.11292 7.66667C7.29701 8.18737 7.02414 8.75872 6.50344 8.94281C5.98274 9.1269 5.4114 8.85403 5.2273 8.33333C5.01393 7.72984 4.94851 7.08396 5.03654 6.44994C5.12456 5.81592 5.36346 5.21229 5.73316 4.68974C6.10285 4.1672 6.59256 3.74101 7.16113 3.44698C7.72955 3.15303 8.36047 2.99975 9.00039 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18 13H20C20.5523 13 21 12.5523 21 12C21 11.4477 20.5523 11 20 11H4C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H14C14.7956 13 15.5587 13.3161 16.1213 13.8787C16.6839 14.4413 17 15.2044 17 16C17 16.7956 16.6839 17.5587 16.1213 18.1213C15.5587 18.6839 14.7956 19 14 19H6C5.44772 19 5 19.4477 5 20C5 20.5523 5.44772 21 6 21H14C15.3261 21 16.5979 20.4732 17.5355 19.5355C18.4732 18.5979 19 17.3261 19 16C19 14.9119 18.6453 13.8604 18 13Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nStrikeIcon.displayName = \"StrikeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SubscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.4079 14.3995C18.0284 14.0487 18.7506 13.9217 19.4536 14.0397C20.1566 14.1578 20.7977 14.5138 21.2696 15.0481L21.2779 15.0574L21.2778 15.0575C21.7439 15.5988 22 16.2903 22 17C22 18.0823 21.3962 18.8401 20.7744 19.3404C20.194 19.8073 19.4858 20.141 18.9828 20.378C18.9638 20.387 18.9451 20.3958 18.9266 20.4045C18.4473 20.6306 18.2804 20.7817 18.1922 20.918C18.1773 20.9412 18.1619 20.9681 18.1467 21H21C21.5523 21 22 21.4477 22 22C22 22.5523 21.5523 23 21 23H17C16.4477 23 16 22.5523 16 22C16 21.1708 16.1176 20.4431 16.5128 19.832C16.9096 19.2184 17.4928 18.8695 18.0734 18.5956C18.6279 18.334 19.138 18.0901 19.5207 17.7821C19.8838 17.49 20 17.2477 20 17C20 16.7718 19.9176 16.5452 19.7663 16.3672C19.5983 16.1792 19.3712 16.0539 19.1224 16.0121C18.8722 15.9701 18.6152 16.015 18.3942 16.1394C18.1794 16.2628 18.0205 16.4549 17.9422 16.675C17.7572 17.1954 17.1854 17.4673 16.665 17.2822C16.1446 17.0972 15.8728 16.5254 16.0578 16.005C16.2993 15.3259 16.7797 14.7584 17.4039 14.4018L17.4079 14.3995L17.4079 14.3995Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSubscriptIcon.displayName = \"SubscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SuperscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.405 1.40657C18.0246 1.05456 18.7463 0.92634 19.4492 1.04344C20.1521 1.16054 20.7933 1.51583 21.2652 2.0497L21.2697 2.05469L21.2696 2.05471C21.7431 2.5975 22 3.28922 22 4.00203C22 5.08579 21.3952 5.84326 20.7727 6.34289C20.1966 6.80531 19.4941 7.13675 18.9941 7.37261C18.9714 7.38332 18.9491 7.39383 18.9273 7.40415C18.4487 7.63034 18.2814 7.78152 18.1927 7.91844C18.1778 7.94155 18.1625 7.96834 18.1473 8.00003H21C21.5523 8.00003 22 8.44774 22 9.00003C22 9.55231 21.5523 10 21 10H17C16.4477 10 16 9.55231 16 9.00003C16 8.17007 16.1183 7.44255 16.5138 6.83161C16.9107 6.21854 17.4934 5.86971 18.0728 5.59591C18.6281 5.33347 19.1376 5.09075 19.5208 4.78316C19.8838 4.49179 20 4.25026 20 4.00203C20 3.77192 19.9178 3.54865 19.7646 3.37182C19.5968 3.18324 19.3696 3.05774 19.1205 3.01625C18.8705 2.97459 18.6137 3.02017 18.3933 3.14533C18.1762 3.26898 18.0191 3.45826 17.9406 3.67557C17.7531 4.19504 17.18 4.46414 16.6605 4.27662C16.141 4.0891 15.8719 3.51596 16.0594 2.99649C16.303 2.3219 16.7817 1.76125 17.4045 1.40689L17.405 1.40657Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSuperscriptIcon.displayName = \"SuperscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const UnderlineIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 4C7 3.44772 6.55228 3 6 3C5.44772 3 5 3.44772 5 4V10C5 11.8565 5.7375 13.637 7.05025 14.9497C8.36301 16.2625 10.1435 17 12 17C13.8565 17 15.637 16.2625 16.9497 14.9497C18.2625 13.637 19 11.8565 19 10V4C19 3.44772 18.5523 3 18 3C17.4477 3 17 3.44772 17 4V10C17 11.3261 16.4732 12.5979 15.5355 13.5355C14.5979 14.4732 13.3261 15 12 15C10.6739 15 9.40215 14.4732 8.46447 13.5355C7.52678 12.5979 7 11.3261 7 10V4ZM4 19C3.44772 19 3 19.4477 3 20C3 20.5523 3.44772 21 4 21H20C20.5523 21 21 20.5523 21 20C21 19.4477 20.5523 19 20 19H4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUnderlineIcon.displayName = \"UnderlineIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isMarkInSchema, isNodeTypeSelected } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { BoldIcon } from \"@/components/tiptap-icons/bold-icon\"\nimport { Code2Icon } from \"@/components/tiptap-icons/code2-icon\"\nimport { ItalicIcon } from \"@/components/tiptap-icons/italic-icon\"\nimport { StrikeIcon } from \"@/components/tiptap-icons/strike-icon\"\nimport { SubscriptIcon } from \"@/components/tiptap-icons/subscript-icon\"\nimport { SuperscriptIcon } from \"@/components/tiptap-icons/superscript-icon\"\nimport { UnderlineIcon } from \"@/components/tiptap-icons/underline-icon\"\n\nexport type Mark =\n | \"bold\"\n | \"italic\"\n | \"strike\"\n | \"code\"\n | \"underline\"\n | \"superscript\"\n | \"subscript\"\n\n/**\n * Configuration for the mark functionality\n */\nexport interface UseMarkConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of mark to toggle\n */\n type: Mark\n /**\n * Whether the button should hide when mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful mark toggle.\n */\n onToggled?: () => void\n}\n\nexport const markIcons = {\n bold: BoldIcon,\n italic: ItalicIcon,\n underline: UnderlineIcon,\n strike: StrikeIcon,\n code: Code2Icon,\n superscript: SuperscriptIcon,\n subscript: SubscriptIcon,\n}\n\nexport const MARK_SHORTCUT_KEYS: Record<Mark, string> = {\n bold: \"mod+b\",\n italic: \"mod+i\",\n underline: \"mod+u\",\n strike: \"mod+shift+s\",\n code: \"mod+e\",\n superscript: \"mod+.\",\n subscript: \"mod+,\",\n}\n\n/**\n * Checks if a mark can be toggled in the current editor state\n */\nexport function canToggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n return editor.can().toggleMark(type)\n}\n\n/**\n * Checks if a mark is currently active\n */\nexport function isMarkActive(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(type)\n}\n\n/**\n * Toggles a mark in the editor\n */\nexport function toggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleMark(editor, type)) return false\n\n return editor.chain().focus().toggleMark(type).run()\n}\n\n/**\n * Determines if the mark button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: Mark\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleMark(editor, type)\n }\n\n return true\n}\n\n/**\n * Gets the formatted mark name\n */\nexport function getFormattedMarkName(type: Mark): string {\n return type.charAt(0).toUpperCase() + type.slice(1)\n}\n\n/**\n * Custom hook that provides mark functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleBoldButton() {\n * const { isVisible, handleMark } = useMark({ type: \"bold\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleMark}>Bold</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedItalicButton() {\n * const { isVisible, handleMark, label, isActive } = useMark({\n * editor: myEditor,\n * type: \"italic\",\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Mark toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleMark}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Italic\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useMark(config: UseMarkConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleMark(editor, type)\n const isActive = isMarkActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleMark = useCallback(() => {\n if (!editor) return false\n\n const success = toggleMark(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleMark,\n canToggle,\n label: getFormattedMarkName(type),\n shortcutKeys: MARK_SHORTCUT_KEYS[type],\n Icon: markIcons[type],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n TextAlign,\n UseTextAlignConfig,\n} from \"@/components/tiptap-ui/text-align-button\"\nimport {\n TEXT_ALIGN_SHORTCUT_KEYS,\n useTextAlign,\n} from \"@/components/tiptap-ui/text-align-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface TextAlignButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseTextAlignConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n /**\n * Optional custom icon component to render instead of the default.\n */\n icon?: React.MemoExoticComponent<IconComponent> | React.FC<IconProps>\n}\n\nexport function TextAlignShortcutBadge({\n align,\n shortcutKeys = TEXT_ALIGN_SHORTCUT_KEYS[align],\n}: {\n align: TextAlign\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for setting text alignment in a Tiptap editor.\n *\n * For custom button implementations, use the `useTextAlign` hook instead.\n */\nexport const TextAlignButton = forwardRef<\n HTMLButtonElement,\n TextAlignButtonProps\n>(\n (\n {\n editor: providedEditor,\n align,\n text,\n hideWhenUnavailable = false,\n onAligned,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleTextAlign,\n label,\n canAlign,\n isActive,\n Icon,\n shortcutKeys,\n } = useTextAlign({\n editor,\n align,\n hideWhenUnavailable,\n onAligned,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleTextAlign()\n },\n [handleTextAlign, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const RenderIcon = CustomIcon ?? Icon\n\n return (\n <Button\n type=\"button\"\n disabled={!canAlign}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canAlign}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <TextAlignShortcutBadge\n align={align}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nTextAlignButton.displayName = \"TextAlignButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignCenterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 12C6 11.4477 6.44772 11 7 11H17C17.5523 11 18 11.4477 18 12C18 12.5523 17.5523 13 17 13H7C6.44772 13 6 12.5523 6 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 18C4 17.4477 4.44772 17 5 17H19C19.5523 17 20 17.4477 20 18C20 18.5523 19.5523 19 19 19H5C4.44772 19 4 18.5523 4 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignCenterIcon.displayName = \"AlignCenterIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignJustifyIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignJustifyIcon.displayName = \"AlignJustifyIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H15C15.5523 11 16 11.4477 16 12C16 12.5523 15.5523 13 15 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H17C17.5523 17 18 17.4477 18 18C18 18.5523 17.5523 19 17 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignLeftIcon.displayName = \"AlignLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignRightIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 18C6 17.4477 6.44772 17 7 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H7C6.44772 19 6 18.5523 6 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignRightIcon.displayName = \"AlignRightIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { ChainedCommands } from \"@tiptap/react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isNodeTypeSelected,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { AlignCenterIcon } from \"@/components/tiptap-icons/align-center-icon\"\nimport { AlignJustifyIcon } from \"@/components/tiptap-icons/align-justify-icon\"\nimport { AlignLeftIcon } from \"@/components/tiptap-icons/align-left-icon\"\nimport { AlignRightIcon } from \"@/components/tiptap-icons/align-right-icon\"\n\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\"\n\n/**\n * Configuration for the text align functionality\n */\nexport interface UseTextAlignConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The text alignment to apply.\n */\n align: TextAlign\n /**\n * Whether the button should hide when alignment is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful alignment change.\n */\n onAligned?: () => void\n}\n\nexport const TEXT_ALIGN_SHORTCUT_KEYS: Record<TextAlign, string> = {\n left: \"mod+shift+l\",\n center: \"mod+shift+e\",\n right: \"mod+shift+r\",\n justify: \"mod+shift+j\",\n}\n\nexport const textAlignIcons = {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon,\n}\n\nexport const textAlignLabels: Record<TextAlign, string> = {\n left: \"Align left\",\n center: \"Align center\",\n right: \"Align right\",\n justify: \"Align justify\",\n}\n\n/**\n * Checks if text alignment can be performed in the current editor state\n */\nexport function canSetTextAlign(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isExtensionAvailable(editor, \"textAlign\") ||\n isNodeTypeSelected(editor, [\"image\", \"horizontalRule\"])\n )\n return false\n\n return editor.can().setTextAlign(align)\n}\n\nexport function hasSetTextAlign(\n commands: ChainedCommands\n): commands is ChainedCommands & {\n setTextAlign: (align: TextAlign) => ChainedCommands\n} {\n return \"setTextAlign\" in commands\n}\n\n/**\n * Checks if the text alignment is currently active\n */\nexport function isTextAlignActive(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive({ textAlign: align })\n}\n\n/**\n * Sets text alignment in the editor\n */\nexport function setTextAlign(editor: Editor | null, align: TextAlign): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canSetTextAlign(editor, align)) return false\n\n const chain = editor.chain().focus()\n if (hasSetTextAlign(chain)) {\n return chain.setTextAlign(align).run()\n }\n\n return false\n}\n\n/**\n * Determines if the text align button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n align: TextAlign\n}): boolean {\n const { editor, hideWhenUnavailable, align } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"textAlign\")) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetTextAlign(editor, align)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides text align functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleAlignButton() {\n * const { isVisible, handleTextAlign } = useTextAlign({ align: \"center\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleTextAlign}>Align Center</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedAlignButton() {\n * const { isVisible, handleTextAlign, label, isActive } = useTextAlign({\n * editor: myEditor,\n * align: \"right\",\n * hideWhenUnavailable: true,\n * onAligned: () => console.log('Text aligned!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleTextAlign}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Align Right\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useTextAlign(config: UseTextAlignConfig) {\n const {\n editor: providedEditor,\n align,\n hideWhenUnavailable = false,\n onAligned,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canAlign = canSetTextAlign(editor, align)\n const isActive = isTextAlignActive(editor, align)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, align, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, align])\n\n const handleTextAlign = useCallback(() => {\n if (!editor) return false\n\n const success = setTextAlign(editor, align)\n if (success) {\n onAligned?.()\n }\n return success\n }, [editor, align, onAligned])\n\n return {\n isVisible,\n isActive,\n handleTextAlign,\n canAlign,\n label: textAlignLabels[align],\n shortcutKeys: TEXT_ALIGN_SHORTCUT_KEYS[align],\n Icon: textAlignIcons[align],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n UndoRedoAction,\n UseUndoRedoConfig,\n} from \"@/components/tiptap-ui/undo-redo-button\"\nimport {\n UNDO_REDO_SHORTCUT_KEYS,\n useUndoRedo,\n} from \"@/components/tiptap-ui/undo-redo-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface UndoRedoButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseUndoRedoConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HistoryShortcutBadge({\n action,\n shortcutKeys = UNDO_REDO_SHORTCUT_KEYS[action],\n}: {\n action: UndoRedoAction\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for triggering undo/redo actions in a Tiptap editor.\n *\n * For custom button implementations, use the `useHistory` hook instead.\n */\nexport const UndoRedoButton = forwardRef<\n HTMLButtonElement,\n UndoRedoButtonProps\n>(\n (\n {\n editor: providedEditor,\n action,\n text,\n hideWhenUnavailable = false,\n onExecuted,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleAction, label, canExecute, Icon, shortcutKeys } =\n useUndoRedo({\n editor,\n action,\n hideWhenUnavailable,\n onExecuted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleAction()\n },\n [handleAction, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canExecute}\n data-style=\"ghost\"\n data-disabled={!canExecute}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HistoryShortcutBadge\n action={action}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nUndoRedoButton.displayName = \"UndoRedoButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Redo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.7071 2.29289C15.3166 1.90237 14.6834 1.90237 14.2929 2.29289C13.9024 2.68342 13.9024 3.31658 14.2929 3.70711L17.5858 7H9.5C7.77609 7 6.12279 7.68482 4.90381 8.90381C3.68482 10.1228 3 11.7761 3 13.5C3 14.3536 3.16813 15.1988 3.49478 15.9874C3.82144 16.7761 4.30023 17.4926 4.90381 18.0962C6.12279 19.3152 7.77609 20 9.5 20H13C13.5523 20 14 19.5523 14 19C14 18.4477 13.5523 18 13 18H9.5C8.30653 18 7.16193 17.5259 6.31802 16.682C5.90016 16.2641 5.56869 15.768 5.34254 15.2221C5.1164 14.6761 5 14.0909 5 13.5C5 12.3065 5.47411 11.1619 6.31802 10.318C7.16193 9.47411 8.30653 9 9.5 9H17.5858L14.2929 12.2929C13.9024 12.6834 13.9024 13.3166 14.2929 13.7071C14.6834 14.0976 15.3166 14.0976 15.7071 13.7071L20.7071 8.70711C21.0976 8.31658 21.0976 7.68342 20.7071 7.29289L15.7071 2.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRedo2Icon.displayName = \"Redo2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Undo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 3.70711C10.0976 3.31658 10.0976 2.68342 9.70711 2.29289C9.31658 1.90237 8.68342 1.90237 8.29289 2.29289L3.29289 7.29289C2.90237 7.68342 2.90237 8.31658 3.29289 8.70711L8.29289 13.7071C8.68342 14.0976 9.31658 14.0976 9.70711 13.7071C10.0976 13.3166 10.0976 12.6834 9.70711 12.2929L6.41421 9H14.5C15.0909 9 15.6761 9.1164 16.2221 9.34254C16.768 9.56869 17.2641 9.90016 17.682 10.318C18.0998 10.7359 18.4313 11.232 18.6575 11.7779C18.8836 12.3239 19 12.9091 19 13.5C19 14.0909 18.8836 14.6761 18.6575 15.2221C18.4313 15.768 18.0998 16.2641 17.682 16.682C17.2641 17.0998 16.768 17.4313 16.2221 17.6575C15.6761 17.8836 15.0909 18 14.5 18H11C10.4477 18 10 18.4477 10 19C10 19.5523 10.4477 20 11 20H14.5C15.3536 20 16.1988 19.8319 16.9874 19.5052C17.7761 19.1786 18.4926 18.6998 19.0962 18.0962C19.6998 17.4926 20.1786 16.7761 20.5052 15.9874C20.8319 15.1988 21 14.3536 21 13.5C21 12.6464 20.8319 11.8012 20.5052 11.0126C20.1786 10.2239 19.6998 9.50739 19.0962 8.90381C18.4926 8.30022 17.7761 7.82144 16.9874 7.49478C16.1988 7.16813 15.3536 7 14.5 7H6.41421L9.70711 3.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUndo2Icon.displayName = \"Undo2Icon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isNodeTypeSelected } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { Redo2Icon } from \"@/components/tiptap-icons/redo2-icon\"\nimport { Undo2Icon } from \"@/components/tiptap-icons/undo2-icon\"\n\nexport type UndoRedoAction = \"undo\" | \"redo\"\n\n/**\n * Configuration for the history functionality\n */\nexport interface UseUndoRedoConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The history action to perform (undo or redo).\n */\n action: UndoRedoAction\n /**\n * Whether the button should hide when action is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful action execution.\n */\n onExecuted?: () => void\n}\n\nexport const UNDO_REDO_SHORTCUT_KEYS: Record<UndoRedoAction, string> = {\n undo: \"mod+z\",\n redo: \"mod+shift+z\",\n}\n\nexport const historyActionLabels: Record<UndoRedoAction, string> = {\n undo: \"Undo\",\n redo: \"Redo\",\n}\n\nexport const historyIcons = {\n undo: Undo2Icon,\n redo: Redo2Icon,\n}\n\n/**\n * Checks if a history action can be executed\n */\nexport function canExecuteUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n return action === \"undo\" ? editor.can().undo() : editor.can().redo()\n}\n\n/**\n * Executes a history action on the editor\n */\nexport function executeUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canExecuteUndoRedoAction(editor, action)) return false\n\n const chain = editor.chain().focus()\n return action === \"undo\" ? chain.undo().run() : chain.redo().run()\n}\n\n/**\n * Determines if the history button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n action: UndoRedoAction\n}): boolean {\n const { editor, hideWhenUnavailable, action } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canExecuteUndoRedoAction(editor, action)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides history functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleUndoButton() {\n * const { isVisible, handleAction } = useHistory({ action: \"undo\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleAction}>Undo</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedRedoButton() {\n * const { isVisible, handleAction, label } = useHistory({\n * editor: myEditor,\n * action: \"redo\",\n * hideWhenUnavailable: true,\n * onExecuted: () => console.log('Action executed!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleAction}\n * aria-label={label}\n * >\n * Redo\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useUndoRedo(config: UseUndoRedoConfig) {\n const {\n editor: providedEditor,\n action,\n hideWhenUnavailable = false,\n onExecuted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canExecute = canExecuteUndoRedoAction(editor, action)\n\n useEffect(() => {\n if (!editor) return\n\n const handleUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, action }))\n }\n\n handleUpdate()\n\n editor.on(\"transaction\", handleUpdate)\n\n return () => {\n editor.off(\"transaction\", handleUpdate)\n }\n }, [editor, hideWhenUnavailable, action])\n\n const handleAction = useCallback(() => {\n if (!editor) return false\n\n const success = executeUndoRedoAction(editor, action)\n if (success) {\n onExecuted?.()\n }\n return success\n }, [editor, action, onExecuted])\n\n return {\n isVisible,\n handleAction,\n canExecute,\n label: historyActionLabels[action],\n shortcutKeys: UNDO_REDO_SHORTCUT_KEYS[action],\n Icon: historyIcons[action],\n }\n}\n","\"use client\"\n\nimport { createContext, useContext } from \"react\"\nimport type { IMComposerLocale } from \"../types\"\nimport { defaultLocale } from \"../types\"\n\nconst LocaleContext = createContext<IMComposerLocale>(defaultLocale)\n\nexport function LocaleProvider({\n locale,\n children,\n}: {\n locale?: IMComposerLocale\n children: React.ReactNode\n}) {\n const mergedLocale = { ...defaultLocale, ...locale }\n return (\n <LocaleContext.Provider value={mergedLocale}>\n {children}\n </LocaleContext.Provider>\n )\n}\n\nexport function useLocale(): IMComposerLocale {\n return useContext(LocaleContext)\n}\n","\"use client\"\n\nimport { useRef, useCallback, useImperativeHandle, forwardRef, useState } from \"react\"\nimport { EditorContent, EditorContext, useEditor, type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Tiptap Core Extensions ---\nimport { StarterKit } from \"@tiptap/starter-kit\"\nimport { TaskItem, TaskList } from \"@tiptap/extension-list\"\nimport { TextAlign } from \"@tiptap/extension-text-align\"\nimport { Typography } from \"@tiptap/extension-typography\"\nimport { Highlight } from \"@tiptap/extension-highlight\"\nimport { Subscript } from \"@tiptap/extension-subscript\"\nimport { Superscript } from \"@tiptap/extension-superscript\"\nimport { Selection } from \"@tiptap/extensions\"\nimport { Placeholder } from \"@tiptap/extension-placeholder\"\nimport { Image } from \"@tiptap/extension-image\"\n\n// --- UI Primitives ---\nimport { Spacer } from \"@/components/tiptap-ui-primitive/spacer\"\nimport {\n Toolbar,\n ToolbarGroup,\n ToolbarSeparator,\n} from \"@/components/tiptap-ui-primitive/toolbar\"\n\n// --- Tiptap Node ---\nimport { ImageUploadNode } from \"@/components/tiptap-node/image-upload-node/image-upload-node-extension\"\nimport { HorizontalRule } from \"@/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension\"\n\n// --- Tiptap UI ---\nimport { HeadingDropdownMenu } from \"@/components/tiptap-ui/heading-dropdown-menu\"\nimport { ImageUploadButton } from \"@/components/tiptap-ui/image-upload-button\"\nimport { ListDropdownMenu } from \"@/components/tiptap-ui/list-dropdown-menu\"\nimport { BlockquoteButton } from \"@/components/tiptap-ui/blockquote-button\"\nimport { CodeBlockButton } from \"@/components/tiptap-ui/code-block-button\"\nimport { ColorHighlightPopover } from \"@/components/tiptap-ui/color-highlight-popover\"\nimport { LinkPopover } from \"@/components/tiptap-ui/link-popover\"\nimport { MarkButton } from \"@/components/tiptap-ui/mark-button\"\nimport { TextAlignButton } from \"@/components/tiptap-ui/text-align-button\"\nimport { UndoRedoButton } from \"@/components/tiptap-ui/undo-redo-button\"\n\n// --- Lib ---\nimport { MAX_FILE_SIZE, focusNextNode } from \"@/lib/tiptap-utils\"\n\n// --- Context ---\nimport { useLocale } from \"@/contexts/LocaleContext\"\n\n// --- Types ---\nimport type { MarkdownMessagePayload, ComposerDraft, UploadImageFn } from \"../types\"\n\nexport interface RichEditorProps {\n placeholder?: string\n disabled?: boolean\n uploadImage?: UploadImageFn\n onUploadingChange?: (count: number) => void\n onSend?: () => void\n onChange?: () => void\n sendKeymap?: 'enter' | 'ctrlEnter' | 'cmdEnter'\n}\n\nexport interface RichEditorRef {\n editor: Editor | null\n focus: () => void\n clear: () => void\n exportPayload: () => MarkdownMessagePayload | null\n importMarkdown: (markdown: string) => void\n getDraft: () => ComposerDraft\n setDraft: (draft: ComposerDraft) => void\n setText: (text: string) => void\n insertText: (text: string) => void\n isUploading: () => boolean\n}\n\nconst RichToolbar = () => {\n const locale = useLocale()\n\n return (\n <Toolbar className=\"im-rich-toolbar\">\n <ToolbarGroup>\n <UndoRedoButton action=\"undo\" tooltip={locale.undo} />\n <UndoRedoButton action=\"redo\" tooltip={locale.redo} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <HeadingDropdownMenu\n levels={[1, 2, 3, 4]}\n tooltip={locale.heading}\n labels={{\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n heading4: locale.heading4,\n paragraph: locale.paragraph,\n }}\n />\n <ListDropdownMenu\n types={[\"bulletList\", \"orderedList\", \"taskList\"]}\n tooltip={locale.list}\n labels={{\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n taskList: locale.taskList,\n }}\n />\n <BlockquoteButton tooltip={locale.blockquote} />\n <CodeBlockButton tooltip={locale.codeBlock} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"bold\" tooltip={locale.bold} />\n <MarkButton type=\"italic\" tooltip={locale.italic} />\n <MarkButton type=\"strike\" tooltip={locale.strike} />\n <MarkButton type=\"code\" tooltip={locale.code} />\n <MarkButton type=\"underline\" tooltip={locale.underline} />\n <ColorHighlightPopover tooltip={locale.highlight} removeTooltip={locale.removeHighlight} />\n <LinkPopover\n tooltip={locale.link}\n placeholder={locale.linkPlaceholder}\n applyTooltip={locale.applyLink}\n openTooltip={locale.openLink}\n removeTooltip={locale.removeLink}\n />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"superscript\" tooltip={locale.superscript} />\n <MarkButton type=\"subscript\" tooltip={locale.subscript} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <TextAlignButton align=\"left\" tooltip={locale.alignLeft} />\n <TextAlignButton align=\"center\" tooltip={locale.alignCenter} />\n <TextAlignButton align=\"right\" tooltip={locale.alignRight} />\n <TextAlignButton align=\"justify\" tooltip={locale.alignJustify} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <ImageUploadButton tooltip={locale.insertImage} />\n </ToolbarGroup>\n\n <Spacer />\n </Toolbar>\n )\n}\n\nexport const RichEditor = forwardRef<RichEditorRef, RichEditorProps>(function RichEditor(\n {\n placeholder = \"Write something...\",\n disabled = false,\n uploadImage,\n onUploadingChange,\n onSend,\n onChange,\n sendKeymap = 'enter',\n },\n ref\n) {\n const locale = useLocale()\n const uploadingCountRef = useRef(0)\n const [pasteUploads, setPasteUploads] = useState<Map<string, { name: string; size: number; progress: number }>>(new Map())\n\n const handleImageUpload = useCallback(async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n ): Promise<string> => {\n if (!uploadImage) {\n throw new Error(\"No upload handler provided\")\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(`File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`)\n }\n\n uploadingCountRef.current++\n onUploadingChange?.(uploadingCountRef.current)\n\n try {\n if (abortSignal?.aborted) {\n throw new Error(\"Upload cancelled\")\n }\n\n const result = await uploadImage(file, (event) => {\n onProgress?.(event)\n })\n onProgress?.({ progress: 100 })\n return result.url\n } finally {\n uploadingCountRef.current--\n onUploadingChange?.(uploadingCountRef.current)\n }\n }, [uploadImage, onUploadingChange])\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n editorProps: {\n attributes: {\n autocomplete: \"off\",\n autocorrect: \"off\",\n autocapitalize: \"off\",\n class: \"im-rich-editor-content\",\n },\n handleClick: (view, pos, event) => {\n const target = event.target as HTMLElement\n const { state } = view\n\n // Handle image click - select the image node on single click\n if (target.tagName === 'IMG') {\n const { doc } = state\n let imagePos = -1\n\n doc.descendants((node, nodePos) => {\n if (node.type.name === 'image' && imagePos === -1) {\n if (pos >= nodePos && pos <= nodePos + node.nodeSize) {\n imagePos = nodePos\n return false\n }\n }\n return true\n })\n\n if (imagePos >= 0) {\n const tr = state.tr.setSelection(NodeSelection.create(doc, imagePos))\n view.dispatch(tr)\n return true\n }\n }\n\n // If currently a NodeSelection (e.g., image selected), clicking elsewhere should create TextSelection\n if (state.selection instanceof NodeSelection) {\n const $pos = state.doc.resolve(pos)\n const tr = state.tr.setSelection(TextSelection.near($pos))\n view.dispatch(tr)\n view.focus()\n return true\n }\n\n return false\n },\n handlePaste: (view, event) => {\n if (!uploadImage) return false\n\n const items = event.clipboardData?.items\n if (!items) return false\n\n const imageFiles: File[] = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile()\n if (file) imageFiles.push(file)\n }\n }\n\n // Only handle if there are image files\n if (imageFiles.length === 0) return false\n\n // Prevent default paste behavior for images\n event.preventDefault()\n\n // Upload each image with progress tracking\n imageFiles.forEach((file) => {\n const uploadId = crypto.randomUUID()\n\n // Add to paste uploads state\n setPasteUploads(prev => {\n const next = new Map(prev)\n next.set(uploadId, { name: file.name, size: file.size, progress: 0 })\n return next\n })\n\n const uploadWithProgress = async () => {\n try {\n const url = await handleImageUpload(file, (event) => {\n setPasteUploads(prev => {\n const next = new Map(prev)\n const item = next.get(uploadId)\n if (item) {\n next.set(uploadId, { ...item, progress: event.progress })\n }\n return next\n })\n })\n // Insert image using the same method as toolbar upload\n if (editor) {\n const pos = editor.state.selection.from\n editor\n .chain()\n .focus()\n .insertContentAt(pos, {\n type: 'image',\n attrs: { src: url },\n })\n .run()\n focusNextNode(editor)\n }\n } catch (error) {\n console.error('Failed to upload pasted image:', error)\n } finally {\n // Remove from paste uploads state\n setPasteUploads(prev => {\n const next = new Map(prev)\n next.delete(uploadId)\n return next\n })\n }\n }\n uploadWithProgress()\n })\n\n return true\n },\n handleDrop: (view, event) => {\n if (!uploadImage) return false\n\n const files = event.dataTransfer?.files\n if (!files || files.length === 0) return false\n\n const imageFiles = Array.from(files).filter(file =>\n file.type.startsWith('image/')\n )\n\n // Only handle if there are image files\n if (imageFiles.length === 0) return false\n\n // Prevent default drop behavior for images\n event.preventDefault()\n\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n imageFiles.forEach(async (file) => {\n try {\n const url = await handleImageUpload(file)\n const node = view.state.schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates?.pos ?? view.state.selection.from,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error('Failed to upload dropped image:', error)\n }\n })\n\n return true\n },\n handleKeyDown: (view, event) => {\n // Handle send keymap\n const isMod = event.metaKey || event.ctrlKey\n\n if (event.key === 'Enter' && !event.shiftKey) {\n if (sendKeymap === 'enter' && !isMod) {\n event.preventDefault()\n onSend?.()\n return true\n }\n if (sendKeymap === 'ctrlEnter' && event.ctrlKey) {\n event.preventDefault()\n onSend?.()\n return true\n }\n if (sendKeymap === 'cmdEnter' && event.metaKey) {\n event.preventDefault()\n onSend?.()\n return true\n }\n }\n return false\n },\n },\n extensions: [\n StarterKit.configure({\n horizontalRule: false,\n link: {\n openOnClick: false,\n enableClickSelection: true,\n },\n }),\n HorizontalRule,\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Typography,\n Superscript,\n Subscript,\n Selection,\n Placeholder.configure({\n placeholder,\n }),\n Image,\n ...(uploadImage ? [\n ImageUploadNode.configure({\n accept: \"image/*\",\n maxSize: MAX_FILE_SIZE,\n limit: 3,\n upload: handleImageUpload,\n onError: (error) => console.error(\"Upload failed:\", error),\n locale: {\n clickToUpload: locale.clickToUpload,\n orDragAndDrop: locale.orDragAndDrop,\n maxFiles: locale.maxFiles,\n clearAll: locale.clearAll,\n uploading: locale.uploading,\n },\n }),\n ] : []),\n ],\n onUpdate: () => {\n onChange?.()\n },\n })\n\n // Expose ref methods\n useImperativeHandle(ref, () => ({\n editor,\n\n focus: () => {\n editor?.commands.focus()\n },\n\n clear: () => {\n editor?.commands.clearContent()\n },\n\n exportPayload: (): MarkdownMessagePayload | null => {\n if (!editor) return null\n if (uploadingCountRef.current > 0) return null\n\n // Get text content - for now just use getText() until markdown extension is added\n const content = editor.getText()\n if (!content.trim()) return null\n\n return {\n type: 'markdown',\n markdown: content,\n }\n },\n\n importMarkdown: (markdown: string) => {\n if (editor) {\n editor.commands.setContent(markdown)\n }\n },\n\n getDraft: (): ComposerDraft => {\n return {\n mode: 'rich',\n json: editor?.getJSON(),\n }\n },\n\n setDraft: (draft: ComposerDraft) => {\n if (draft.json && editor) {\n editor.commands.setContent(draft.json)\n }\n },\n\n setText: (text: string) => {\n editor?.commands.setContent(text)\n },\n\n insertText: (text: string) => {\n editor?.commands.insertContent(text)\n },\n\n isUploading: () => uploadingCountRef.current > 0,\n }), [editor])\n\n return (\n <div className=\"im-rich-editor-wrapper\">\n <EditorContext.Provider value={{ editor }}>\n <RichToolbar />\n <div className=\"im-rich-editor-container\">\n <EditorContent\n editor={editor}\n role=\"presentation\"\n />\n </div>\n {/* Paste upload progress indicator */}\n {pasteUploads.size > 0 && (\n <div className=\"im-paste-upload-progress tiptap-image-upload\">\n {Array.from(pasteUploads.entries()).map(([id, { name, size, progress }]) => (\n <div key={id} className=\"tiptap-image-upload-preview\">\n <div\n className=\"tiptap-image-upload-progress\"\n style={{ width: `${progress}%` }}\n />\n <div className=\"tiptap-image-upload-preview-content\">\n <div className=\"tiptap-image-upload-file-info\">\n <div className=\"tiptap-image-upload-file-icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.1953 4.41771C10.3478 4.08499 9.43578 3.94949 8.5282 4.02147C7.62062 4.09345 6.74133 4.37102 5.95691 4.83316C5.1725 5.2953 4.50354 5.92989 4.00071 6.68886C3.49788 7.44783 3.17436 8.31128 3.05465 9.2138C2.93495 10.1163 3.0222 11.0343 3.3098 11.8981C3.5974 12.7619 4.07781 13.5489 4.71463 14.1995C5.10094 14.5942 5.09414 15.2274 4.69945 15.6137C4.30476 16 3.67163 15.9932 3.28532 15.5985C2.43622 14.731 1.79568 13.6816 1.41221 12.5299C1.02875 11.3781 0.91241 10.1542 1.07201 8.95084C1.23162 7.74748 1.66298 6.59621 2.33343 5.58425C3.00387 4.57229 3.89581 3.72617 4.9417 3.10998C5.98758 2.4938 7.15998 2.1237 8.37008 2.02773C9.58018 1.93176 10.7963 2.11243 11.9262 2.55605C13.0561 2.99968 14.0703 3.69462 14.8919 4.58825C15.5423 5.29573 16.0585 6.11304 16.4177 7.00002H17.4999C18.6799 6.99991 19.8288 7.37933 20.7766 8.08222C21.7245 8.78515 22.4212 9.7743 22.7637 10.9036C23.1062 12.0328 23.0765 13.2423 22.6788 14.3534C22.2812 15.4644 21.5367 16.4181 20.5554 17.0736C20.0962 17.3803 19.4752 17.2567 19.1684 16.7975C18.8617 16.3382 18.9853 15.7172 19.4445 15.4105C20.069 14.9934 20.5427 14.3865 20.7958 13.6794C21.0488 12.9724 21.0678 12.2027 20.8498 11.4841C20.6318 10.7655 20.1885 10.136 19.5853 9.6887C18.9821 9.24138 18.251 8.99993 17.5001 9.00002H15.71C15.2679 9.00002 14.8783 8.70973 14.7518 8.28611C14.4913 7.41374 14.0357 6.61208 13.4195 5.94186C12.8034 5.27164 12.0427 4.75043 11.1953 4.41771Z\" fill=\"currentColor\"/>\n <path d=\"M11 14.4142V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V14.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L12.7078 11.2936C12.7054 11.2912 12.703 11.2888 12.7005 11.2864C12.5208 11.1099 12.2746 11.0008 12.003 11L12 11L11.997 11C11.8625 11.0004 11.7343 11.0273 11.6172 11.0759C11.502 11.1236 11.3938 11.1937 11.2995 11.2864C11.297 11.2888 11.2946 11.2912 11.2922 11.2936L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L11 14.4142Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n <div className=\"tiptap-image-upload-details\">\n <span className=\"tiptap-image-upload-text\">{name}</span>\n <span className=\"tiptap-image-upload-subtext\">\n {size === 0 ? \"0 Bytes\" : (() => {\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(size) / Math.log(k))\n return `${parseFloat((size / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n })()}\n </span>\n </div>\n </div>\n <div className=\"tiptap-image-upload-actions\">\n <span className=\"tiptap-image-upload-progress-text\">{progress}%</span>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </EditorContext.Provider>\n </div>\n )\n})\n","import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useCallback,\n useRef,\n} from 'react';\nimport { EditorContent } from '@tiptap/react';\nimport type {\n IMComposerProps,\n IMComposerRef,\n EditorMode,\n MentionSuggestionState,\n ComposerDraft,\n} from '../types';\nimport { defaultLocale } from '../types';\nimport { usePlainEditor } from '../hooks/usePlainEditor';\nimport { useAttachments } from '../hooks/useAttachments';\nimport { MentionPopover } from './MentionPopover';\nimport { AttachmentPreview } from './AttachmentPreview';\nimport { RichEditor, type RichEditorRef } from './RichEditor';\nimport { LocaleProvider } from '../contexts/LocaleContext';\n\n/**\n * IM Composer component supporting plain text and rich text modes.\n */\nexport const IMComposer = forwardRef<IMComposerRef, IMComposerProps>(function IMComposer(\n {\n mode: controlledMode,\n defaultMode = 'plain',\n onSend,\n onChange,\n onContextMenu,\n onQuoteRemoved,\n\n // Plain - Mention\n enableMention = true,\n mentionProvider,\n maxMentions,\n renderMentionItem,\n mentionPlacement = 'bottom',\n\n // Plain - Attachments\n enableAttachments = true,\n attachmentPreviewPlacement = 'bottom',\n maxAttachments = 10,\n allowedMimeTypes,\n maxFileSize,\n onAttachmentLimitExceeded,\n onFilesChange,\n showAttachmentPreview = true,\n\n // Rich\n uploadImage,\n\n // Keymap\n keymap,\n\n // Common\n placeholder,\n disabled = false,\n className,\n\n // i18n\n locale: customLocale,\n },\n ref\n) {\n const locale = { ...defaultLocale, ...customLocale };\n\n // Mode state (controlled or uncontrolled)\n const [internalMode, setInternalMode] = useState<EditorMode>(defaultMode);\n const mode = controlledMode ?? internalMode;\n\n // Mention state\n const [mentionState, setMentionState] = useState<MentionSuggestionState>({\n active: false,\n query: '',\n items: [],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null,\n });\n\n // Upload state for rich mode\n const [uploadingCount, setUploadingCount] = useState(0);\n\n // Rich editor ref\n const richEditorRef = useRef<RichEditorRef>(null);\n\n // Get placeholder for current mode\n const getPlaceholder = () => {\n if (typeof placeholder === 'string') {\n return placeholder;\n }\n if (placeholder) {\n return mode === 'plain' ? placeholder.plain : placeholder.rich;\n }\n return mode === 'plain' ? locale.placeholderPlain : locale.placeholderRich;\n };\n\n // Attachments hook\n const attachments = useAttachments({\n maxAttachments,\n maxFileSize,\n allowedMimeTypes,\n onLimitExceeded: onAttachmentLimitExceeded,\n onChange: onFilesChange,\n });\n\n // Handle send\n const handlePlainSend = useCallback(() => {\n if (disabled) return;\n\n const payload = plainEditor.exportPayload(attachments.getAttachments());\n if (payload && onSend) {\n onSend(payload);\n plainEditor.clear();\n attachments.clearAttachments();\n }\n }, [disabled, onSend]);\n\n const handleRichSend = useCallback(() => {\n if (disabled || uploadingCount > 0) return;\n\n const payload = richEditorRef.current?.exportPayload();\n if (payload && onSend) {\n onSend(payload);\n richEditorRef.current?.clear();\n }\n }, [disabled, onSend, uploadingCount]);\n\n // Plain editor\n const plainEditor = usePlainEditor({\n placeholder: getPlaceholder(),\n sendKeymap: keymap?.send || 'enter',\n onSend: handlePlainSend,\n enableMention,\n mentionProvider,\n maxMentions,\n onMentionStateChange: setMentionState,\n onPasteFiles: enableAttachments ? attachments.addFiles : undefined,\n isUploading: () => false,\n disabled,\n onChange,\n onQuoteRemoved,\n });\n\n // Handle mention selection\n const handleMentionSelect = useCallback(\n (member: { userId: string; display: string }) => {\n // Use the command from suggestion to properly replace @ trigger\n if (mentionState.command) {\n mentionState.command(member);\n }\n setMentionState((s) => ({ ...s, active: false, command: null }));\n },\n [mentionState.command]\n );\n\n // Expose ref methods\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n if (mode === 'plain') {\n plainEditor.focus();\n } else {\n richEditorRef.current?.focus();\n }\n },\n\n clear: () => {\n if (mode === 'plain') {\n plainEditor.clear();\n attachments.clearAttachments();\n } else {\n richEditorRef.current?.clear();\n }\n },\n\n exportPayload: () => {\n if (mode === 'plain') {\n return plainEditor.exportPayload(attachments.getAttachments());\n } else {\n return richEditorRef.current?.exportPayload() || null;\n }\n },\n\n // Rich mode\n importMarkdown: (markdown: string) => {\n richEditorRef.current?.importMarkdown(markdown);\n },\n\n // Attachments\n getAttachments: () => attachments.getAttachments(),\n setAttachments: (atts) => attachments.setAttachments(atts),\n addFiles: (files) => attachments.addFiles(files),\n removeAttachment: (id) => attachments.removeAttachment(id),\n clearAttachments: () => attachments.clearAttachments(),\n\n // Quote\n insertQuote: (title: string, content: string) => {\n plainEditor.insertQuote(title, content);\n },\n\n // Mention\n insertMention: (userId: string, display: string) => {\n plainEditor.insertMention(userId, display);\n },\n\n // Draft\n getDraft: () => {\n if (mode === 'plain') {\n return plainEditor.getDraft(attachments.getAttachments());\n } else {\n return richEditorRef.current?.getDraft() || { mode: 'rich' };\n }\n },\n\n setDraft: (draft: ComposerDraft) => {\n if (mode === 'plain') {\n plainEditor.setDraft(draft);\n if (draft.attachments) {\n attachments.setAttachments(draft.attachments);\n }\n } else {\n richEditorRef.current?.setDraft(draft);\n }\n },\n\n // Text ops\n setText: (text: string) => {\n if (mode === 'plain') {\n plainEditor.setText(text);\n } else {\n richEditorRef.current?.setText(text);\n }\n },\n\n insertText: (text: string) => {\n if (mode === 'plain') {\n plainEditor.insertText(text);\n } else {\n richEditorRef.current?.insertText(text);\n }\n },\n }),\n [mode, plainEditor, attachments]\n );\n\n // Render plain mode\n const renderPlainMode = () => (\n <div className=\"im-composer__plain-wrapper\">\n {/* Attachment preview (top) */}\n {showAttachmentPreview &&\n attachmentPreviewPlacement === 'top' &&\n attachments.attachments.length > 0 && (\n <AttachmentPreview\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n placement=\"top\"\n removeLabel={locale.removeAttachment}\n />\n )}\n\n {/* Editor */}\n <div className=\"im-composer__editor-wrapper\">\n <EditorContent\n editor={plainEditor.editor}\n className=\"im-composer__editor\"\n />\n </div>\n\n {/* Mention popover - rendered via Portal to avoid overflow:hidden issues */}\n <MentionPopover\n mentionState={mentionState}\n editor={plainEditor.editor}\n placement={mentionPlacement}\n onSelect={handleMentionSelect}\n onHover={(index) => setMentionState((s) => ({ ...s, selectedIndex: index }))}\n renderItem={renderMentionItem}\n locale={{\n noResults: locale.mentionNoResults,\n loading: locale.mentionLoading,\n error: locale.mentionError,\n }}\n />\n\n {/* Attachment preview (bottom) */}\n {showAttachmentPreview &&\n attachmentPreviewPlacement === 'bottom' &&\n attachments.attachments.length > 0 && (\n <AttachmentPreview\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n placement=\"bottom\"\n removeLabel={locale.removeAttachment}\n />\n )}\n </div>\n );\n\n // Render rich mode\n const renderRichMode = () => (\n <div className=\"im-composer__rich-wrapper\">\n <RichEditor\n ref={richEditorRef}\n placeholder={getPlaceholder()}\n disabled={disabled}\n uploadImage={uploadImage}\n onUploadingChange={setUploadingCount}\n onSend={handleRichSend}\n onChange={onChange}\n sendKeymap={keymap?.send}\n />\n </div>\n );\n\n return (\n <LocaleProvider locale={locale}>\n <div\n className={`im-composer ${className || ''} ${disabled ? 'im-composer--disabled' : ''}`}\n onContextMenu={onContextMenu}\n >\n {mode === 'plain' ? renderPlainMode() : renderRichMode()}\n </div>\n </LocaleProvider>\n );\n});\n","import React from 'react';\nimport type { QuoteInfo } from '../types';\n\nexport interface QuoteBarProps {\n /** Quote information */\n quote: QuoteInfo;\n /** Called when remove button is clicked */\n onRemove: () => void;\n /** Remove button label */\n removeLabel?: string;\n}\n\n/**\n * Quote message bar component.\n */\nexport function QuoteBar({ quote, onRemove, removeLabel = 'Remove quote' }: QuoteBarProps) {\n return (\n <div className=\"im-quote-bar\">\n <div className=\"im-quote-bar__content\">\n <span className=\"im-quote-bar__title\">{quote.title}</span>\n <span className=\"im-quote-bar__text\">{quote.content}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-quote-bar__remove-btn\"\n onClick={onRemove}\n aria-label={removeLabel}\n >\n <CloseIcon />\n </button>\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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","import type { Editor } from '@tiptap/core';\n\n/**\n * Markdown serializer for Tiptap editor content.\n * Converts the editor document to Markdown string.\n */\nexport function editorToMarkdown(editor: Editor): string {\n const doc = editor.state.doc;\n return nodeToMarkdown(doc);\n}\n\nfunction nodeToMarkdown(node: any, depth = 0): string {\n const parts: string[] = [];\n\n node.forEach((child: any, offset: number, index: number) => {\n parts.push(childNodeToMarkdown(child, depth, index));\n });\n\n return parts.join('');\n}\n\nfunction childNodeToMarkdown(node: any, depth: number, index: number): string {\n const typeName = node.type.name;\n\n switch (typeName) {\n case 'doc':\n return nodeToMarkdown(node, depth);\n\n case 'paragraph':\n const paragraphContent = inlineContentToMarkdown(node);\n return index > 0 ? '\\n\\n' + paragraphContent : paragraphContent;\n\n case 'heading': {\n const level = node.attrs.level || 1;\n const prefix = '#'.repeat(level) + ' ';\n const content = inlineContentToMarkdown(node);\n return (index > 0 ? '\\n\\n' : '') + prefix + content;\n }\n\n case 'bulletList':\n return (index > 0 ? '\\n\\n' : '') + listToMarkdown(node, '-', depth);\n\n case 'orderedList':\n return (index > 0 ? '\\n\\n' : '') + listToMarkdown(node, '1.', depth);\n\n case 'listItem':\n return nodeToMarkdown(node, depth);\n\n case 'blockquote': {\n const content = nodeToMarkdown(node, depth);\n const lines = content.split('\\n').map((line) => '> ' + line);\n return (index > 0 ? '\\n\\n' : '') + lines.join('\\n');\n }\n\n case 'codeBlock': {\n const language = node.attrs.language || '';\n const code = node.textContent;\n return (index > 0 ? '\\n\\n' : '') + '```' + language + '\\n' + code + '\\n```';\n }\n\n case 'horizontalRule':\n return (index > 0 ? '\\n\\n' : '') + '---';\n\n case 'hardBreak':\n return '\\n';\n\n case 'image': {\n const { src, alt, title } = node.attrs;\n const titlePart = title ? ` \"${title}\"` : '';\n return `![${alt || ''}](${src}${titlePart})`;\n }\n\n default:\n if (node.isText) {\n return formatTextWithMarks(node);\n }\n return node.textContent || '';\n }\n}\n\nfunction listToMarkdown(node: any, marker: string, depth: number): string {\n const items: string[] = [];\n const indent = ' '.repeat(depth);\n\n node.forEach((item: any, offset: number, index: number) => {\n const itemMarker = marker === '1.' ? `${index + 1}.` : marker;\n const content = inlineContentToMarkdown(item.firstChild);\n items.push(indent + itemMarker + ' ' + content);\n\n // Handle nested lists\n item.forEach((child: any, childOffset: number, childIndex: number) => {\n if (childIndex > 0) {\n if (child.type.name === 'bulletList' || child.type.name === 'orderedList') {\n items.push(listToMarkdown(child, child.type.name === 'bulletList' ? '-' : '1.', depth + 1));\n }\n }\n });\n });\n\n return items.join('\\n');\n}\n\nfunction inlineContentToMarkdown(node: any): string {\n if (!node) return '';\n\n const parts: string[] = [];\n\n node.forEach((child: any) => {\n if (child.isText) {\n parts.push(formatTextWithMarks(child));\n } else if (child.type.name === 'hardBreak') {\n parts.push('\\n');\n } else if (child.type.name === 'image') {\n const { src, alt, title } = child.attrs;\n const titlePart = title ? ` \"${title}\"` : '';\n parts.push(`![${alt || ''}](${src}${titlePart})`);\n } else {\n parts.push(child.textContent || '');\n }\n });\n\n return parts.join('');\n}\n\nfunction formatTextWithMarks(node: any): string {\n let text = node.text || '';\n\n if (!node.marks || node.marks.length === 0) {\n return escapeMarkdown(text);\n }\n\n // Sort marks for consistent output\n const marks = [...node.marks].sort((a, b) => {\n const order = ['link', 'code', 'bold', 'italic', 'strike'];\n return order.indexOf(a.type.name) - order.indexOf(b.type.name);\n });\n\n for (const mark of marks) {\n switch (mark.type.name) {\n case 'bold':\n text = `**${text}**`;\n break;\n case 'italic':\n text = `*${text}*`;\n break;\n case 'strike':\n text = `~~${text}~~`;\n break;\n case 'code':\n text = `\\`${text}\\``;\n break;\n case 'link':\n const href = mark.attrs.href || '';\n text = `[${text}](${href})`;\n break;\n }\n }\n\n return text;\n}\n\nfunction escapeMarkdown(text: string): string {\n // Escape special markdown characters in regular text\n // Be conservative - only escape characters that would cause issues\n return text.replace(/([\\\\`*_{}[\\]()#+\\-.!])/g, '\\\\$1');\n}\n\n/**\n * Parse Markdown to Tiptap-compatible JSON content.\n * This is a simplified parser for the Markdown subset we support.\n */\nexport function markdownToEditorContent(markdown: string): any {\n const lines = markdown.split('\\n');\n const content: any[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Code block\n if (line.startsWith('```')) {\n const language = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n\n content.push({\n type: 'codeBlock',\n attrs: { language },\n content: [{ type: 'text', text: codeLines.join('\\n') }],\n });\n i++;\n continue;\n }\n\n // Heading\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n content.push({\n type: 'heading',\n attrs: { level: headingMatch[1].length },\n content: parseInlineContent(headingMatch[2]),\n });\n i++;\n continue;\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].startsWith('> ')) {\n quoteLines.push(lines[i].slice(2));\n i++;\n }\n\n content.push({\n type: 'blockquote',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(quoteLines.join('\\n')),\n },\n ],\n });\n continue;\n }\n\n // Horizontal rule\n if (line.match(/^(-{3,}|_{3,}|\\*{3,})$/)) {\n content.push({ type: 'horizontalRule' });\n i++;\n continue;\n }\n\n // Bullet list item\n if (line.match(/^[-*+]\\s+/)) {\n const items: any[] = [];\n while (i < lines.length && lines[i].match(/^[-*+]\\s+/)) {\n const itemText = lines[i].replace(/^[-*+]\\s+/, '');\n items.push({\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(itemText),\n },\n ],\n });\n i++;\n }\n\n content.push({\n type: 'bulletList',\n content: items,\n });\n continue;\n }\n\n // Ordered list item\n const orderedMatch = line.match(/^(\\d+)\\.\\s+/);\n if (orderedMatch) {\n const items: any[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s+/)) {\n const itemText = lines[i].replace(/^\\d+\\.\\s+/, '');\n items.push({\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(itemText),\n },\n ],\n });\n i++;\n }\n\n content.push({\n type: 'orderedList',\n attrs: { start: parseInt(orderedMatch[1], 10) },\n content: items,\n });\n continue;\n }\n\n // Empty line\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n // Regular paragraph\n content.push({\n type: 'paragraph',\n content: parseInlineContent(line),\n });\n i++;\n }\n\n return {\n type: 'doc',\n content: content.length > 0 ? content : [{ type: 'paragraph' }],\n };\n}\n\nfunction parseInlineContent(text: string): any[] {\n if (!text) return [];\n\n const content: any[] = [];\n let remaining = text;\n\n // Simple regex-based parsing for inline elements\n const patterns = [\n // Image: ![alt](url)\n { regex: /!\\[([^\\]]*)\\]\\(([^)]+)\\)/, type: 'image' },\n // Link: [text](url)\n { regex: /\\[([^\\]]+)\\]\\(([^)]+)\\)/, type: 'link' },\n // Bold: **text**\n { regex: /\\*\\*([^*]+)\\*\\*/, type: 'bold' },\n // Italic: *text*\n { regex: /(?<!\\*)\\*([^*]+)\\*(?!\\*)/, type: 'italic' },\n // Strike: ~~text~~\n { regex: /~~([^~]+)~~/, type: 'strike' },\n // Code: `text`\n { regex: /`([^`]+)`/, type: 'code' },\n ];\n\n while (remaining.length > 0) {\n let earliestMatch: { match: RegExpExecArray; type: string } | null = null;\n let earliestIndex = Infinity;\n\n for (const pattern of patterns) {\n const match = pattern.regex.exec(remaining);\n if (match && match.index < earliestIndex) {\n earliestMatch = { match, type: pattern.type };\n earliestIndex = match.index;\n }\n }\n\n if (earliestMatch) {\n // Add text before the match\n if (earliestIndex > 0) {\n content.push({\n type: 'text',\n text: remaining.slice(0, earliestIndex),\n });\n }\n\n const { match, type } = earliestMatch;\n\n switch (type) {\n case 'image':\n content.push({\n type: 'image',\n attrs: {\n alt: match[1],\n src: match[2],\n },\n });\n break;\n case 'link':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'link', attrs: { href: match[2] } }],\n });\n break;\n case 'bold':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'bold' }],\n });\n break;\n case 'italic':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'italic' }],\n });\n break;\n case 'strike':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'strike' }],\n });\n break;\n case 'code':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'code' }],\n });\n break;\n }\n\n remaining = remaining.slice(earliestIndex + match[0].length);\n } else {\n // No more patterns found, add remaining text\n content.push({\n type: 'text',\n text: remaining,\n });\n break;\n }\n }\n\n return content;\n}\n","/**\n * Allowed protocols for links in rich mode.\n */\nexport const ALLOWED_LINK_PROTOCOLS = ['http:', 'https:', 'mailto:'];\n\n/**\n * Allowed protocols for images in rich mode.\n */\nexport const ALLOWED_IMAGE_PROTOCOLS = ['https:', 'http:', 'blob:', 'data:'];\n\n/**\n * Check if a URL has an allowed protocol for links.\n */\nexport function isAllowedLinkProtocol(url: string): boolean {\n try {\n const parsed = new URL(url);\n return ALLOWED_LINK_PROTOCOLS.includes(parsed.protocol);\n } catch {\n // Invalid URL or relative path\n return true; // Allow relative URLs\n }\n}\n\n/**\n * Check if a URL has an allowed protocol for images.\n */\nexport function isAllowedImageProtocol(url: string): boolean {\n try {\n const parsed = new URL(url);\n return ALLOWED_IMAGE_PROTOCOLS.includes(parsed.protocol);\n } catch {\n // Invalid URL or relative path\n return true; // Allow relative URLs\n }\n}\n\n/**\n * Sanitize a URL for links.\n * - Adds https:// if no protocol is present\n * - Returns null if protocol is not allowed (including javascript:, vbscript:, etc.)\n */\nexport function sanitizeLinkUrl(url: string): string | null {\n if (!url) return null;\n\n // Check for dangerous protocols BEFORE adding https prefix\n const trimmedUrl = url.trim().toLowerCase();\n if (\n trimmedUrl.startsWith('javascript:') ||\n trimmedUrl.startsWith('vbscript:') ||\n trimmedUrl.startsWith('data:')\n ) {\n return null;\n }\n\n // Check if URL has a protocol\n if (!url.includes('://') && !url.startsWith('mailto:')) {\n url = 'https://' + url;\n }\n\n if (!isAllowedLinkProtocol(url)) {\n return null;\n }\n\n return url;\n}\n\n/**\n * Sanitize a URL for images.\n * Returns null if protocol is not allowed.\n */\nexport function sanitizeImageUrl(url: string): string | null {\n if (!url) return null;\n\n if (!isAllowedImageProtocol(url)) {\n return null;\n }\n\n return url;\n}\n\n/**\n * Escape HTML entities to prevent XSS.\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;',\n };\n\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Strip HTML tags from text.\n */\nexport function stripHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Check if text contains potentially dangerous content.\n */\nexport function containsUnsafeContent(text: string): boolean {\n // Check for javascript: protocol\n if (/javascript:/i.test(text)) {\n return true;\n }\n\n // Check for data: protocol with script\n if (/data:text\\/html/i.test(text)) {\n return true;\n }\n\n // Check for event handlers\n if (/on\\w+\\s*=/i.test(text)) {\n return true;\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/extensions/common/CompositionExtension.ts","../src/extensions/common/KeymapExtension.ts","../src/extensions/plain/PlainTextExtension.ts","../src/extensions/plain/MentionExtension.ts","../src/components/QuoteNodeView.tsx","../src/extensions/plain/QuoteExtension.ts","../src/utils/mention.ts","../src/hooks/usePlainEditor.ts","../src/utils/attachment.ts","../src/hooks/useAttachments.ts","../src/components/MentionList.tsx","../src/components/MentionPopover.tsx","../src/components/AttachmentPreview.tsx","../src/components/tiptap-ui-primitive/spacer/spacer.tsx","../src/lib/tiptap-utils.ts","../src/components/tiptap-ui-primitive/separator/separator.tsx","../src/hooks/use-menu-navigation.ts","../src/hooks/use-composed-ref.ts","../src/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/tiptap-ui-primitive/button/button.tsx","../src/components/tiptap-icons/close-icon.tsx","../src/components/tiptap-node/image-upload-node/image-upload-node.tsx","../src/components/tiptap-node/image-upload-node/image-upload-node-extension.ts","../src/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts","../src/components/tiptap-icons/chevron-down-icon.tsx","../src/hooks/use-tiptap-editor.ts","../src/components/tiptap-ui-primitive/badge/badge.tsx","../src/components/tiptap-ui/heading-button/heading-button.tsx","../src/components/tiptap-icons/heading-one-icon.tsx","../src/components/tiptap-icons/heading-two-icon.tsx","../src/components/tiptap-icons/heading-three-icon.tsx","../src/components/tiptap-icons/heading-four-icon.tsx","../src/components/tiptap-icons/heading-five-icon.tsx","../src/components/tiptap-icons/heading-six-icon.tsx","../src/components/tiptap-ui/heading-button/use-heading.ts","../src/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx","../src/components/tiptap-ui-primitive/card/card.tsx","../src/components/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx","../src/components/tiptap-icons/heading-icon.tsx","../src/components/tiptap-ui/heading-dropdown-menu/use-heading-dropdown-menu.ts","../src/components/tiptap-ui/image-upload-button/image-upload-button.tsx","../src/hooks/use-is-breakpoint.ts","../src/components/tiptap-icons/image-plus-icon.tsx","../src/components/tiptap-ui/image-upload-button/use-image-upload.ts","../src/components/tiptap-ui/list-button/list-button.tsx","../src/components/tiptap-icons/list-icon.tsx","../src/components/tiptap-icons/list-ordered-icon.tsx","../src/components/tiptap-icons/list-todo-icon.tsx","../src/components/tiptap-ui/list-button/use-list.ts","../src/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu.ts","../src/components/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/tiptap-ui/blockquote-button/blockquote-button.tsx","../src/components/tiptap-icons/blockquote-icon.tsx","../src/components/tiptap-ui/blockquote-button/use-blockquote.ts","../src/components/tiptap-ui/code-block-button/code-block-button.tsx","../src/components/tiptap-icons/code-block-icon.tsx","../src/components/tiptap-ui/code-block-button/use-code-block.ts","../src/components/tiptap-icons/ban-icon.tsx","../src/components/tiptap-icons/highlighter-icon.tsx","../src/components/tiptap-ui-primitive/popover/popover.tsx","../src/components/tiptap-ui/color-highlight-button/color-highlight-button.tsx","../src/components/tiptap-ui/color-highlight-button/use-color-highlight.ts","../src/components/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx","../src/components/tiptap-icons/corner-down-left-icon.tsx","../src/components/tiptap-icons/external-link-icon.tsx","../src/components/tiptap-icons/link-icon.tsx","../src/components/tiptap-icons/trash-icon.tsx","../src/components/tiptap-ui-primitive/input/input.tsx","../src/components/tiptap-ui/link-popover/link-popover.tsx","../src/components/tiptap-ui/link-popover/use-link-popover.ts","../src/components/tiptap-ui/mark-button/mark-button.tsx","../src/components/tiptap-icons/bold-icon.tsx","../src/components/tiptap-icons/code2-icon.tsx","../src/components/tiptap-icons/italic-icon.tsx","../src/components/tiptap-icons/strike-icon.tsx","../src/components/tiptap-icons/subscript-icon.tsx","../src/components/tiptap-icons/superscript-icon.tsx","../src/components/tiptap-icons/underline-icon.tsx","../src/components/tiptap-ui/mark-button/use-mark.ts","../src/components/tiptap-ui/text-align-button/text-align-button.tsx","../src/components/tiptap-icons/align-center-icon.tsx","../src/components/tiptap-icons/align-justify-icon.tsx","../src/components/tiptap-icons/align-left-icon.tsx","../src/components/tiptap-icons/align-right-icon.tsx","../src/components/tiptap-ui/text-align-button/use-text-align.ts","../src/components/tiptap-ui/undo-redo-button/undo-redo-button.tsx","../src/components/tiptap-icons/redo2-icon.tsx","../src/components/tiptap-icons/undo2-icon.tsx","../src/components/tiptap-ui/undo-redo-button/use-undo-redo.ts","../src/contexts/LocaleContext.tsx","../src/utils/markdown.ts","../src/components/RichEditor.tsx","../src/components/IMComposer.tsx","../src/components/QuoteBar.tsx","../src/utils/security.ts"],"names":["defaultLocale","compositionPluginKey","PluginKey","CompositionExtension","Extension","extension","Plugin","KeymapExtension","getSend","send","isSendKey","event","isNewlineKey","editor","commands","plainTextPluginKey","serializeToPlainText","slice","text","isFirst","node","child","PlainTextExtension","view","clipboardData","files","state","dispatch","tr","schema","lines","nodes","line","index","fragment","dataTransfer","mentionPluginKey","Node","element","attributes","HTMLAttributes","mergeAttributes","isMention","selection","empty","anchor","pos","createMentionExtension","options","currentState","updateState","updates","Mention","query","items","props","wrappedCommand","member","selectedMember","range","mentionCount","QuoteNodeView","selected","title","content","jsxs","NodeViewWrapper","jsx","e","QuoteExtension","ReactNodeViewRenderer","firstNode","$anchor","quoteSize","extractPlainTextWithMentions","mentions","plainText","doc","lastWasMention","userId","display","start","mentionText","end","utf16Length","str","validateMentionIndices","mention","extracted","expected","createMentionInfo","startIndex","getQuoteFromEditor","usePlainEditor","placeholder","sendKeymap","onSend","enableMention","mentionProvider","maxMentions","onMentionStateChange","onPasteFiles","isUploading","disabled","onChange","onQuoteRemoved","mentionListOpenRef","useRef","compositionRef","sendKeymapRef","onSendRef","handleMentionStateChange","useCallback","extensions","useMemo","exts","Document","Paragraph","Text","HardBreak","History","Placeholder","useEditor","editorElement","isComposing","isMentionListOpen","exportPayload","attachments","quote","getDraft","setDraft","draft","insertMention","insertQuote","removeQuote","getQuote","setText","insertText","clear","focus","generateAttachmentId","createAttachment","file","isImage","revokeAttachmentUrl","attachment","revokeAllAttachmentUrls","matchesMimeType","mime","pattern","prefix","isMimeTypeAllowed","allowedTypes","validateFile","currentCount","formatFileSize","bytes","k","sizes","i","useAttachments","maxAttachments","maxFileSize","allowedMimeTypes","onLimitExceeded","setAttachmentsState","useState","attachmentsRef","useEffect","addFiles","fileArray","currentAttachments","newAttachments","validationError","updated","removeAttachment","id","a","clearAttachments","setAttachments","currentIds","toRevoke","processedAttachments","att","getAttachments","MentionList","selectedIndex","loading","error","onSelect","onHover","renderItem","locale","noResults","loadingText","errorText","listRef","itemRefs","selectedItem","isSelected","el","getCursorRect","from","coords","MentionPopover","mentionState","placement","portalContainer","zIndex","isPositioned","setIsPositioned","cursorRectRef","floatingPlacement","fallbackPlacements","virtualReference","refs","floatingStyles","update","useFloating","offset","flip","shift","size","availableHeight","elements","autoUpdate","useLayoutEffect","frame","rect","FloatingPortal","AttachmentPreview","onRemove","removeLabel","FileIcon","CloseIcon","Spacer","orientation","style","computedStyle","MAX_FILE_SIZE","MAC_SYMBOLS","cn","classes","isMac","formatShortcutKey","key","capitalize","lowerKey","parseShortcutKeys","shortcutKeys","delimiter","isMarkInSchema","markName","isNodeInSchema","nodeName","focusNextNode","nextSel","Selection","paragraphType","para","$inside","TextSelection","isValidPosition","isExtensionAvailable","extensionNames","names","found","name","ext","findNodeAtPosition","position","findNodePosition","nodePos","hasValidNode","hasValidPos","foundPos","foundNode","currentNode","nodeAtPos","isNodeTypeSelected","nodeTypeNames","checkAncestorNodes","NodeSelection","selectedNode","$from","depth","ancestorNode","selectionWithinConvertibleTypes","types","allowed","nodeType","AllSelection","valid","ATTR_WHITESPACE","isAllowedUri","uri","protocols","allowedProtocols","sanitizeUrl","inputUrl","baseUrl","url","Separator","forwardRef","decorative","className","divProps","ref","semanticProps","useMenuNavigation","containerRef","onClose","autoSelectFirstItem","setSelectedIndex","handleKeyboardNavigation","moveNext","currentIndex","movePrev","targetElement","updateRef","value","useComposedRef","libRef","userRef","prevUserRef","instance","useToolbarNavigation","toolbarRef","setItems","collectItems","toolbar","updateItems","observer","handleFocus","target","handleBlur","Toolbar","children","variant","composedRef","ToolbarGroup","ToolbarSeparator","useTooltip","initialOpen","controlledOpen","setControlledOpen","delay","closeDelay","uncontrolledOpen","setUncontrolledOpen","open","setOpen","data","context","hover","useHover","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","TooltipContext","createContext","useTooltipContext","useContext","Tooltip","tooltip","FloatingDelayGroup","TooltipTrigger","asChild","propRef","childrenRef","isValidElement","version","useMergeRefs","dataAttributes","cloneElement","TooltipContent","portal","portalProps","ShortcutDisplay","shortcuts","Fragment","Button","showTooltip","ariaLabel","ButtonGroup","memo","useFileUpload","fileItems","setFileItems","uploadFile","abortController","fileId","newFileItem","prev","progress","item","uploadPromises","fileToRemove","CloudUploadIcon","FileCornerIcon","isFileAccepted","accept","t","acceptType","baseType","ImageUploadDragArea","onFile","isDragOver","setIsDragOver","isDragActive","setIsDragActive","ImageUploadPreview","fileItem","DropZoneContent","maxSize","limit","ImageUploadNode","inputRef","uploadOptions","uploadFiles","removeFileItem","clearAllFiles","handleUpload","urls","imageNodes","filename","handleChange","handleClick","hasFiles","nodeAfter","nodeEl","firstChild","HorizontalRule","TiptapHorizontalRule","ChevronDownIcon","useTiptapEditor","providedEditor","coreEditor","useCurrentEditor","mainEditor","useEditorState","Badge","appearance","trimText","HeadingShortcutBadge","level","HEADING_SHORTCUT_KEYS","HeadingButton","hideWhenUnavailable","onToggled","showShortcut","onClick","buttonProps","isVisible","canToggle","isActive","handleToggle","label","Icon","useHeading","HeadingOneIcon","HeadingTwoIcon","HeadingThreeIcon","HeadingFourIcon","HeadingFiveIcon","HeadingSixIcon","headingIcons","turnInto","isHeadingActive","l","toggleHeading","levels","toggleLevel","chain","lastChild","to","resolvedFrom","resolvedTo","shouldShowButton","config","setIsVisible","canToggleState","handleSelectionUpdate","success","DropdownMenu","B","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuItem","DropdownMenuSubContent","DropdownMenuContent","sideOffset","Card","CardHeader","CardBody","CardItemGroup","CardGroupLabel","CardFooter","HeadingDropdownMenu","onOpenChange","labels","isOpen","setIsOpen","useHeadingDropdownMenu","handleOpenChange","HeadingIcon","getActiveHeadingLevel","activeLevel","ImageShortcutBadge","IMAGE_UPLOAD_SHORTCUT_KEY","ImageUploadButton","onInserted","CustomIcon","canInsert","handleImage","useImageUpload","useIsBreakpoint","mode","breakpoint","matches","setMatches","mql","ImagePlusIcon","canInsertImage","isImageActive","insertImage","isMobile","useHotkeys","ListShortcutBadge","type","LIST_SHORTCUT_KEYS","ListButton","useList","ListIcon","ListOrderedIcon","ListTodoIcon","listIcons","listLabels","canToggleList","isListActive","toggleList","toggle","listOptions","canToggleAnyList","listTypes","isAnyListActive","getFilteredListOptions","availableTypes","option","shouldShowListDropdown","params","listInSchema","canToggleAny","getActiveListType","useListDropdownMenu","filteredLists","isAnyActive","activeType","activeList","ListDropdownMenu","handleOnOpenChange","BlockquoteShortcutBadge","BLOCKQUOTE_SHORTCUT_KEY","BlockquoteButton","useBlockquote","BlockquoteIcon","canToggleBlockquote","toggleBlockquote","CodeBlockShortcutBadge","CODE_BLOCK_SHORTCUT_KEY","CodeBlockButton","useCodeBlock","CodeBlockIcon","toggleCodeBlock","BanIcon","HighlighterIcon","Popover","ue","PopoverTrigger","PopoverContent","align","ColorHighlightShortcutBadge","COLOR_HIGHLIGHT_SHORTCUT_KEY","ColorHighlightButton","highlightColor","onApplied","canColorHighlight","handleColorHighlight","useColorHighlight","buttonStyle","HIGHLIGHT_COLORS","pickHighlightColorsByValue","values","colorMap","color","isColorHighlightActive","$pos","removeHighlight","canColorHighlightState","highlightMarkType","handleRemoveHighlight","ColorHighlightPopoverButton","ColorHighlightPopoverContent","colors","removeTooltip","menuItems","highlightedElement","ColorHighlightPopover","CornerDownLeftIcon","ExternalLinkIcon","LinkIcon","TrashIcon","Input","InputGroup","LinkButton","LinkMain","setUrl","setLink","removeLink","openLink","applyTooltip","openTooltip","handleKeyDown","LinkPopover","onSetLink","autoOpenOnLinkActive","canSet","useLinkPopover","nextIsOpen","handleSetLink","canSetLink","isLinkActive","shouldShowLinkButton","useLinkHandler","href","updateLinkState","isEmpty","features","safeUrl","useLinkState","linkHandler","MarkShortcutBadge","MARK_SHORTCUT_KEYS","MarkButton","handleMark","useMark","BoldIcon","Code2Icon","ItalicIcon","StrikeIcon","SubscriptIcon","SuperscriptIcon","UnderlineIcon","markIcons","canToggleMark","isMarkActive","toggleMark","getFormattedMarkName","TextAlignShortcutBadge","TEXT_ALIGN_SHORTCUT_KEYS","TextAlignButton","onAligned","handleTextAlign","canAlign","useTextAlign","AlignCenterIcon","AlignJustifyIcon","AlignLeftIcon","AlignRightIcon","textAlignIcons","textAlignLabels","canSetTextAlign","hasSetTextAlign","isTextAlignActive","setTextAlign","HistoryShortcutBadge","action","UNDO_REDO_SHORTCUT_KEYS","UndoRedoButton","onExecuted","handleAction","canExecute","useUndoRedo","Redo2Icon","Undo2Icon","historyActionLabels","historyIcons","canExecuteUndoRedoAction","executeUndoRedoAction","handleUpdate","LocaleContext","LocaleProvider","mergedLocale","useLocale","editorToMarkdown","nodeToMarkdown","parts","childNodeToMarkdown","paragraphContent","inlineContentToMarkdown","listToMarkdown","language","code","src","alt","titlePart","formatTextWithMarks","marker","indent","itemMarker","childOffset","childIndex","escapeMarkdown","marks","b","order","mark","markdownToEditorContent","markdown","codeLines","headingMatch","parseInlineContent","quoteLines","itemText","orderedMatch","remaining","patterns","earliestMatch","earliestIndex","match","RichToolbar","RichEditor","uploadImage","onUploadingChange","uploadingCountRef","pasteUploads","setPasteUploads","handleImageUpload","onProgress","abortSignal","result","imagePos","imageFiles","uploadId","next","coordinates","transaction","isMod","StarterKit","TextAlign","TaskList","TaskItem","Highlight","Typography","Superscript","Subscript","Image","useImperativeHandle","EditorContext","EditorContent","IMComposer","controlledMode","defaultMode","onContextMenu","renderMentionItem","mentionPlacement","enableAttachments","attachmentPreviewPlacement","onAttachmentLimitExceeded","onFilesChange","showAttachmentPreview","keymap","customLocale","internalMode","setInternalMode","setMentionState","uploadingCount","setUploadingCount","richEditorRef","getPlaceholder","handlePlainSend","payload","plainEditor","handleRichSend","handleMentionSelect","s","atts","renderPlainMode","renderRichMode","QuoteBar","ALLOWED_LINK_PROTOCOLS","ALLOWED_IMAGE_PROTOCOLS","isAllowedLinkProtocol","parsed","isAllowedImageProtocol","sanitizeLinkUrl","trimmedUrl","sanitizeImageUrl"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode, MouseEventHandler } from 'react';\n\n// ============================================================================\n// Attachment Types\n// ============================================================================\n\n/**\n * Represents a file attachment in plain mode\n */\nexport interface Attachment {\n /** Unique identifier generated by the component */\n id: string;\n /** Original File object */\n file: File;\n /** File name */\n name: string;\n /** File size in bytes */\n size: number;\n /** MIME type */\n mime: string;\n /** File last modified timestamp */\n lastModified?: number;\n /** Preview URL for images (objectURL) */\n previewUrl?: string;\n}\n\n// ============================================================================\n// Mention Types\n// ============================================================================\n\n/**\n * Information about a mention in the message\n */\nexport interface MentionInfo {\n /** User ID */\n userId: string;\n /** Display name */\n display: string;\n /** Start index in plainText (UTF-16, inclusive) */\n start: number;\n /** End index in plainText (UTF-16, exclusive) */\n end: number;\n}\n\n/**\n * Member data for mention suggestions\n */\nexport interface Member {\n /** Unique user identifier */\n userId: string;\n /** Display name shown in the editor */\n display: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n}\n\n// ============================================================================\n// Quote Types\n// ============================================================================\n\n/**\n * Quoted message information\n */\nexport interface QuoteInfo {\n /** Quote title, e.g., \"Reply to Alice:\" */\n title: string;\n /** Quoted content */\n content: string;\n}\n\n// ============================================================================\n// Payload Types\n// ============================================================================\n\n/**\n * Result from image upload handler\n */\nexport interface UploadImageResult {\n /** URL of the uploaded image */\n url: string;\n /** Optional alt text */\n alt?: string;\n}\n\n/**\n * Progress callback for image upload\n */\nexport interface UploadProgressEvent {\n /** Upload progress percentage (0-100) */\n progress: number;\n}\n\n/**\n * Image upload function type with optional progress callback\n */\nexport type UploadImageFn = (\n file: File,\n onProgress?: (event: UploadProgressEvent) => void\n) => Promise<UploadImageResult>;\n\n/**\n * Payload for plain text mode messages\n */\nexport interface PlainMessagePayload {\n type: 'text';\n /** Plain text with mentions as @userId */\n plainText: string;\n /** List of mentions with their positions */\n mentions: MentionInfo[];\n /** List of attached files */\n attachments: Attachment[];\n /** Quoted message (if any) */\n quote?: QuoteInfo;\n}\n\n/**\n * Payload for rich text mode messages (Markdown)\n */\nexport interface MarkdownMessagePayload {\n type: 'markdown';\n /** Markdown content */\n markdown: string;\n}\n\n/**\n * Union type for all message payloads\n */\nexport type MessagePayload = PlainMessagePayload | MarkdownMessagePayload;\n\n// ============================================================================\n// Draft Types\n// ============================================================================\n\n/**\n * Draft state for saving/restoring editor content\n */\nexport interface ComposerDraft {\n /** Editor mode */\n mode?: EditorMode;\n /** Serialized editor state (JSON string from getJSON) - deprecated, use json */\n editorState?: string;\n /** Editor JSON content */\n json?: Record<string, unknown>;\n /** Attachments (plain mode only) */\n attachments?: Attachment[];\n /** Quick restore text for plain mode */\n text?: string;\n /** Quote information (plain mode only) */\n quote?: QuoteInfo;\n}\n\n// ============================================================================\n// Locale Types\n// ============================================================================\n\n/**\n * Locale strings for internationalization\n */\nexport interface IMComposerLocale {\n /** Placeholder text for plain mode */\n placeholderPlain?: string;\n /** Placeholder text for rich mode */\n placeholderRich?: string;\n /** No results found in mention list */\n mentionNoResults?: string;\n /** Loading text for mention list */\n mentionLoading?: string;\n /** Error text for mention list */\n mentionError?: string;\n /** Remove attachment button label */\n removeAttachment?: string;\n /** Remove quote button label */\n removeQuote?: string;\n /** Upload failed message */\n uploadFailed?: string;\n /** Uploading text */\n uploading?: string;\n\n // Toolbar buttons\n /** Undo button */\n undo?: string;\n /** Redo button */\n redo?: string;\n /** Heading dropdown */\n heading?: string;\n /** Heading 1 */\n heading1?: string;\n /** Heading 2 */\n heading2?: string;\n /** Heading 3 */\n heading3?: string;\n /** Heading 4 */\n heading4?: string;\n /** Paragraph */\n paragraph?: string;\n /** List dropdown */\n list?: string;\n /** Bullet list */\n bulletList?: string;\n /** Ordered list */\n orderedList?: string;\n /** Task list */\n taskList?: string;\n /** Blockquote button */\n blockquote?: string;\n /** Code block button */\n codeBlock?: string;\n /** Bold button */\n bold?: string;\n /** Italic button */\n italic?: string;\n /** Strikethrough button */\n strike?: string;\n /** Inline code button */\n code?: string;\n /** Underline button */\n underline?: string;\n /** Highlight button */\n highlight?: string;\n /** Remove highlight */\n removeHighlight?: string;\n /** Link button */\n link?: string;\n /** Link input placeholder */\n linkPlaceholder?: string;\n /** Apply link */\n applyLink?: string;\n /** Open link */\n openLink?: string;\n /** Remove link */\n removeLink?: string;\n /** Superscript button */\n superscript?: string;\n /** Subscript button */\n subscript?: string;\n /** Align left button */\n alignLeft?: string;\n /** Align center button */\n alignCenter?: string;\n /** Align right button */\n alignRight?: string;\n /** Align justify button */\n alignJustify?: string;\n /** Insert image button */\n insertImage?: string;\n /** Upload image */\n uploadImage?: string;\n /** Click to upload */\n clickToUpload?: string;\n /** Or drag and drop */\n orDragAndDrop?: string;\n /** Maximum files */\n maxFiles?: string;\n /** Clear all */\n clearAll?: string;\n}\n\n/**\n * Default English locale\n */\nexport const defaultLocale: IMComposerLocale = {\n placeholderPlain: 'Type a message...',\n placeholderRich: 'Write something...',\n mentionNoResults: 'No results found',\n mentionLoading: 'Loading...',\n mentionError: 'Failed to load',\n removeAttachment: 'Remove',\n removeQuote: 'Remove quote',\n uploadFailed: 'Upload failed',\n uploading: 'Uploading...',\n\n // Toolbar buttons\n undo: 'Undo',\n redo: 'Redo',\n heading: 'Heading',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n paragraph: 'Paragraph',\n list: 'List',\n bulletList: 'Bullet List',\n orderedList: 'Ordered List',\n taskList: 'Task List',\n blockquote: 'Blockquote',\n codeBlock: 'Code Block',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n code: 'Code',\n underline: 'Underline',\n highlight: 'Highlight',\n removeHighlight: 'Remove Highlight',\n link: 'Link',\n linkPlaceholder: 'Paste a link...',\n applyLink: 'Apply',\n openLink: 'Open in new window',\n removeLink: 'Remove link',\n superscript: 'Superscript',\n subscript: 'Subscript',\n alignLeft: 'Align Left',\n alignCenter: 'Align Center',\n alignRight: 'Align Right',\n alignJustify: 'Justify',\n insertImage: 'Insert Image',\n uploadImage: 'Upload Image',\n clickToUpload: 'Click to upload',\n orDragAndDrop: 'or drag and drop',\n maxFiles: 'Maximum {limit} file(s), {size}MB each',\n clearAll: 'Clear All',\n};\n\n// ============================================================================\n// Props Types\n// ============================================================================\n\n/**\n * Send keymap configuration\n */\nexport type SendKeymap = 'enter' | 'ctrlEnter' | 'cmdEnter';\n\n/**\n * Editor mode\n */\nexport type EditorMode = 'plain' | 'rich';\n\n/**\n * Attachment limit exceeded reason\n */\nexport type AttachmentLimitReason = 'count' | 'size' | 'mime';\n\n/**\n * Main component props\n */\nexport interface IMComposerProps {\n // Mode\n /** Controlled mode */\n mode?: EditorMode;\n /** Default mode for uncontrolled usage */\n defaultMode?: EditorMode;\n\n // Callbacks\n /** Called when user triggers send action */\n onSend?: (payload: PlainMessagePayload | MarkdownMessagePayload) => void;\n /** Called when editor content changes */\n onChange?: () => void;\n /** Context menu handler */\n onContextMenu?: MouseEventHandler<HTMLDivElement>;\n /** Called when quote is removed */\n onQuoteRemoved?: () => void;\n\n // Plain Mode - Mention\n /** Enable @mention feature */\n enableMention?: boolean;\n /** Async provider for mention suggestions */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Maximum number of mentions allowed */\n maxMentions?: number;\n /** Custom render function for mention list items */\n renderMentionItem?: (props: { member: Member; isSelected: boolean }) => ReactNode;\n /** Mention list placement relative to cursor: 'top' or 'bottom' */\n mentionPlacement?: 'top' | 'bottom';\n\n // Plain Mode - Attachments\n /** Enable file attachments */\n enableAttachments?: boolean;\n /** Attachment preview bar placement */\n attachmentPreviewPlacement?: 'top' | 'bottom';\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Allowed MIME types (supports wildcards like \"image/*\") */\n allowedMimeTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Called when attachment limit is exceeded */\n onAttachmentLimitExceeded?: (reason: AttachmentLimitReason, file: File) => void;\n /** Called when attachments change */\n onFilesChange?: (attachments: Attachment[]) => void;\n /** Show attachment preview bar */\n showAttachmentPreview?: boolean;\n\n // Rich Mode\n /** Markdown options */\n markdownOptions?: {\n enabledSyntax?: string[];\n };\n /** Image upload handler with optional progress callback */\n uploadImage?: UploadImageFn;\n\n // Keymap\n /** Keymap configuration */\n keymap?: {\n send?: SendKeymap;\n };\n\n // Common\n /** Placeholder text (string or per-mode object) */\n placeholder?: string | { plain?: string; rich?: string };\n /** Disable the editor */\n disabled?: boolean;\n /** Additional CSS class */\n className?: string;\n\n // i18n\n /** Locale strings */\n locale?: IMComposerLocale;\n}\n\n// ============================================================================\n// Ref Types\n// ============================================================================\n\n/**\n * Methods exposed via ref\n */\nexport interface IMComposerRef {\n /** Focus the editor */\n focus: () => void;\n /** Clear the editor content */\n clear: () => void;\n /** Export current content as payload. Returns null if empty or uploading */\n exportPayload: () => PlainMessagePayload | MarkdownMessagePayload | null;\n\n // Rich mode\n /** Import markdown content (rich mode only) */\n importMarkdown: (markdown: string) => void;\n\n // Attachments (plain mode only)\n /** Get current attachments */\n getAttachments: () => Attachment[];\n /** Set attachments */\n setAttachments: (attachments: Attachment[]) => void;\n /** Add files to attachments */\n addFiles: (files: FileList | File[]) => void;\n /** Remove a specific attachment by ID */\n removeAttachment: (id: string) => void;\n /** Clear all attachments */\n clearAttachments: () => void;\n\n // Quote (plain mode only)\n /** Insert or replace a quote */\n insertQuote: (title: string, content: string) => void;\n\n // Mention (plain mode only)\n /** Programmatically insert a mention */\n insertMention: (userId: string, display: string) => void;\n\n // Draft\n /** Get current draft state */\n getDraft: () => ComposerDraft;\n /** Restore from draft state */\n setDraft: (draft: ComposerDraft) => void;\n\n // Text operations\n /** Set text content (with optional mentions for plain mode) */\n setText: (text: string, mentions?: Member[]) => void;\n /** Insert text at cursor */\n insertText: (text: string) => void;\n}\n\n// ============================================================================\n// Internal Types (not exported from main entry)\n// ============================================================================\n\n/**\n * @internal Mention suggestion state\n */\nexport interface MentionSuggestionState {\n active: boolean;\n query: string;\n items: Member[];\n selectedIndex: number;\n loading: boolean;\n error: boolean;\n /** Command to insert a mention (replaces @ trigger) */\n command: ((member: { userId: string; display: string }) => void) | null;\n}\n\n/**\n * @internal Composition state for IME handling\n */\nexport interface CompositionState {\n isComposing: boolean;\n}\n\n/**\n * @internal Upload state for images\n */\nexport interface UploadState {\n uploadingCount: number;\n}\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport interface CompositionExtensionStorage {\n isComposing: boolean;\n}\n\nexport const compositionPluginKey = new PluginKey('composition');\n\n/**\n * Extension to track IME composition state.\n * This is critical for handling CJK input correctly.\n */\nexport const CompositionExtension = Extension.create<{}, CompositionExtensionStorage>({\n name: 'composition',\n\n addStorage() {\n return {\n isComposing: false,\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n\n return [\n new Plugin({\n key: compositionPluginKey,\n props: {\n handleDOMEvents: {\n compositionstart: () => {\n extension.storage.isComposing = true;\n return false;\n },\n compositionend: () => {\n extension.storage.isComposing = false;\n return false;\n },\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport type { SendKeymap } from '../../types';\n\nexport interface KeymapExtensionOptions {\n /** Send keymap configuration (can be a function for dynamic value) */\n send: SendKeymap | (() => SendKeymap);\n /** Callback when send is triggered */\n onSend?: () => void;\n /** Check if mention list is open */\n isMentionListOpen?: () => boolean;\n /** Check if uploading */\n isUploading?: () => boolean;\n /** Check if composing (IME) */\n isComposing?: () => boolean;\n}\n\nexport interface KeymapExtensionStorage {\n options: KeymapExtensionOptions;\n}\n\nexport const keymapPluginKey = new PluginKey('imKeymap');\n\n/**\n * Extension to handle send/newline keyboard shortcuts with proper priority.\n *\n * Priority order (as per PRD):\n * 1. IME composing → ignore all shortcuts\n * 2. Mention list open → ↑↓ Enter Esc for navigation\n * 3. Uploading → disable send\n * 4. Editor default behavior\n * 5. Send keymap\n */\nexport const KeymapExtension = Extension.create<KeymapExtensionOptions, KeymapExtensionStorage>({\n name: 'imKeymap',\n\n addOptions() {\n return {\n send: 'enter',\n onSend: undefined,\n isMentionListOpen: () => false,\n isUploading: () => false,\n isComposing: () => false,\n };\n },\n\n addStorage() {\n return {\n options: this.options,\n };\n },\n\n addKeyboardShortcuts() {\n const getSend = (): SendKeymap => {\n const { send } = this.options;\n return typeof send === 'function' ? send() : send;\n };\n\n const isSendKey = (event: KeyboardEvent): boolean => {\n const send = getSend();\n\n switch (send) {\n case 'enter':\n return event.key === 'Enter' && !event.shiftKey && !event.ctrlKey && !event.metaKey;\n case 'ctrlEnter':\n return event.key === 'Enter' && event.ctrlKey;\n case 'cmdEnter':\n return event.key === 'Enter' && event.metaKey;\n default:\n return false;\n }\n };\n\n const isNewlineKey = (event: KeyboardEvent): boolean => {\n const send = getSend();\n\n switch (send) {\n case 'enter':\n return event.key === 'Enter' && event.shiftKey;\n case 'ctrlEnter':\n case 'cmdEnter':\n return event.key === 'Enter' && !event.ctrlKey && !event.metaKey;\n default:\n return false;\n }\n };\n\n return {\n Enter: ({ editor }) => {\n const event = (editor.view.dom.ownerDocument.defaultView as Window & { event?: KeyboardEvent })?.event;\n if (!event) return false;\n\n // Priority 1: IME composing\n if (this.options.isComposing?.()) {\n return false;\n }\n\n // Priority 2: Mention list open (handled by mention extension)\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n // Check for send\n if (isSendKey(event)) {\n // Priority 3: Uploading\n if (this.options.isUploading?.()) {\n return true; // Block send but consume the event\n }\n\n // Priority 5: Send\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n // Check for newline\n if (isNewlineKey(event)) {\n return editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ]);\n }\n\n return false;\n },\n\n 'Shift-Enter': ({ editor }) => {\n const send = getSend();\n\n if (this.options.isComposing?.()) {\n return false;\n }\n\n // For 'enter' mode, Shift+Enter creates newline\n if (send === 'enter') {\n return editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ]);\n }\n\n return false;\n },\n\n 'Mod-Enter': ({ editor }) => {\n if (this.options.isComposing?.()) {\n return false;\n }\n\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n const send = getSend();\n\n // Mod-Enter is Cmd+Enter on Mac, Ctrl+Enter on Windows/Linux\n if (send === 'cmdEnter' || send === 'ctrlEnter') {\n if (this.options.isUploading?.()) {\n return true;\n }\n\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n return false;\n },\n\n // Explicit Ctrl-Enter for Mac (where Mod is Cmd)\n 'Ctrl-Enter': () => {\n if (this.options.isComposing?.()) {\n return false;\n }\n\n if (this.options.isMentionListOpen?.()) {\n return false;\n }\n\n const send = getSend();\n\n if (send === 'ctrlEnter') {\n if (this.options.isUploading?.()) {\n return true;\n }\n\n if (this.options.onSend) {\n this.options.onSend();\n return true;\n }\n }\n\n return false;\n },\n };\n },\n});\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport interface PlainTextExtensionOptions {\n /** Callback when files are pasted */\n onPasteFiles?: (files: File[]) => void;\n}\n\nexport const plainTextPluginKey = new PluginKey('plainText');\n\n/**\n * Serialize document slice to plain text with single newlines between paragraphs.\n */\nfunction serializeToPlainText(slice: any): string {\n let text = '';\n let isFirst = true;\n\n slice.content.forEach((node: any) => {\n if (node.type.name === 'quote') {\n // Skip quote nodes in clipboard\n return;\n }\n\n if (node.type.name === 'paragraph') {\n if (!isFirst) {\n text += '\\n';\n }\n isFirst = false;\n\n node.content?.forEach((child: any) => {\n if (child.isText) {\n text += child.text || '';\n } else if (child.type.name === 'mention') {\n text += `@${child.attrs.display || child.attrs.userId}`;\n } else if (child.type.name === 'hardBreak') {\n text += '\\n';\n }\n });\n }\n });\n\n return text;\n}\n\n/**\n * Extension for plain text mode.\n * Handles paste events to ensure plain text only and file detection.\n */\nexport const PlainTextExtension = Extension.create<PlainTextExtensionOptions>({\n name: 'plainText',\n\n addOptions() {\n return {\n onPasteFiles: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n\n return [\n new Plugin({\n key: plainTextPluginKey,\n props: {\n handlePaste: (view, event) => {\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n\n // Check for files\n const files = Array.from(clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n extension.options.onPasteFiles?.(files);\n return true;\n }\n\n // Force plain text paste (strip formatting, keep newlines)\n const text = clipboardData.getData('text/plain');\n if (text) {\n event.preventDefault();\n\n const { state, dispatch } = view;\n const { tr, schema } = state;\n\n // Split by newlines and create paragraphs\n const lines = text.split(/\\r?\\n/);\n const nodes: any[] = [];\n\n lines.forEach((line, index) => {\n if (index > 0) {\n // Add hard break for newlines within the paste\n nodes.push(schema.nodes.hardBreak?.create() || schema.text('\\n'));\n }\n if (line) {\n nodes.push(schema.text(line));\n }\n });\n\n if (nodes.length > 0) {\n const fragment = state.schema.nodes.doc.create(\n null,\n state.schema.nodes.paragraph.create(null, nodes)\n );\n const slice = fragment.slice(1, fragment.content.size - 1);\n dispatch(tr.replaceSelection(slice));\n }\n\n return true;\n }\n\n return false;\n },\n\n // Disable dropping rich content\n handleDrop: (view, event) => {\n const dataTransfer = event.dataTransfer;\n if (!dataTransfer) return false;\n\n const files = Array.from(dataTransfer.files);\n if (files.length > 0) {\n event.preventDefault();\n extension.options.onPasteFiles?.(files);\n return true;\n }\n\n return false;\n },\n\n // Custom clipboard text serializer to avoid double newlines\n clipboardTextSerializer: (slice) => {\n return serializeToPlainText(slice);\n },\n },\n }),\n ];\n },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\nimport { PluginKey } from '@tiptap/pm/state';\nimport Mention from '@tiptap/extension-mention';\nimport type { SuggestionProps, SuggestionKeyDownProps } from '@tiptap/suggestion';\nimport type { Member, MentionSuggestionState } from '../../types';\n\nexport interface MentionExtensionOptions {\n /** Provider for mention suggestions */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Maximum number of mentions allowed */\n maxMentions?: number;\n /** Callback when mention state changes */\n onMentionStateChange?: (state: MentionSuggestionState) => void;\n /** Check if composing */\n isComposing?: () => boolean;\n}\n\nexport const mentionPluginKey = new PluginKey('mentionSuggestion');\n\n/**\n * Custom mention node that extends Tiptap's Mention.\n * The node is atomic (cursor cannot enter) and stores both userId and display.\n */\nexport const MentionNode = Node.create({\n name: 'mention',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n renderLabel: ({ node }: { node: any }) => `@${node.attrs.display}`,\n suggestion: {},\n };\n },\n\n group: 'inline',\n inline: true,\n selectable: false,\n atom: true, // Cannot be split, cursor cannot enter\n\n addAttributes() {\n return {\n userId: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-user-id'),\n renderHTML: (attributes) => ({\n 'data-user-id': attributes.userId,\n }),\n },\n display: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-display'),\n renderHTML: (attributes) => ({\n 'data-display': attributes.display,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'span',\n mergeAttributes(\n { 'data-type': this.name, class: 'im-mention' },\n this.options.HTMLAttributes,\n HTMLAttributes\n ),\n `@${node.attrs.display}`,\n ];\n },\n\n renderText({ node }) {\n // Output format: @{userId} (with trailing space handled during export)\n return `@${node.attrs.userId}`;\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText('', pos, pos + node.nodeSize);\n return false;\n }\n return true;\n });\n\n return isMention;\n }),\n };\n },\n});\n\n/**\n * Create mention extension with suggestion functionality.\n */\nexport function createMentionExtension(options: MentionExtensionOptions) {\n let currentState = {\n active: false,\n query: '',\n items: [] as Member[],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null as ((member: { userId: string; display: string }) => void) | null,\n };\n\n const updateState = (updates: Partial<typeof currentState>) => {\n currentState = { ...currentState, ...updates };\n options.onMentionStateChange?.(currentState);\n };\n\n return Mention.extend({\n name: 'mention',\n\n addOptions() {\n return {\n ...this.parent?.(),\n suggestion: {\n char: '@',\n pluginKey: mentionPluginKey,\n\n items: async ({ query }: { query: string }): Promise<Member[]> => {\n if (!options.mentionProvider) {\n return [];\n }\n\n updateState({ loading: true, error: false, query });\n\n try {\n const items = await options.mentionProvider(query);\n updateState({ items, loading: false });\n return items;\n } catch {\n updateState({ error: true, loading: false, items: [] });\n return [];\n }\n },\n\n render: () => {\n return {\n onStart: (props: SuggestionProps) => {\n // Wrap command to match our interface\n const wrappedCommand = (member: { userId: string; display: string }) => {\n (props.command as any)({\n userId: member.userId,\n display: member.display,\n });\n };\n\n updateState({\n active: true,\n query: props.query,\n selectedIndex: 0,\n command: wrappedCommand,\n });\n },\n\n onUpdate: (props: SuggestionProps) => {\n // Wrap command to match our interface\n const wrappedCommand = (member: { userId: string; display: string }) => {\n (props.command as any)({\n userId: member.userId,\n display: member.display,\n });\n };\n\n updateState({\n query: props.query,\n selectedIndex: 0,\n command: wrappedCommand,\n });\n },\n\n onKeyDown: (props: SuggestionKeyDownProps): boolean => {\n const { event } = props;\n\n // Don't handle keys during IME composition\n if (options.isComposing?.() || event.isComposing) {\n return false;\n }\n\n if (event.key === 'ArrowUp') {\n updateState({\n selectedIndex:\n (currentState.selectedIndex - 1 + currentState.items.length) %\n currentState.items.length,\n });\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n updateState({\n selectedIndex: (currentState.selectedIndex + 1) % currentState.items.length,\n });\n return true;\n }\n\n if (event.key === 'Enter') {\n const selectedMember = currentState.items[currentState.selectedIndex];\n if (selectedMember && currentState.command) {\n currentState.command({\n userId: selectedMember.userId,\n display: selectedMember.display,\n });\n }\n return true;\n }\n\n if (event.key === 'Escape') {\n updateState({ active: false, command: null });\n return true;\n }\n\n return false;\n },\n\n onExit: () => {\n updateState({\n active: false,\n query: '',\n items: [],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null,\n });\n },\n };\n },\n\n command: ({ editor, range, props }: { editor: any; range: any; props: any }) => {\n // Check mention limit\n if (options.maxMentions) {\n let mentionCount = 0;\n editor.state.doc.descendants((node: any) => {\n if (node.type.name === 'mention') {\n mentionCount++;\n }\n });\n if (mentionCount >= options.maxMentions) {\n return;\n }\n }\n\n // Insert mention node without trailing space\n editor\n .chain()\n .focus()\n .insertContentAt(range, [\n {\n type: 'mention',\n attrs: {\n userId: props.userId,\n display: props.display,\n },\n },\n ])\n .run();\n },\n },\n };\n },\n\n addAttributes() {\n return {\n userId: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-user-id'),\n renderHTML: (attributes) => ({\n 'data-user-id': attributes.userId,\n }),\n },\n display: {\n default: null,\n parseHTML: (element) => element.getAttribute('data-display'),\n renderHTML: (attributes) => ({\n 'data-display': attributes.display,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `span[data-type=\"${this.name}\"]`,\n },\n ];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'span',\n mergeAttributes(\n { 'data-type': this.name, class: 'im-mention' },\n HTMLAttributes\n ),\n `@${node.attrs.display}`,\n ];\n },\n });\n}\n\nexport { mentionPluginKey as MentionPluginKey };\n","import React from 'react';\nimport { NodeViewWrapper, type NodeViewProps } from '@tiptap/react';\n\n/**\n * React NodeView component for rendering quote nodes in the editor.\n */\nexport function QuoteNodeView({ node, editor, selected }: NodeViewProps) {\n const { title, content } = node.attrs;\n\n const handleRemove = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n editor.commands.removeQuote();\n };\n\n return (\n <NodeViewWrapper\n className={`im-quote-node ${selected ? 'im-quote-node--selected' : ''}`}\n data-type=\"quote\"\n >\n <div className=\"im-quote-node__content\">\n <span className=\"im-quote-node__title\">{title}</span>\n <span className=\"im-quote-node__text\">{content}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-quote-node__remove-btn\"\n onClick={handleRemove}\n contentEditable={false}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n </NodeViewWrapper>\n );\n}\n","import { Node, mergeAttributes } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { QuoteNodeView } from '../../components/QuoteNodeView';\n\nexport interface QuoteExtensionOptions {\n /** Callback when quote is removed */\n onQuoteRemoved?: () => void;\n /** Remove button label */\n removeLabel?: string;\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n quote: {\n /** Insert a quote at the start of the document */\n insertQuote: (title: string, content: string) => ReturnType;\n /** Remove the quote */\n removeQuote: () => ReturnType;\n };\n }\n}\n\n/**\n * Quote node extension for displaying quoted messages in the editor.\n * The quote is always at the top of the document and can be selected/deleted.\n */\nexport const QuoteExtension = Node.create<QuoteExtensionOptions>({\n name: 'quote',\n\n addOptions() {\n return {\n onQuoteRemoved: undefined,\n removeLabel: 'Remove quote',\n };\n },\n\n group: 'block',\n atom: true,\n selectable: true,\n draggable: false,\n\n addAttributes() {\n return {\n title: {\n default: '',\n parseHTML: (element) => element.getAttribute('data-title'),\n renderHTML: (attributes) => ({\n 'data-title': attributes.title,\n }),\n },\n content: {\n default: '',\n parseHTML: (element) => element.getAttribute('data-content'),\n renderHTML: (attributes) => ({\n 'data-content': attributes.content,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"quote\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes({ 'data-type': 'quote', class: 'im-quote-node' }, HTMLAttributes),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(QuoteNodeView);\n },\n\n addCommands() {\n return {\n insertQuote:\n (title: string, content: string) =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const node = this.type.create({ title, content });\n // Check if first node is already a quote\n const firstNode = tr.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n // Replace existing quote\n tr.replaceWith(0, firstNode.nodeSize, node);\n } else {\n // Insert at the beginning\n tr.insert(0, node);\n }\n }\n return true;\n },\n\n removeQuote:\n () =>\n ({ tr, dispatch, state }) => {\n if (dispatch) {\n const firstNode = state.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n tr.delete(0, firstNode.nodeSize);\n this.options.onQuoteRemoved?.();\n }\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: ({ editor }) => {\n const { selection } = editor.state;\n const { $anchor, empty } = selection;\n const firstNode = editor.state.doc.firstChild;\n\n // If quote node is selected, delete it\n if (firstNode?.type.name === 'quote') {\n const quoteSize = firstNode.nodeSize;\n\n // Cursor is right after quote (at start of first paragraph)\n if (empty && $anchor.pos === quoteSize + 1) {\n editor.commands.removeQuote();\n return true;\n }\n\n // Quote is selected\n const node = editor.state.doc.nodeAt(selection.from);\n if (node?.type.name === 'quote') {\n editor.commands.removeQuote();\n return true;\n }\n }\n\n return false;\n },\n Delete: ({ editor }) => {\n const { selection } = editor.state;\n const node = editor.state.doc.nodeAt(selection.from);\n if (node?.type.name === 'quote') {\n editor.commands.removeQuote();\n return true;\n }\n return false;\n },\n };\n },\n});\n","import type { Editor } from '@tiptap/core';\nimport type { MentionInfo } from '../types';\n\n/**\n * Extract plain text and mention information from the editor.\n * Mention tokens are output as @{userId} followed by a space.\n *\n * @param editor Tiptap editor instance\n * @returns Object containing plainText and mentions array with UTF-16 indices\n */\nexport function extractPlainTextWithMentions(editor: Editor): {\n plainText: string;\n mentions: MentionInfo[];\n} {\n const mentions: MentionInfo[] = [];\n let plainText = '';\n\n const doc = editor.state.doc;\n\n // Track if we need to add space after mention\n let lastWasMention = false;\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'mention') {\n const userId = node.attrs.userId;\n const display = node.attrs.display;\n\n // Calculate start index (UTF-16)\n const start = plainText.length;\n\n // Mention text format: @{userId}\n const mentionText = `@${userId}`;\n plainText += mentionText;\n\n // End index (exclusive)\n const end = plainText.length;\n\n mentions.push({\n userId,\n display,\n start,\n end,\n });\n\n lastWasMention = true;\n return false; // Don't descend into mention node\n }\n\n if (node.isText) {\n const text = node.text || '';\n // If last was mention and text doesn't start with space, add one\n if (lastWasMention && text.length > 0 && !text.startsWith(' ')) {\n plainText += ' ';\n }\n plainText += text;\n lastWasMention = false;\n return false;\n }\n\n if (node.type.name === 'hardBreak') {\n // Add space after mention if needed before the line break\n if (lastWasMention) {\n plainText += ' ';\n }\n plainText += '\\n';\n lastWasMention = false;\n return false;\n }\n\n if (node.type.name === 'paragraph') {\n // Add space after mention if needed, then add newline before paragraph (except first)\n if (plainText.length > 0) {\n if (lastWasMention) {\n plainText += ' ';\n }\n if (!plainText.endsWith('\\n')) {\n plainText += '\\n';\n }\n }\n lastWasMention = false;\n return true; // Descend into paragraph\n }\n\n return true;\n });\n\n // If document ends with a mention, add trailing space\n if (lastWasMention) {\n plainText += ' ';\n }\n\n return { plainText: plainText.trim(), mentions };\n}\n\n/**\n * Calculate UTF-16 code unit length of a string.\n * JavaScript strings are already in UTF-16, so this is just the length.\n */\nexport function utf16Length(str: string): number {\n return str.length;\n}\n\n/**\n * Check if mention indices are valid and aligned with the plainText.\n */\nexport function validateMentionIndices(\n plainText: string,\n mentions: MentionInfo[]\n): boolean {\n for (const mention of mentions) {\n if (mention.start < 0 || mention.end > plainText.length || mention.start >= mention.end) {\n return false;\n }\n\n // Check that the text at the indices matches the expected format\n const extracted = plainText.slice(mention.start, mention.end);\n const expected = `@${mention.userId}`;\n\n if (extracted !== expected) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Create a mention info object with calculated indices.\n */\nexport function createMentionInfo(\n userId: string,\n display: string,\n startIndex: number\n): MentionInfo {\n const mentionText = `@${userId}`;\n return {\n userId,\n display,\n start: startIndex,\n end: startIndex + utf16Length(mentionText),\n };\n}\n\n/**\n * Parse text with @userId mentions and return structured data.\n * This is useful for restoring content from plainText.\n */\nexport function parseMentionsFromText(\n text: string,\n knownMembers: Map<string, string>\n): {\n plainText: string;\n mentions: MentionInfo[];\n} {\n const mentions: MentionInfo[] = [];\n const mentionRegex = /@(\\w+)/g;\n let match;\n\n while ((match = mentionRegex.exec(text)) !== null) {\n const userId = match[1];\n const display = knownMembers.get(userId) || userId;\n\n mentions.push({\n userId,\n display,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n\n return { plainText: text, mentions };\n}\n","import { useRef, useCallback, useMemo } from 'react';\nimport { useEditor } from '@tiptap/react';\nimport Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport History from '@tiptap/extension-history';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { CompositionExtension } from '../extensions/common/CompositionExtension';\nimport { KeymapExtension } from '../extensions/common/KeymapExtension';\nimport { PlainTextExtension } from '../extensions/plain/PlainTextExtension';\nimport { createMentionExtension } from '../extensions/plain/MentionExtension';\nimport { QuoteExtension } from '../extensions/plain/QuoteExtension';\nimport type {\n Member,\n MentionSuggestionState,\n SendKeymap,\n ComposerDraft,\n PlainMessagePayload,\n Attachment,\n QuoteInfo,\n} from '../types';\nimport { extractPlainTextWithMentions } from '../utils/mention';\n\n/** Helper to get quote from editor */\nfunction getQuoteFromEditor(editor: ReturnType<typeof useEditor>): QuoteInfo | undefined {\n if (!editor) return undefined;\n const firstNode = editor.state.doc.firstChild;\n if (firstNode?.type.name === 'quote') {\n return {\n title: firstNode.attrs.title,\n content: firstNode.attrs.content,\n };\n }\n return undefined;\n}\n\nexport interface UsePlainEditorOptions {\n /** Placeholder text */\n placeholder?: string;\n /** Keymap for send */\n sendKeymap?: SendKeymap;\n /** Called when send is triggered */\n onSend?: () => void;\n /** Enable mention */\n enableMention?: boolean;\n /** Mention provider */\n mentionProvider?: (query: string) => Promise<Member[]>;\n /** Max mentions */\n maxMentions?: number;\n /** Called when mention state changes */\n onMentionStateChange?: (state: MentionSuggestionState) => void;\n /** Called when files are pasted */\n onPasteFiles?: (files: File[]) => void;\n /** Get current uploading state */\n isUploading?: () => boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Called on content change */\n onChange?: () => void;\n /** Called when quote is removed */\n onQuoteRemoved?: () => void;\n}\n\nexport interface UsePlainEditorReturn {\n /** Tiptap editor instance */\n editor: ReturnType<typeof useEditor>;\n /** Check if composing (IME) */\n isComposing: () => boolean;\n /** Check if mention list is open */\n isMentionListOpen: () => boolean;\n /** Export payload */\n exportPayload: (attachments: Attachment[]) => PlainMessagePayload | null;\n /** Get draft */\n getDraft: (attachments: Attachment[]) => ComposerDraft;\n /** Set draft */\n setDraft: (draft: ComposerDraft) => void;\n /** Insert mention programmatically */\n insertMention: (userId: string, display: string) => void;\n /** Insert quote */\n insertQuote: (title: string, content: string) => void;\n /** Remove quote */\n removeQuote: () => void;\n /** Get current quote */\n getQuote: () => QuoteInfo | undefined;\n /** Set text content */\n setText: (text: string) => void;\n /** Insert text at cursor */\n insertText: (text: string) => void;\n /** Clear editor */\n clear: () => void;\n /** Focus editor */\n focus: () => void;\n}\n\n/**\n * Hook for managing plain text editor.\n */\nexport function usePlainEditor(options: UsePlainEditorOptions = {}): UsePlainEditorReturn {\n const {\n placeholder = 'Type a message...',\n sendKeymap = 'enter',\n onSend,\n enableMention = true,\n mentionProvider,\n maxMentions,\n onMentionStateChange,\n onPasteFiles,\n isUploading = () => false,\n disabled = false,\n onChange,\n onQuoteRemoved,\n } = options;\n\n const mentionListOpenRef = useRef(false);\n const compositionRef = useRef(false);\n const sendKeymapRef = useRef(sendKeymap);\n const onSendRef = useRef(onSend);\n\n // Keep refs in sync\n sendKeymapRef.current = sendKeymap;\n onSendRef.current = onSend;\n\n // Track mention list state\n const handleMentionStateChange = useCallback(\n (state: MentionSuggestionState) => {\n mentionListOpenRef.current = state.active;\n onMentionStateChange?.(state);\n },\n [onMentionStateChange]\n );\n\n const extensions = useMemo(() => {\n const exts = [\n Document,\n Paragraph,\n Text,\n HardBreak,\n History,\n Placeholder.configure({\n placeholder,\n }),\n CompositionExtension.configure({\n // Track composition state\n }),\n PlainTextExtension.configure({\n onPasteFiles,\n }),\n KeymapExtension.configure({\n send: () => sendKeymapRef.current,\n onSend: () => onSendRef.current?.(),\n isMentionListOpen: () => mentionListOpenRef.current,\n isUploading,\n isComposing: () => compositionRef.current,\n }),\n QuoteExtension.configure({\n onQuoteRemoved,\n }),\n ];\n\n if (enableMention) {\n exts.push(\n createMentionExtension({\n mentionProvider,\n maxMentions,\n onMentionStateChange: handleMentionStateChange,\n isComposing: () => compositionRef.current,\n })\n );\n }\n\n return exts;\n }, [\n placeholder,\n enableMention,\n mentionProvider,\n maxMentions,\n handleMentionStateChange,\n onPasteFiles,\n isUploading,\n onQuoteRemoved,\n ]);\n\n const editor = useEditor({\n extensions,\n editable: !disabled,\n onUpdate: () => {\n onChange?.();\n },\n onCreate: ({ editor }) => {\n // Update composition state from editor storage\n const updateComposition = () => {\n const storage = editor.storage as unknown as Record<string, { isComposing?: boolean } | undefined>;\n compositionRef.current = storage.composition?.isComposing ?? false;\n };\n\n // Listen for composition events\n const editorElement = editor.view.dom;\n editorElement.addEventListener('compositionstart', () => {\n compositionRef.current = true;\n });\n editorElement.addEventListener('compositionend', () => {\n compositionRef.current = false;\n });\n },\n });\n\n const isComposing = useCallback(() => {\n return compositionRef.current;\n }, []);\n\n const isMentionListOpen = useCallback(() => {\n return mentionListOpenRef.current;\n }, []);\n\n const exportPayload = useCallback(\n (attachments: Attachment[]): PlainMessagePayload | null => {\n if (!editor) return null;\n\n const { plainText, mentions } = extractPlainTextWithMentions(editor);\n const quote = getQuoteFromEditor(editor);\n\n // Empty text and no attachments → null\n if (!plainText.trim() && attachments.length === 0) {\n return null;\n }\n\n return {\n type: 'text',\n plainText,\n mentions,\n attachments,\n quote,\n };\n },\n [editor]\n );\n\n const getDraft = useCallback(\n (attachments: Attachment[]): ComposerDraft => {\n if (!editor) {\n return {\n mode: 'plain',\n };\n }\n\n const { plainText } = extractPlainTextWithMentions(editor);\n const quote = getQuoteFromEditor(editor);\n\n // Return empty draft if everything is empty\n const isEmpty = !plainText.trim() && !quote && attachments.length === 0;\n if (isEmpty) {\n return {\n mode: 'plain',\n };\n }\n\n return {\n mode: 'plain',\n editorState: JSON.stringify(editor.getJSON()),\n attachments,\n text: plainText,\n quote,\n };\n },\n [editor]\n );\n\n const setDraft = useCallback(\n (draft: ComposerDraft) => {\n if (!editor) return;\n\n try {\n if (draft.json) {\n editor.commands.setContent(draft.json);\n } else if (draft.editorState) {\n const content = JSON.parse(draft.editorState);\n editor.commands.setContent(content);\n }\n } catch (e) {\n console.error('Failed to restore draft:', e);\n }\n },\n [editor]\n );\n\n const insertMention = useCallback(\n (userId: string, display: string) => {\n if (!editor) return;\n\n editor\n .chain()\n .focus()\n .insertContent([\n {\n type: 'mention',\n attrs: { userId, display },\n },\n { type: 'text', text: ' ' },\n ])\n .run();\n },\n [editor]\n );\n\n const insertQuote = useCallback(\n (title: string, content: string) => {\n if (!editor) return;\n // Use queueMicrotask to avoid flushSync warning from ReactNodeViewRenderer\n queueMicrotask(() => {\n editor.commands.insertQuote(title, content);\n });\n },\n [editor]\n );\n\n const removeQuote = useCallback(() => {\n if (!editor) return;\n editor.commands.removeQuote();\n }, [editor]);\n\n const getQuote = useCallback((): QuoteInfo | undefined => {\n return getQuoteFromEditor(editor);\n }, [editor]);\n\n const setText = useCallback(\n (text: string) => {\n if (!editor) return;\n\n editor.commands.setContent({\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n });\n },\n [editor]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (!editor) return;\n editor.commands.insertContent(text);\n },\n [editor]\n );\n\n const clear = useCallback(() => {\n if (!editor) return;\n editor.commands.clearContent();\n }, [editor]);\n\n const focus = useCallback(() => {\n if (!editor) return;\n editor.commands.focus();\n }, [editor]);\n\n return {\n editor,\n isComposing,\n isMentionListOpen,\n exportPayload,\n getDraft,\n setDraft,\n insertMention,\n insertQuote,\n removeQuote,\n getQuote,\n setText,\n insertText,\n clear,\n focus,\n };\n}\n","import type { Attachment, AttachmentLimitReason } from '../types';\n\n/**\n * Generate a unique ID for attachments.\n */\nexport function generateAttachmentId(): string {\n return `att_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Create an Attachment object from a File.\n */\nexport function createAttachment(file: File): Attachment {\n const isImage = file.type.startsWith('image/');\n\n return {\n id: generateAttachmentId(),\n file,\n name: file.name,\n size: file.size,\n mime: file.type,\n lastModified: file.lastModified,\n previewUrl: isImage ? URL.createObjectURL(file) : undefined,\n };\n}\n\n/**\n * Revoke object URL for an attachment.\n */\nexport function revokeAttachmentUrl(attachment: Attachment): void {\n if (attachment.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl);\n }\n}\n\n/**\n * Revoke all object URLs for a list of attachments.\n */\nexport function revokeAllAttachmentUrls(attachments: Attachment[]): void {\n attachments.forEach(revokeAttachmentUrl);\n}\n\n/**\n * Check if a MIME type matches an allowed pattern.\n * Supports wildcards like \"image/*\".\n */\nexport function matchesMimeType(mime: string, pattern: string): boolean {\n if (pattern === '*/*' || pattern === '*') {\n return true;\n }\n\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return mime.startsWith(prefix + '/');\n }\n\n return mime === pattern;\n}\n\n/**\n * Check if a MIME type is allowed by any of the patterns.\n */\nexport function isMimeTypeAllowed(mime: string, allowedTypes?: string[]): boolean {\n if (!allowedTypes || allowedTypes.length === 0) {\n return true;\n }\n\n return allowedTypes.some((pattern) => matchesMimeType(mime, pattern));\n}\n\n/**\n * Validate a file against attachment constraints.\n * Returns the reason for rejection, or null if valid.\n */\nexport function validateFile(\n file: File,\n currentCount: number,\n options: {\n maxAttachments?: number;\n maxFileSize?: number;\n allowedMimeTypes?: string[];\n }\n): AttachmentLimitReason | null {\n // Check count limit\n if (options.maxAttachments !== undefined && currentCount >= options.maxAttachments) {\n return 'count';\n }\n\n // Check file size\n if (options.maxFileSize !== undefined && file.size > options.maxFileSize) {\n return 'size';\n }\n\n // Check MIME type\n if (!isMimeTypeAllowed(file.type, options.allowedMimeTypes)) {\n return 'mime';\n }\n\n return null;\n}\n\n/**\n * Format file size for display.\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport type { Attachment, AttachmentLimitReason } from '../types';\nimport {\n createAttachment,\n revokeAttachmentUrl,\n revokeAllAttachmentUrls,\n validateFile,\n} from '../utils/attachment';\n\nexport interface UseAttachmentsOptions {\n /** Maximum number of attachments */\n maxAttachments?: number;\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Allowed MIME types */\n allowedMimeTypes?: string[];\n /** Called when limit is exceeded */\n onLimitExceeded?: (reason: AttachmentLimitReason, file: File) => void;\n /** Called when attachments change */\n onChange?: (attachments: Attachment[]) => void;\n}\n\nexport interface UseAttachmentsReturn {\n /** Current attachments */\n attachments: Attachment[];\n /** Add files to attachments */\n addFiles: (files: FileList | File[]) => void;\n /** Remove attachment by ID */\n removeAttachment: (id: string) => void;\n /** Clear all attachments */\n clearAttachments: () => void;\n /** Set attachments directly */\n setAttachments: (attachments: Attachment[]) => void;\n /** Get current attachments */\n getAttachments: () => Attachment[];\n}\n\n/**\n * Hook for managing file attachments with proper objectURL lifecycle.\n */\nexport function useAttachments(options: UseAttachmentsOptions = {}): UseAttachmentsReturn {\n const {\n maxAttachments = 10,\n maxFileSize,\n allowedMimeTypes,\n onLimitExceeded,\n onChange,\n } = options;\n\n const [attachments, setAttachmentsState] = useState<Attachment[]>([]);\n const attachmentsRef = useRef<Attachment[]>([]);\n\n // Keep ref in sync with state\n useEffect(() => {\n attachmentsRef.current = attachments;\n }, [attachments]);\n\n // Cleanup all URLs on unmount\n useEffect(() => {\n return () => {\n revokeAllAttachmentUrls(attachmentsRef.current);\n };\n }, []);\n\n const addFiles = useCallback(\n (files: FileList | File[]) => {\n const fileArray = Array.from(files);\n const currentAttachments = attachmentsRef.current;\n const newAttachments: Attachment[] = [];\n let currentCount = currentAttachments.length;\n\n for (const file of fileArray) {\n const validationError = validateFile(file, currentCount, {\n maxAttachments,\n maxFileSize,\n allowedMimeTypes,\n });\n\n if (validationError) {\n onLimitExceeded?.(validationError, file);\n continue;\n }\n\n const attachment = createAttachment(file);\n newAttachments.push(attachment);\n currentCount++;\n }\n\n if (newAttachments.length > 0) {\n const updated = [...currentAttachments, ...newAttachments];\n setAttachmentsState(updated);\n onChange?.(updated);\n }\n },\n [maxAttachments, maxFileSize, allowedMimeTypes, onLimitExceeded, onChange]\n );\n\n const removeAttachment = useCallback(\n (id: string) => {\n const attachment = attachmentsRef.current.find((a) => a.id === id);\n if (attachment) {\n revokeAttachmentUrl(attachment);\n }\n\n const updated = attachmentsRef.current.filter((a) => a.id !== id);\n setAttachmentsState(updated);\n onChange?.(updated);\n },\n [onChange]\n );\n\n const clearAttachments = useCallback(() => {\n revokeAllAttachmentUrls(attachmentsRef.current);\n setAttachmentsState([]);\n onChange?.([]);\n }, [onChange]);\n\n const setAttachments = useCallback(\n (newAttachments: Attachment[]) => {\n // Revoke URLs for attachments being removed\n const currentIds = new Set(newAttachments.map((a) => a.id));\n const toRevoke = attachmentsRef.current.filter((a) => !currentIds.has(a.id));\n revokeAllAttachmentUrls(toRevoke);\n\n // Regenerate previewUrl for images if file exists but previewUrl is missing/invalid\n const processedAttachments = newAttachments.map((att) => {\n if (att.file && att.mime.startsWith('image/')) {\n return {\n ...att,\n previewUrl: URL.createObjectURL(att.file),\n };\n }\n return att;\n });\n\n setAttachmentsState(processedAttachments);\n onChange?.(processedAttachments);\n },\n [onChange]\n );\n\n const getAttachments = useCallback(() => {\n return attachmentsRef.current;\n }, []);\n\n return {\n attachments,\n addFiles,\n removeAttachment,\n clearAttachments,\n setAttachments,\n getAttachments,\n };\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { Member } from '../types';\n\nexport interface MentionListProps {\n /** List of member suggestions */\n items: Member[];\n /** Currently selected index */\n selectedIndex: number;\n /** Loading state */\n loading: boolean;\n /** Error state */\n error: boolean;\n /** Called when item is clicked */\n onSelect: (member: Member) => void;\n /** Called when mouse enters an item */\n onHover: (index: number) => void;\n /** Custom render function */\n renderItem?: (props: { member: Member; isSelected: boolean }) => React.ReactNode;\n /** Locale strings */\n locale?: {\n noResults?: string;\n loading?: string;\n error?: string;\n };\n}\n\n/**\n * Mention suggestion list component.\n */\nexport function MentionList({\n items,\n selectedIndex,\n loading,\n error,\n onSelect,\n onHover,\n renderItem,\n locale = {},\n}: MentionListProps) {\n const {\n noResults = 'No results found',\n loading: loadingText = 'Loading...',\n error: errorText = 'Failed to load',\n } = locale;\n\n const listRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Auto-scroll to selected item when selectedIndex changes\n useEffect(() => {\n const selectedItem = itemRefs.current[selectedIndex];\n if (selectedItem && listRef.current && typeof selectedItem.scrollIntoView === 'function') {\n // Use scrollIntoView with block: 'nearest' to only scroll if needed\n selectedItem.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }, [selectedIndex]);\n\n // Reset refs array when items change\n useEffect(() => {\n itemRefs.current = itemRefs.current.slice(0, items.length);\n }, [items.length]);\n\n if (loading) {\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n <div className=\"im-mention-list__status\">{loadingText}</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n <div className=\"im-mention-list__status\">{errorText}</div>\n </div>\n );\n }\n\n if (items.length === 0) {\n return (\n null\n );\n }\n\n return (\n <div className=\"im-mention-list\" ref={listRef}>\n {items.map((member, index) => {\n const isSelected = index === selectedIndex;\n\n if (renderItem) {\n return (\n <div\n key={member.userId}\n ref={(el) => { itemRefs.current[index] = el; }}\n className={`im-mention-list__item ${isSelected ? 'im-mention-list__item--selected' : ''}`}\n onClick={() => onSelect(member)}\n onMouseEnter={() => onHover(index)}\n >\n {renderItem({ member, isSelected })}\n </div>\n );\n }\n\n return (\n <div\n key={member.userId}\n ref={(el) => { itemRefs.current[index] = el; }}\n className={`im-mention-list__item ${isSelected ? 'im-mention-list__item--selected' : ''}`}\n onClick={() => onSelect(member)}\n onMouseEnter={() => onHover(index)}\n >\n {member.avatarUrl && (\n <img\n src={member.avatarUrl}\n alt={member.display}\n className=\"im-mention-list__avatar\"\n />\n )}\n <span className=\"im-mention-list__display\">{member.display}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n size,\n FloatingPortal,\n type Placement,\n} from '@floating-ui/react';\nimport type { Editor } from '@tiptap/react';\nimport type { MentionSuggestionState } from '../types';\nimport { MentionList, type MentionListProps } from './MentionList';\n\nexport interface MentionPopoverProps extends Omit<MentionListProps, 'items' | 'selectedIndex' | 'loading' | 'error'> {\n /** Mention state from editor */\n mentionState: MentionSuggestionState;\n /** The Tiptap editor instance */\n editor: Editor | null;\n /** Placement of the popover relative to cursor: 'top' or 'bottom' */\n placement?: 'top' | 'bottom';\n /** Container element for portal (defaults to document.body) */\n portalContainer?: HTMLElement | null;\n /** Z-index for the popover */\n zIndex?: number;\n}\n\n/**\n * Get cursor bounding rect from the Tiptap editor.\n */\nfunction getCursorRect(editor: Editor | null): DOMRect | null {\n if (!editor || !editor.view) return null;\n\n try {\n const { state } = editor.view;\n const { from } = state.selection;\n\n // Get coordinates at the cursor position\n const coords = editor.view.coordsAtPos(from);\n\n // Create a DOMRect-like object\n return new DOMRect(coords.left, coords.top, 1, coords.bottom - coords.top);\n } catch {\n return null;\n }\n}\n\n/**\n * MentionPopover - A floating popover for mention suggestions.\n * Uses Portal to render outside the DOM hierarchy, avoiding overflow:hidden issues.\n */\nexport function MentionPopover({\n mentionState,\n editor,\n placement = 'bottom',\n portalContainer,\n zIndex = 9999,\n onSelect,\n onHover,\n renderItem,\n locale,\n}: MentionPopoverProps) {\n const [isPositioned, setIsPositioned] = useState(false);\n const cursorRectRef = useRef<DOMRect | null>(null);\n\n // Convert placement to floating-ui placement\n const floatingPlacement: Placement = placement === 'top' ? 'top-start' : 'bottom-start';\n const fallbackPlacements: Placement[] = placement === 'top'\n ? ['bottom-start', 'top-end', 'bottom-end']\n : ['top-start', 'bottom-end', 'top-end'];\n\n // Virtual reference element that always reads from ref\n const virtualReference = useRef({\n getBoundingClientRect: () => cursorRectRef.current || new DOMRect(0, 0, 0, 0),\n }).current;\n\n const { refs, floatingStyles, update } = useFloating({\n open: mentionState.active && isPositioned,\n placement: floatingPlacement,\n middleware: [\n offset(4),\n flip({\n fallbackPlacements,\n }),\n shift({ padding: 8 }),\n size({\n apply({ availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxHeight: `${Math.min(availableHeight - 16, 300)}px`,\n });\n },\n padding: 8,\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n // Set virtual reference once\n useEffect(() => {\n refs.setReference(virtualReference);\n }, [refs, virtualReference]);\n\n // Update cursor position when mention becomes active or query changes\n useLayoutEffect(() => {\n if (mentionState.active && editor) {\n // Use requestAnimationFrame to ensure DOM is updated\n const frame = requestAnimationFrame(() => {\n const rect = getCursorRect(editor);\n if (rect) {\n cursorRectRef.current = rect;\n setIsPositioned(true);\n update?.();\n }\n });\n return () => cancelAnimationFrame(frame);\n } else {\n cursorRectRef.current = null;\n setIsPositioned(false);\n }\n }, [mentionState.active, mentionState.query, editor, update]);\n\n // Update position when items change (list height may change)\n useEffect(() => {\n if (mentionState.active && isPositioned && update) {\n update();\n }\n }, [mentionState.items, mentionState.loading, update, mentionState.active, isPositioned]);\n\n // Don't render if not active or not positioned\n if (!mentionState.active || !isPositioned) {\n return null;\n }\n\n return (\n <FloatingPortal root={portalContainer}>\n <div\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex,\n }}\n className=\"im-mention-popover\"\n >\n <MentionList\n items={mentionState.items}\n selectedIndex={mentionState.selectedIndex}\n loading={mentionState.loading}\n error={mentionState.error}\n onSelect={onSelect}\n onHover={onHover}\n renderItem={renderItem}\n locale={locale}\n />\n </div>\n </FloatingPortal>\n );\n}\n","import React from 'react';\nimport type { Attachment } from '../types';\nimport { formatFileSize } from '../utils/attachment';\n\nexport interface AttachmentPreviewProps {\n /** List of attachments */\n attachments: Attachment[];\n /** Called when remove button is clicked */\n onRemove: (id: string) => void;\n /** Placement position */\n placement?: 'top' | 'bottom';\n /** Remove button label */\n removeLabel?: string;\n}\n\n/**\n * Attachment preview bar component.\n */\nexport function AttachmentPreview({\n attachments,\n onRemove,\n placement = 'bottom',\n removeLabel = 'Remove',\n}: AttachmentPreviewProps) {\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div className={`im-attachment-preview im-attachment-preview--${placement}`}>\n {attachments.map((attachment) => (\n <div key={attachment.id} className=\"im-attachment-preview__item\">\n {attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt={attachment.name}\n className=\"im-attachment-preview__thumbnail\"\n />\n ) : (\n <div className=\"im-attachment-preview__file-icon\">\n <FileIcon />\n </div>\n )}\n <div className=\"im-attachment-preview__info\">\n <span className=\"im-attachment-preview__name\" title={attachment.name}>\n {attachment.name}\n </span>\n <span className=\"im-attachment-preview__size\">{formatFileSize(attachment.size)}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-attachment-preview__remove-btn\"\n onClick={() => onRemove(attachment.id)}\n aria-label={removeLabel}\n >\n <CloseIcon />\n </button>\n </div>\n ))}\n </div>\n );\n}\n\nfunction FileIcon() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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","\"use client\"\n\nexport type SpacerOrientation = \"horizontal\" | \"vertical\"\n\nexport interface SpacerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: SpacerOrientation\n size?: string | number\n}\n\nexport function Spacer({\n orientation = \"horizontal\",\n size,\n style = {},\n ...props\n}: SpacerProps) {\n const computedStyle = {\n ...style,\n ...(orientation === \"horizontal\" && !size && { flex: 1 }),\n ...(size && {\n width: orientation === \"vertical\" ? \"1px\" : size,\n height: orientation === \"horizontal\" ? \"1px\" : size,\n }),\n }\n\n return <div {...props} style={computedStyle} />\n}\n","import type { Node as PMNode } from \"@tiptap/pm/model\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport {\n AllSelection,\n NodeSelection,\n Selection,\n TextSelection,\n} from \"@tiptap/pm/state\"\nimport { cellAround, CellSelection } from \"@tiptap/pm/tables\"\nimport {\n findParentNodeClosestToPos,\n type Editor,\n type NodeWithPos,\n} from \"@tiptap/react\"\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\n\nexport const MAC_SYMBOLS: Record<string, string> = {\n mod: \"⌘\",\n command: \"⌘\",\n meta: \"⌘\",\n ctrl: \"⌃\",\n control: \"⌃\",\n alt: \"⌥\",\n option: \"⌥\",\n shift: \"⇧\",\n backspace: \"Del\",\n delete: \"⌦\",\n enter: \"⏎\",\n escape: \"⎋\",\n capslock: \"⇪\",\n} as const\n\nexport const SR_ONLY = {\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 whiteSpace: \"nowrap\",\n borderWidth: 0,\n} as const\n\nexport function cn(\n ...classes: (string | boolean | undefined | null)[]\n): string {\n return classes.filter(Boolean).join(\" \")\n}\n\n/**\n * Determines if the current platform is macOS\n * @returns boolean indicating if the current platform is Mac\n */\nexport function isMac(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n navigator.platform.toLowerCase().includes(\"mac\")\n )\n}\n\n/**\n * Formats a shortcut key based on the platform (Mac or non-Mac)\n * @param key - The key to format (e.g., \"ctrl\", \"alt\", \"shift\")\n * @param isMac - Boolean indicating if the platform is Mac\n * @param capitalize - Whether to capitalize the key (default: true)\n * @returns Formatted shortcut key symbol\n */\nexport const formatShortcutKey = (\n key: string,\n isMac: boolean,\n capitalize: boolean = true\n) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || (capitalize ? key.toUpperCase() : key)\n }\n\n return capitalize ? key.charAt(0).toUpperCase() + key.slice(1) : key\n}\n\n/**\n * Parses a shortcut key string into an array of formatted key symbols\n * @param shortcutKeys - The string of shortcut keys (e.g., \"ctrl-alt-shift\")\n * @param delimiter - The delimiter used to split the keys (default: \"-\")\n * @param capitalize - Whether to capitalize the keys (default: true)\n * @returns Array of formatted shortcut key symbols\n */\nexport const parseShortcutKeys = (props: {\n shortcutKeys: string | undefined\n delimiter?: string\n capitalize?: boolean\n}) => {\n const { shortcutKeys, delimiter = \"+\", capitalize = true } = props\n\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split(delimiter)\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac(), capitalize))\n}\n\n/**\n * Checks if a mark exists in the editor schema\n * @param markName - The name of the mark to check\n * @param editor - The editor instance\n * @returns boolean indicating if the mark exists in the schema\n */\nexport const isMarkInSchema = (\n markName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.marks.get(markName) !== undefined\n}\n\n/**\n * Checks if a node exists in the editor schema\n * @param nodeName - The name of the node to check\n * @param editor - The editor instance\n * @returns boolean indicating if the node exists in the schema\n */\nexport const isNodeInSchema = (\n nodeName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.nodes.get(nodeName) !== undefined\n}\n\n/**\n * Moves the focus to the next node in the editor\n * @param editor - The editor instance\n * @returns boolean indicating if the focus was moved\n */\nexport function focusNextNode(editor: Editor) {\n const { state, view } = editor\n const { doc, selection } = state\n\n const nextSel = Selection.findFrom(selection.$to, 1, true)\n if (nextSel) {\n view.dispatch(state.tr.setSelection(nextSel).scrollIntoView())\n return true\n }\n\n const paragraphType = state.schema.nodes.paragraph\n if (!paragraphType) {\n console.warn(\"No paragraph node type found in schema.\")\n return false\n }\n\n const end = doc.content.size\n const para = paragraphType.create()\n let tr = state.tr.insert(end, para)\n\n // Place the selection inside the new paragraph\n const $inside = tr.doc.resolve(end + 1)\n tr = tr.setSelection(TextSelection.near($inside)).scrollIntoView()\n view.dispatch(tr)\n return true\n}\n\n/**\n * Checks if a value is a valid number (not null, undefined, or NaN)\n * @param value - The value to check\n * @returns boolean indicating if the value is a valid number\n */\nexport function isValidPosition(pos: number | null | undefined): pos is number {\n return typeof pos === \"number\" && pos >= 0\n}\n\n/**\n * Checks if one or more extensions are registered in the Tiptap editor.\n * @param editor - The Tiptap editor instance\n * @param extensionNames - A single extension name or an array of names to check\n * @returns True if at least one of the extensions is available, false otherwise\n */\nexport function isExtensionAvailable(\n editor: Editor | null,\n extensionNames: string | string[]\n): boolean {\n if (!editor) return false\n\n const names = Array.isArray(extensionNames)\n ? extensionNames\n : [extensionNames]\n\n const found = names.some((name) =>\n editor.extensionManager.extensions.some((ext) => ext.name === name)\n )\n\n if (!found) {\n console.warn(\n `None of the extensions [${names.join(\", \")}] were found in the editor schema. Ensure they are included in the editor configuration.`\n )\n }\n\n return found\n}\n\n/**\n * Finds a node at the specified position with error handling\n * @param editor The Tiptap editor instance\n * @param position The position in the document to find the node\n * @returns The node at the specified position, or null if not found\n */\nexport function findNodeAtPosition(editor: Editor, position: number) {\n try {\n const node = editor.state.doc.nodeAt(position)\n if (!node) {\n console.warn(`No node found at position ${position}`)\n return null\n }\n return node\n } catch (error) {\n console.error(`Error getting node at position ${position}:`, error)\n return null\n }\n}\n\n/**\n * Finds the position and instance of a node in the document\n * @param props Object containing editor, node (optional), and nodePos (optional)\n * @param props.editor The Tiptap editor instance\n * @param props.node The node to find (optional if nodePos is provided)\n * @param props.nodePos The position of the node to find (optional if node is provided)\n * @returns An object with the position and node, or null if not found\n */\nexport function findNodePosition(props: {\n editor: Editor | null\n node?: PMNode | null\n nodePos?: number | null\n}): { pos: number; node: PMNode } | null {\n const { editor, node, nodePos } = props\n\n if (!editor || !editor.state?.doc) return null\n\n // Zero is valid position\n const hasValidNode = node !== undefined && node !== null\n const hasValidPos = isValidPosition(nodePos)\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n // First search for the node in the document if we have a node\n if (hasValidNode) {\n let foundPos = -1\n let foundNode: PMNode | null = null\n\n editor.state.doc.descendants((currentNode, pos) => {\n // TODO: Needed?\n // if (currentNode.type && currentNode.type.name === node!.type.name) {\n if (currentNode === node) {\n foundPos = pos\n foundNode = currentNode\n return false\n }\n return true\n })\n\n if (foundPos !== -1 && foundNode !== null) {\n return { pos: foundPos, node: foundNode }\n }\n }\n\n // If we have a valid position, use findNodeAtPosition\n if (hasValidPos) {\n const nodeAtPos = findNodeAtPosition(editor, nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n }\n\n return null\n}\n\n/**\n * Determines whether the current selection contains a node whose type matches\n * any of the provided node type names.\n * @param editor Tiptap editor instance\n * @param nodeTypeNames List of node type names to match against\n * @param checkAncestorNodes Whether to check ancestor node types up the depth chain\n */\nexport function isNodeTypeSelected(\n editor: Editor | null,\n nodeTypeNames: string[] = [],\n checkAncestorNodes: boolean = false\n): boolean {\n if (!editor || !editor.state.selection) return false\n\n const { selection } = editor.state\n if (selection.empty) return false\n\n // Direct node selection check\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n return selectedNode ? nodeTypeNames.includes(selectedNode.type.name) : false\n }\n\n // Depth-based ancestor node check\n if (checkAncestorNodes) {\n const { $from } = selection\n for (let depth = $from.depth; depth > 0; depth--) {\n const ancestorNode = $from.node(depth)\n if (nodeTypeNames.includes(ancestorNode.type.name)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check whether the current selection is fully within nodes\n * whose type names are in the provided `types` list.\n *\n * - NodeSelection → checks the selected node.\n * - Text/AllSelection → ensures all textblocks within [from, to) are allowed.\n */\nexport function selectionWithinConvertibleTypes(\n editor: Editor,\n types: string[] = []\n): boolean {\n if (!editor || types.length === 0) return false\n\n const { state } = editor\n const { selection } = state\n const allowed = new Set(types)\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node?.type?.name\n return !!nodeType && allowed.has(nodeType)\n }\n\n if (selection instanceof TextSelection || selection instanceof AllSelection) {\n let valid = true\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.isTextblock && !allowed.has(node.type.name)) {\n valid = false\n return false // stop early\n }\n return valid\n })\n return valid\n }\n\n return false\n}\n\n/**\n * Handles image upload with progress tracking and abort capability\n * @param file The file to upload\n * @param onProgress Optional callback for tracking upload progress\n * @param abortSignal Optional AbortSignal for cancelling the upload\n * @returns Promise resolving to the URL of the uploaded image\n */\nexport const handleImageUpload = async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n): Promise<string> => {\n // Validate file\n if (!file) {\n throw new Error(\"No file provided\")\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(\n `File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`\n )\n }\n\n // For demo/testing: Simulate upload progress. In production, replace the following code\n // with your own upload implementation.\n for (let progress = 0; progress <= 100; progress += 10) {\n if (abortSignal?.aborted) {\n throw new Error(\"Upload cancelled\")\n }\n await new Promise((resolve) => setTimeout(resolve, 500))\n onProgress?.({ progress })\n }\n\n return \"/images/tiptap-ui-placeholder-image.jpg\"\n}\n\ntype ProtocolOptions = {\n /**\n * The protocol scheme to be registered.\n * @default '''\n * @example 'ftp'\n * @example 'git'\n */\n scheme: string\n\n /**\n * If enabled, it allows optional slashes after the protocol.\n * @default false\n * @example true\n */\n optionalSlashes?: boolean\n}\n\ntype ProtocolConfig = Array<ProtocolOptions | string>\n\nconst ATTR_WHITESPACE =\n // eslint-disable-next-line no-control-regex\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n\nexport function isAllowedUri(\n uri: string | undefined,\n protocols?: ProtocolConfig\n) {\n const allowedProtocols: string[] = [\n \"http\",\n \"https\",\n \"ftp\",\n \"ftps\",\n \"mailto\",\n \"tel\",\n \"callto\",\n \"sms\",\n \"cid\",\n \"xmpp\",\n ]\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol =\n typeof protocol === \"string\" ? protocol : protocol.scheme\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol)\n }\n })\n }\n\n return (\n !uri ||\n uri.replace(ATTR_WHITESPACE, \"\").match(\n new RegExp(\n // eslint-disable-next-line no-useless-escape\n `^(?:(?:${allowedProtocols.join(\"|\")}):|[^a-z]|[a-z0-9+.\\-]+(?:[^a-z+.\\-:]|$))`,\n \"i\"\n )\n )\n )\n}\n\nexport function sanitizeUrl(\n inputUrl: string,\n baseUrl: string,\n protocols?: ProtocolConfig\n): string {\n try {\n const url = new URL(inputUrl, baseUrl)\n\n if (isAllowedUri(url.href, protocols)) {\n return url.href\n }\n } catch {\n // If URL creation fails, it's considered invalid\n }\n return \"#\"\n}\n\n/**\n * Update a single attribute on multiple nodes.\n *\n * @param tr - The transaction to mutate\n * @param targets - Array of { node, pos }\n * @param attrName - Attribute key to update\n * @param next - New value OR updater function receiving previous value\n * Pass `undefined` to remove the attribute.\n * @returns true if at least one node was updated, false otherwise\n */\nexport function updateNodesAttr<A extends string = string, V = unknown>(\n tr: Transaction,\n targets: readonly NodeWithPos[],\n attrName: A,\n next: V | ((prev: V | undefined) => V | undefined)\n): boolean {\n if (!targets.length) return false\n\n let changed = false\n\n for (const { pos } of targets) {\n // Always re-read from the transaction's current doc\n const currentNode = tr.doc.nodeAt(pos)\n if (!currentNode) continue\n\n const prevValue = (currentNode.attrs as Record<string, unknown>)[\n attrName\n ] as V | undefined\n const resolvedNext =\n typeof next === \"function\"\n ? (next as (p: V | undefined) => V | undefined)(prevValue)\n : next\n\n if (prevValue === resolvedNext) continue\n\n const nextAttrs: Record<string, unknown> = { ...currentNode.attrs }\n if (resolvedNext === undefined) {\n // Remove the key entirely instead of setting null\n delete nextAttrs[attrName]\n } else {\n nextAttrs[attrName] = resolvedNext\n }\n\n tr.setNodeMarkup(pos, undefined, nextAttrs)\n changed = true\n }\n\n return changed\n}\n\n/**\n * Selects the entire content of the current block node if the selection is empty.\n * If the selection is not empty, it does nothing.\n * @param editor The Tiptap editor instance\n */\nexport function selectCurrentBlockContent(editor: Editor) {\n const { selection, doc } = editor.state\n\n if (!selection.empty) return\n\n const $pos = selection.$from\n let blockNode = null\n let blockPos = -1\n\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n const pos = $pos.start(depth)\n\n if (node.isBlock && node.textContent.trim()) {\n blockNode = node\n blockPos = pos\n break\n }\n }\n\n if (blockNode && blockPos >= 0) {\n const from = blockPos\n const to = blockPos + blockNode.nodeSize - 2 // -2 to exclude the closing tag\n\n if (from < to) {\n const $from = doc.resolve(from)\n const $to = doc.resolve(to)\n const newSelection = TextSelection.between($from, $to, 1)\n\n if (newSelection && !selection.eq(newSelection)) {\n editor.view.dispatch(editor.state.tr.setSelection(newSelection))\n }\n }\n }\n}\n\n/**\n * Retrieves all nodes of specified types from the current selection.\n * @param selection The current editor selection\n * @param allowedNodeTypes An array of node type names to look for (e.g., [\"image\", \"table\"])\n * @returns An array of objects containing the node and its position\n */\nexport function getSelectedNodesOfType(\n selection: Selection,\n allowedNodeTypes: string[]\n): NodeWithPos[] {\n const results: NodeWithPos[] = []\n const allowed = new Set(allowedNodeTypes)\n\n if (selection instanceof CellSelection) {\n selection.forEachCell((node: PMNode, pos: number) => {\n if (allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n })\n return results\n }\n\n if (selection instanceof NodeSelection) {\n const { node, from: pos } = selection\n if (node && allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n return results\n }\n\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n const cellNode = selection.$anchor.doc.nodeAt(cell.pos)\n if (cellNode && allowed.has(cellNode.type.name)) {\n results.push({ node: cellNode, pos: cell.pos })\n return results\n }\n }\n\n // Fallback: find parent nodes of allowed types\n const parentNode = findParentNodeClosestToPos($anchor, (node) =>\n allowed.has(node.type.name)\n )\n\n if (parentNode) {\n results.push({ node: parentNode.node, pos: parentNode.pos })\n }\n\n return results\n}\n","import { forwardRef } from \"react\"\nimport \"@/components/tiptap-ui-primitive/separator/separator.scss\"\nimport { cn } from \"@/lib/tiptap-utils\"\n\nexport type Orientation = \"horizontal\" | \"vertical\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation\n decorative?: boolean\n}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ decorative, orientation = \"vertical\", className, ...divProps }, ref) => {\n const ariaOrientation = orientation === \"vertical\" ? orientation : undefined\n const semanticProps = decorative\n ? { role: \"none\" }\n : { \"aria-orientation\": ariaOrientation, role: \"separator\" }\n\n return (\n <div\n className={cn(\"tiptap-separator\", className)}\n data-orientation={orientation}\n {...semanticProps}\n {...divProps}\n ref={ref}\n />\n )\n }\n)\n\nSeparator.displayName = \"Separator\"\n","import type { Editor } from \"@tiptap/react\"\nimport { useEffect, useState } from \"react\"\n\ntype Orientation = \"horizontal\" | \"vertical\" | \"both\"\n\ninterface MenuNavigationOptions<T> {\n /**\n * The Tiptap editor instance, if using with a Tiptap editor.\n */\n editor?: Editor | null\n /**\n * Reference to the container element for handling keyboard events.\n */\n containerRef?: React.RefObject<HTMLElement | null>\n /**\n * Search query that affects the selected item.\n */\n query?: string\n /**\n * Array of items to navigate through.\n */\n items: T[]\n /**\n * Callback fired when an item is selected.\n */\n onSelect?: (item: T) => void\n /**\n * Callback fired when the menu should close.\n */\n onClose?: () => void\n /**\n * The navigation orientation of the menu.\n * @default \"vertical\"\n */\n orientation?: Orientation\n /**\n * Whether to automatically select the first item when the menu opens.\n * @default true\n */\n autoSelectFirstItem?: boolean\n}\n\n/**\n * Hook that implements keyboard navigation for dropdown menus and command palettes.\n *\n * Handles arrow keys, tab, home/end, enter for selection, and escape to close.\n * Works with both Tiptap editors and regular DOM elements.\n *\n * @param options - Configuration options for the menu navigation\n * @returns Object containing the selected index and a setter function\n */\nexport function useMenuNavigation<T>({\n editor,\n containerRef,\n query,\n items,\n onSelect,\n onClose,\n orientation = \"vertical\",\n autoSelectFirstItem = true,\n}: MenuNavigationOptions<T>) {\n const [selectedIndex, setSelectedIndex] = useState<number>(\n autoSelectFirstItem ? 0 : -1\n )\n\n useEffect(() => {\n const handleKeyboardNavigation = (event: KeyboardEvent) => {\n if (!items.length) return false\n\n const moveNext = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return 0\n return (currentIndex + 1) % items.length\n })\n\n const movePrev = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return items.length - 1\n return (currentIndex - 1 + items.length) % items.length\n })\n\n switch (event.key) {\n case \"ArrowUp\": {\n if (orientation === \"horizontal\") return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case \"ArrowDown\": {\n if (orientation === \"horizontal\") return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case \"ArrowLeft\": {\n if (orientation === \"vertical\") return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case \"ArrowRight\": {\n if (orientation === \"vertical\") return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case \"Tab\": {\n event.preventDefault()\n if (event.shiftKey) {\n movePrev()\n } else {\n moveNext()\n }\n return true\n }\n\n case \"Home\": {\n event.preventDefault()\n setSelectedIndex(0)\n return true\n }\n\n case \"End\": {\n event.preventDefault()\n setSelectedIndex(items.length - 1)\n return true\n }\n\n case \"Enter\": {\n if (event.isComposing) return false\n event.preventDefault()\n if (selectedIndex !== -1 && items[selectedIndex]) {\n onSelect?.(items[selectedIndex])\n }\n return true\n }\n\n case \"Escape\": {\n event.preventDefault()\n onClose?.()\n return true\n }\n\n default:\n return false\n }\n }\n\n let targetElement: HTMLElement | null = null\n\n if (editor) {\n targetElement = editor.view.dom\n } else if (containerRef?.current) {\n targetElement = containerRef.current\n }\n\n if (targetElement) {\n targetElement.addEventListener(\"keydown\", handleKeyboardNavigation, true)\n\n return () => {\n targetElement?.removeEventListener(\n \"keydown\",\n handleKeyboardNavigation,\n true\n )\n }\n }\n\n return undefined\n }, [\n editor,\n containerRef,\n items,\n selectedIndex,\n onSelect,\n onClose,\n orientation,\n ])\n\n useEffect(() => {\n if (query) {\n setSelectedIndex(autoSelectFirstItem ? 0 : -1)\n }\n }, [query, autoSelectFirstItem])\n\n return {\n selectedIndex: items.length ? selectedIndex : undefined,\n setSelectedIndex,\n }\n}\n","\"use client\"\n\nimport { useCallback, useRef } from \"react\"\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\ntype UserRef<T> =\n | ((instance: T | null) => void)\n | React.RefObject<T | null>\n | null\n | undefined\n\nconst updateRef = <T>(ref: NonNullable<UserRef<T>>, value: T | null) => {\n if (typeof ref === \"function\") {\n ref(value)\n } else if (ref && typeof ref === \"object\" && \"current\" in ref) {\n // Safe assignment without MutableRefObject\n ;(ref as { current: T | null }).current = value\n }\n}\n\nexport const useComposedRef = <T extends HTMLElement>(\n libRef: React.RefObject<T | null>,\n userRef: UserRef<T>\n) => {\n const prevUserRef = useRef<UserRef<T>>(null)\n\n return useCallback(\n (instance: T | null) => {\n if (libRef && \"current\" in libRef) {\n ;(libRef as { current: T | null }).current = instance\n }\n\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null)\n }\n\n prevUserRef.current = userRef\n\n if (userRef) {\n updateRef(userRef, instance)\n }\n },\n [libRef, userRef]\n )\n}\n\nexport default useComposedRef\n","import { forwardRef, useCallback, useEffect, useRef, useState } from \"react\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport \"@/components/tiptap-ui-primitive/toolbar/toolbar.scss\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport { useMenuNavigation } from \"@/hooks/use-menu-navigation\"\nimport { useComposedRef } from \"@/hooks/use-composed-ref\"\n\ntype BaseProps = React.HTMLAttributes<HTMLDivElement>\n\ninterface ToolbarProps extends BaseProps {\n variant?: \"floating\" | \"fixed\"\n}\n\nconst useToolbarNavigation = (\n toolbarRef: React.RefObject<HTMLDivElement | null>\n) => {\n const [items, setItems] = useState<HTMLElement[]>([])\n\n const collectItems = useCallback(() => {\n if (!toolbarRef.current) return []\n return Array.from(\n toolbarRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [role=\"button\"]:not([disabled]), [tabindex=\"0\"]:not([disabled])'\n )\n )\n }, [toolbarRef])\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const updateItems = () => setItems(collectItems())\n\n updateItems()\n const observer = new MutationObserver(updateItems)\n observer.observe(toolbar, { childList: true, subtree: true })\n\n return () => observer.disconnect()\n }, [collectItems, toolbarRef])\n\n const { selectedIndex } = useMenuNavigation<HTMLElement>({\n containerRef: toolbarRef,\n items,\n orientation: \"horizontal\",\n onSelect: (el) => el.click(),\n autoSelectFirstItem: false,\n })\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target))\n target.setAttribute(\"data-focus-visible\", \"true\")\n }\n\n const handleBlur = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target)) target.removeAttribute(\"data-focus-visible\")\n }\n\n toolbar.addEventListener(\"focus\", handleFocus, true)\n toolbar.addEventListener(\"blur\", handleBlur, true)\n\n return () => {\n toolbar.removeEventListener(\"focus\", handleFocus, true)\n toolbar.removeEventListener(\"blur\", handleBlur, true)\n }\n }, [toolbarRef])\n\n useEffect(() => {\n if (selectedIndex !== undefined && items[selectedIndex]) {\n items[selectedIndex].focus()\n }\n }, [selectedIndex, items])\n}\n\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n ({ children, className, variant = \"fixed\", ...props }, ref) => {\n const toolbarRef = useRef<HTMLDivElement>(null)\n const composedRef = useComposedRef(toolbarRef, ref)\n useToolbarNavigation(toolbarRef)\n\n return (\n <div\n ref={composedRef}\n role=\"toolbar\"\n aria-label=\"toolbar\"\n data-variant={variant}\n className={cn(\"tiptap-toolbar\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nToolbar.displayName = \"Toolbar\"\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, BaseProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\"tiptap-toolbar-group\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nToolbarGroup.displayName = \"ToolbarGroup\"\n\nexport const ToolbarSeparator = forwardRef<HTMLDivElement, BaseProps>(\n ({ ...props }, ref) => (\n <Separator ref={ref} orientation=\"vertical\" decorative {...props} />\n )\n)\nToolbarSeparator.displayName = \"ToolbarSeparator\"\n","\"use client\"\n\nimport {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n useState,\n version,\n} from \"react\"\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingPortal,\n type Placement,\n type UseFloatingReturn,\n type ReferenceType,\n FloatingDelayGroup,\n} from \"@floating-ui/react\"\nimport \"@/components/tiptap-ui-primitive/tooltip/tooltip.scss\"\n\ninterface TooltipProviderProps {\n children: React.ReactNode\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n onOpenChange?: (open: boolean) => void\n delay?: number\n closeDelay?: number\n timeout?: number\n useDelayGroup?: boolean\n}\n\ninterface TooltipTriggerProps\n extends Omit<React.HTMLProps<HTMLElement>, \"ref\"> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps\n extends Omit<React.HTMLProps<HTMLDivElement>, \"ref\"> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, \"children\">\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (\n userProps?: React.HTMLProps<HTMLElement>\n ) => Record<string, unknown>\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLDivElement>\n ) => Record<string, unknown>\n}\n\nfunction useTooltip({\n initialOpen = false,\n placement = \"top\",\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n delay = 600,\n closeDelay = 0,\n}: Omit<TooltipProviderProps, \"children\"> = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState<boolean>(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(4),\n flip({\n crossAxis: placement.includes(\"-\"),\n fallbackAxisSideDirection: \"start\",\n padding: 4,\n }),\n shift({ padding: 4 }),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n mouseOnly: true,\n move: false,\n restMs: delay,\n enabled: controlledOpen == null,\n delay: {\n close: closeDelay,\n },\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: \"tooltip\" })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = useContext(TooltipContext)\n\n if (context == null) {\n throw new Error(\"Tooltip components must be wrapped in <TooltipProvider />\")\n }\n\n return context\n}\n\nexport function Tooltip({ children, ...props }: TooltipProviderProps) {\n const tooltip = useTooltip(props)\n\n if (!props.useDelayGroup) {\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n }\n\n return (\n <FloatingDelayGroup\n delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }}\n timeoutMs={props.timeout}\n >\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = forwardRef<HTMLElement, TooltipTriggerProps>(\n function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = isValidElement(children)\n ? parseInt(version, 10) >= 19\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as { props: { ref?: React.Ref<any> } }).props.ref\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n const dataAttributes = {\n \"data-tooltip-state\": context.open ? \"open\" : \"closed\",\n }\n\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === \"object\" ? children.props : {}),\n ...dataAttributes,\n })\n )\n }\n\n return (\n <button\n ref={ref}\n data-tooltip-state={context.open ? \"open\" : \"closed\"}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nexport const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent(\n { style, children, portal = true, portalProps = {}, ...props },\n propRef\n ) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open) return null\n\n const content = (\n <div\n ref={ref}\n style={{\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n className=\"tiptap-tooltip\"\n >\n {children}\n </div>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nTooltip.displayName = \"Tooltip\"\nTooltipTrigger.displayName = \"TooltipTrigger\"\nTooltipContent.displayName = \"TooltipContent\"\n","import { forwardRef, Fragment, useMemo } from \"react\"\n\n// --- Tiptap UI Primitive ---\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/tiptap-ui-primitive/tooltip\"\n\n// --- Lib ---\nimport { cn, parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\nimport \"@/components/tiptap-ui-primitive/button/button-colors.scss\"\nimport \"@/components/tiptap-ui-primitive/button/button-group.scss\"\nimport \"@/components/tiptap-ui-primitive/button/button.scss\"\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({\n shortcuts,\n}) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n children,\n tooltip,\n showTooltip = true,\n shortcutKeys,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const shortcuts = useMemo<string[]>(\n () => parseShortcutKeys({ shortcutKeys }),\n [shortcutKeys]\n )\n\n if (!tooltip || !showTooltip) {\n return (\n <button\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </TooltipTrigger>\n <TooltipContent>\n {tooltip}\n <ShortcutDisplay shortcuts={shortcuts} />\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport const ButtonGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, children, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-button-group\", className)}\n data-orientation={orientation}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n )\n})\nButtonGroup.displayName = \"ButtonGroup\"\n\nexport default Button\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CloseIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M18.7071 6.70711C19.0976 6.31658 19.0976 5.68342 18.7071 5.29289C18.3166 4.90237 17.6834 4.90237 17.2929 5.29289L12 10.5858L6.70711 5.29289C6.31658 4.90237 5.68342 4.90237 5.29289 5.29289C4.90237 5.68342 4.90237 6.31658 5.29289 6.70711L10.5858 12L5.29289 17.2929C4.90237 17.6834 4.90237 18.3166 5.29289 18.7071C5.68342 19.0976 6.31658 19.0976 6.70711 18.7071L12 13.4142L17.2929 18.7071C17.6834 19.0976 18.3166 19.0976 18.7071 18.7071C19.0976 18.3166 19.0976 17.6834 18.7071 17.2929L13.4142 12L18.7071 6.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCloseIcon.displayName = \"CloseIcon\"\n","\"use client\"\n\nimport React, { useRef, useState } from \"react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { CloseIcon } from \"@/components/tiptap-icons/close-icon\"\nimport \"@/components/tiptap-node/image-upload-node/image-upload-node.scss\"\nimport { focusNextNode, isValidPosition } from \"@/lib/tiptap-utils\"\n\nexport interface FileItem {\n /**\n * Unique identifier for the file item\n */\n id: string\n /**\n * The actual File object being uploaded\n */\n file: File\n /**\n * Current upload progress as a percentage (0-100)\n */\n progress: number\n /**\n * Current status of the file upload process\n * @default \"uploading\"\n */\n status: \"uploading\" | \"success\" | \"error\"\n\n /**\n * URL to the uploaded file, available after successful upload\n * @optional\n */\n url?: string\n /**\n * Controller that can be used to abort the upload process\n * @optional\n */\n abortController?: AbortController\n}\n\nexport interface UploadOptions {\n /**\n * Maximum allowed file size in bytes\n */\n maxSize: number\n /**\n * Maximum number of files that can be uploaded\n */\n limit: number\n /**\n * String specifying acceptable file types (MIME types or extensions)\n * @example \".jpg,.png,image/jpeg\" or \"image/*\"\n */\n accept: string\n /**\n * Function that handles the actual file upload process\n * @param {File} file - The file to be uploaded\n * @param {Function} onProgress - Callback function to report upload progress\n * @param {AbortSignal} signal - Signal that can be used to abort the upload\n * @returns {Promise<string>} Promise resolving to the URL of the uploaded file\n */\n upload: (\n file: File,\n onProgress: (event: { progress: number }) => void,\n signal: AbortSignal\n ) => Promise<string>\n /**\n * Callback triggered when a file is uploaded successfully\n * @param {string} url - URL of the successfully uploaded file\n * @optional\n */\n onSuccess?: (url: string) => void\n /**\n * Callback triggered when an error occurs during upload\n * @param {Error} error - The error that occurred\n * @optional\n */\n onError?: (error: Error) => void\n}\n\n/**\n * Custom hook for managing multiple file uploads with progress tracking and cancellation\n */\nfunction useFileUpload(options: UploadOptions) {\n const [fileItems, setFileItems] = useState<FileItem[]>([])\n\n const uploadFile = async (file: File): Promise<string | null> => {\n if (file.size > options.maxSize) {\n const error = new Error(\n `File size exceeds maximum allowed (${options.maxSize / 1024 / 1024}MB)`\n )\n options.onError?.(error)\n return null\n }\n\n const abortController = new AbortController()\n const fileId = crypto.randomUUID()\n\n const newFileItem: FileItem = {\n id: fileId,\n file,\n progress: 0,\n status: \"uploading\",\n abortController,\n }\n\n setFileItems((prev) => [...prev, newFileItem])\n\n try {\n if (!options.upload) {\n throw new Error(\"Upload function is not defined\")\n }\n\n const url = await options.upload(\n file,\n ({ progress }) => {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId ? { ...item, progress: Math.round(progress) } : item\n )\n )\n },\n abortController.signal\n )\n\n if (!url) throw new Error(\"Upload failed: No URL returned\")\n\n if (!abortController.signal.aborted) {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId\n ? { ...item, status: \"success\", url, progress: 100 }\n : item\n )\n )\n options.onSuccess?.(url)\n return url\n }\n\n return null\n } catch (error) {\n if (!abortController.signal.aborted) {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId\n ? { ...item, status: \"error\", progress: 0 }\n : item\n )\n )\n options.onError?.(\n error instanceof Error ? error : new Error(\"Upload failed\")\n )\n }\n return null\n }\n }\n\n const uploadFiles = async (files: File[]): Promise<string[]> => {\n if (!files || files.length === 0) {\n options.onError?.(new Error(\"No files to upload\"))\n return []\n }\n\n if (options.limit && files.length > options.limit) {\n options.onError?.(\n new Error(\n `Maximum ${options.limit} file${options.limit === 1 ? \"\" : \"s\"} allowed`\n )\n )\n return []\n }\n\n // Upload all files concurrently\n const uploadPromises = files.map((file) => uploadFile(file))\n const results = await Promise.all(uploadPromises)\n\n // Filter out null results (failed uploads)\n return results.filter((url): url is string => url !== null)\n }\n\n const removeFileItem = (fileId: string) => {\n setFileItems((prev) => {\n const fileToRemove = prev.find((item) => item.id === fileId)\n if (fileToRemove?.abortController) {\n fileToRemove.abortController.abort()\n }\n if (fileToRemove?.url) {\n URL.revokeObjectURL(fileToRemove.url)\n }\n return prev.filter((item) => item.id !== fileId)\n })\n }\n\n const clearAllFiles = () => {\n fileItems.forEach((item) => {\n if (item.abortController) {\n item.abortController.abort()\n }\n if (item.url) {\n URL.revokeObjectURL(item.url)\n }\n })\n setFileItems([])\n }\n\n return {\n fileItems,\n uploadFiles,\n removeFileItem,\n clearAllFiles,\n }\n}\n\nconst CloudUploadIcon: React.FC = () => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n className=\"tiptap-image-upload-icon\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.1953 4.41771C10.3478 4.08499 9.43578 3.94949 8.5282 4.02147C7.62062 4.09345 6.74133 4.37102 5.95691 4.83316C5.1725 5.2953 4.50354 5.92989 4.00071 6.68886C3.49788 7.44783 3.17436 8.31128 3.05465 9.2138C2.93495 10.1163 3.0222 11.0343 3.3098 11.8981C3.5974 12.7619 4.07781 13.5489 4.71463 14.1995C5.10094 14.5942 5.09414 15.2274 4.69945 15.6137C4.30476 16 3.67163 15.9932 3.28532 15.5985C2.43622 14.731 1.79568 13.6816 1.41221 12.5299C1.02875 11.3781 0.91241 10.1542 1.07201 8.95084C1.23162 7.74748 1.66298 6.59621 2.33343 5.58425C3.00387 4.57229 3.89581 3.72617 4.9417 3.10998C5.98758 2.4938 7.15998 2.1237 8.37008 2.02773C9.58018 1.93176 10.7963 2.11243 11.9262 2.55605C13.0561 2.99968 14.0703 3.69462 14.8919 4.58825C15.5423 5.29573 16.0585 6.11304 16.4177 7.00002H17.4999C18.6799 6.99991 19.8288 7.37933 20.7766 8.08222C21.7245 8.78515 22.4212 9.7743 22.7637 10.9036C23.1062 12.0328 23.0765 13.2423 22.6788 14.3534C22.2812 15.4644 21.5367 16.4181 20.5554 17.0736C20.0962 17.3803 19.4752 17.2567 19.1684 16.7975C18.8617 16.3382 18.9853 15.7172 19.4445 15.4105C20.069 14.9934 20.5427 14.3865 20.7958 13.6794C21.0488 12.9724 21.0678 12.2027 20.8498 11.4841C20.6318 10.7655 20.1885 10.136 19.5853 9.6887C18.9821 9.24138 18.251 8.99993 17.5001 9.00002H15.71C15.2679 9.00002 14.8783 8.70973 14.7518 8.28611C14.4913 7.41374 14.0357 6.61208 13.4195 5.94186C12.8034 5.27164 12.0427 4.75043 11.1953 4.41771Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11 14.4142V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V14.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L12.7078 11.2936C12.7054 11.2912 12.703 11.2888 12.7005 11.2864C12.5208 11.1099 12.2746 11.0008 12.003 11L12 11L11.997 11C11.8625 11.0004 11.7343 11.0273 11.6172 11.0759C11.502 11.1236 11.3938 11.1937 11.2995 11.2864C11.297 11.2888 11.2946 11.2912 11.2922 11.2936L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L11 14.4142Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\nconst FileIcon: React.FC = () => (\n <svg\n width=\"43\"\n height=\"57\"\n viewBox=\"0 0 43 57\"\n fill=\"currentColor\"\n className=\"tiptap-image-upload-dropzone-rect-primary\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0.75 10.75C0.75 5.64137 4.89137 1.5 10 1.5H32.3431C33.2051 1.5 34.0317 1.84241 34.6412 2.4519L40.2981 8.10876C40.9076 8.71825 41.25 9.5449 41.25 10.4069V46.75C41.25 51.8586 37.1086 56 32 56H10C4.89137 56 0.75 51.8586 0.75 46.75V10.75Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n)\n\nconst FileCornerIcon: React.FC = () => (\n <svg\n width=\"10\"\n height=\"10\"\n className=\"tiptap-image-upload-dropzone-rect-secondary\"\n viewBox=\"0 0 10 10\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0.75H0.343146C1.40401 0.75 2.42143 1.17143 3.17157 1.92157L8.82843 7.57843C9.57857 8.32857 10 9.34599 10 10.4069V10.75H4C1.79086 10.75 0 8.95914 0 6.75V0.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n\ninterface ImageUploadDragAreaProps {\n /**\n * Callback function triggered when files are dropped or selected\n * @param {File[]} files - Array of File objects that were dropped or selected\n */\n onFile: (files: File[]) => void\n /**\n * Accepted file types (MIME types)\n * @default \"image/*\"\n */\n accept?: string\n /**\n * Optional child elements to render inside the drag area\n * @optional\n * @default undefined\n */\n children?: React.ReactNode\n}\n\n/**\n * Check if a file matches the accept pattern\n */\nconst isFileAccepted = (file: File, accept: string): boolean => {\n if (!accept || accept === '*' || accept === '*/*') return true\n\n const acceptTypes = accept.split(',').map(t => t.trim())\n\n return acceptTypes.some(acceptType => {\n if (acceptType.endsWith('/*')) {\n // Handle wildcard like \"image/*\"\n const baseType = acceptType.slice(0, -2)\n return file.type.startsWith(baseType)\n }\n if (acceptType.startsWith('.')) {\n // Handle extension like \".jpg\"\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase())\n }\n // Handle exact MIME type\n return file.type === acceptType\n })\n}\n\n/**\n * A component that creates a drag-and-drop area for image uploads\n */\nconst ImageUploadDragArea: React.FC<ImageUploadDragAreaProps> = ({\n onFile,\n accept = \"image/*\",\n children,\n}) => {\n const [isDragOver, setIsDragOver] = useState(false)\n const [isDragActive, setIsDragActive] = useState(false)\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(true)\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragActive(false)\n setIsDragOver(false)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(true)\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragActive(false)\n setIsDragOver(false)\n\n const files = Array.from(e.dataTransfer.files).filter(file =>\n isFileAccepted(file, accept)\n )\n if (files.length > 0) {\n onFile(files)\n }\n }\n\n return (\n <div\n className={`tiptap-image-upload-drag-area ${isDragActive ? \"drag-active\" : \"\"} ${isDragOver ? \"drag-over\" : \"\"}`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n </div>\n )\n}\n\ninterface ImageUploadPreviewProps {\n /**\n * The file item to preview\n */\n fileItem: FileItem\n /**\n * Callback to remove this file from upload queue\n */\n onRemove: () => void\n}\n\n/**\n * Component that displays a preview of an uploading file with progress\n */\nconst ImageUploadPreview: React.FC<ImageUploadPreviewProps> = ({\n fileItem,\n onRemove,\n}) => {\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 Bytes\"\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n }\n\n return (\n <div className=\"tiptap-image-upload-preview\">\n {fileItem.status === \"uploading\" && (\n <div\n className=\"tiptap-image-upload-progress\"\n style={{ width: `${fileItem.progress}%` }}\n />\n )}\n\n <div className=\"tiptap-image-upload-preview-content\">\n <div className=\"tiptap-image-upload-file-info\">\n <div className=\"tiptap-image-upload-file-icon\">\n <CloudUploadIcon />\n </div>\n <div className=\"tiptap-image-upload-details\">\n <span className=\"tiptap-image-upload-text\">\n {fileItem.file.name}\n </span>\n <span className=\"tiptap-image-upload-subtext\">\n {formatFileSize(fileItem.file.size)}\n </span>\n </div>\n </div>\n <div className=\"tiptap-image-upload-actions\">\n {fileItem.status === \"uploading\" && (\n <span className=\"tiptap-image-upload-progress-text\">\n {fileItem.progress}%\n </span>\n )}\n <Button\n type=\"button\"\n data-style=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <CloseIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nconst DropZoneContent: React.FC<{\n maxSize: number\n limit: number\n locale?: {\n clickToUpload?: string\n orDragAndDrop?: string\n maxFiles?: string\n }\n}> = ({ maxSize, limit, locale }) => (\n <>\n <div className=\"tiptap-image-upload-dropzone\">\n <FileIcon />\n <FileCornerIcon />\n <div className=\"tiptap-image-upload-icon-container\">\n <CloudUploadIcon />\n </div>\n </div>\n\n <div className=\"tiptap-image-upload-content\">\n <span className=\"tiptap-image-upload-text\">\n <em>{locale?.clickToUpload ?? \"Click to upload\"}</em> {locale?.orDragAndDrop ?? \"or drag and drop\"}\n </span>\n <span className=\"tiptap-image-upload-subtext\">\n {locale?.maxFiles\n ? locale.maxFiles\n .replace(\"{limit}\", String(limit))\n .replace(\"{size}\", String(maxSize / 1024 / 1024))\n : `Maximum ${limit} file${limit === 1 ? \"\" : \"s\"}, ${maxSize / 1024 / 1024}MB each.`}\n </span>\n </div>\n </>\n)\n\nexport const ImageUploadNode: React.FC<NodeViewProps> = (props) => {\n const { accept, limit, maxSize } = props.node.attrs\n const inputRef = useRef<HTMLInputElement>(null)\n const extension = props.extension\n const locale = extension.options.locale\n\n const uploadOptions: UploadOptions = {\n maxSize,\n limit,\n accept,\n upload: extension.options.upload,\n onSuccess: extension.options.onSuccess,\n onError: extension.options.onError,\n }\n\n const { fileItems, uploadFiles, removeFileItem, clearAllFiles } =\n useFileUpload(uploadOptions)\n\n const handleUpload = async (files: File[]) => {\n const urls = await uploadFiles(files)\n\n if (urls.length > 0) {\n const pos = props.getPos()\n\n if (isValidPosition(pos)) {\n const imageNodes = urls.map((url, index) => {\n const filename =\n files[index]?.name.replace(/\\.[^/.]+$/, \"\") || \"unknown\"\n return {\n type: extension.options.type,\n attrs: {\n ...extension.options,\n src: url,\n alt: filename,\n title: filename,\n },\n }\n })\n\n props.editor\n .chain()\n .focus()\n .deleteRange({ from: pos, to: pos + props.node.nodeSize })\n .insertContentAt(pos, imageNodes)\n .run()\n\n focusNextNode(props.editor)\n }\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) {\n extension.options.onError?.(new Error(\"No file selected\"))\n return\n }\n handleUpload(Array.from(files))\n }\n\n const handleClick = () => {\n if (inputRef.current && fileItems.length === 0) {\n inputRef.current.value = \"\"\n inputRef.current.click()\n }\n }\n\n const hasFiles = fileItems.length > 0\n\n return (\n <NodeViewWrapper\n className=\"tiptap-image-upload\"\n tabIndex={0}\n onClick={handleClick}\n >\n {!hasFiles && (\n <ImageUploadDragArea onFile={handleUpload} accept={accept}>\n <DropZoneContent maxSize={maxSize} limit={limit} locale={locale} />\n </ImageUploadDragArea>\n )}\n\n {hasFiles && (\n <div className=\"tiptap-image-upload-previews\">\n {fileItems.length > 1 && (\n <div className=\"tiptap-image-upload-header\">\n <span>{locale?.uploading ?? \"Uploading\"} {fileItems.length} files</span>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n clearAllFiles()\n }}\n >\n {locale?.clearAll ?? \"Clear All\"}\n </Button>\n </div>\n )}\n {fileItems.map((fileItem) => (\n <ImageUploadPreview\n key={fileItem.id}\n fileItem={fileItem}\n onRemove={() => removeFileItem(fileItem.id)}\n />\n ))}\n </div>\n )}\n\n <input\n ref={inputRef}\n name=\"file\"\n accept={accept}\n type=\"file\"\n multiple={limit > 1}\n onChange={handleChange}\n onClick={(e: React.MouseEvent<HTMLInputElement>) => e.stopPropagation()}\n />\n </NodeViewWrapper>\n )\n}\n","import { mergeAttributes, Node } from \"@tiptap/react\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { ImageUploadNode as ImageUploadNodeComponent } from \"@/components/tiptap-node/image-upload-node/image-upload-node\"\nimport type { NodeType } from \"@tiptap/pm/model\"\n\nexport type UploadFunction = (\n file: File,\n onProgress: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n) => Promise<string>\n\nexport interface ImageUploadNodeOptions {\n /**\n * The type of the node.\n * @default 'image'\n */\n type?: string | NodeType | undefined\n /**\n * Acceptable file types for upload.\n * @default 'image/*'\n */\n accept?: string\n /**\n * Maximum number of files that can be uploaded.\n * @default 1\n */\n limit?: number\n /**\n * Maximum file size in bytes (0 for unlimited).\n * @default 0\n */\n maxSize?: number\n /**\n * Function to handle the upload process.\n */\n upload?: UploadFunction\n /**\n * Callback for upload errors.\n */\n onError?: (error: Error) => void\n /**\n * Callback for successful uploads.\n */\n onSuccess?: (url: string) => void\n /**\n * HTML attributes to add to the image element.\n * @default {}\n * @example { class: 'foo' }\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n HTMLAttributes: Record<string, any>\n /**\n * Locale strings for i18n\n */\n locale?: {\n clickToUpload?: string\n orDragAndDrop?: string\n maxFiles?: string\n clearAll?: string\n uploading?: string\n }\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n imageUpload: {\n setImageUploadNode: (options?: ImageUploadNodeOptions) => ReturnType\n }\n }\n}\n\n/**\n * A Tiptap node extension that creates an image upload component.\n * @see registry/tiptap-node/image-upload-node/image-upload-node\n */\nexport const ImageUploadNode = Node.create<ImageUploadNodeOptions>({\n name: \"imageUpload\",\n\n group: \"block\",\n\n draggable: true,\n\n selectable: true,\n\n atom: true,\n\n addOptions() {\n return {\n type: \"image\",\n accept: \"image/*\",\n limit: 1,\n maxSize: 0,\n upload: undefined,\n onError: undefined,\n onSuccess: undefined,\n HTMLAttributes: {},\n locale: undefined,\n }\n },\n\n addAttributes() {\n return {\n accept: {\n default: this.options.accept,\n },\n limit: {\n default: this.options.limit,\n },\n maxSize: {\n default: this.options.maxSize,\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"image-upload\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes({ \"data-type\": \"image-upload\" }, HTMLAttributes),\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageUploadNodeComponent)\n },\n\n addCommands() {\n return {\n setImageUploadNode:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n }\n },\n\n /**\n * Adds Enter key handler to trigger the upload component when it's selected.\n */\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n const { selection } = editor.state\n const { nodeAfter } = selection.$from\n\n if (\n nodeAfter &&\n nodeAfter.type.name === \"imageUpload\" &&\n editor.isActive(\"imageUpload\")\n ) {\n const nodeEl = editor.view.nodeDOM(selection.$from.pos)\n if (nodeEl && nodeEl instanceof HTMLElement) {\n // Since NodeViewWrapper is wrapped with a div, we need to click the first child\n const firstChild = nodeEl.firstChild\n if (firstChild && firstChild instanceof HTMLElement) {\n firstChild.click()\n return true\n }\n }\n }\n return false\n },\n }\n },\n})\n\nexport default ImageUploadNode\n","import { mergeAttributes } from \"@tiptap/react\"\nimport TiptapHorizontalRule from \"@tiptap/extension-horizontal-rule\"\n\nexport const HorizontalRule = TiptapHorizontalRule.extend({\n renderHTML() {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, { \"data-type\": this.name }),\n [\"hr\"],\n ]\n },\n})\n\nexport default HorizontalRule\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ChevronDownIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.29289 8.29289C5.68342 7.90237 6.31658 7.90237 6.70711 8.29289L12 13.5858L17.2929 8.29289C17.6834 7.90237 18.3166 7.90237 18.7071 8.29289C19.0976 8.68342 19.0976 9.31658 18.7071 9.70711L12.7071 15.7071C12.3166 16.0976 11.6834 16.0976 11.2929 15.7071L5.29289 9.70711C4.90237 9.31658 4.90237 8.68342 5.29289 8.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nChevronDownIcon.displayName = \"ChevronDownIcon\"\n","import type { Editor } from \"@tiptap/react\"\nimport { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { useMemo } from \"react\"\n\n/**\n * Hook that provides access to a Tiptap editor instance.\n *\n * Accepts an optional editor instance directly, or falls back to retrieving\n * the editor from the Tiptap context if available. This allows components\n * to work both when given an editor directly and when used within a Tiptap\n * editor context.\n *\n * @param providedEditor - Optional editor instance to use instead of the context editor\n * @returns The provided editor or the editor from context, whichever is available\n */\nexport function useTiptapEditor(providedEditor?: Editor | null): {\n editor: Editor | null\n editorState?: Editor[\"state\"]\n canCommand?: Editor[\"can\"]\n} {\n const { editor: coreEditor } = useCurrentEditor()\n const mainEditor = useMemo(\n () => providedEditor || coreEditor,\n [providedEditor, coreEditor]\n )\n\n const editorState = useEditorState({\n editor: mainEditor,\n selector(context) {\n if (!context.editor) {\n return {\n editor: null,\n editorState: undefined,\n canCommand: undefined,\n }\n }\n\n return {\n editor: context.editor,\n editorState: context.editor.state,\n canCommand: context.editor.can,\n }\n },\n })\n\n return editorState || { editor: null }\n}\n","import { forwardRef } from \"react\"\nimport \"@/components/tiptap-ui-primitive/badge/badge-colors.scss\"\nimport \"@/components/tiptap-ui-primitive/badge/badge-group.scss\"\nimport \"@/components/tiptap-ui-primitive/badge/badge.scss\"\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"ghost\" | \"white\" | \"gray\" | \"green\" | \"default\"\n size?: \"default\" | \"small\"\n appearance?: \"default\" | \"subdued\" | \"emphasized\"\n trimText?: boolean\n}\n\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n (\n {\n variant,\n size = \"default\",\n appearance = \"default\",\n trimText = false,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={`tiptap-badge ${className || \"\"}`}\n data-style={variant}\n data-size={size}\n data-appearance={appearance}\n data-text-trim={trimText ? \"on\" : \"off\"}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nBadge.displayName = \"Badge\"\n\nexport default Badge\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type {\n Level,\n UseHeadingConfig,\n} from \"@/components/tiptap-ui/heading-button\"\nimport {\n HEADING_SHORTCUT_KEYS,\n useHeading,\n} from \"@/components/tiptap-ui/heading-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\nexport interface HeadingButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HeadingShortcutBadge({\n level,\n shortcutKeys = HEADING_SHORTCUT_KEYS[level],\n}: {\n level: Level\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling heading in a Tiptap editor.\n *\n * For custom button implementations, use the `useHeading` hook instead.\n */\nexport const HeadingButton = forwardRef<HTMLButtonElement, HeadingButtonProps>(\n (\n {\n editor: providedEditor,\n level,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n Icon,\n shortcutKeys,\n } = useHeading({\n editor,\n level,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HeadingShortcutBadge level={level} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nHeadingButton.displayName = \"HeadingButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingOneIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0001 10C21.0001 9.63121 20.7971 9.29235 20.472 9.11833C20.1468 8.94431 19.7523 8.96338 19.4454 9.16795L16.4454 11.168C15.9859 11.4743 15.8617 12.0952 16.1681 12.5547C16.4744 13.0142 17.0953 13.1384 17.5548 12.8321L19.0001 11.8685V18C19.0001 18.5523 19.4478 19 20.0001 19C20.5524 19 21.0001 18.5523 21.0001 18V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingOneIcon.displayName = \"HeadingOneIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingTwoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22.0001 12C22.0001 10.7611 21.1663 9.79297 20.0663 9.42632C18.9547 9.05578 17.6171 9.28724 16.4001 10.2C15.9582 10.5314 15.8687 11.1582 16.2001 11.6C16.5314 12.0418 17.1582 12.1314 17.6001 11.8C18.383 11.2128 19.0455 11.1942 19.4338 11.3237C19.8339 11.457 20.0001 11.7389 20.0001 12C20.0001 12.4839 19.8554 12.7379 19.6537 12.9481C19.4275 13.1837 19.1378 13.363 18.7055 13.6307C18.6313 13.6767 18.553 13.7252 18.4701 13.777C17.9572 14.0975 17.3128 14.5261 16.8163 15.2087C16.3007 15.9177 16.0001 16.8183 16.0001 18C16.0001 18.5523 16.4478 19 17.0001 19H21.0001C21.5523 19 22.0001 18.5523 22.0001 18C22.0001 17.4477 21.5523 17 21.0001 17H18.131C18.21 16.742 18.3176 16.5448 18.4338 16.385C18.6873 16.0364 19.0429 15.7775 19.5301 15.473C19.5898 15.4357 19.6536 15.3966 19.7205 15.3556C20.139 15.0992 20.6783 14.7687 21.0964 14.3332C21.6447 13.7621 22.0001 13.0161 22.0001 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingTwoIcon.displayName = \"HeadingTwoIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingThreeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4608 11.2169C19.1135 11.0531 18.5876 11.0204 18.0069 11.3619C17.5309 11.642 16.918 11.4831 16.638 11.007C16.358 10.531 16.5169 9.91809 16.9929 9.63807C18.1123 8.97962 19.3364 8.94691 20.314 9.40808C21.2839 9.86558 21.9999 10.818 21.9999 12C21.9999 12.7957 21.6838 13.5587 21.1212 14.1213C20.5586 14.6839 19.7956 15 18.9999 15C18.4476 15 17.9999 14.5523 17.9999 14C17.9999 13.4477 18.4476 13 18.9999 13C19.2651 13 19.5195 12.8947 19.707 12.7071C19.8946 12.5196 19.9999 12.2652 19.9999 12C19.9999 11.6821 19.8159 11.3844 19.4608 11.2169Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.0001 14C18.0001 13.4477 18.4478 13 19.0001 13C19.7957 13 20.5588 13.3161 21.1214 13.8787C21.684 14.4413 22.0001 15.2043 22.0001 16C22.0001 17.2853 21.2767 18.3971 20.1604 18.8994C19.0257 19.41 17.642 19.2315 16.4001 18.3C15.9582 17.9686 15.8687 17.3418 16.2001 16.9C16.5314 16.4582 17.1582 16.3686 17.6001 16.7C18.3581 17.2685 18.9744 17.24 19.3397 17.0756C19.7234 16.9029 20.0001 16.5147 20.0001 16C20.0001 15.7348 19.8947 15.4804 19.7072 15.2929C19.5196 15.1054 19.2653 15 19.0001 15C18.4478 15 18.0001 14.5523 18.0001 14Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingThreeIcon.displayName = \"HeadingThreeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFourIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 9C17.5523 9 18 9.44772 18 10V13H20V10C20 9.44772 20.4477 9 21 9C21.5523 9 22 9.44772 22 10V18C22 18.5523 21.5523 19 21 19C20.4477 19 20 18.5523 20 18V15H17C16.4477 15 16 14.5523 16 14V10C16 9.44772 16.4477 9 17 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFourIcon.displayName = \"HeadingFourIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFiveIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M16 10C16 9.44772 16.4477 9 17 9H21C21.5523 9 22 9.44772 22 10C22 10.5523 21.5523 11 21 11H18V12H18.3C20.2754 12 22 13.4739 22 15.5C22 17.5261 20.2754 19 18.3 19C17.6457 19 17.0925 18.8643 16.5528 18.5944C16.0588 18.3474 15.8586 17.7468 16.1055 17.2528C16.3525 16.7588 16.9532 16.5586 17.4472 16.8056C17.7074 16.9357 17.9542 17 18.3 17C19.3246 17 20 16.2739 20 15.5C20 14.7261 19.3246 14 18.3 14H17C16.4477 14 16 13.5523 16 13L16 12.9928V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFiveIcon.displayName = \"HeadingFiveIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingSixIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.7071 9.29289C21.0976 9.68342 21.0976 10.3166 20.7071 10.7071C19.8392 11.575 19.2179 12.2949 18.7889 13.0073C18.8587 13.0025 18.929 13 19 13C20.6569 13 22 14.3431 22 16C22 17.6569 20.6569 19 19 19C17.3431 19 16 17.6569 16 16C16 14.6007 16.2837 13.4368 16.8676 12.3419C17.4384 11.2717 18.2728 10.3129 19.2929 9.29289C19.6834 8.90237 20.3166 8.90237 20.7071 9.29289ZM19 17C18.4477 17 18 16.5523 18 16C18 15.4477 18.4477 15 19 15C19.5523 15 20 15.4477 20 16C20 16.5523 19.5523 17 19 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingSixIcon.displayName = \"HeadingSixIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HeadingOneIcon } from \"@/components/tiptap-icons/heading-one-icon\"\nimport { HeadingTwoIcon } from \"@/components/tiptap-icons/heading-two-icon\"\nimport { HeadingThreeIcon } from \"@/components/tiptap-icons/heading-three-icon\"\nimport { HeadingFourIcon } from \"@/components/tiptap-icons/heading-four-icon\"\nimport { HeadingFiveIcon } from \"@/components/tiptap-icons/heading-five-icon\"\nimport { HeadingSixIcon } from \"@/components/tiptap-icons/heading-six-icon\"\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\n/**\n * Configuration for the heading functionality\n */\nexport interface UseHeadingConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The heading level.\n */\n level: Level\n /**\n * Whether the button should hide when heading is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful heading toggle.\n */\n onToggled?: () => void\n}\n\nexport const headingIcons = {\n 1: HeadingOneIcon,\n 2: HeadingTwoIcon,\n 3: HeadingThreeIcon,\n 4: HeadingFourIcon,\n 5: HeadingFiveIcon,\n 6: HeadingSixIcon,\n}\n\nexport const HEADING_SHORTCUT_KEYS: Record<Level, string> = {\n 1: \"ctrl+alt+1\",\n 2: \"ctrl+alt+2\",\n 3: \"ctrl+alt+3\",\n 4: \"ctrl+alt+4\",\n 5: \"ctrl+alt+5\",\n 6: \"ctrl+alt+6\",\n}\n\n/**\n * Checks if heading can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n level?: Level,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"heading\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return level\n ? editor.can().setNode(\"heading\", { level })\n : editor.can().setNode(\"heading\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set heading directly on the selection,\n // or we can clear formatting/nodes to arrive at a heading.\n return level\n ? editor.can().setNode(\"heading\", { level }) || editor.can().clearNodes()\n : editor.can().setNode(\"heading\") || editor.can().clearNodes()\n}\n\n/**\n * Checks if heading is currently active\n */\nexport function isHeadingActive(\n editor: Editor | null,\n level?: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (Array.isArray(level)) {\n return level.some((l) => editor.isActive(\"heading\", { level: l }))\n }\n\n return level\n ? editor.isActive(\"heading\", { level })\n : editor.isActive(\"heading\")\n}\n\n/**\n * Toggles heading in the editor\n */\nexport function toggleHeading(\n editor: Editor | null,\n level: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n const levels = Array.isArray(level) ? level : [level]\n const toggleLevel = levels.find((l) => canToggle(editor, l))\n\n if (!toggleLevel) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const isActive = levels.some((l) =>\n editor.isActive(\"heading\", { level: l })\n )\n\n const toggle = isActive\n ? chain.setNode(\"paragraph\")\n : chain.setNode(\"heading\", { level: toggleLevel })\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the heading button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n level?: Level | Level[]\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, level, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"heading\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n if (Array.isArray(level)) {\n return level.some((l) => canToggle(editor, l))\n }\n return canToggle(editor, level)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides heading functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleHeadingButton() {\n * const { isVisible, isActive, handleToggle, Icon } = useHeading({ level: 1 })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Heading 1\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingButton() {\n * const { isVisible, isActive, handleToggle, label, Icon } = useHeading({\n * level: 2,\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Heading toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Toggle Heading 2\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useHeading(config: UseHeadingConfig) {\n const {\n editor: providedEditor,\n level,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor, level)\n const isActive = isHeadingActive(editor, level)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, level, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, level, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleHeading(editor, level)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, level, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: `Heading ${level}`,\n shortcutKeys: HEADING_SHORTCUT_KEYS[level],\n Icon: headingIcons[level],\n }\n}\n","import { forwardRef } from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.scss\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root modal={false} {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal {...props} />\n}\n\nconst DropdownMenuTrigger = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>(({ ...props }, ref) => <DropdownMenuPrimitive.Trigger ref={ref} {...props} />)\nDropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuItem = DropdownMenuPrimitive.Item\n\nconst DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger\n\nconst DropdownMenuSubContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {\n portal?: boolean | React.ComponentProps<typeof DropdownMenuPortal>\n }\n>(({ className, portal = true, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\n portal?: boolean\n }\n>(({ className, sideOffset = 4, portal = false, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n onCloseAutoFocus={(e) => e.preventDefault()}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuGroup,\n DropdownMenuSub,\n DropdownMenuPortal,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\"\n\nimport { forwardRef } from \"react\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/card/card.scss\"\n\nconst Card = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return <div ref={ref} className={cn(\"tiptap-card\", className)} {...props} />\n }\n)\nCard.displayName = \"Card\"\n\nconst CardHeader = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-header\", className)}\n {...props}\n />\n )\n }\n)\nCardHeader.displayName = \"CardHeader\"\n\nconst CardBody = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"tiptap-card-body\", className)} {...props} />\n )\n }\n)\nCardBody.displayName = \"CardBody\"\n\nconst CardItemGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-orientation={orientation}\n className={cn(\"tiptap-card-item-group\", className)}\n {...props}\n />\n )\n})\nCardItemGroup.displayName = \"CardItemGroup\"\n\nconst CardGroupLabel = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-group-label\", className)}\n {...props}\n />\n )\n }\n)\nCardGroupLabel.displayName = \"CardGroupLabel\"\n\nconst CardFooter = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-footer\", className)}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardBody, CardItemGroup, CardGroupLabel }\n","import { forwardRef, useCallback, useState } from \"react\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"@/components/tiptap-icons/chevron-down-icon\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport { HeadingButton } from \"@/components/tiptap-ui/heading-button\"\nimport type { UseHeadingDropdownMenuConfig } from \"@/components/tiptap-ui/heading-dropdown-menu\"\nimport { useHeadingDropdownMenu } from \"@/components/tiptap-ui/heading-dropdown-menu\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"@/components/tiptap-ui-primitive/card\"\n\nexport interface HeadingDropdownMenuProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingDropdownMenuConfig {\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Labels for dropdown items\n */\n labels?: {\n heading1?: string\n heading2?: string\n heading3?: string\n heading4?: string\n heading5?: string\n heading6?: string\n paragraph?: string\n }\n}\n\n/**\n * Dropdown menu component for selecting heading levels in a Tiptap editor.\n *\n * For custom dropdown implementations, use the `useHeadingDropdownMenu` hook instead.\n */\nexport const HeadingDropdownMenu = forwardRef<\n HTMLButtonElement,\n HeadingDropdownMenuProps\n>(\n (\n {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n portal = false,\n onOpenChange,\n labels,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState<boolean>(false)\n const { isVisible, isActive, canToggle, Icon } = useHeadingDropdownMenu({\n editor,\n levels,\n hideWhenUnavailable,\n })\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!editor || !canToggle) return\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [canToggle, editor, onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu modal open={isOpen} onOpenChange={handleOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"Format text as heading\"\n aria-pressed={isActive}\n tooltip=\"Heading\"\n {...buttonProps}\n ref={ref}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {levels.map((level) => (\n <DropdownMenuItem key={`heading-${level}`} asChild>\n <HeadingButton\n editor={editor}\n level={level}\n text={labels?.[`heading${level}` as keyof typeof labels] ?? `Heading ${level}`}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n)\n\nHeadingDropdownMenu.displayName = \"HeadingDropdownMenu\"\n\nexport default HeadingDropdownMenu\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M6 3C6.55228 3 7 3.44772 7 4V11H17V4C17 3.44772 17.4477 3 18 3C18.5523 3 19 3.44772 19 4V20C19 20.5523 18.5523 21 18 21C17.4477 21 17 20.5523 17 20V13H7V20C7 20.5523 6.55228 21 6 21C5.44772 21 5 20.5523 5 20V4C5 3.44772 5.44772 3 6 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingIcon.displayName = \"HeadingIcon\"\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { HeadingIcon } from \"@/components/tiptap-icons/heading-icon\"\n\n// --- Tiptap UI ---\nimport {\n headingIcons,\n type Level,\n isHeadingActive,\n canToggle,\n shouldShowButton,\n} from \"@/components/tiptap-ui/heading-button\"\n\n/**\n * Configuration for the heading dropdown menu functionality\n */\nexport interface UseHeadingDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Available heading levels to show in the dropdown\n * @default [1, 2, 3, 4, 5, 6]\n */\n levels?: Level[]\n /**\n * Whether the dropdown should hide when headings are not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * Gets the currently active heading level from the available levels\n */\nexport function getActiveHeadingLevel(\n editor: Editor | null,\n levels: Level[] = [1, 2, 3, 4, 5, 6]\n): Level | undefined {\n if (!editor || !editor.isEditable) return undefined\n return levels.find((level) => isHeadingActive(editor, level))\n}\n\n/**\n * Custom hook that provides heading dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * isAnyHeadingActive,\n * canToggle,\n * levels,\n * } = useHeadingDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * } = useHeadingDropdownMenu({\n * editor: myEditor,\n * levels: [1, 2, 3],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useHeadingDropdownMenu(config?: UseHeadingDropdownMenuConfig) {\n const {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const activeLevel = getActiveHeadingLevel(editor, levels)\n const isActive = isHeadingActive(editor)\n const canToggleState = canToggle(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, level: levels })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, levels])\n\n return {\n isVisible,\n activeLevel,\n isActive,\n canToggle: canToggleState,\n levels,\n label: \"Heading\",\n Icon: activeLevel ? headingIcons[activeLevel] : HeadingIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseImageUploadConfig } from \"@/components/tiptap-ui/image-upload-button\"\nimport {\n IMAGE_UPLOAD_SHORTCUT_KEY,\n useImageUpload,\n} from \"@/components/tiptap-ui/image-upload-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface ImageUploadButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseImageUploadConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n /**\n * Optional custom icon component to render instead of the default.\n */\n icon?: React.MemoExoticComponent<IconComponent> | React.FC<IconProps>\n}\n\nexport function ImageShortcutBadge({\n shortcutKeys = IMAGE_UPLOAD_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for uploading/inserting images in a Tiptap editor.\n *\n * For custom button implementations, use the `useImage` hook instead.\n */\nexport const ImageUploadButton = forwardRef<\n HTMLButtonElement,\n ImageUploadButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onInserted,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canInsert,\n handleImage,\n label,\n isActive,\n shortcutKeys,\n Icon,\n } = useImageUpload({\n editor,\n hideWhenUnavailable,\n onInserted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleImage()\n },\n [handleImage, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const RenderIcon = CustomIcon ?? Icon\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canInsert}\n data-disabled={!canInsert}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && <ImageShortcutBadge shortcutKeys={shortcutKeys} />}\n </>\n )}\n </Button>\n )\n }\n)\n\nImageUploadButton.displayName = \"ImageUploadButton\"\n","import { useEffect, useState } from \"react\"\n\ntype BreakpointMode = \"min\" | \"max\"\n\n/**\n * Hook to detect whether the current viewport matches a given breakpoint rule.\n * Example:\n * useIsBreakpoint(\"max\", 768) // true when width < 768\n * useIsBreakpoint(\"min\", 1024) // true when width >= 1024\n */\nexport function useIsBreakpoint(\n mode: BreakpointMode = \"max\",\n breakpoint = 768\n) {\n const [matches, setMatches] = useState<boolean | undefined>(undefined)\n\n useEffect(() => {\n const query =\n mode === \"min\"\n ? `(min-width: ${breakpoint}px)`\n : `(max-width: ${breakpoint - 1}px)`\n\n const mql = window.matchMedia(query)\n const onChange = (e: MediaQueryListEvent) => setMatches(e.matches)\n\n // Set initial value\n setMatches(mql.matches)\n\n // Add listener\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [mode, breakpoint])\n\n return !!matches\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ImagePlusIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20 2C20 1.44772 19.5523 1 19 1C18.4477 1 18 1.44772 18 2V4H16C15.4477 4 15 4.44772 15 5C15 5.55228 15.4477 6 16 6H18V8C18 8.55228 18.4477 9 19 9C19.5523 9 20 8.55228 20 8V6H22C22.5523 6 23 5.55228 23 5C23 4.44772 22.5523 4 22 4H20V2ZM5 4C4.73478 4 4.48043 4.10536 4.29289 4.29289C4.10536 4.48043 4 4.73478 4 5V19C4 19.2652 4.10536 19.5196 4.29289 19.7071C4.48043 19.8946 4.73478 20 5 20H5.58579L14.379 11.2068C14.9416 10.6444 15.7045 10.3284 16.5 10.3284C17.2955 10.3284 18.0584 10.6444 18.621 11.2068L20 12.5858V12C20 11.4477 20.4477 11 21 11C21.5523 11 22 11.4477 22 12V14.998C22 14.9994 22 15.0007 22 15.002V19C22 19.7957 21.6839 20.5587 21.1213 21.1213C20.5587 21.6839 19.7957 22 19 22H6.00219C6.00073 22 5.99927 22 5.99781 22H5C4.20435 22 3.44129 21.6839 2.87868 21.1213C2.31607 20.5587 2 19.7957 2 19V5C2 4.20435 2.31607 3.44129 2.87868 2.87868C3.44129 2.31607 4.20435 2 5 2H12C12.5523 2 13 2.44772 13 3C13 3.55228 12.5523 4 12 4H5ZM8.41422 20H19C19.2652 20 19.5196 19.8946 19.7071 19.7071C19.8946 19.5196 20 19.2652 20 19V15.4142L17.207 12.6212C17.0195 12.4338 16.7651 12.3284 16.5 12.3284C16.2349 12.3284 15.9806 12.4337 15.7931 12.6211L8.41422 20ZM6.87868 6.87868C7.44129 6.31607 8.20435 6 9 6C9.79565 6 10.5587 6.31607 11.1213 6.87868C11.6839 7.44129 12 8.20435 12 9C12 9.79565 11.6839 10.5587 11.1213 11.1213C10.5587 11.6839 9.79565 12 9 12C8.20435 12 7.44129 11.6839 6.87868 11.1213C6.31607 10.5587 6 9.79565 6 9C6 8.20435 6.31607 7.44129 6.87868 6.87868ZM9 8C8.73478 8 8.48043 8.10536 8.29289 8.29289C8.10536 8.48043 8 8.73478 8 9C8 9.26522 8.10536 9.51957 8.29289 9.70711C8.48043 9.89464 8.73478 10 9 10C9.26522 10 9.51957 9.89464 9.70711 9.70711C9.89464 9.51957 10 9.26522 10 9C10 8.73478 9.89464 8.48043 9.70711 8.29289C9.51957 8.10536 9.26522 8 9 8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nImagePlusIcon.displayName = \"ImagePlusIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { ImagePlusIcon } from \"@/components/tiptap-icons/image-plus-icon\"\n\nexport const IMAGE_UPLOAD_SHORTCUT_KEY = \"mod+shift+i\"\n\n/**\n * Configuration for the image upload functionality\n */\nexport interface UseImageUploadConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when insertion is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful image insertion.\n */\n onInserted?: () => void\n}\n\n/**\n * Checks if image can be inserted in the current editor state\n */\nexport function canInsertImage(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"imageUpload\")) return false\n\n return editor.can().insertContent({ type: \"imageUpload\" })\n}\n\n/**\n * Checks if image is currently active\n */\nexport function isImageActive(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"imageUpload\")\n}\n\n/**\n * Inserts an image in the editor\n */\nexport function insertImage(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canInsertImage(editor)) return false\n\n try {\n return editor\n .chain()\n .focus()\n .insertContent({\n type: \"imageUpload\",\n })\n .run()\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the image button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"imageUpload\")) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canInsertImage(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides image functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleImageButton() {\n * const { isVisible, handleImage } = useImage()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleImage}>Add Image</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedImageButton() {\n * const { isVisible, handleImage, label, isActive } = useImage({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onInserted: () => console.log('Image inserted!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleImage}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Add Image\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useImageUpload(config?: UseImageUploadConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onInserted,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canInsert = canInsertImage(editor)\n const isActive = isImageActive(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleImage = useCallback(() => {\n if (!editor) return false\n\n const success = insertImage(editor)\n if (success) {\n onInserted?.()\n }\n return success\n }, [editor, onInserted])\n\n useHotkeys(\n IMAGE_UPLOAD_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleImage()\n },\n {\n enabled: isVisible && canInsert,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleImage,\n canInsert,\n label: \"Add image\",\n shortcutKeys: IMAGE_UPLOAD_SHORTCUT_KEY,\n Icon: ImagePlusIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\n// --- Tiptap UI ---\nimport type { ListType, UseListConfig } from \"@/components/tiptap-ui/list-button\"\nimport { LIST_SHORTCUT_KEYS, useList } from \"@/components/tiptap-ui/list-button\"\n\nexport interface ListButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseListConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ListShortcutBadge({\n type,\n shortcutKeys = LIST_SHORTCUT_KEYS[type],\n}: {\n type: ListType\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling lists in a Tiptap editor.\n *\n * For custom button implementations, use the `useList` hook instead.\n */\nexport const ListButton = forwardRef<HTMLButtonElement, ListButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useList({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ListShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nListButton.displayName = \"ListButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 6C7 5.44772 7.44772 5 8 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H8C7.44772 7 7 6.55228 7 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 12C7 11.4477 7.44772 11 8 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H8C7.44772 13 7 12.5523 7 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 18C7 17.4477 7.44772 17 8 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H8C7.44772 19 7 18.5523 7 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H3.01C3.56228 5 4.01 5.44772 4.01 6C4.01 6.55228 3.56228 7 3.01 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H3.01C3.56228 11 4.01 11.4477 4.01 12C4.01 12.5523 3.56228 13 3.01 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H3.01C3.56228 17 4.01 17.4477 4.01 18C4.01 18.5523 3.56228 19 3.01 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListIcon.displayName = \"ListIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListOrderedIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 6C9 5.44772 9.44772 5 10 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H10C9.44772 7 9 6.55228 9 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 12C9 11.4477 9.44772 11 10 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H10C9.44772 13 9 12.5523 9 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 18C9 17.4477 9.44772 17 10 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H10C9.44772 19 9 18.5523 9 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 6C3 5.44772 3.44772 5 4 5H5C5.55228 5 6 5.44772 6 6V10C6 10.5523 5.55228 11 5 11C4.44772 11 4 10.5523 4 10V7C3.44772 7 3 6.55228 3 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 10C3 9.44772 3.44772 9 4 9H6C6.55228 9 7 9.44772 7 10C7 10.5523 6.55228 11 6 11H4C3.44772 11 3 10.5523 3 10Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.82219 13.0431C6.54543 13.4047 6.99997 14.1319 6.99997 15C6.99997 15.5763 6.71806 16.0426 6.48747 16.35C6.31395 16.5814 6.1052 16.8044 5.91309 17H5.99997C6.55226 17 6.99997 17.4477 6.99997 18C6.99997 18.5523 6.55226 19 5.99997 19H3.99997C3.44769 19 2.99997 18.5523 2.99997 18C2.99997 17.4237 3.28189 16.9575 3.51247 16.65C3.74323 16.3424 4.03626 16.0494 4.26965 15.8161C4.27745 15.8083 4.2852 15.8006 4.29287 15.7929C4.55594 15.5298 4.75095 15.3321 4.88748 15.15C4.96287 15.0495 4.99021 14.9922 4.99911 14.9714C4.99535 14.9112 4.9803 14.882 4.9739 14.8715C4.96613 14.8588 4.95382 14.845 4.92776 14.8319C4.87723 14.8067 4.71156 14.7623 4.44719 14.8944C3.95321 15.1414 3.35254 14.9412 3.10555 14.4472C2.85856 13.9533 3.05878 13.3526 3.55276 13.1056C4.28839 12.7378 5.12272 12.6934 5.82219 13.0431Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListOrderedIcon.displayName = \"ListOrderedIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListTodoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 4.89543 2.89543 4 4 4H8C9.10457 4 10 4.89543 10 6V10C10 11.1046 9.10457 12 8 12H4C2.89543 12 2 11.1046 2 10V6ZM8 6H4V10H8V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 14.2929C10.0976 14.6834 10.0976 15.3166 9.70711 15.7071L5.70711 19.7071C5.31658 20.0976 4.68342 20.0976 4.29289 19.7071L2.29289 17.7071C1.90237 17.3166 1.90237 16.6834 2.29289 16.2929C2.68342 15.9024 3.31658 15.9024 3.70711 16.2929L5 17.5858L8.29289 14.2929C8.68342 13.9024 9.31658 13.9024 9.70711 14.2929Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 6C12 5.44772 12.4477 5 13 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H13C12.4477 7 12 6.55228 12 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 12C12 11.4477 12.4477 11 13 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H13C12.4477 13 12 12.5523 12 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 18C12 17.4477 12.4477 17 13 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H13C12.4477 19 12 18.5523 12 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListTodoIcon.displayName = \"ListTodoIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"@/components/tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"@/components/tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"@/components/tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\nexport type ListType = \"bulletList\" | \"orderedList\" | \"taskList\"\n\n/**\n * Configuration for the list functionality\n */\nexport interface UseListConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of list to toggle.\n */\n type: ListType\n /**\n * Whether the button should hide when list is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\nexport const listIcons = {\n bulletList: ListIcon,\n orderedList: ListOrderedIcon,\n taskList: ListTodoIcon,\n}\n\nexport const listLabels: Record<ListType, string> = {\n bulletList: \"Bullet List\",\n orderedList: \"Ordered List\",\n taskList: \"Task List\",\n}\n\nexport const LIST_SHORTCUT_KEYS: Record<ListType, string> = {\n bulletList: \"mod+shift+8\",\n orderedList: \"mod+shift+7\",\n taskList: \"mod+shift+9\",\n}\n\n/**\n * Checks if a list can be toggled in the current editor state\n */\nexport function canToggleList(\n editor: Editor | null,\n type: ListType,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n if (!turnInto) {\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList()\n case \"orderedList\":\n return editor.can().toggleOrderedList()\n case \"taskList\":\n return editor.can().toggleList(\"taskList\", \"taskItem\")\n default:\n return false\n }\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set list directly on the selection,\n // or we can clear formatting/nodes to arrive at a list.\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList() || editor.can().clearNodes()\n case \"orderedList\":\n return editor.can().toggleOrderedList() || editor.can().clearNodes()\n case \"taskList\":\n return (\n editor.can().toggleList(\"taskList\", \"taskItem\") ||\n editor.can().clearNodes()\n )\n default:\n return false\n }\n}\n\n/**\n * Checks if list is currently active\n */\nexport function isListActive(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n\n switch (type) {\n case \"bulletList\":\n return editor.isActive(\"bulletList\")\n case \"orderedList\":\n return editor.isActive(\"orderedList\")\n case \"taskList\":\n return editor.isActive(\"taskList\")\n default:\n return false\n }\n}\n\n/**\n * Toggles list in the editor\n */\nexport function toggleList(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleList(editor, type)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n if (editor.isActive(type)) {\n // Unwrap list\n chain\n .liftListItem(\"listItem\")\n .lift(\"bulletList\")\n .lift(\"orderedList\")\n .lift(\"taskList\")\n .run()\n } else {\n // Wrap in specific list type\n const toggleMap: Record<ListType, () => typeof chain> = {\n bulletList: () => chain.toggleBulletList(),\n orderedList: () => chain.toggleOrderedList(),\n taskList: () => chain.toggleList(\"taskList\", \"taskItem\"),\n }\n\n const toggle = toggleMap[type]\n if (!toggle) return false\n\n toggle().run()\n }\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the list button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: ListType\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleList(editor, type)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides list functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleListButton() {\n * const { isVisible, handleToggle, isActive } = useList({ type: \"bulletList\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Bullet List</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListButton() {\n * const { isVisible, handleToggle, label, isActive } = useList({\n * type: \"orderedList\",\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('List toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle List\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useList(config: UseListConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleList(editor, type)\n const isActive = isListActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleList(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: listLabels[type],\n shortcutKeys: LIST_SHORTCUT_KEYS[type],\n Icon: listIcons[type],\n }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"@/components/tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"@/components/tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"@/components/tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport { isNodeInSchema } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport {\n canToggleList,\n isListActive,\n listIcons,\n type ListType,\n} from \"@/components/tiptap-ui/list-button\"\n\n/**\n * Configuration for the list dropdown menu functionality\n */\nexport interface UseListDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The list types to display in the dropdown.\n * @default [\"bulletList\", \"orderedList\", \"taskList\"]\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport interface ListOption {\n label: string\n type: ListType\n icon: React.ElementType\n}\n\nexport const listOptions: ListOption[] = [\n {\n label: \"Bullet List\",\n type: \"bulletList\",\n icon: ListIcon,\n },\n {\n label: \"Ordered List\",\n type: \"orderedList\",\n icon: ListOrderedIcon,\n },\n {\n label: \"Task List\",\n type: \"taskList\",\n icon: ListTodoIcon,\n },\n]\n\nexport function canToggleAnyList(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => canToggleList(editor, type))\n}\n\nexport function isAnyListActive(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => isListActive(editor, type))\n}\n\nexport function getFilteredListOptions(\n availableTypes: ListType[]\n): typeof listOptions {\n return listOptions.filter(\n (option) => !option.type || availableTypes.includes(option.type)\n )\n}\n\nexport function shouldShowListDropdown(params: {\n editor: Editor | null\n listTypes: ListType[]\n hideWhenUnavailable: boolean\n listInSchema: boolean\n canToggleAny: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, listInSchema, canToggleAny } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleAny\n }\n\n return true\n}\n\n/**\n * Gets the currently active list type from the available types\n */\nexport function getActiveListType(\n editor: Editor | null,\n availableTypes: ListType[]\n): ListType | undefined {\n if (!editor || !editor.isEditable) return undefined\n return availableTypes.find((type) => isListActive(editor, type))\n}\n\n/**\n * Custom hook that provides list dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * isAnyActive,\n * canToggleAny,\n * filteredLists,\n * } = useListDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * } = useListDropdownMenu({\n * editor: myEditor,\n * types: [\"bulletList\", \"orderedList\"],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useListDropdownMenu(config?: UseListDropdownMenuConfig) {\n const {\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const listInSchema = types.some((type) => isNodeInSchema(type, editor))\n\n const filteredLists = useMemo(() => getFilteredListOptions(types), [types])\n\n const canToggleAny = canToggleAnyList(editor, types)\n const isAnyActive = isAnyListActive(editor, types)\n const activeType = getActiveListType(editor, types)\n const activeList = filteredLists.find((option) => option.type === activeType)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowListDropdown({\n editor,\n listTypes: types,\n hideWhenUnavailable,\n listInSchema,\n canToggleAny,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [canToggleAny, editor, hideWhenUnavailable, listInSchema, types])\n\n return {\n isVisible,\n activeType,\n isActive: isAnyActive,\n canToggle: canToggleAny,\n types,\n filteredLists,\n label: \"List\",\n Icon: activeList ? listIcons[activeList.type] : ListIcon,\n }\n}\n","import { useCallback, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"@/components/tiptap-icons/chevron-down-icon\"\n\n// --- Tiptap UI ---\nimport { ListButton, type ListType } from \"@/components/tiptap-ui/list-button\"\n\nimport { useListDropdownMenu } from \"@/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"@/components/tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"@/components/tiptap-ui-primitive/card\"\n\nexport interface ListDropdownMenuProps extends Omit<ButtonProps, \"type\"> {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor\n /**\n * The list types to display in the dropdown.\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n /**\n * Labels for dropdown items\n */\n labels?: {\n bulletList?: string\n orderedList?: string\n taskList?: string\n }\n}\n\nexport function ListDropdownMenu({\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n onOpenChange,\n portal = false,\n labels,\n ...props\n}: ListDropdownMenuProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const { filteredLists, canToggle, isActive, isVisible, Icon } =\n useListDropdownMenu({\n editor,\n types,\n hideWhenUnavailable,\n })\n\n const handleOnOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"List options\"\n tooltip=\"List\"\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {filteredLists.map((option) => (\n <DropdownMenuItem key={option.type} asChild>\n <ListButton\n editor={editor}\n type={option.type}\n text={labels?.[option.type] ?? option.label}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ListDropdownMenu\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Tiptap UI ---\nimport type { UseBlockquoteConfig } from \"@/components/tiptap-ui/blockquote-button\"\nimport {\n BLOCKQUOTE_SHORTCUT_KEY,\n useBlockquote,\n} from \"@/components/tiptap-ui/blockquote-button\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface BlockquoteButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseBlockquoteConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function BlockquoteShortcutBadge({\n shortcutKeys = BLOCKQUOTE_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling blockquote in a Tiptap editor.\n *\n * For custom button implementations, use the `useBlockquote` hook instead.\n */\nexport const BlockquoteButton = forwardRef<\n HTMLButtonElement,\n BlockquoteButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useBlockquote({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"Blockquote\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <BlockquoteShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nBlockquoteButton.displayName = \"BlockquoteButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BlockquoteIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 6C8 5.44772 8.44772 5 9 5H16C16.5523 5 17 5.44772 17 6C17 6.55228 16.5523 7 16 7H9C8.44772 7 8 6.55228 8 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 3C4.55228 3 5 3.44772 5 4L5 20C5 20.5523 4.55229 21 4 21C3.44772 21 3 20.5523 3 20L3 4C3 3.44772 3.44772 3 4 3Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H20C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 18C8 17.4477 8.44772 17 9 17H16C16.5523 17 17 17.4477 17 18C17 18.5523 16.5523 19 16 19H9C8.44772 19 8 18.5523 8 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBlockquoteIcon.displayName = \"BlockquoteIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BlockquoteIcon } from \"@/components/tiptap-icons/blockquote-icon\"\n\n// --- UI Utils ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\nexport const BLOCKQUOTE_SHORTCUT_KEY = \"mod+shift+b\"\n\n/**\n * Configuration for the blockquote functionality\n */\nexport interface UseBlockquoteConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when blockquote is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if blockquote can be toggled in the current editor state\n */\nexport function canToggleBlockquote(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"blockquote\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleWrap(\"blockquote\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can wrap in blockquote directly on the selection,\n // or we can clear formatting/nodes to arrive at a blockquote.\n return editor.can().toggleWrap(\"blockquote\") || editor.can().clearNodes()\n}\n\n/**\n * Toggles blockquote formatting for a specific node or the current selection\n */\nexport function toggleBlockquote(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleBlockquote(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"blockquote\")\n ? chain.lift(\"blockquote\")\n : chain.wrapIn(\"blockquote\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the blockquote button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"blockquote\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleBlockquote(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides blockquote functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleBlockquoteButton() {\n * const { isVisible, handleToggle, isActive } = useBlockquote()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Blockquote</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedBlockquoteButton() {\n * const { isVisible, handleToggle, label, isActive } = useBlockquote({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Blockquote toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Blockquote\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useBlockquote(config?: UseBlockquoteConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleBlockquote(editor)\n const isActive = editor?.isActive(\"blockquote\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleBlockquote(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: \"Blockquote\",\n shortcutKeys: BLOCKQUOTE_SHORTCUT_KEY,\n Icon: BlockquoteIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type { UseCodeBlockConfig } from \"@/components/tiptap-ui/code-block-button\"\nimport {\n CODE_BLOCK_SHORTCUT_KEY,\n useCodeBlock,\n} from \"@/components/tiptap-ui/code-block-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface CodeBlockButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseCodeBlockConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function CodeBlockShortcutBadge({\n shortcutKeys = CODE_BLOCK_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling code block in a Tiptap editor.\n *\n * For custom button implementations, use the `useCodeBlock` hook instead.\n */\nexport const CodeBlockButton = forwardRef<\n HTMLButtonElement,\n CodeBlockButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useCodeBlock({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n disabled={!canToggle}\n data-disabled={!canToggle}\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"Code Block\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <CodeBlockShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nCodeBlockButton.displayName = \"CodeBlockButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CodeBlockIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.70711 2.29289C7.09763 2.68342 7.09763 3.31658 6.70711 3.70711L4.41421 6L6.70711 8.29289C7.09763 8.68342 7.09763 9.31658 6.70711 9.70711C6.31658 10.0976 5.68342 10.0976 5.29289 9.70711L2.29289 6.70711C1.90237 6.31658 1.90237 5.68342 2.29289 5.29289L5.29289 2.29289C5.68342 1.90237 6.31658 1.90237 6.70711 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.2929 2.29289C10.6834 1.90237 11.3166 1.90237 11.7071 2.29289L14.7071 5.29289C15.0976 5.68342 15.0976 6.31658 14.7071 6.70711L11.7071 9.70711C11.3166 10.0976 10.6834 10.0976 10.2929 9.70711C9.90237 9.31658 9.90237 8.68342 10.2929 8.29289L12.5858 6L10.2929 3.70711C9.90237 3.31658 9.90237 2.68342 10.2929 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17 4C17 3.44772 17.4477 3 18 3H19C20.6569 3 22 4.34315 22 6V18C22 19.6569 20.6569 21 19 21H5C3.34315 21 2 19.6569 2 18V12C2 11.4477 2.44772 11 3 11C3.55228 11 4 11.4477 4 12V18C4 18.5523 4.44772 19 5 19H19C19.5523 19 20 18.5523 20 18V6C20 5.44772 19.5523 5 19 5H18C17.4477 5 17 4.55228 17 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCodeBlockIcon.displayName = \"CodeBlockIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { CodeBlockIcon } from \"@/components/tiptap-icons/code-block-icon\"\n\nexport const CODE_BLOCK_SHORTCUT_KEY = \"mod+alt+c\"\n\n/**\n * Configuration for the code block functionality\n */\nexport interface UseCodeBlockConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when code block is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful code block toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if code block can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"codeBlock\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleNode(\"codeBlock\", \"paragraph\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can toggle code block directly on the selection,\n // or we can clear formatting/nodes to arrive at a code block.\n return (\n editor.can().toggleNode(\"codeBlock\", \"paragraph\") ||\n editor.can().clearNodes()\n )\n}\n\n/**\n * Toggles code block in the editor\n */\nexport function toggleCodeBlock(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggle(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"codeBlock\")\n ? chain.setNode(\"paragraph\")\n : chain.toggleNode(\"codeBlock\", \"paragraph\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the code block button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"codeBlock\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggle(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides code block functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleCodeBlockButton() {\n * const { isVisible, isActive, handleToggle } = useCodeBlock()\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * Code Block\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedCodeBlockButton() {\n * const { isVisible, isActive, handleToggle, label } = useCodeBlock({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Code block toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Code Block\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useCodeBlock(config?: UseCodeBlockConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor)\n const isActive = editor?.isActive(\"codeBlock\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleCodeBlock(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: \"Code Block\",\n shortcutKeys: CODE_BLOCK_SHORTCUT_KEY,\n Icon: CodeBlockIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BanIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.43471 4.01458C4.34773 4.06032 4.26607 4.11977 4.19292 4.19292C4.11977 4.26607 4.06032 4.34773 4.01458 4.43471C2.14611 6.40628 1 9.0693 1 12C1 18.0751 5.92487 23 12 23C14.9306 23 17.5936 21.854 19.5651 19.9856C19.6522 19.9398 19.7339 19.8803 19.8071 19.8071C19.8803 19.7339 19.9398 19.6522 19.9856 19.5651C21.854 17.5936 23 14.9306 23 12C23 5.92487 18.0751 1 12 1C9.0693 1 6.40628 2.14611 4.43471 4.01458ZM6.38231 4.9681C7.92199 3.73647 9.87499 3 12 3C16.9706 3 21 7.02944 21 12C21 14.125 20.2635 16.078 19.0319 17.6177L6.38231 4.9681ZM17.6177 19.0319C16.078 20.2635 14.125 21 12 21C7.02944 21 3 16.9706 3 12C3 9.87499 3.73647 7.92199 4.9681 6.38231L17.6177 19.0319Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBanIcon.displayName = \"BanIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HighlighterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.7072 4.70711C15.0977 4.31658 15.0977 3.68342 14.7072 3.29289C14.3167 2.90237 13.6835 2.90237 13.293 3.29289L8.69294 7.89286L8.68594 7.9C8.13626 8.46079 7.82837 9.21474 7.82837 10C7.82837 10.2306 7.85491 10.4584 7.90631 10.6795L2.29289 16.2929C2.10536 16.4804 2 16.7348 2 17V20C2 20.5523 2.44772 21 3 21H12C12.2652 21 12.5196 20.8946 12.7071 20.7071L15.3205 18.0937C15.5416 18.1452 15.7695 18.1717 16.0001 18.1717C16.7853 18.1717 17.5393 17.8639 18.1001 17.3142L22.7072 12.7071C23.0977 12.3166 23.0977 11.6834 22.7072 11.2929C22.3167 10.9024 21.6835 10.9024 21.293 11.2929L16.6971 15.8887C16.5105 16.0702 16.2605 16.1717 16.0001 16.1717C15.7397 16.1717 15.4897 16.0702 15.303 15.8887L10.1113 10.697C9.92992 10.5104 9.82837 10.2604 9.82837 10C9.82837 9.73963 9.92992 9.48958 10.1113 9.30297L14.7072 4.70711ZM13.5858 17L9.00004 12.4142L4 17.4142V19H11.5858L13.5858 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHighlighterIcon.displayName = \"HighlighterIcon\"\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/popover/popover.scss\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align={align}\n sideOffset={sideOffset}\n className={cn(\"tiptap-popover\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","import { forwardRef, useCallback, useMemo } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseColorHighlightConfig } from \"@/components/tiptap-ui/color-highlight-button\"\nimport {\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n useColorHighlight,\n} from \"@/components/tiptap-ui/color-highlight-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\n// --- Styles ---\nimport \"@/components/tiptap-ui/color-highlight-button/color-highlight-button.scss\"\n\nexport interface ColorHighlightButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseColorHighlightConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ColorHighlightShortcutBadge({\n shortcutKeys = COLOR_HIGHLIGHT_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for applying color highlights in a Tiptap editor.\n *\n * Supports two highlighting modes:\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n *\n * For custom button implementations, use the `useColorHighlight` hook instead.\n *\n * @example\n * ```tsx\n * // Mark-based highlighting (default)\n * <ColorHighlightButton highlightColor=\"yellow\" />\n *\n * // Node-based background coloring\n * <ColorHighlightButton\n * highlightColor=\"var(--tt-color-highlight-blue)\"\n * mode=\"node\"\n * />\n *\n * // With custom callback\n * <ColorHighlightButton\n * highlightColor=\"red\"\n * mode=\"mark\"\n * onApplied={({ color, mode }) => console.log(`Applied ${color} in ${mode} mode`)}\n * />\n * ```\n */\nexport const ColorHighlightButton = forwardRef<\n HTMLButtonElement,\n ColorHighlightButtonProps\n>(\n (\n {\n editor: providedEditor,\n highlightColor,\n text,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n showShortcut = false,\n onClick,\n children,\n style,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canColorHighlight,\n isActive,\n handleColorHighlight,\n label,\n shortcutKeys,\n } = useColorHighlight({\n editor,\n highlightColor,\n label: text || `Toggle highlight (${highlightColor})`,\n hideWhenUnavailable,\n mode,\n onApplied,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleColorHighlight()\n },\n [handleColorHighlight, onClick]\n )\n\n const buttonStyle = useMemo(\n () =>\n ({\n ...style,\n \"--highlight-color\": highlightColor,\n }) as React.CSSProperties,\n [highlightColor, style]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canColorHighlight}\n data-disabled={!canColorHighlight}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n style={buttonStyle}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <span\n className=\"tiptap-button-highlight\"\n style={\n { \"--highlight-color\": highlightColor } as React.CSSProperties\n }\n />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ColorHighlightShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nColorHighlightButton.displayName = \"ColorHighlightButton\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n isExtensionAvailable,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HighlighterIcon } from \"@/components/tiptap-icons/highlighter-icon\"\n\nexport const COLOR_HIGHLIGHT_SHORTCUT_KEY = \"mod+shift+h\"\nexport const HIGHLIGHT_COLORS = [\n {\n label: \"Default background\",\n value: \"var(--tt-bg-color)\",\n border: \"var(--tt-bg-color-contrast)\",\n },\n {\n label: \"Gray background\",\n value: \"var(--tt-color-highlight-gray)\",\n border: \"var(--tt-color-highlight-gray-contrast)\",\n },\n {\n label: \"Brown background\",\n value: \"var(--tt-color-highlight-brown)\",\n border: \"var(--tt-color-highlight-brown-contrast)\",\n },\n {\n label: \"Orange background\",\n value: \"var(--tt-color-highlight-orange)\",\n border: \"var(--tt-color-highlight-orange-contrast)\",\n },\n {\n label: \"Yellow background\",\n value: \"var(--tt-color-highlight-yellow)\",\n border: \"var(--tt-color-highlight-yellow-contrast)\",\n },\n {\n label: \"Green background\",\n value: \"var(--tt-color-highlight-green)\",\n border: \"var(--tt-color-highlight-green-contrast)\",\n },\n {\n label: \"Blue background\",\n value: \"var(--tt-color-highlight-blue)\",\n border: \"var(--tt-color-highlight-blue-contrast)\",\n },\n {\n label: \"Purple background\",\n value: \"var(--tt-color-highlight-purple)\",\n border: \"var(--tt-color-highlight-purple-contrast)\",\n },\n {\n label: \"Pink background\",\n value: \"var(--tt-color-highlight-pink)\",\n border: \"var(--tt-color-highlight-pink-contrast)\",\n },\n {\n label: \"Red background\",\n value: \"var(--tt-color-highlight-red)\",\n border: \"var(--tt-color-highlight-red-contrast)\",\n },\n]\nexport type HighlightColor = (typeof HIGHLIGHT_COLORS)[number]\n\nexport type HighlightMode = \"mark\" | \"node\"\n\n/**\n * Configuration for the color highlight functionality\n */\nexport interface UseColorHighlightConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The color to apply when toggling the highlight.\n */\n highlightColor?: string\n /**\n * Optional label to display alongside the icon.\n */\n label?: string\n /**\n * Whether the button should hide when the mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * The highlighting mode to use.\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n * @default \"mark\"\n */\n mode?: HighlightMode\n /**\n * Called when the highlight is applied.\n */\n onApplied?: ({\n color,\n label,\n mode,\n }: {\n color: string\n label: string\n mode: HighlightMode\n }) => void\n}\n\nexport function pickHighlightColorsByValue(values: string[]) {\n const colorMap = new Map(\n HIGHLIGHT_COLORS.map((color) => [color.value, color])\n )\n return values\n .map((value) => colorMap.get(value))\n .filter((color): color is (typeof HIGHLIGHT_COLORS)[number] => !!color)\n}\n\n/**\n * Checks if highlight can be applied based on the mode and current editor state\n */\nexport function canColorHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (\n !isMarkInSchema(\"highlight\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n return editor.can().setMark(\"highlight\")\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n\n try {\n return editor.can().toggleNodeBackgroundColor(\"test\")\n } catch {\n return false\n }\n }\n}\n\n/**\n * Checks if highlight is currently active\n */\nexport function isColorHighlightActive(\n editor: Editor | null,\n highlightColor?: string,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n return highlightColor\n ? editor.isActive(\"highlight\", { color: highlightColor })\n : editor.isActive(\"highlight\")\n } else {\n if (!highlightColor) return false\n\n try {\n const { state } = editor\n const { selection } = state\n\n const $pos = selection.$anchor\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n if (node && node.attrs?.backgroundColor === highlightColor) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n }\n}\n\n/**\n * Removes highlight based on the mode\n */\nexport function removeHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canColorHighlight(editor, mode)) return false\n\n if (mode === \"mark\") {\n return editor.chain().focus().unsetMark(\"highlight\").run()\n } else {\n return editor.chain().focus().unsetNodeBackgroundColor().run()\n }\n}\n\n/**\n * Determines if the highlight button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n mode: HighlightMode\n}): boolean {\n const { editor, hideWhenUnavailable, mode } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (!isMarkInSchema(\"highlight\", editor)) return false\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canColorHighlight(editor, mode)\n }\n\n return true\n}\n\nexport function useColorHighlight(config: UseColorHighlightConfig) {\n const {\n editor: providedEditor,\n label,\n highlightColor,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canColorHighlightState = canColorHighlight(editor, mode)\n const isActive = isColorHighlightActive(editor, highlightColor, mode)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, mode }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, mode])\n\n const handleColorHighlight = useCallback(() => {\n if (!editor || !canColorHighlightState || !highlightColor || !label)\n return false\n\n if (mode === \"mark\") {\n if (editor.state.storedMarks) {\n const highlightMarkType = editor.schema.marks.highlight\n if (highlightMarkType) {\n editor.view.dispatch(\n editor.state.tr.removeStoredMark(highlightMarkType)\n )\n }\n }\n\n setTimeout(() => {\n const success = editor\n .chain()\n .focus()\n .toggleMark(\"highlight\", { color: highlightColor })\n .run()\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }, 0)\n\n return true\n } else {\n const success = editor\n .chain()\n .focus()\n .toggleNodeBackgroundColor(highlightColor)\n .run()\n\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }\n }, [canColorHighlightState, highlightColor, editor, label, onApplied, mode])\n\n const handleRemoveHighlight = useCallback(() => {\n const success = removeHighlight(editor, mode)\n if (success) {\n onApplied?.({ color: \"\", label: \"Remove highlight\", mode })\n }\n return success\n }, [editor, onApplied, mode])\n\n useHotkeys(\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleColorHighlight()\n },\n {\n enabled: isVisible && canColorHighlightState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleColorHighlight,\n handleRemoveHighlight,\n canColorHighlight: canColorHighlightState,\n label: label || `Highlight`,\n shortcutKeys: COLOR_HIGHLIGHT_SHORTCUT_KEY,\n Icon: HighlighterIcon,\n mode,\n }\n}\n","import { forwardRef, useMemo, useRef, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useMenuNavigation } from \"@/hooks/use-menu-navigation\"\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BanIcon } from \"@/components/tiptap-icons/ban-icon\"\nimport { HighlighterIcon } from \"@/components/tiptap-icons/highlighter-icon\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"@/components/tiptap-ui-primitive/popover\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"@/components/tiptap-ui-primitive/card\"\n\n// --- Tiptap UI ---\nimport type {\n HighlightColor,\n UseColorHighlightConfig,\n} from \"@/components/tiptap-ui/color-highlight-button\"\nimport {\n ColorHighlightButton,\n pickHighlightColorsByValue,\n useColorHighlight,\n} from \"@/components/tiptap-ui/color-highlight-button\"\n\nexport interface ColorHighlightPopoverContentProps {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n /**\n * Tooltip for remove highlight button\n */\n removeTooltip?: string\n}\n\nexport interface ColorHighlightPopoverProps\n extends Omit<ButtonProps, \"type\">,\n Pick<\n UseColorHighlightConfig,\n \"editor\" | \"hideWhenUnavailable\" | \"onApplied\"\n > {\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n /**\n * Tooltip for remove highlight button\n */\n removeTooltip?: string\n}\n\nexport const ColorHighlightPopoverButton = forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Highlight text\"\n tooltip=\"Highlight\"\n ref={ref}\n {...props}\n >\n {children ?? <HighlighterIcon className=\"tiptap-button-icon\" />}\n </Button>\n))\n\nColorHighlightPopoverButton.displayName = \"ColorHighlightPopoverButton\"\n\nexport function ColorHighlightPopoverContent({\n editor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n removeTooltip = \"Remove highlight\",\n}: ColorHighlightPopoverContentProps) {\n const { handleRemoveHighlight } = useColorHighlight({ editor })\n const isMobile = useIsBreakpoint()\n const containerRef = useRef<HTMLDivElement>(null)\n\n const menuItems = useMemo(\n () => [...colors, { label: removeTooltip, value: \"none\" }],\n [colors, removeTooltip]\n )\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n orientation: \"both\",\n onSelect: (item) => {\n if (!containerRef.current) return false\n const highlightedElement = containerRef.current.querySelector(\n '[data-highlighted=\"true\"]'\n ) as HTMLElement\n if (highlightedElement) highlightedElement.click()\n if (item.value === \"none\") handleRemoveHighlight()\n return true\n },\n autoSelectFirstItem: false,\n })\n\n return (\n <Card\n ref={containerRef}\n tabIndex={0}\n style={isMobile ? { boxShadow: \"none\", border: 0 } : {}}\n >\n <CardBody style={isMobile ? { padding: 0 } : {}}>\n <CardItemGroup orientation=\"horizontal\">\n <ButtonGroup orientation=\"horizontal\">\n {colors.map((color, index) => (\n <ColorHighlightButton\n key={color.value}\n editor={editor}\n highlightColor={color.value}\n tooltip={color.label}\n aria-label={`${color.label} highlight color`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n />\n ))}\n </ButtonGroup>\n <Separator />\n <ButtonGroup orientation=\"horizontal\">\n <Button\n onClick={handleRemoveHighlight}\n aria-label={removeTooltip}\n tooltip={removeTooltip}\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n data-style=\"ghost\"\n data-highlighted={selectedIndex === colors.length}\n >\n <BanIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\nexport function ColorHighlightPopover({\n editor: providedEditor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n hideWhenUnavailable = false,\n onApplied,\n removeTooltip,\n ...props\n}: ColorHighlightPopoverProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n const { isVisible, canColorHighlight, isActive, label, Icon } =\n useColorHighlight({\n editor,\n hideWhenUnavailable,\n onApplied,\n })\n\n if (!isVisible) return null\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <ColorHighlightPopoverButton\n disabled={!canColorHighlight}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canColorHighlight}\n aria-pressed={isActive}\n aria-label={label}\n tooltip={label}\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n </ColorHighlightPopoverButton>\n </PopoverTrigger>\n <PopoverContent aria-label=\"Highlight colors\">\n <ColorHighlightPopoverContent editor={editor} colors={colors} removeTooltip={removeTooltip} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default ColorHighlightPopover\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CornerDownLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M21 4C21 3.44772 20.5523 3 20 3C19.4477 3 19 3.44772 19 4V11C19 11.7956 18.6839 12.5587 18.1213 13.1213C17.5587 13.6839 16.7956 14 16 14H6.41421L9.70711 10.7071C10.0976 10.3166 10.0976 9.68342 9.70711 9.29289C9.31658 8.90237 8.68342 8.90237 8.29289 9.29289L3.29289 14.2929C2.90237 14.6834 2.90237 15.3166 3.29289 15.7071L8.29289 20.7071C8.68342 21.0976 9.31658 21.0976 9.70711 20.7071C10.0976 20.3166 10.0976 19.6834 9.70711 19.2929L6.41421 16H16C17.3261 16 18.5979 15.4732 19.5355 14.5355C20.4732 13.5979 21 12.3261 21 11V4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCornerDownLeftIcon.displayName = \"CornerDownLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ExternalLinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14 3C14 2.44772 14.4477 2 15 2H21C21.5523 2 22 2.44772 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L10.7071 14.7071C10.3166 15.0976 9.68342 15.0976 9.29289 14.7071C8.90237 14.3166 8.90237 13.6834 9.29289 13.2929L18.5858 4H15C14.4477 4 14 3.55228 14 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.29289 7.29289C4.48043 7.10536 4.73478 7 5 7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H5C4.20435 5 3.44129 5.31607 2.87868 5.87868C2.31607 6.44129 2 7.20435 2 8V19C2 19.7957 2.31607 20.5587 2.87868 21.1213C3.44129 21.6839 4.20435 22 5 22H16C16.7957 22 17.5587 21.6839 18.1213 21.1213C18.6839 20.5587 19 19.7957 19 19V13C19 12.4477 18.5523 12 18 12C17.4477 12 17 12.4477 17 13V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V8C4 7.73478 4.10536 7.48043 4.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nExternalLinkIcon.displayName = \"ExternalLinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const LinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M16.9958 1.06669C15.4226 1.05302 13.907 1.65779 12.7753 2.75074L12.765 2.76086L11.045 4.47086C10.6534 4.86024 10.6515 5.49341 11.0409 5.88507C11.4303 6.27673 12.0634 6.27858 12.4551 5.88919L14.1697 4.18456C14.9236 3.45893 15.9319 3.05752 16.9784 3.06662C18.0272 3.07573 19.0304 3.49641 19.772 4.23804C20.5137 4.97967 20.9344 5.98292 20.9435 7.03171C20.9526 8.07776 20.5515 9.08563 19.8265 9.83941L16.833 12.8329C16.4274 13.2386 15.9393 13.5524 15.4019 13.7529C14.8645 13.9533 14.2903 14.0359 13.7181 13.9949C13.146 13.9539 12.5894 13.7904 12.0861 13.5154C11.5827 13.2404 11.1444 12.8604 10.8008 12.401C10.47 11.9588 9.84333 11.8685 9.40108 12.1993C8.95883 12.5301 8.86849 13.1568 9.1993 13.599C9.71464 14.288 10.3721 14.858 11.1272 15.2705C11.8822 15.683 12.7171 15.9283 13.5753 15.9898C14.4334 16.0513 15.2948 15.9274 16.1009 15.6267C16.907 15.326 17.639 14.8555 18.2473 14.247L21.2472 11.2471L21.2593 11.2347C22.3523 10.1031 22.9571 8.58751 22.9434 7.01433C22.9297 5.44115 22.2987 3.93628 21.1863 2.82383C20.0738 1.71138 18.5689 1.08036 16.9958 1.06669Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10.4247 8.0102C9.56657 7.94874 8.70522 8.07256 7.89911 8.37326C7.09305 8.67395 6.36096 9.14458 5.75272 9.753L2.75285 12.7529L2.74067 12.7653C1.64772 13.8969 1.04295 15.4125 1.05662 16.9857C1.07029 18.5589 1.70131 20.0637 2.81376 21.1762C3.9262 22.2886 5.43108 22.9196 7.00426 22.9333C8.57744 22.947 10.0931 22.3422 11.2247 21.2493L11.2371 21.2371L12.9471 19.5271C13.3376 19.1366 13.3376 18.5034 12.9471 18.1129C12.5565 17.7223 11.9234 17.7223 11.5328 18.1129L9.82932 19.8164C9.07555 20.5414 8.06768 20.9425 7.02164 20.9334C5.97285 20.9243 4.9696 20.5036 4.22797 19.762C3.48634 19.0203 3.06566 18.0171 3.05655 16.9683C3.04746 15.9222 3.44851 14.9144 4.17355 14.1606L7.16719 11.167C7.5727 10.7613 8.06071 10.4476 8.59811 10.2471C9.13552 10.0467 9.70976 9.96412 10.2819 10.0051C10.854 10.0461 11.4106 10.2096 11.9139 10.4846C12.4173 10.7596 12.8556 11.1397 13.1992 11.599C13.53 12.0412 14.1567 12.1316 14.5989 11.8007C15.0412 11.4699 15.1315 10.8433 14.8007 10.401C14.2854 9.71205 13.6279 9.14198 12.8729 8.72948C12.1178 8.31697 11.2829 8.07166 10.4247 8.0102Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nLinkIcon.displayName = \"LinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TrashIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 5V4C7 3.17477 7.40255 2.43324 7.91789 1.91789C8.43324 1.40255 9.17477 1 10 1H14C14.8252 1 15.5668 1.40255 16.0821 1.91789C16.5975 2.43324 17 3.17477 17 4V5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H20V20C20 20.8252 19.5975 21.5668 19.0821 22.0821C18.5668 22.5975 17.8252 23 17 23H7C6.17477 23 5.43324 22.5975 4.91789 22.0821C4.40255 21.5668 4 20.8252 4 20V7H3C2.44772 7 2 6.55228 2 6C2 5.44772 2.44772 5 3 5H7ZM9 4C9 3.82523 9.09745 3.56676 9.33211 3.33211C9.56676 3.09745 9.82523 3 10 3H14C14.1748 3 14.4332 3.09745 14.6679 3.33211C14.9025 3.56676 15 3.82523 15 4V5H9V4ZM6 7V20C6 20.1748 6.09745 20.4332 6.33211 20.6679C6.56676 20.9025 6.82523 21 7 21H17C17.1748 21 17.4332 20.9025 17.6679 20.6679C17.9025 20.4332 18 20.1748 18 20V7H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTrashIcon.displayName = \"TrashIcon\"\n","import { cn } from \"@/lib/tiptap-utils\"\nimport \"@/components/tiptap-ui-primitive/input/input.scss\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input type={type} className={cn(\"tiptap-input\", className)} {...props} />\n )\n}\n\nfunction InputGroup({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"tiptap-input-group\", className)} {...props}>\n {children}\n </div>\n )\n}\n\nexport { Input, InputGroup }\n","\"use client\"\n\nimport { forwardRef, useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useIsBreakpoint } from \"@/hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { CornerDownLeftIcon } from \"@/components/tiptap-icons/corner-down-left-icon\"\nimport { ExternalLinkIcon } from \"@/components/tiptap-icons/external-link-icon\"\nimport { LinkIcon } from \"@/components/tiptap-icons/link-icon\"\nimport { TrashIcon } from \"@/components/tiptap-icons/trash-icon\"\n\n// --- Tiptap UI ---\nimport type { UseLinkPopoverConfig } from \"@/components/tiptap-ui/link-popover\"\nimport { useLinkPopover } from \"@/components/tiptap-ui/link-popover\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"@/components/tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/components/tiptap-ui-primitive/popover\"\nimport { Separator } from \"@/components/tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"@/components/tiptap-ui-primitive/card\"\nimport { Input, InputGroup } from \"@/components/tiptap-ui-primitive/input\"\n\nexport interface LinkMainProps {\n /**\n * The URL to set for the link.\n */\n url: string\n /**\n * Function to update the URL state.\n */\n setUrl: React.Dispatch<React.SetStateAction<string | null>>\n /**\n * Function to set the link in the editor.\n */\n setLink: () => void\n /**\n * Function to remove the link from the editor.\n */\n removeLink: () => void\n /**\n * Function to open the link.\n */\n openLink: () => void\n /**\n * Whether the link is currently active in the editor.\n */\n isActive: boolean\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Tooltip for apply button\n */\n applyTooltip?: string\n /**\n * Tooltip for open link button\n */\n openTooltip?: string\n /**\n * Tooltip for remove link button\n */\n removeTooltip?: string\n}\n\nexport interface LinkPopoverProps\n extends Omit<ButtonProps, \"type\">,\n UseLinkPopoverConfig {\n /**\n * Callback for when the popover opens or closes.\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to automatically open the popover when a link is active.\n * @default true\n */\n autoOpenOnLinkActive?: boolean\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Tooltip for apply button\n */\n applyTooltip?: string\n /**\n * Tooltip for open link button\n */\n openTooltip?: string\n /**\n * Tooltip for remove link button\n */\n removeTooltip?: string\n}\n\n/**\n * Link button component for triggering the link popover\n */\nexport const LinkButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Link\"\n tooltip=\"Link\"\n ref={ref}\n {...props}\n >\n {children || <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n )\n }\n)\n\nLinkButton.displayName = \"LinkButton\"\n\n/**\n * Main content component for the link popover\n */\nconst LinkMain: React.FC<LinkMainProps> = ({\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n isActive,\n placeholder = \"Paste a link...\",\n applyTooltip = \"Apply link\",\n openTooltip = \"Open in new window\",\n removeTooltip = \"Remove link\",\n}) => {\n const isMobile = useIsBreakpoint()\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault()\n setLink()\n }\n }\n\n return (\n <Card\n style={{\n ...(isMobile ? { boxShadow: \"none\", border: 0 } : {}),\n }}\n >\n <CardBody\n style={{\n ...(isMobile ? { padding: 0 } : {}),\n }}\n >\n <CardItemGroup orientation=\"horizontal\">\n <InputGroup>\n <Input\n type=\"url\"\n placeholder={placeholder}\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n </InputGroup>\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={setLink}\n title={applyTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n\n <Separator />\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={openLink}\n title={openTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n\n <Button\n type=\"button\"\n onClick={removeLink}\n title={removeTooltip}\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\n/**\n * Link content component for standalone use\n */\nexport const LinkContent: React.FC<{\n editor?: Editor | null\n}> = ({ editor }) => {\n const linkPopover = useLinkPopover({\n editor,\n })\n\n return <LinkMain {...linkPopover} />\n}\n\n/**\n * Link popover component for Tiptap editors.\n *\n * For custom popover implementations, use the `useLinkPopover` hook instead.\n */\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n (\n {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n onOpenChange,\n autoOpenOnLinkActive = true,\n onClick,\n children,\n placeholder,\n applyTooltip,\n openTooltip,\n removeTooltip,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const {\n isVisible,\n canSet,\n isActive,\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n label,\n Icon,\n } = useLinkPopover({\n editor,\n hideWhenUnavailable,\n onSetLink,\n })\n\n const handleOnOpenChange = useCallback(\n (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n onOpenChange?.(nextIsOpen)\n },\n [onOpenChange]\n )\n\n const handleSetLink = useCallback(() => {\n setLink()\n setIsOpen(false)\n }, [setLink])\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n setIsOpen(!isOpen)\n },\n [onClick, isOpen]\n )\n\n useEffect(() => {\n if (autoOpenOnLinkActive && isActive) {\n setIsOpen(true)\n }\n }, [autoOpenOnLinkActive, isActive])\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOnOpenChange}>\n <PopoverTrigger asChild>\n <LinkButton\n disabled={!canSet}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canSet}\n aria-label={label}\n aria-pressed={isActive}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? <Icon className=\"tiptap-button-icon\" />}\n </LinkButton>\n </PopoverTrigger>\n\n <PopoverContent>\n <LinkMain\n url={url}\n setUrl={setUrl}\n setLink={handleSetLink}\n removeLink={removeLink}\n openLink={openLink}\n isActive={isActive}\n placeholder={placeholder}\n applyTooltip={applyTooltip}\n openTooltip={openTooltip}\n removeTooltip={removeTooltip}\n />\n </PopoverContent>\n </Popover>\n )\n }\n)\n\nLinkPopover.displayName = \"LinkPopover\"\n\nexport default LinkPopover\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { LinkIcon } from \"@/components/tiptap-icons/link-icon\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n sanitizeUrl,\n} from \"@/lib/tiptap-utils\"\n\n/**\n * Configuration for the link popover functionality\n */\nexport interface UseLinkPopoverConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the link popover when not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Configuration for the link handler functionality\n */\nexport interface LinkHandlerProps {\n /**\n * The Tiptap editor instance.\n */\n editor: Editor | null\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Checks if a link can be set in the current editor state\n */\nexport function canSetLink(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n // The third argument 'true' checks whether the current selection is inside an image caption, and prevents setting a link there\n // If the selection is inside an image caption, we can't set a link\n if (isNodeTypeSelected(editor, [\"image\"], true)) return false\n return editor.can().setMark(\"link\")\n}\n\n/**\n * Checks if a link is currently active in the editor\n */\nexport function isLinkActive(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"link\")\n}\n\n/**\n * Determines if the link button should be shown\n */\nexport function shouldShowLinkButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n const linkInSchema = isMarkInSchema(\"link\", editor)\n\n if (!linkInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetLink(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook for handling link operations in a Tiptap editor\n */\nexport function useLinkHandler(props: LinkHandlerProps) {\n const { editor, onSetLink } = props\n const [url, setUrl] = useState<string | null>(null)\n\n useEffect(() => {\n if (!editor) return\n\n // Get URL immediately on mount\n const { href } = editor.getAttributes(\"link\")\n\n if (isLinkActive(editor) && url === null) {\n setUrl(href || \"\")\n }\n }, [editor, url])\n\n useEffect(() => {\n if (!editor) return\n\n const updateLinkState = () => {\n const { href } = editor.getAttributes(\"link\")\n setUrl(href || \"\")\n }\n\n editor.on(\"selectionUpdate\", updateLinkState)\n return () => {\n editor.off(\"selectionUpdate\", updateLinkState)\n }\n }, [editor])\n\n const setLink = useCallback(() => {\n if (!url || !editor) return\n\n const { selection } = editor.state\n const isEmpty = selection.empty\n\n let chain = editor.chain().focus()\n\n chain = chain.extendMarkRange(\"link\").setLink({ href: url })\n\n if (isEmpty) {\n chain = chain.insertContent({ type: \"text\", text: url })\n }\n\n chain.run()\n\n setUrl(null)\n\n onSetLink?.()\n }, [editor, onSetLink, url])\n\n const removeLink = useCallback(() => {\n if (!editor) return\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .unsetLink()\n .setMeta(\"preventAutolink\", true)\n .run()\n setUrl(\"\")\n }, [editor])\n\n const openLink = useCallback(\n (target: string = \"_blank\", features: string = \"noopener,noreferrer\") => {\n if (!url) return\n\n const safeUrl = sanitizeUrl(url, window.location.href)\n if (safeUrl !== \"#\") {\n window.open(safeUrl, target, features)\n }\n },\n [url]\n )\n\n return {\n url: url || \"\",\n setUrl,\n setLink,\n removeLink,\n openLink,\n }\n}\n\n/**\n * Custom hook for link popover state management\n */\nexport function useLinkState(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}) {\n const { editor, hideWhenUnavailable = false } = props\n\n const canSet = canSetLink(editor)\n const isActive = isLinkActive(editor)\n\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowLinkButton({\n editor,\n hideWhenUnavailable,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n return {\n isVisible,\n canSet,\n isActive,\n }\n}\n\n/**\n * Main hook that provides link popover functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover()\n *\n * if (!isVisible) return null\n *\n * return <button disabled={!canSet}>Link</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onSetLink: () => console.log('Link set!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * disabled={!canSet}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * {label}\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useLinkPopover(config?: UseLinkPopoverConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const { isVisible, canSet, isActive } = useLinkState({\n editor,\n hideWhenUnavailable,\n })\n\n const linkHandler = useLinkHandler({\n editor,\n onSetLink,\n })\n\n return {\n isVisible,\n canSet,\n isActive,\n label: \"Link\",\n Icon: LinkIcon,\n ...linkHandler,\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { Mark, UseMarkConfig } from \"@/components/tiptap-ui/mark-button\"\nimport { MARK_SHORTCUT_KEYS, useMark } from \"@/components/tiptap-ui/mark-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface MarkButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseMarkConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function MarkShortcutBadge({\n type,\n shortcutKeys = MARK_SHORTCUT_KEYS[type],\n}: {\n type: Mark\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling marks in a Tiptap editor.\n *\n * For custom button implementations, use the `useMark` hook instead.\n */\nexport const MarkButton = forwardRef<HTMLButtonElement, MarkButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleMark,\n label,\n canToggle,\n isActive,\n Icon,\n shortcutKeys,\n } = useMark({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleMark()\n },\n [handleMark, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canToggle}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canToggle}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <MarkShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nMarkButton.displayName = \"MarkButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BoldIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 2.5C5.17157 2.5 4.5 3.17157 4.5 4V20C4.5 20.8284 5.17157 21.5 6 21.5H15C16.4587 21.5 17.8576 20.9205 18.8891 19.8891C19.9205 18.8576 20.5 17.4587 20.5 16C20.5 14.5413 19.9205 13.1424 18.8891 12.1109C18.6781 11.9 18.4518 11.7079 18.2128 11.5359C19.041 10.5492 19.5 9.29829 19.5 8C19.5 6.54131 18.9205 5.14236 17.8891 4.11091C16.8576 3.07946 15.4587 2.5 14 2.5H6ZM14 10.5C14.663 10.5 15.2989 10.2366 15.7678 9.76777C16.2366 9.29893 16.5 8.66304 16.5 8C16.5 7.33696 16.2366 6.70107 15.7678 6.23223C15.2989 5.76339 14.663 5.5 14 5.5H7.5V10.5H14ZM7.5 18.5V13.5H15C15.663 13.5 16.2989 13.7634 16.7678 14.2322C17.2366 14.7011 17.5 15.337 17.5 16C17.5 16.663 17.2366 17.2989 16.7678 17.7678C16.2989 18.2366 15.663 18.5 15 18.5H7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBoldIcon.displayName = \"BoldIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Code2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.4545 4.2983C15.6192 3.77115 15.3254 3.21028 14.7983 3.04554C14.2712 2.88081 13.7103 3.1746 13.5455 3.70175L8.54554 19.7017C8.38081 20.2289 8.6746 20.7898 9.20175 20.9545C9.72889 21.1192 10.2898 20.8254 10.4545 20.2983L15.4545 4.2983Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6.70711 7.29289C7.09763 7.68342 7.09763 8.31658 6.70711 8.70711L3.41421 12L6.70711 15.2929C7.09763 15.6834 7.09763 16.3166 6.70711 16.7071C6.31658 17.0976 5.68342 17.0976 5.29289 16.7071L1.29289 12.7071C0.902369 12.3166 0.902369 11.6834 1.29289 11.2929L5.29289 7.29289C5.68342 6.90237 6.31658 6.90237 6.70711 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17.2929 7.29289C17.6834 6.90237 18.3166 6.90237 18.7071 7.29289L22.7071 11.2929C23.0976 11.6834 23.0976 12.3166 22.7071 12.7071L18.7071 16.7071C18.3166 17.0976 17.6834 17.0976 17.2929 16.7071C16.9024 16.3166 16.9024 15.6834 17.2929 15.2929L20.5858 12L17.2929 8.70711C16.9024 8.31658 16.9024 7.68342 17.2929 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCode2Icon.displayName = \"Code2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ItalicIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.0222 3H19C19.5523 3 20 3.44772 20 4C20 4.55228 19.5523 5 19 5H15.693L10.443 19H14C14.5523 19 15 19.4477 15 20C15 20.5523 14.5523 21 14 21H9.02418C9.00802 21.0004 8.99181 21.0004 8.97557 21H5C4.44772 21 4 20.5523 4 20C4 19.4477 4.44772 19 5 19H8.30704L13.557 5H10C9.44772 5 9 4.55228 9 4C9 3.44772 9.44772 3 10 3H14.9782C14.9928 2.99968 15.0075 2.99967 15.0222 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nItalicIcon.displayName = \"ItalicIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const StrikeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.00039 3H16.0001C16.5524 3 17.0001 3.44772 17.0001 4C17.0001 4.55229 16.5524 5 16.0001 5H9.00011C8.68006 4.99983 8.36412 5.07648 8.07983 5.22349C7.79555 5.37051 7.55069 5.5836 7.36585 5.84487C7.181 6.10614 7.06155 6.40796 7.01754 6.72497C6.97352 7.04198 7.00623 7.36492 7.11292 7.66667C7.29701 8.18737 7.02414 8.75872 6.50344 8.94281C5.98274 9.1269 5.4114 8.85403 5.2273 8.33333C5.01393 7.72984 4.94851 7.08396 5.03654 6.44994C5.12456 5.81592 5.36346 5.21229 5.73316 4.68974C6.10285 4.1672 6.59256 3.74101 7.16113 3.44698C7.72955 3.15303 8.36047 2.99975 9.00039 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18 13H20C20.5523 13 21 12.5523 21 12C21 11.4477 20.5523 11 20 11H4C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H14C14.7956 13 15.5587 13.3161 16.1213 13.8787C16.6839 14.4413 17 15.2044 17 16C17 16.7956 16.6839 17.5587 16.1213 18.1213C15.5587 18.6839 14.7956 19 14 19H6C5.44772 19 5 19.4477 5 20C5 20.5523 5.44772 21 6 21H14C15.3261 21 16.5979 20.4732 17.5355 19.5355C18.4732 18.5979 19 17.3261 19 16C19 14.9119 18.6453 13.8604 18 13Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nStrikeIcon.displayName = \"StrikeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SubscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.4079 14.3995C18.0284 14.0487 18.7506 13.9217 19.4536 14.0397C20.1566 14.1578 20.7977 14.5138 21.2696 15.0481L21.2779 15.0574L21.2778 15.0575C21.7439 15.5988 22 16.2903 22 17C22 18.0823 21.3962 18.8401 20.7744 19.3404C20.194 19.8073 19.4858 20.141 18.9828 20.378C18.9638 20.387 18.9451 20.3958 18.9266 20.4045C18.4473 20.6306 18.2804 20.7817 18.1922 20.918C18.1773 20.9412 18.1619 20.9681 18.1467 21H21C21.5523 21 22 21.4477 22 22C22 22.5523 21.5523 23 21 23H17C16.4477 23 16 22.5523 16 22C16 21.1708 16.1176 20.4431 16.5128 19.832C16.9096 19.2184 17.4928 18.8695 18.0734 18.5956C18.6279 18.334 19.138 18.0901 19.5207 17.7821C19.8838 17.49 20 17.2477 20 17C20 16.7718 19.9176 16.5452 19.7663 16.3672C19.5983 16.1792 19.3712 16.0539 19.1224 16.0121C18.8722 15.9701 18.6152 16.015 18.3942 16.1394C18.1794 16.2628 18.0205 16.4549 17.9422 16.675C17.7572 17.1954 17.1854 17.4673 16.665 17.2822C16.1446 17.0972 15.8728 16.5254 16.0578 16.005C16.2993 15.3259 16.7797 14.7584 17.4039 14.4018L17.4079 14.3995L17.4079 14.3995Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSubscriptIcon.displayName = \"SubscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SuperscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.405 1.40657C18.0246 1.05456 18.7463 0.92634 19.4492 1.04344C20.1521 1.16054 20.7933 1.51583 21.2652 2.0497L21.2697 2.05469L21.2696 2.05471C21.7431 2.5975 22 3.28922 22 4.00203C22 5.08579 21.3952 5.84326 20.7727 6.34289C20.1966 6.80531 19.4941 7.13675 18.9941 7.37261C18.9714 7.38332 18.9491 7.39383 18.9273 7.40415C18.4487 7.63034 18.2814 7.78152 18.1927 7.91844C18.1778 7.94155 18.1625 7.96834 18.1473 8.00003H21C21.5523 8.00003 22 8.44774 22 9.00003C22 9.55231 21.5523 10 21 10H17C16.4477 10 16 9.55231 16 9.00003C16 8.17007 16.1183 7.44255 16.5138 6.83161C16.9107 6.21854 17.4934 5.86971 18.0728 5.59591C18.6281 5.33347 19.1376 5.09075 19.5208 4.78316C19.8838 4.49179 20 4.25026 20 4.00203C20 3.77192 19.9178 3.54865 19.7646 3.37182C19.5968 3.18324 19.3696 3.05774 19.1205 3.01625C18.8705 2.97459 18.6137 3.02017 18.3933 3.14533C18.1762 3.26898 18.0191 3.45826 17.9406 3.67557C17.7531 4.19504 17.18 4.46414 16.6605 4.27662C16.141 4.0891 15.8719 3.51596 16.0594 2.99649C16.303 2.3219 16.7817 1.76125 17.4045 1.40689L17.405 1.40657Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSuperscriptIcon.displayName = \"SuperscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const UnderlineIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 4C7 3.44772 6.55228 3 6 3C5.44772 3 5 3.44772 5 4V10C5 11.8565 5.7375 13.637 7.05025 14.9497C8.36301 16.2625 10.1435 17 12 17C13.8565 17 15.637 16.2625 16.9497 14.9497C18.2625 13.637 19 11.8565 19 10V4C19 3.44772 18.5523 3 18 3C17.4477 3 17 3.44772 17 4V10C17 11.3261 16.4732 12.5979 15.5355 13.5355C14.5979 14.4732 13.3261 15 12 15C10.6739 15 9.40215 14.4732 8.46447 13.5355C7.52678 12.5979 7 11.3261 7 10V4ZM4 19C3.44772 19 3 19.4477 3 20C3 20.5523 3.44772 21 4 21H20C20.5523 21 21 20.5523 21 20C21 19.4477 20.5523 19 20 19H4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUnderlineIcon.displayName = \"UnderlineIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isMarkInSchema, isNodeTypeSelected } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { BoldIcon } from \"@/components/tiptap-icons/bold-icon\"\nimport { Code2Icon } from \"@/components/tiptap-icons/code2-icon\"\nimport { ItalicIcon } from \"@/components/tiptap-icons/italic-icon\"\nimport { StrikeIcon } from \"@/components/tiptap-icons/strike-icon\"\nimport { SubscriptIcon } from \"@/components/tiptap-icons/subscript-icon\"\nimport { SuperscriptIcon } from \"@/components/tiptap-icons/superscript-icon\"\nimport { UnderlineIcon } from \"@/components/tiptap-icons/underline-icon\"\n\nexport type Mark =\n | \"bold\"\n | \"italic\"\n | \"strike\"\n | \"code\"\n | \"underline\"\n | \"superscript\"\n | \"subscript\"\n\n/**\n * Configuration for the mark functionality\n */\nexport interface UseMarkConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of mark to toggle\n */\n type: Mark\n /**\n * Whether the button should hide when mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful mark toggle.\n */\n onToggled?: () => void\n}\n\nexport const markIcons = {\n bold: BoldIcon,\n italic: ItalicIcon,\n underline: UnderlineIcon,\n strike: StrikeIcon,\n code: Code2Icon,\n superscript: SuperscriptIcon,\n subscript: SubscriptIcon,\n}\n\nexport const MARK_SHORTCUT_KEYS: Record<Mark, string> = {\n bold: \"mod+b\",\n italic: \"mod+i\",\n underline: \"mod+u\",\n strike: \"mod+shift+s\",\n code: \"mod+e\",\n superscript: \"mod+.\",\n subscript: \"mod+,\",\n}\n\n/**\n * Checks if a mark can be toggled in the current editor state\n */\nexport function canToggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n return editor.can().toggleMark(type)\n}\n\n/**\n * Checks if a mark is currently active\n */\nexport function isMarkActive(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(type)\n}\n\n/**\n * Toggles a mark in the editor\n */\nexport function toggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleMark(editor, type)) return false\n\n return editor.chain().focus().toggleMark(type).run()\n}\n\n/**\n * Determines if the mark button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: Mark\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleMark(editor, type)\n }\n\n return true\n}\n\n/**\n * Gets the formatted mark name\n */\nexport function getFormattedMarkName(type: Mark): string {\n return type.charAt(0).toUpperCase() + type.slice(1)\n}\n\n/**\n * Custom hook that provides mark functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleBoldButton() {\n * const { isVisible, handleMark } = useMark({ type: \"bold\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleMark}>Bold</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedItalicButton() {\n * const { isVisible, handleMark, label, isActive } = useMark({\n * editor: myEditor,\n * type: \"italic\",\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Mark toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleMark}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Italic\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useMark(config: UseMarkConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleMark(editor, type)\n const isActive = isMarkActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleMark = useCallback(() => {\n if (!editor) return false\n\n const success = toggleMark(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleMark,\n canToggle,\n label: getFormattedMarkName(type),\n shortcutKeys: MARK_SHORTCUT_KEYS[type],\n Icon: markIcons[type],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n TextAlign,\n UseTextAlignConfig,\n} from \"@/components/tiptap-ui/text-align-button\"\nimport {\n TEXT_ALIGN_SHORTCUT_KEYS,\n useTextAlign,\n} from \"@/components/tiptap-ui/text-align-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface TextAlignButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseTextAlignConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n /**\n * Optional custom icon component to render instead of the default.\n */\n icon?: React.MemoExoticComponent<IconComponent> | React.FC<IconProps>\n}\n\nexport function TextAlignShortcutBadge({\n align,\n shortcutKeys = TEXT_ALIGN_SHORTCUT_KEYS[align],\n}: {\n align: TextAlign\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for setting text alignment in a Tiptap editor.\n *\n * For custom button implementations, use the `useTextAlign` hook instead.\n */\nexport const TextAlignButton = forwardRef<\n HTMLButtonElement,\n TextAlignButtonProps\n>(\n (\n {\n editor: providedEditor,\n align,\n text,\n hideWhenUnavailable = false,\n onAligned,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleTextAlign,\n label,\n canAlign,\n isActive,\n Icon,\n shortcutKeys,\n } = useTextAlign({\n editor,\n align,\n hideWhenUnavailable,\n onAligned,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleTextAlign()\n },\n [handleTextAlign, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const RenderIcon = CustomIcon ?? Icon\n\n return (\n <Button\n type=\"button\"\n disabled={!canAlign}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canAlign}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <TextAlignShortcutBadge\n align={align}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nTextAlignButton.displayName = \"TextAlignButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignCenterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 12C6 11.4477 6.44772 11 7 11H17C17.5523 11 18 11.4477 18 12C18 12.5523 17.5523 13 17 13H7C6.44772 13 6 12.5523 6 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 18C4 17.4477 4.44772 17 5 17H19C19.5523 17 20 17.4477 20 18C20 18.5523 19.5523 19 19 19H5C4.44772 19 4 18.5523 4 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignCenterIcon.displayName = \"AlignCenterIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignJustifyIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignJustifyIcon.displayName = \"AlignJustifyIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H15C15.5523 11 16 11.4477 16 12C16 12.5523 15.5523 13 15 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H17C17.5523 17 18 17.4477 18 18C18 18.5523 17.5523 19 17 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignLeftIcon.displayName = \"AlignLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignRightIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 18C6 17.4477 6.44772 17 7 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H7C6.44772 19 6 18.5523 6 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignRightIcon.displayName = \"AlignRightIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { ChainedCommands } from \"@tiptap/react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isNodeTypeSelected,\n} from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { AlignCenterIcon } from \"@/components/tiptap-icons/align-center-icon\"\nimport { AlignJustifyIcon } from \"@/components/tiptap-icons/align-justify-icon\"\nimport { AlignLeftIcon } from \"@/components/tiptap-icons/align-left-icon\"\nimport { AlignRightIcon } from \"@/components/tiptap-icons/align-right-icon\"\n\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\"\n\n/**\n * Configuration for the text align functionality\n */\nexport interface UseTextAlignConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The text alignment to apply.\n */\n align: TextAlign\n /**\n * Whether the button should hide when alignment is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful alignment change.\n */\n onAligned?: () => void\n}\n\nexport const TEXT_ALIGN_SHORTCUT_KEYS: Record<TextAlign, string> = {\n left: \"mod+shift+l\",\n center: \"mod+shift+e\",\n right: \"mod+shift+r\",\n justify: \"mod+shift+j\",\n}\n\nexport const textAlignIcons = {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon,\n}\n\nexport const textAlignLabels: Record<TextAlign, string> = {\n left: \"Align left\",\n center: \"Align center\",\n right: \"Align right\",\n justify: \"Align justify\",\n}\n\n/**\n * Checks if text alignment can be performed in the current editor state\n */\nexport function canSetTextAlign(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isExtensionAvailable(editor, \"textAlign\") ||\n isNodeTypeSelected(editor, [\"image\", \"horizontalRule\"])\n )\n return false\n\n return editor.can().setTextAlign(align)\n}\n\nexport function hasSetTextAlign(\n commands: ChainedCommands\n): commands is ChainedCommands & {\n setTextAlign: (align: TextAlign) => ChainedCommands\n} {\n return \"setTextAlign\" in commands\n}\n\n/**\n * Checks if the text alignment is currently active\n */\nexport function isTextAlignActive(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive({ textAlign: align })\n}\n\n/**\n * Sets text alignment in the editor\n */\nexport function setTextAlign(editor: Editor | null, align: TextAlign): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canSetTextAlign(editor, align)) return false\n\n const chain = editor.chain().focus()\n if (hasSetTextAlign(chain)) {\n return chain.setTextAlign(align).run()\n }\n\n return false\n}\n\n/**\n * Determines if the text align button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n align: TextAlign\n}): boolean {\n const { editor, hideWhenUnavailable, align } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"textAlign\")) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetTextAlign(editor, align)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides text align functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleAlignButton() {\n * const { isVisible, handleTextAlign } = useTextAlign({ align: \"center\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleTextAlign}>Align Center</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedAlignButton() {\n * const { isVisible, handleTextAlign, label, isActive } = useTextAlign({\n * editor: myEditor,\n * align: \"right\",\n * hideWhenUnavailable: true,\n * onAligned: () => console.log('Text aligned!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleTextAlign}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Align Right\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useTextAlign(config: UseTextAlignConfig) {\n const {\n editor: providedEditor,\n align,\n hideWhenUnavailable = false,\n onAligned,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canAlign = canSetTextAlign(editor, align)\n const isActive = isTextAlignActive(editor, align)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, align, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, align])\n\n const handleTextAlign = useCallback(() => {\n if (!editor) return false\n\n const success = setTextAlign(editor, align)\n if (success) {\n onAligned?.()\n }\n return success\n }, [editor, align, onAligned])\n\n return {\n isVisible,\n isActive,\n handleTextAlign,\n canAlign,\n label: textAlignLabels[align],\n shortcutKeys: TEXT_ALIGN_SHORTCUT_KEYS[align],\n Icon: textAlignIcons[align],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"@/lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n UndoRedoAction,\n UseUndoRedoConfig,\n} from \"@/components/tiptap-ui/undo-redo-button\"\nimport {\n UNDO_REDO_SHORTCUT_KEYS,\n useUndoRedo,\n} from \"@/components/tiptap-ui/undo-redo-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"@/components/tiptap-ui-primitive/button\"\nimport { Button } from \"@/components/tiptap-ui-primitive/button\"\nimport { Badge } from \"@/components/tiptap-ui-primitive/badge\"\n\nexport interface UndoRedoButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseUndoRedoConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HistoryShortcutBadge({\n action,\n shortcutKeys = UNDO_REDO_SHORTCUT_KEYS[action],\n}: {\n action: UndoRedoAction\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for triggering undo/redo actions in a Tiptap editor.\n *\n * For custom button implementations, use the `useHistory` hook instead.\n */\nexport const UndoRedoButton = forwardRef<\n HTMLButtonElement,\n UndoRedoButtonProps\n>(\n (\n {\n editor: providedEditor,\n action,\n text,\n hideWhenUnavailable = false,\n onExecuted,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleAction, label, canExecute, Icon, shortcutKeys } =\n useUndoRedo({\n editor,\n action,\n hideWhenUnavailable,\n onExecuted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleAction()\n },\n [handleAction, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canExecute}\n data-style=\"ghost\"\n data-disabled={!canExecute}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HistoryShortcutBadge\n action={action}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nUndoRedoButton.displayName = \"UndoRedoButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Redo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.7071 2.29289C15.3166 1.90237 14.6834 1.90237 14.2929 2.29289C13.9024 2.68342 13.9024 3.31658 14.2929 3.70711L17.5858 7H9.5C7.77609 7 6.12279 7.68482 4.90381 8.90381C3.68482 10.1228 3 11.7761 3 13.5C3 14.3536 3.16813 15.1988 3.49478 15.9874C3.82144 16.7761 4.30023 17.4926 4.90381 18.0962C6.12279 19.3152 7.77609 20 9.5 20H13C13.5523 20 14 19.5523 14 19C14 18.4477 13.5523 18 13 18H9.5C8.30653 18 7.16193 17.5259 6.31802 16.682C5.90016 16.2641 5.56869 15.768 5.34254 15.2221C5.1164 14.6761 5 14.0909 5 13.5C5 12.3065 5.47411 11.1619 6.31802 10.318C7.16193 9.47411 8.30653 9 9.5 9H17.5858L14.2929 12.2929C13.9024 12.6834 13.9024 13.3166 14.2929 13.7071C14.6834 14.0976 15.3166 14.0976 15.7071 13.7071L20.7071 8.70711C21.0976 8.31658 21.0976 7.68342 20.7071 7.29289L15.7071 2.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRedo2Icon.displayName = \"Redo2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Undo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 3.70711C10.0976 3.31658 10.0976 2.68342 9.70711 2.29289C9.31658 1.90237 8.68342 1.90237 8.29289 2.29289L3.29289 7.29289C2.90237 7.68342 2.90237 8.31658 3.29289 8.70711L8.29289 13.7071C8.68342 14.0976 9.31658 14.0976 9.70711 13.7071C10.0976 13.3166 10.0976 12.6834 9.70711 12.2929L6.41421 9H14.5C15.0909 9 15.6761 9.1164 16.2221 9.34254C16.768 9.56869 17.2641 9.90016 17.682 10.318C18.0998 10.7359 18.4313 11.232 18.6575 11.7779C18.8836 12.3239 19 12.9091 19 13.5C19 14.0909 18.8836 14.6761 18.6575 15.2221C18.4313 15.768 18.0998 16.2641 17.682 16.682C17.2641 17.0998 16.768 17.4313 16.2221 17.6575C15.6761 17.8836 15.0909 18 14.5 18H11C10.4477 18 10 18.4477 10 19C10 19.5523 10.4477 20 11 20H14.5C15.3536 20 16.1988 19.8319 16.9874 19.5052C17.7761 19.1786 18.4926 18.6998 19.0962 18.0962C19.6998 17.4926 20.1786 16.7761 20.5052 15.9874C20.8319 15.1988 21 14.3536 21 13.5C21 12.6464 20.8319 11.8012 20.5052 11.0126C20.1786 10.2239 19.6998 9.50739 19.0962 8.90381C18.4926 8.30022 17.7761 7.82144 16.9874 7.49478C16.1988 7.16813 15.3536 7 14.5 7H6.41421L9.70711 3.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUndo2Icon.displayName = \"Undo2Icon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"@/hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isNodeTypeSelected } from \"@/lib/tiptap-utils\"\n\n// --- Icons ---\nimport { Redo2Icon } from \"@/components/tiptap-icons/redo2-icon\"\nimport { Undo2Icon } from \"@/components/tiptap-icons/undo2-icon\"\n\nexport type UndoRedoAction = \"undo\" | \"redo\"\n\n/**\n * Configuration for the history functionality\n */\nexport interface UseUndoRedoConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The history action to perform (undo or redo).\n */\n action: UndoRedoAction\n /**\n * Whether the button should hide when action is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful action execution.\n */\n onExecuted?: () => void\n}\n\nexport const UNDO_REDO_SHORTCUT_KEYS: Record<UndoRedoAction, string> = {\n undo: \"mod+z\",\n redo: \"mod+shift+z\",\n}\n\nexport const historyActionLabels: Record<UndoRedoAction, string> = {\n undo: \"Undo\",\n redo: \"Redo\",\n}\n\nexport const historyIcons = {\n undo: Undo2Icon,\n redo: Redo2Icon,\n}\n\n/**\n * Checks if a history action can be executed\n */\nexport function canExecuteUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n return action === \"undo\" ? editor.can().undo() : editor.can().redo()\n}\n\n/**\n * Executes a history action on the editor\n */\nexport function executeUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canExecuteUndoRedoAction(editor, action)) return false\n\n const chain = editor.chain().focus()\n return action === \"undo\" ? chain.undo().run() : chain.redo().run()\n}\n\n/**\n * Determines if the history button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n action: UndoRedoAction\n}): boolean {\n const { editor, hideWhenUnavailable, action } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canExecuteUndoRedoAction(editor, action)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides history functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleUndoButton() {\n * const { isVisible, handleAction } = useHistory({ action: \"undo\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleAction}>Undo</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedRedoButton() {\n * const { isVisible, handleAction, label } = useHistory({\n * editor: myEditor,\n * action: \"redo\",\n * hideWhenUnavailable: true,\n * onExecuted: () => console.log('Action executed!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleAction}\n * aria-label={label}\n * >\n * Redo\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useUndoRedo(config: UseUndoRedoConfig) {\n const {\n editor: providedEditor,\n action,\n hideWhenUnavailable = false,\n onExecuted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canExecute = canExecuteUndoRedoAction(editor, action)\n\n useEffect(() => {\n if (!editor) return\n\n const handleUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, action }))\n }\n\n handleUpdate()\n\n editor.on(\"transaction\", handleUpdate)\n\n return () => {\n editor.off(\"transaction\", handleUpdate)\n }\n }, [editor, hideWhenUnavailable, action])\n\n const handleAction = useCallback(() => {\n if (!editor) return false\n\n const success = executeUndoRedoAction(editor, action)\n if (success) {\n onExecuted?.()\n }\n return success\n }, [editor, action, onExecuted])\n\n return {\n isVisible,\n handleAction,\n canExecute,\n label: historyActionLabels[action],\n shortcutKeys: UNDO_REDO_SHORTCUT_KEYS[action],\n Icon: historyIcons[action],\n }\n}\n","\"use client\"\n\nimport { createContext, useContext } from \"react\"\nimport type { IMComposerLocale } from \"../types\"\nimport { defaultLocale } from \"../types\"\n\nconst LocaleContext = createContext<IMComposerLocale>(defaultLocale)\n\nexport function LocaleProvider({\n locale,\n children,\n}: {\n locale?: IMComposerLocale\n children: React.ReactNode\n}) {\n const mergedLocale = { ...defaultLocale, ...locale }\n return (\n <LocaleContext.Provider value={mergedLocale}>\n {children}\n </LocaleContext.Provider>\n )\n}\n\nexport function useLocale(): IMComposerLocale {\n return useContext(LocaleContext)\n}\n","import type { Editor } from '@tiptap/core';\n\n/**\n * Markdown serializer for Tiptap editor content.\n * Converts the editor document to Markdown string.\n */\nexport function editorToMarkdown(editor: Editor): string {\n const doc = editor.state.doc;\n return nodeToMarkdown(doc);\n}\n\nfunction nodeToMarkdown(node: any, depth = 0): string {\n const parts: string[] = [];\n\n node.forEach((child: any, offset: number, index: number) => {\n parts.push(childNodeToMarkdown(child, depth, index));\n });\n\n return parts.join('');\n}\n\nfunction childNodeToMarkdown(node: any, depth: number, index: number): string {\n const typeName = node.type.name;\n\n switch (typeName) {\n case 'doc':\n return nodeToMarkdown(node, depth);\n\n case 'paragraph':\n const paragraphContent = inlineContentToMarkdown(node);\n return index > 0 ? '\\n\\n' + paragraphContent : paragraphContent;\n\n case 'heading': {\n const level = node.attrs.level || 1;\n const prefix = '#'.repeat(level) + ' ';\n const content = inlineContentToMarkdown(node);\n return (index > 0 ? '\\n\\n' : '') + prefix + content;\n }\n\n case 'bulletList':\n return (index > 0 ? '\\n\\n' : '') + listToMarkdown(node, '-', depth);\n\n case 'orderedList':\n return (index > 0 ? '\\n\\n' : '') + listToMarkdown(node, '1.', depth);\n\n case 'listItem':\n return nodeToMarkdown(node, depth);\n\n case 'blockquote': {\n const content = nodeToMarkdown(node, depth);\n const lines = content.split('\\n').map((line) => '> ' + line);\n return (index > 0 ? '\\n\\n' : '') + lines.join('\\n');\n }\n\n case 'codeBlock': {\n const language = node.attrs.language || '';\n const code = node.textContent;\n return (index > 0 ? '\\n\\n' : '') + '```' + language + '\\n' + code + '\\n```';\n }\n\n case 'horizontalRule':\n return (index > 0 ? '\\n\\n' : '') + '---';\n\n case 'hardBreak':\n return '\\n';\n\n case 'image': {\n const { src, alt, title } = node.attrs;\n const titlePart = title ? ` \"${title}\"` : '';\n return `![${alt || ''}](${src}${titlePart})`;\n }\n\n default:\n if (node.isText) {\n return formatTextWithMarks(node);\n }\n return node.textContent || '';\n }\n}\n\nfunction listToMarkdown(node: any, marker: string, depth: number): string {\n const items: string[] = [];\n const indent = ' '.repeat(depth);\n\n node.forEach((item: any, offset: number, index: number) => {\n const itemMarker = marker === '1.' ? `${index + 1}.` : marker;\n const content = inlineContentToMarkdown(item.firstChild);\n items.push(indent + itemMarker + ' ' + content);\n\n // Handle nested lists\n item.forEach((child: any, childOffset: number, childIndex: number) => {\n if (childIndex > 0) {\n if (child.type.name === 'bulletList' || child.type.name === 'orderedList') {\n items.push(listToMarkdown(child, child.type.name === 'bulletList' ? '-' : '1.', depth + 1));\n }\n }\n });\n });\n\n return items.join('\\n');\n}\n\nfunction inlineContentToMarkdown(node: any): string {\n if (!node) return '';\n\n const parts: string[] = [];\n\n node.forEach((child: any) => {\n if (child.isText) {\n parts.push(formatTextWithMarks(child));\n } else if (child.type.name === 'hardBreak') {\n parts.push('\\n');\n } else if (child.type.name === 'image') {\n const { src, alt, title } = child.attrs;\n const titlePart = title ? ` \"${title}\"` : '';\n parts.push(`![${alt || ''}](${src}${titlePart})`);\n } else {\n parts.push(child.textContent || '');\n }\n });\n\n return parts.join('');\n}\n\nfunction formatTextWithMarks(node: any): string {\n let text = node.text || '';\n\n if (!node.marks || node.marks.length === 0) {\n return escapeMarkdown(text);\n }\n\n // Sort marks for consistent output\n const marks = [...node.marks].sort((a, b) => {\n const order = ['link', 'code', 'bold', 'italic', 'strike'];\n return order.indexOf(a.type.name) - order.indexOf(b.type.name);\n });\n\n for (const mark of marks) {\n switch (mark.type.name) {\n case 'bold':\n text = `**${text}**`;\n break;\n case 'italic':\n text = `*${text}*`;\n break;\n case 'strike':\n text = `~~${text}~~`;\n break;\n case 'code':\n text = `\\`${text}\\``;\n break;\n case 'link':\n const href = mark.attrs.href || '';\n text = `[${text}](${href})`;\n break;\n }\n }\n\n return text;\n}\n\nfunction escapeMarkdown(text: string): string {\n // Escape special markdown characters in regular text\n // Be conservative - only escape characters that would cause issues\n return text.replace(/([\\\\`*_{}[\\]()#+\\-.!])/g, '\\\\$1');\n}\n\n/**\n * Parse Markdown to Tiptap-compatible JSON content.\n * This is a simplified parser for the Markdown subset we support.\n */\nexport function markdownToEditorContent(markdown: string): any {\n const lines = markdown.split('\\n');\n const content: any[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Code block\n if (line.startsWith('```')) {\n const language = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n\n while (i < lines.length && !lines[i].startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n\n content.push({\n type: 'codeBlock',\n attrs: { language },\n content: [{ type: 'text', text: codeLines.join('\\n') }],\n });\n i++;\n continue;\n }\n\n // Heading\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n content.push({\n type: 'heading',\n attrs: { level: headingMatch[1].length },\n content: parseInlineContent(headingMatch[2]),\n });\n i++;\n continue;\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n const quoteLines: string[] = [];\n while (i < lines.length && lines[i].startsWith('> ')) {\n quoteLines.push(lines[i].slice(2));\n i++;\n }\n\n content.push({\n type: 'blockquote',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(quoteLines.join('\\n')),\n },\n ],\n });\n continue;\n }\n\n // Horizontal rule\n if (line.match(/^(-{3,}|_{3,}|\\*{3,})$/)) {\n content.push({ type: 'horizontalRule' });\n i++;\n continue;\n }\n\n // Bullet list item\n if (line.match(/^[-*+]\\s+/)) {\n const items: any[] = [];\n while (i < lines.length && lines[i].match(/^[-*+]\\s+/)) {\n const itemText = lines[i].replace(/^[-*+]\\s+/, '');\n items.push({\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(itemText),\n },\n ],\n });\n i++;\n }\n\n content.push({\n type: 'bulletList',\n content: items,\n });\n continue;\n }\n\n // Ordered list item\n const orderedMatch = line.match(/^(\\d+)\\.\\s+/);\n if (orderedMatch) {\n const items: any[] = [];\n while (i < lines.length && lines[i].match(/^\\d+\\.\\s+/)) {\n const itemText = lines[i].replace(/^\\d+\\.\\s+/, '');\n items.push({\n type: 'listItem',\n content: [\n {\n type: 'paragraph',\n content: parseInlineContent(itemText),\n },\n ],\n });\n i++;\n }\n\n content.push({\n type: 'orderedList',\n attrs: { start: parseInt(orderedMatch[1], 10) },\n content: items,\n });\n continue;\n }\n\n // Empty line\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n // Regular paragraph\n content.push({\n type: 'paragraph',\n content: parseInlineContent(line),\n });\n i++;\n }\n\n return {\n type: 'doc',\n content: content.length > 0 ? content : [{ type: 'paragraph' }],\n };\n}\n\nfunction parseInlineContent(text: string): any[] {\n if (!text) return [];\n\n const content: any[] = [];\n let remaining = text;\n\n // Simple regex-based parsing for inline elements\n const patterns = [\n // Image: ![alt](url)\n { regex: /!\\[([^\\]]*)\\]\\(([^)]+)\\)/, type: 'image' },\n // Link: [text](url)\n { regex: /\\[([^\\]]+)\\]\\(([^)]+)\\)/, type: 'link' },\n // Bold: **text**\n { regex: /\\*\\*([^*]+)\\*\\*/, type: 'bold' },\n // Italic: *text*\n { regex: /(?<!\\*)\\*([^*]+)\\*(?!\\*)/, type: 'italic' },\n // Strike: ~~text~~\n { regex: /~~([^~]+)~~/, type: 'strike' },\n // Code: `text`\n { regex: /`([^`]+)`/, type: 'code' },\n ];\n\n while (remaining.length > 0) {\n let earliestMatch: { match: RegExpExecArray; type: string } | null = null;\n let earliestIndex = Infinity;\n\n for (const pattern of patterns) {\n const match = pattern.regex.exec(remaining);\n if (match && match.index < earliestIndex) {\n earliestMatch = { match, type: pattern.type };\n earliestIndex = match.index;\n }\n }\n\n if (earliestMatch) {\n // Add text before the match\n if (earliestIndex > 0) {\n content.push({\n type: 'text',\n text: remaining.slice(0, earliestIndex),\n });\n }\n\n const { match, type } = earliestMatch;\n\n switch (type) {\n case 'image':\n content.push({\n type: 'image',\n attrs: {\n alt: match[1],\n src: match[2],\n },\n });\n break;\n case 'link':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'link', attrs: { href: match[2] } }],\n });\n break;\n case 'bold':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'bold' }],\n });\n break;\n case 'italic':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'italic' }],\n });\n break;\n case 'strike':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'strike' }],\n });\n break;\n case 'code':\n content.push({\n type: 'text',\n text: match[1],\n marks: [{ type: 'code' }],\n });\n break;\n }\n\n remaining = remaining.slice(earliestIndex + match[0].length);\n } else {\n // No more patterns found, add remaining text\n content.push({\n type: 'text',\n text: remaining,\n });\n break;\n }\n }\n\n return content;\n}\n","\"use client\"\n\nimport { useRef, useCallback, useImperativeHandle, forwardRef, useState } from \"react\"\nimport { EditorContent, EditorContext, useEditor, type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Tiptap Core Extensions ---\nimport { StarterKit } from \"@tiptap/starter-kit\"\nimport { TaskItem, TaskList } from \"@tiptap/extension-list\"\nimport { TextAlign } from \"@tiptap/extension-text-align\"\nimport { Typography } from \"@tiptap/extension-typography\"\nimport { Highlight } from \"@tiptap/extension-highlight\"\nimport { Subscript } from \"@tiptap/extension-subscript\"\nimport { Superscript } from \"@tiptap/extension-superscript\"\nimport { Selection } from \"@tiptap/extensions\"\nimport { Placeholder } from \"@tiptap/extension-placeholder\"\nimport { Image } from \"@tiptap/extension-image\"\n\n// --- UI Primitives ---\nimport { Spacer } from \"@/components/tiptap-ui-primitive/spacer\"\nimport {\n Toolbar,\n ToolbarGroup,\n ToolbarSeparator,\n} from \"@/components/tiptap-ui-primitive/toolbar\"\n\n// --- Tiptap Node ---\nimport { ImageUploadNode } from \"@/components/tiptap-node/image-upload-node/image-upload-node-extension\"\nimport { HorizontalRule } from \"@/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension\"\n\n// --- Tiptap UI ---\nimport { HeadingDropdownMenu } from \"@/components/tiptap-ui/heading-dropdown-menu\"\nimport { ImageUploadButton } from \"@/components/tiptap-ui/image-upload-button\"\nimport { ListDropdownMenu } from \"@/components/tiptap-ui/list-dropdown-menu\"\nimport { BlockquoteButton } from \"@/components/tiptap-ui/blockquote-button\"\nimport { CodeBlockButton } from \"@/components/tiptap-ui/code-block-button\"\nimport { ColorHighlightPopover } from \"@/components/tiptap-ui/color-highlight-popover\"\nimport { LinkPopover } from \"@/components/tiptap-ui/link-popover\"\nimport { MarkButton } from \"@/components/tiptap-ui/mark-button\"\nimport { TextAlignButton } from \"@/components/tiptap-ui/text-align-button\"\nimport { UndoRedoButton } from \"@/components/tiptap-ui/undo-redo-button\"\n\n// --- Lib ---\nimport { MAX_FILE_SIZE, focusNextNode } from \"@/lib/tiptap-utils\"\n\n// --- Context ---\nimport { useLocale } from \"@/contexts/LocaleContext\"\n\n// --- Types ---\nimport type { MarkdownMessagePayload, ComposerDraft, UploadImageFn } from \"../types\"\nimport { editorToMarkdown } from \"../utils/markdown\"\n\nexport interface RichEditorProps {\n placeholder?: string\n disabled?: boolean\n uploadImage?: UploadImageFn\n onUploadingChange?: (count: number) => void\n onSend?: () => void\n onChange?: () => void\n sendKeymap?: 'enter' | 'ctrlEnter' | 'cmdEnter'\n}\n\nexport interface RichEditorRef {\n editor: Editor | null\n focus: () => void\n clear: () => void\n exportPayload: () => MarkdownMessagePayload | null\n importMarkdown: (markdown: string) => void\n getDraft: () => ComposerDraft\n setDraft: (draft: ComposerDraft) => void\n setText: (text: string) => void\n insertText: (text: string) => void\n isUploading: () => boolean\n}\n\nconst RichToolbar = () => {\n const locale = useLocale()\n\n return (\n <Toolbar className=\"im-rich-toolbar\">\n <ToolbarGroup>\n <UndoRedoButton action=\"undo\" tooltip={locale.undo} />\n <UndoRedoButton action=\"redo\" tooltip={locale.redo} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <HeadingDropdownMenu\n levels={[1, 2, 3, 4]}\n tooltip={locale.heading}\n labels={{\n heading1: locale.heading1,\n heading2: locale.heading2,\n heading3: locale.heading3,\n heading4: locale.heading4,\n paragraph: locale.paragraph,\n }}\n />\n <ListDropdownMenu\n types={[\"bulletList\", \"orderedList\", \"taskList\"]}\n tooltip={locale.list}\n labels={{\n bulletList: locale.bulletList,\n orderedList: locale.orderedList,\n taskList: locale.taskList,\n }}\n />\n <BlockquoteButton tooltip={locale.blockquote} />\n <CodeBlockButton tooltip={locale.codeBlock} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"bold\" tooltip={locale.bold} />\n <MarkButton type=\"italic\" tooltip={locale.italic} />\n <MarkButton type=\"strike\" tooltip={locale.strike} />\n <MarkButton type=\"code\" tooltip={locale.code} />\n <MarkButton type=\"underline\" tooltip={locale.underline} />\n <ColorHighlightPopover tooltip={locale.highlight} removeTooltip={locale.removeHighlight} />\n <LinkPopover\n tooltip={locale.link}\n placeholder={locale.linkPlaceholder}\n applyTooltip={locale.applyLink}\n openTooltip={locale.openLink}\n removeTooltip={locale.removeLink}\n />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"superscript\" tooltip={locale.superscript} />\n <MarkButton type=\"subscript\" tooltip={locale.subscript} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <TextAlignButton align=\"left\" tooltip={locale.alignLeft} />\n <TextAlignButton align=\"center\" tooltip={locale.alignCenter} />\n <TextAlignButton align=\"right\" tooltip={locale.alignRight} />\n <TextAlignButton align=\"justify\" tooltip={locale.alignJustify} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <ImageUploadButton tooltip={locale.insertImage} />\n </ToolbarGroup>\n\n <Spacer />\n </Toolbar>\n )\n}\n\nexport const RichEditor = forwardRef<RichEditorRef, RichEditorProps>(function RichEditor(\n {\n placeholder = \"Write something...\",\n disabled = false,\n uploadImage,\n onUploadingChange,\n onSend,\n onChange,\n sendKeymap = 'enter',\n },\n ref\n) {\n const locale = useLocale()\n const uploadingCountRef = useRef(0)\n const [pasteUploads, setPasteUploads] = useState<Map<string, { name: string; size: number; progress: number }>>(new Map())\n\n const handleImageUpload = useCallback(async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n ): Promise<string> => {\n if (!uploadImage) {\n throw new Error(\"No upload handler provided\")\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(`File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`)\n }\n\n uploadingCountRef.current++\n onUploadingChange?.(uploadingCountRef.current)\n\n try {\n if (abortSignal?.aborted) {\n throw new Error(\"Upload cancelled\")\n }\n\n const result = await uploadImage(file, (event) => {\n onProgress?.(event)\n })\n onProgress?.({ progress: 100 })\n return result.url\n } finally {\n uploadingCountRef.current--\n onUploadingChange?.(uploadingCountRef.current)\n }\n }, [uploadImage, onUploadingChange])\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !disabled,\n editorProps: {\n attributes: {\n autocomplete: \"off\",\n autocorrect: \"off\",\n autocapitalize: \"off\",\n class: \"im-rich-editor-content\",\n },\n handleClick: (view, pos, event) => {\n const target = event.target as HTMLElement\n const { state } = view\n\n // Handle image click - select the image node on single click\n if (target.tagName === 'IMG') {\n const { doc } = state\n let imagePos = -1\n\n doc.descendants((node, nodePos) => {\n if (node.type.name === 'image' && imagePos === -1) {\n if (pos >= nodePos && pos <= nodePos + node.nodeSize) {\n imagePos = nodePos\n return false\n }\n }\n return true\n })\n\n if (imagePos >= 0) {\n const tr = state.tr.setSelection(NodeSelection.create(doc, imagePos))\n view.dispatch(tr)\n return true\n }\n }\n\n // If currently a NodeSelection (e.g., image selected), clicking elsewhere should create TextSelection\n if (state.selection instanceof NodeSelection) {\n const $pos = state.doc.resolve(pos)\n const tr = state.tr.setSelection(TextSelection.near($pos))\n view.dispatch(tr)\n view.focus()\n return true\n }\n\n return false\n },\n handlePaste: (view, event) => {\n if (!uploadImage) return false\n\n const items = event.clipboardData?.items\n if (!items) return false\n\n const imageFiles: File[] = []\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile()\n if (file) imageFiles.push(file)\n }\n }\n\n // Only handle if there are image files\n if (imageFiles.length === 0) return false\n\n // Prevent default paste behavior for images\n event.preventDefault()\n\n // Upload each image with progress tracking\n imageFiles.forEach((file) => {\n const uploadId = crypto.randomUUID()\n\n // Add to paste uploads state\n setPasteUploads(prev => {\n const next = new Map(prev)\n next.set(uploadId, { name: file.name, size: file.size, progress: 0 })\n return next\n })\n\n const uploadWithProgress = async () => {\n try {\n const url = await handleImageUpload(file, (event) => {\n setPasteUploads(prev => {\n const next = new Map(prev)\n const item = next.get(uploadId)\n if (item) {\n next.set(uploadId, { ...item, progress: event.progress })\n }\n return next\n })\n })\n // Insert image using the same method as toolbar upload\n if (editor) {\n const pos = editor.state.selection.from\n editor\n .chain()\n .focus()\n .insertContentAt(pos, {\n type: 'image',\n attrs: { src: url },\n })\n .run()\n focusNextNode(editor)\n }\n } catch (error) {\n console.error('Failed to upload pasted image:', error)\n } finally {\n // Remove from paste uploads state\n setPasteUploads(prev => {\n const next = new Map(prev)\n next.delete(uploadId)\n return next\n })\n }\n }\n uploadWithProgress()\n })\n\n return true\n },\n handleDrop: (view, event) => {\n if (!uploadImage) return false\n\n const files = event.dataTransfer?.files\n if (!files || files.length === 0) return false\n\n const imageFiles = Array.from(files).filter(file =>\n file.type.startsWith('image/')\n )\n\n // Only handle if there are image files\n if (imageFiles.length === 0) return false\n\n // Prevent default drop behavior for images\n event.preventDefault()\n\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n imageFiles.forEach(async (file) => {\n try {\n const url = await handleImageUpload(file)\n const node = view.state.schema.nodes.image.create({ src: url })\n const transaction = view.state.tr.insert(\n coordinates?.pos ?? view.state.selection.from,\n node\n )\n view.dispatch(transaction)\n } catch (error) {\n console.error('Failed to upload dropped image:', error)\n }\n })\n\n return true\n },\n handleKeyDown: (view, event) => {\n // Handle send keymap\n const isMod = event.metaKey || event.ctrlKey\n\n if (event.key === 'Enter' && !event.shiftKey) {\n if (sendKeymap === 'enter' && !isMod) {\n event.preventDefault()\n onSend?.()\n return true\n }\n if (sendKeymap === 'ctrlEnter' && event.ctrlKey) {\n event.preventDefault()\n onSend?.()\n return true\n }\n if (sendKeymap === 'cmdEnter' && event.metaKey) {\n event.preventDefault()\n onSend?.()\n return true\n }\n }\n return false\n },\n },\n extensions: [\n StarterKit.configure({\n horizontalRule: false,\n link: {\n openOnClick: false,\n enableClickSelection: true,\n },\n }),\n HorizontalRule,\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Typography,\n Superscript,\n Subscript,\n Selection,\n Placeholder.configure({\n placeholder,\n }),\n Image,\n ...(uploadImage ? [\n ImageUploadNode.configure({\n accept: \"image/*\",\n maxSize: MAX_FILE_SIZE,\n limit: 3,\n upload: handleImageUpload,\n onError: (error) => console.error(\"Upload failed:\", error),\n locale: {\n clickToUpload: locale.clickToUpload,\n orDragAndDrop: locale.orDragAndDrop,\n maxFiles: locale.maxFiles,\n clearAll: locale.clearAll,\n uploading: locale.uploading,\n },\n }),\n ] : []),\n ],\n onUpdate: () => {\n onChange?.()\n },\n })\n\n // Expose ref methods\n useImperativeHandle(ref, () => ({\n editor,\n\n focus: () => {\n editor?.commands.focus()\n },\n\n clear: () => {\n editor?.commands.clearContent()\n },\n\n exportPayload: (): MarkdownMessagePayload | null => {\n if (!editor) return null\n if (uploadingCountRef.current > 0) return null\n\n const markdown = editorToMarkdown(editor)\n if (!markdown.trim()) return null\n\n return {\n type: 'markdown',\n markdown,\n }\n },\n\n importMarkdown: (markdown: string) => {\n if (editor) {\n editor.commands.setContent(markdown)\n }\n },\n\n getDraft: (): ComposerDraft => {\n return {\n mode: 'rich',\n json: editor?.getJSON(),\n }\n },\n\n setDraft: (draft: ComposerDraft) => {\n if (draft.json && editor) {\n editor.commands.setContent(draft.json)\n }\n },\n\n setText: (text: string) => {\n editor?.commands.setContent(text)\n },\n\n insertText: (text: string) => {\n editor?.commands.insertContent(text)\n },\n\n isUploading: () => uploadingCountRef.current > 0,\n }), [editor])\n\n return (\n <div className=\"im-rich-editor-wrapper\">\n <EditorContext.Provider value={{ editor }}>\n <RichToolbar />\n <div className=\"im-rich-editor-container\">\n <EditorContent\n editor={editor}\n role=\"presentation\"\n />\n </div>\n {/* Paste upload progress indicator */}\n {pasteUploads.size > 0 && (\n <div className=\"im-paste-upload-progress tiptap-image-upload\">\n {Array.from(pasteUploads.entries()).map(([id, { name, size, progress }]) => (\n <div key={id} className=\"tiptap-image-upload-preview\">\n <div\n className=\"tiptap-image-upload-progress\"\n style={{ width: `${progress}%` }}\n />\n <div className=\"tiptap-image-upload-preview-content\">\n <div className=\"tiptap-image-upload-file-info\">\n <div className=\"tiptap-image-upload-file-icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.1953 4.41771C10.3478 4.08499 9.43578 3.94949 8.5282 4.02147C7.62062 4.09345 6.74133 4.37102 5.95691 4.83316C5.1725 5.2953 4.50354 5.92989 4.00071 6.68886C3.49788 7.44783 3.17436 8.31128 3.05465 9.2138C2.93495 10.1163 3.0222 11.0343 3.3098 11.8981C3.5974 12.7619 4.07781 13.5489 4.71463 14.1995C5.10094 14.5942 5.09414 15.2274 4.69945 15.6137C4.30476 16 3.67163 15.9932 3.28532 15.5985C2.43622 14.731 1.79568 13.6816 1.41221 12.5299C1.02875 11.3781 0.91241 10.1542 1.07201 8.95084C1.23162 7.74748 1.66298 6.59621 2.33343 5.58425C3.00387 4.57229 3.89581 3.72617 4.9417 3.10998C5.98758 2.4938 7.15998 2.1237 8.37008 2.02773C9.58018 1.93176 10.7963 2.11243 11.9262 2.55605C13.0561 2.99968 14.0703 3.69462 14.8919 4.58825C15.5423 5.29573 16.0585 6.11304 16.4177 7.00002H17.4999C18.6799 6.99991 19.8288 7.37933 20.7766 8.08222C21.7245 8.78515 22.4212 9.7743 22.7637 10.9036C23.1062 12.0328 23.0765 13.2423 22.6788 14.3534C22.2812 15.4644 21.5367 16.4181 20.5554 17.0736C20.0962 17.3803 19.4752 17.2567 19.1684 16.7975C18.8617 16.3382 18.9853 15.7172 19.4445 15.4105C20.069 14.9934 20.5427 14.3865 20.7958 13.6794C21.0488 12.9724 21.0678 12.2027 20.8498 11.4841C20.6318 10.7655 20.1885 10.136 19.5853 9.6887C18.9821 9.24138 18.251 8.99993 17.5001 9.00002H15.71C15.2679 9.00002 14.8783 8.70973 14.7518 8.28611C14.4913 7.41374 14.0357 6.61208 13.4195 5.94186C12.8034 5.27164 12.0427 4.75043 11.1953 4.41771Z\" fill=\"currentColor\"/>\n <path d=\"M11 14.4142V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V14.4142L15.2929 16.7071C15.6834 17.0976 16.3166 17.0976 16.7071 16.7071C17.0976 16.3166 17.0976 15.6834 16.7071 15.2929L12.7078 11.2936C12.7054 11.2912 12.703 11.2888 12.7005 11.2864C12.5208 11.1099 12.2746 11.0008 12.003 11L12 11L11.997 11C11.8625 11.0004 11.7343 11.0273 11.6172 11.0759C11.502 11.1236 11.3938 11.1937 11.2995 11.2864C11.297 11.2888 11.2946 11.2912 11.2922 11.2936L7.29289 15.2929C6.90237 15.6834 6.90237 16.3166 7.29289 16.7071C7.68342 17.0976 8.31658 17.0976 8.70711 16.7071L11 14.4142Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n <div className=\"tiptap-image-upload-details\">\n <span className=\"tiptap-image-upload-text\">{name}</span>\n <span className=\"tiptap-image-upload-subtext\">\n {size === 0 ? \"0 Bytes\" : (() => {\n const k = 1024\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"]\n const i = Math.floor(Math.log(size) / Math.log(k))\n return `${parseFloat((size / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n })()}\n </span>\n </div>\n </div>\n <div className=\"tiptap-image-upload-actions\">\n <span className=\"tiptap-image-upload-progress-text\">{progress}%</span>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </EditorContext.Provider>\n </div>\n )\n})\n","import React, {\n forwardRef,\n useImperativeHandle,\n useState,\n useCallback,\n useRef,\n} from 'react';\nimport { EditorContent } from '@tiptap/react';\nimport type {\n IMComposerProps,\n IMComposerRef,\n EditorMode,\n MentionSuggestionState,\n ComposerDraft,\n} from '../types';\nimport { defaultLocale } from '../types';\nimport { usePlainEditor } from '../hooks/usePlainEditor';\nimport { useAttachments } from '../hooks/useAttachments';\nimport { MentionPopover } from './MentionPopover';\nimport { AttachmentPreview } from './AttachmentPreview';\nimport { RichEditor, type RichEditorRef } from './RichEditor';\nimport { LocaleProvider } from '../contexts/LocaleContext';\n\n/**\n * IM Composer component supporting plain text and rich text modes.\n */\nexport const IMComposer = forwardRef<IMComposerRef, IMComposerProps>(function IMComposer(\n {\n mode: controlledMode,\n defaultMode = 'plain',\n onSend,\n onChange,\n onContextMenu,\n onQuoteRemoved,\n\n // Plain - Mention\n enableMention = true,\n mentionProvider,\n maxMentions,\n renderMentionItem,\n mentionPlacement = 'bottom',\n\n // Plain - Attachments\n enableAttachments = true,\n attachmentPreviewPlacement = 'bottom',\n maxAttachments = 10,\n allowedMimeTypes,\n maxFileSize,\n onAttachmentLimitExceeded,\n onFilesChange,\n showAttachmentPreview = true,\n\n // Rich\n uploadImage,\n\n // Keymap\n keymap,\n\n // Common\n placeholder,\n disabled = false,\n className,\n\n // i18n\n locale: customLocale,\n },\n ref\n) {\n const locale = { ...defaultLocale, ...customLocale };\n\n // Mode state (controlled or uncontrolled)\n const [internalMode, setInternalMode] = useState<EditorMode>(defaultMode);\n const mode = controlledMode ?? internalMode;\n\n // Mention state\n const [mentionState, setMentionState] = useState<MentionSuggestionState>({\n active: false,\n query: '',\n items: [],\n selectedIndex: 0,\n loading: false,\n error: false,\n command: null,\n });\n\n // Upload state for rich mode\n const [uploadingCount, setUploadingCount] = useState(0);\n\n // Rich editor ref\n const richEditorRef = useRef<RichEditorRef>(null);\n\n // Get placeholder for current mode\n const getPlaceholder = () => {\n if (typeof placeholder === 'string') {\n return placeholder;\n }\n if (placeholder) {\n return mode === 'plain' ? placeholder.plain : placeholder.rich;\n }\n return mode === 'plain' ? locale.placeholderPlain : locale.placeholderRich;\n };\n\n // Attachments hook\n const attachments = useAttachments({\n maxAttachments,\n maxFileSize,\n allowedMimeTypes,\n onLimitExceeded: onAttachmentLimitExceeded,\n onChange: onFilesChange,\n });\n\n // Handle send\n const handlePlainSend = useCallback(() => {\n if (disabled) return;\n\n const payload = plainEditor.exportPayload(attachments.getAttachments());\n if (payload && onSend) {\n onSend(payload);\n plainEditor.clear();\n attachments.clearAttachments();\n }\n }, [disabled, onSend]);\n\n const handleRichSend = useCallback(() => {\n if (disabled || uploadingCount > 0) return;\n\n const payload = richEditorRef.current?.exportPayload();\n if (payload && onSend) {\n onSend(payload);\n richEditorRef.current?.clear();\n }\n }, [disabled, onSend, uploadingCount]);\n\n // Plain editor\n const plainEditor = usePlainEditor({\n placeholder: getPlaceholder(),\n sendKeymap: keymap?.send || 'enter',\n onSend: handlePlainSend,\n enableMention,\n mentionProvider,\n maxMentions,\n onMentionStateChange: setMentionState,\n onPasteFiles: enableAttachments ? attachments.addFiles : undefined,\n isUploading: () => false,\n disabled,\n onChange,\n onQuoteRemoved,\n });\n\n // Handle mention selection\n const handleMentionSelect = useCallback(\n (member: { userId: string; display: string }) => {\n // Use the command from suggestion to properly replace @ trigger\n if (mentionState.command) {\n mentionState.command(member);\n }\n setMentionState((s) => ({ ...s, active: false, command: null }));\n },\n [mentionState.command]\n );\n\n // Expose ref methods\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n if (mode === 'plain') {\n plainEditor.focus();\n } else {\n richEditorRef.current?.focus();\n }\n },\n\n clear: () => {\n if (mode === 'plain') {\n plainEditor.clear();\n attachments.clearAttachments();\n } else {\n richEditorRef.current?.clear();\n }\n },\n\n exportPayload: () => {\n if (mode === 'plain') {\n return plainEditor.exportPayload(attachments.getAttachments());\n } else {\n return richEditorRef.current?.exportPayload() || null;\n }\n },\n\n // Rich mode\n importMarkdown: (markdown: string) => {\n richEditorRef.current?.importMarkdown(markdown);\n },\n\n // Attachments\n getAttachments: () => attachments.getAttachments(),\n setAttachments: (atts) => attachments.setAttachments(atts),\n addFiles: (files) => attachments.addFiles(files),\n removeAttachment: (id) => attachments.removeAttachment(id),\n clearAttachments: () => attachments.clearAttachments(),\n\n // Quote\n insertQuote: (title: string, content: string) => {\n plainEditor.insertQuote(title, content);\n },\n\n // Mention\n insertMention: (userId: string, display: string) => {\n plainEditor.insertMention(userId, display);\n },\n\n // Draft\n getDraft: () => {\n if (mode === 'plain') {\n return plainEditor.getDraft(attachments.getAttachments());\n } else {\n return richEditorRef.current?.getDraft() || { mode: 'rich' };\n }\n },\n\n setDraft: (draft: ComposerDraft) => {\n if (mode === 'plain') {\n plainEditor.setDraft(draft);\n if (draft.attachments) {\n attachments.setAttachments(draft.attachments);\n }\n } else {\n richEditorRef.current?.setDraft(draft);\n }\n },\n\n // Text ops\n setText: (text: string) => {\n if (mode === 'plain') {\n plainEditor.setText(text);\n } else {\n richEditorRef.current?.setText(text);\n }\n },\n\n insertText: (text: string) => {\n if (mode === 'plain') {\n plainEditor.insertText(text);\n } else {\n richEditorRef.current?.insertText(text);\n }\n },\n }),\n [mode, plainEditor, attachments]\n );\n\n // Render plain mode\n const renderPlainMode = () => (\n <div className=\"im-composer__plain-wrapper\">\n {/* Attachment preview (top) */}\n {showAttachmentPreview &&\n attachmentPreviewPlacement === 'top' &&\n attachments.attachments.length > 0 && (\n <AttachmentPreview\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n placement=\"top\"\n removeLabel={locale.removeAttachment}\n />\n )}\n\n {/* Editor */}\n <div className=\"im-composer__editor-wrapper\">\n <EditorContent\n editor={plainEditor.editor}\n className=\"im-composer__editor\"\n />\n </div>\n\n {/* Mention popover - rendered via Portal to avoid overflow:hidden issues */}\n <MentionPopover\n mentionState={mentionState}\n editor={plainEditor.editor}\n placement={mentionPlacement}\n onSelect={handleMentionSelect}\n onHover={(index) => setMentionState((s) => ({ ...s, selectedIndex: index }))}\n renderItem={renderMentionItem}\n locale={{\n noResults: locale.mentionNoResults,\n loading: locale.mentionLoading,\n error: locale.mentionError,\n }}\n />\n\n {/* Attachment preview (bottom) */}\n {showAttachmentPreview &&\n attachmentPreviewPlacement === 'bottom' &&\n attachments.attachments.length > 0 && (\n <AttachmentPreview\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n placement=\"bottom\"\n removeLabel={locale.removeAttachment}\n />\n )}\n </div>\n );\n\n // Render rich mode\n const renderRichMode = () => (\n <div className=\"im-composer__rich-wrapper\">\n <RichEditor\n ref={richEditorRef}\n placeholder={getPlaceholder()}\n disabled={disabled}\n uploadImage={uploadImage}\n onUploadingChange={setUploadingCount}\n onSend={handleRichSend}\n onChange={onChange}\n sendKeymap={keymap?.send}\n />\n </div>\n );\n\n return (\n <LocaleProvider locale={locale}>\n <div\n className={`im-composer ${className || ''} ${disabled ? 'im-composer--disabled' : ''}`}\n onContextMenu={onContextMenu}\n >\n {mode === 'plain' ? renderPlainMode() : renderRichMode()}\n </div>\n </LocaleProvider>\n );\n});\n","import React from 'react';\nimport type { QuoteInfo } from '../types';\n\nexport interface QuoteBarProps {\n /** Quote information */\n quote: QuoteInfo;\n /** Called when remove button is clicked */\n onRemove: () => void;\n /** Remove button label */\n removeLabel?: string;\n}\n\n/**\n * Quote message bar component.\n */\nexport function QuoteBar({ quote, onRemove, removeLabel = 'Remove quote' }: QuoteBarProps) {\n return (\n <div className=\"im-quote-bar\">\n <div className=\"im-quote-bar__content\">\n <span className=\"im-quote-bar__title\">{quote.title}</span>\n <span className=\"im-quote-bar__text\">{quote.content}</span>\n </div>\n <button\n type=\"button\"\n className=\"im-quote-bar__remove-btn\"\n onClick={onRemove}\n aria-label={removeLabel}\n >\n <CloseIcon />\n </button>\n </div>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\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 * Allowed protocols for links in rich mode.\n */\nexport const ALLOWED_LINK_PROTOCOLS = ['http:', 'https:', 'mailto:'];\n\n/**\n * Allowed protocols for images in rich mode.\n */\nexport const ALLOWED_IMAGE_PROTOCOLS = ['https:', 'http:', 'blob:', 'data:'];\n\n/**\n * Check if a URL has an allowed protocol for links.\n */\nexport function isAllowedLinkProtocol(url: string): boolean {\n try {\n const parsed = new URL(url);\n return ALLOWED_LINK_PROTOCOLS.includes(parsed.protocol);\n } catch {\n // Invalid URL or relative path\n return true; // Allow relative URLs\n }\n}\n\n/**\n * Check if a URL has an allowed protocol for images.\n */\nexport function isAllowedImageProtocol(url: string): boolean {\n try {\n const parsed = new URL(url);\n return ALLOWED_IMAGE_PROTOCOLS.includes(parsed.protocol);\n } catch {\n // Invalid URL or relative path\n return true; // Allow relative URLs\n }\n}\n\n/**\n * Sanitize a URL for links.\n * - Adds https:// if no protocol is present\n * - Returns null if protocol is not allowed (including javascript:, vbscript:, etc.)\n */\nexport function sanitizeLinkUrl(url: string): string | null {\n if (!url) return null;\n\n // Check for dangerous protocols BEFORE adding https prefix\n const trimmedUrl = url.trim().toLowerCase();\n if (\n trimmedUrl.startsWith('javascript:') ||\n trimmedUrl.startsWith('vbscript:') ||\n trimmedUrl.startsWith('data:')\n ) {\n return null;\n }\n\n // Check if URL has a protocol\n if (!url.includes('://') && !url.startsWith('mailto:')) {\n url = 'https://' + url;\n }\n\n if (!isAllowedLinkProtocol(url)) {\n return null;\n }\n\n return url;\n}\n\n/**\n * Sanitize a URL for images.\n * Returns null if protocol is not allowed.\n */\nexport function sanitizeImageUrl(url: string): string | null {\n if (!url) return null;\n\n if (!isAllowedImageProtocol(url)) {\n return null;\n }\n\n return url;\n}\n\n/**\n * Escape HTML entities to prevent XSS.\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;',\n };\n\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Strip HTML tags from text.\n */\nexport function stripHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Check if text contains potentially dangerous content.\n */\nexport function containsUnsafeContent(text: string): boolean {\n // Check for javascript: protocol\n if (/javascript:/i.test(text)) {\n return true;\n }\n\n // Check for data: protocol with script\n if (/data:text\\/html/i.test(text)) {\n return true;\n }\n\n // Check for event handlers\n if (/on\\w+\\s*=/i.test(text)) {\n return true;\n }\n\n return false;\n}\n"]}