@4399ywkf/editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/editor-config-context.tsx","../src/hooks/use-tiptap-editor.ts","../src/lib/tiptap-utils.ts","../src/lib/tiptap-advanced-utils.ts","../src/hooks/use-floating-toolbar-visibility.ts","../src/components/tiptap-extension/ui-state-extension.ts","../src/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/tiptap-ui-primitive/button/button.tsx","../src/components/tiptap-node/video-node/video-node-extension.ts","../src/components/tiptap-node/audio-node/audio-node-extension.ts","../src/components/tiptap-node/file-attachment-node/file-type-icon.tsx","../src/components/tiptap-node/file-attachment-node/file-attachment-node-view.tsx","../src/components/tiptap-node/file-attachment-node/file-attachment-node-extension.ts","../src/components/tiptap-icons/close-icon.tsx","../src/components/tiptap-node/media-upload-placeholder-node/media-upload-registry.ts","../src/components/tiptap-node/media-upload-placeholder-node/media-upload-placeholder-node.tsx","../src/components/tiptap-node/media-upload-placeholder-node/media-upload-placeholder-node-extension.ts","../src/components/tiptap-icons/columns-two-icon.tsx","../src/components/tiptap-icons/columns-three-icon.tsx","../src/components/tiptap-icons/columns-left-icon.tsx","../src/components/tiptap-icons/columns-right-icon.tsx","../src/components/tiptap-node/column-node/columns-node-view.tsx","../src/components/tiptap-node/column-node/column-node-extension.ts","../src/components/tiptap-extension/paste-drop-media-extension.ts","../src/hooks/use-isomorphic-layout-effect.ts","../src/hooks/use-on-click-outside.ts","../src/hooks/use-composed-ref.ts","../src/components/tiptap-ui-primitive/separator/separator.tsx","../src/components/tiptap-ui-primitive/spacer/spacer.tsx","../src/hooks/use-is-breakpoint.ts","../src/hooks/use-menu-navigation.ts","../src/components/tiptap-ui-primitive/popover/popover.tsx","../src/hooks/use-floating-element.ts","../src/lib/tiptap-collab-utils.ts","../src/lib/file-picker.ts","../src/hooks/use-ui-editor-state.ts","../src/contexts/user-context.tsx","../src/contexts/collab-context.tsx","../src/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx","../src/hooks/use-unmount.ts","../src/hooks/use-throttled-callback.ts","../src/hooks/use-window-size.ts","../src/components/tiptap-icons/video-icon.tsx","../src/components/tiptap-icons/audio-icon.tsx","../src/components/tiptap-icons/file-icon.tsx","../src/components/tiptap-ui/media-upload-button/media-upload-button.tsx","../src/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/hooks/use-element-rect.ts","../src/hooks/use-cursor-visibility.ts","../src/components/tiptap-ui-utils/floating-element/floating-element-utils.ts","../src/components/tiptap-ui-utils/floating-element/floating-element.tsx","../src/components/tiptap-ui/copy-anchor-link-button/use-scroll-to-hash.ts","../src/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts","../src/components/tiptap-node/image-node/image-node-view.tsx","../src/components/tiptap-node/image-node/image-node-extension.ts","../src/components/tiptap-extension/node-background-extension.ts","../src/components/tiptap-extension/node-alignment-extension.ts","../src/components/tiptap-node/toc-node/context/toc-context.tsx","../src/components/tiptap-node/toc-node/toc-node.tsx","../src/components/tiptap-node/toc-node/extensions/toc-node-extension.ts","../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/table-node/lib/tiptap-table-utils.ts","../src/components/tiptap-node/table-node/extensions/table-node-extension.ts","../src/components/tiptap-node/table-node/extensions/table-handle/helpers/create-image.ts","../src/components/tiptap-node/table-node/extensions/table-handle/table-handle-plugin.ts","../src/components/tiptap-node/table-node/extensions/table-handle/table-handle.ts","../src/components/tiptap-node/table-node/ui/table-handle/use-table-handle-positioning.ts","../src/components/tiptap-node/table-node/hooks/use-table-handle-state.ts","../src/components/tiptap-icons/more-vertical-icon.tsx","../src/components/tiptap-ui-primitive/input/input.tsx","../src/components/tiptap-ui-primitive/combobox/combobox.tsx","../src/components/tiptap-ui-primitive/menu/menu.tsx","../src/components/tiptap-ui-primitive/menu/menu-context.ts","../src/components/tiptap-ui-primitive/menu/menu-hooks.ts","../src/components/tiptap-icons/copy-icon.tsx","../src/components/tiptap-node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts","../src/components/tiptap-icons/arrow-left-icon.tsx","../src/components/tiptap-icons/arrow-right-icon.tsx","../src/components/tiptap-icons/arrow-up-icon.tsx","../src/components/tiptap-icons/arrow-down-icon.tsx","../src/components/tiptap-node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts","../src/components/tiptap-icons/square-x-icon.tsx","../src/components/tiptap-node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts","../src/components/tiptap-icons/table-header-row-icon.tsx","../src/components/tiptap-icons/table-header-column-icon.tsx","../src/components/tiptap-node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts","../src/components/tiptap-icons/add-col-left-icon.tsx","../src/components/tiptap-icons/add-col-right-icon.tsx","../src/components/tiptap-icons/add-row-bottom-icon.tsx","../src/components/tiptap-icons/add-row-top-icon.tsx","../src/components/tiptap-node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts","../src/components/tiptap-icons/trash-icon.tsx","../src/components/tiptap-node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts","../src/components/tiptap-icons/arrow-down-a-z-icon.tsx","../src/components/tiptap-icons/arrow-down-z-a-icon.tsx","../src/components/tiptap-node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts","../src/components/tiptap-ui-primitive/badge/badge.tsx","../src/components/tiptap-ui/color-text-button/color-text-button.tsx","../src/components/tiptap-icons/text-color-small-icon.tsx","../src/components/tiptap-ui/color-text-button/use-color-text.ts","../src/components/tiptap-ui/color-highlight-button/color-highlight-button.tsx","../src/components/tiptap-icons/highlighter-icon.tsx","../src/components/tiptap-ui/color-highlight-button/use-color-highlight.ts","../src/components/tiptap-icons/chevron-down-icon.tsx","../src/components/tiptap-ui-primitive/card/card.tsx","../src/components/tiptap-ui-primitive/button-group/button-group.tsx","../src/components/tiptap-ui/color-text-popover/color-text-popover.tsx","../src/components/tiptap-ui/color-text-popover/use-color-text-popover.ts","../src/components/tiptap-icons/paint-bucket-icon.tsx","../src/components/tiptap-icons/chevron-right-icon.tsx","../src/components/tiptap-ui/color-menu/color-menu.tsx","../src/components/tiptap-icons/align-left-icon.tsx","../src/components/tiptap-icons/align-center-icon.tsx","../src/components/tiptap-icons/align-right-icon.tsx","../src/components/tiptap-icons/align-justify-icon.tsx","../src/components/tiptap-icons/align-bottom-icon.tsx","../src/components/tiptap-icons/align-top-icon.tsx","../src/components/tiptap-icons/align-middle-icon.tsx","../src/components/tiptap-node/table-node/ui/table-align-cell-button/use-table-align-cell.ts","../src/components/tiptap-icons/alignment-icon.tsx","../src/components/tiptap-node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx","../src/components/tiptap-node/table-node/ui/table-handle-menu/table-handle-menu.tsx","../src/components/tiptap-node/table-node/ui/table-handle/table-handle.tsx","../src/components/tiptap-node/table-node/ui/table-selection-overlay/use-resize-overlay.ts","../src/components/tiptap-node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx","../src/components/tiptap-icons/table-cell-merge-icon.tsx","../src/components/tiptap-icons/table-cell-split-icon.tsx","../src/components/tiptap-node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts","../src/components/tiptap-icons/grip-4-icon.tsx","../src/components/tiptap-node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx","../src/components/tiptap-icons/plus-small-icon.tsx","../src/components/tiptap-node/table-node/ui/table-extend-row-column-button/use-table-extend-row-column.ts","../src/components/tiptap-node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx","../src/components/tiptap-ui-utils/suggestion-menu/suggestion-menu-utils.ts","../src/components/tiptap-ui-utils/suggestion-menu/suggestion-menu.tsx","../src/components/tiptap-ui/emoji-menu/emoji-menu-utils.ts","../src/components/tiptap-ui/emoji-menu/emoji-menu.tsx","../src/components/tiptap-ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx","../src/components/tiptap-ui-primitive/avatar/avatar.tsx","../src/components/tiptap-ui/mention-dropdown-menu/mention-dropdown-menu.tsx","../src/components/tiptap-icons/code-block-icon.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/image-icon.tsx","../src/components/tiptap-icons/list-icon.tsx","../src/components/tiptap-icons/list-ordered-icon.tsx","../src/components/tiptap-icons/blockquote-icon.tsx","../src/components/tiptap-icons/list-todo-icon.tsx","../src/components/tiptap-icons/minus-icon.tsx","../src/components/tiptap-icons/type-icon.tsx","../src/components/tiptap-icons/at-sign-icon.tsx","../src/components/tiptap-icons/smile-plus-icon.tsx","../src/components/tiptap-icons/table-icon.tsx","../src/components/tiptap-icons/list-indented-icon.tsx","../src/components/tiptap-ui/emoji-trigger-button/use-emoji-trigger.ts","../src/components/tiptap-ui/mention-trigger-button/use-mention-trigger.ts","../src/components/tiptap-ui/slash-dropdown-menu/use-slash-dropdown-menu.ts","../src/components/tiptap-ui/slash-dropdown-menu/slash-dropdown-menu.tsx","../src/components/tiptap-ui/image-download-button/image-download-button.tsx","../src/components/tiptap-icons/arrow-down-to-line-icon.tsx","../src/components/tiptap-ui/image-download-button/use-image-download.ts","../src/components/tiptap-ui/duplicate-button/duplicate-button.tsx","../src/components/tiptap-ui/duplicate-button/use-duplicate.ts","../src/components/tiptap-ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx","../src/components/tiptap-icons/clipboard-icon.tsx","../src/components/tiptap-ui/copy-to-clipboard-button/use-copy-to-clipboard.ts","../src/components/tiptap-ui/delete-node-button/delete-node-button.tsx","../src/components/tiptap-ui/delete-node-button/use-delete-node.ts","../src/components/tiptap-ui/copy-anchor-link-button/copy-anchor-link-button.tsx","../src/components/tiptap-icons/link-icon.tsx","../src/components/tiptap-ui/copy-anchor-link-button/use-copy-anchor-link.ts","../src/components/tiptap-ui/reset-all-formatting-button/reset-all-formatting-button.tsx","../src/components/tiptap-icons/rotate-ccw-icon.tsx","../src/components/tiptap-ui/reset-all-formatting-button/use-reset-all-formatting.ts","../src/components/tiptap-ui/text-button/text-button.tsx","../src/components/tiptap-ui/text-button/use-text.ts","../src/components/tiptap-ui/heading-button/heading-button.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/list-button/list-button.tsx","../src/components/tiptap-ui/list-button/use-list.ts","../src/components/tiptap-ui/blockquote-button/blockquote-button.tsx","../src/components/tiptap-ui/blockquote-button/use-blockquote.ts","../src/components/tiptap-ui/code-block-button/code-block-button.tsx","../src/components/tiptap-ui/code-block-button/use-code-block.ts","../src/components/tiptap-ui/slash-command-trigger-button/slash-command-trigger-button.tsx","../src/components/tiptap-icons/plus-icon.tsx","../src/components/tiptap-ui/slash-command-trigger-button/use-slash-command-trigger.ts","../src/components/tiptap-icons/move-horizontal-icon.tsx","../src/components/tiptap-node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts","../src/components/tiptap-node/toc-node/ui/toc-show-title-button/toc-show-title.ts","../src/components/tiptap-icons/grip-vertical-icon.tsx","../src/components/tiptap-icons/repeat-2-icon.tsx","../src/components/tiptap-ui/drag-context-menu/drag-context-menu.tsx","../src/components/tiptap-icons/sun-icon.tsx","../src/components/tiptap-icons/moon-star-icon.tsx","../src/components/tiptap-templates/notion-like/notion-like-editor-theme-toggle.tsx","../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/components/tiptap-templates/notion-like/notion-like-editor-collaboration-users.tsx","../src/components/tiptap-templates/notion-like/notion-like-editor-header.tsx","../src/components/tiptap-icons/ban-icon.tsx","../src/components/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx","../src/components/tiptap-ui/image-upload-button/image-upload-button.tsx","../src/components/tiptap-icons/image-plus-icon.tsx","../src/components/tiptap-ui/image-upload-button/use-image-upload.ts","../src/components/tiptap-icons/corner-down-left-icon.tsx","../src/components/tiptap-icons/external-link-icon.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-ui/text-align-button/use-text-align.ts","../src/components/tiptap-ui/turn-into-dropdown/turn-into-dropdown.tsx","../src/components/tiptap-ui/turn-into-dropdown/use-turn-into-dropdown.ts","../src/components/tiptap-ui/indent-button/indent-button.tsx","../src/components/tiptap-icons/indent-increase-icon.tsx","../src/components/tiptap-icons/indent-decrease-icon.tsx","../src/components/tiptap-ui/indent-button/use-indent.ts","../src/components/tiptap-ui/move-node-button/move-node-button.tsx","../src/components/tiptap-ui/move-node-button/use-move-node.ts","../src/components/tiptap-ui/image-align-button/image-align-button.tsx","../src/components/tiptap-icons/align-center-vertical-icon.tsx","../src/components/tiptap-icons/align-end-vertical-icon.tsx","../src/components/tiptap-icons/align-start-vertical-icon.tsx","../src/components/tiptap-ui/image-align-button/use-image-align.ts","../src/components/tiptap-ui/image-caption-button/image-caption-button.tsx","../src/components/tiptap-icons/image-caption-icon.tsx","../src/components/tiptap-ui/image-caption-button/use-image-caption.ts","../src/components/tiptap-icons/refresh-ccw-icon.tsx","../src/components/tiptap-node/image-node/image-node-floating.tsx","../src/components/tiptap-templates/notion-like/notion-like-editor-mobile-toolbar.tsx","../src/components/tiptap-templates/notion-like/notion-like-editor-toolbar-floating.tsx","../src/components/tiptap-templates/notion-like/setup-error-message/setup-error-message.tsx","../src/components/tiptap-node/toc-node/ui/toc-sidebar/toc-sidebar.tsx","../src/components/tiptap-extension/list-normalization-extension.ts","../src/components/tiptap-extension/indent-extension.ts","../src/components/tiptap-templates/notion-like/notion-like-editor.tsx"],"names":["isMac","size","NodeSelection","node","pos","isSelectionValid","useState","useEffect","useMemo","createContext","useContext","jsx","TooltipTrigger","TooltipContent","Fragment","forwardRef","Node","mergeAttributes","jsxs","formatBytes","NodeViewWrapper","ReactNodeViewRenderer","memo","Extension","useRef","useFloating","autoUpdate","useDismiss","useInteractions","nodeType","CellSelection","isNodeSelection","useEditorState","editor","YDoc","useCallback","open","Selection","shift","flip","offset","useMergeRefs","NodeViewContent","TiptapImage","TextSelection","normalizeHeadingDepths","FileIcon","ImageUploadNode","clamp","rect","cellAround","PluginKey","TableMap","Plugin","useTransitionStyles","ComboboxProvider","Ariakit","Combobox","ComboboxList","ComboboxItem","Menu","useMenuContext","MenuButton","MenuButtonArrow","MenuGroup","MenuGroupLabel","MenuItemRadio","MenuItem","Ariakit3","state","REQUIRED_EXTENSIONS","selectedRect","moveTableRow","moveTableColumn","shouldShowButton","cell","safeColumnIsHeader","columnIsHeader","safeRowIsHeader","rowIsHeader","addRowAfter","addColumnAfter","canColorText","canColorHighlight","useHotkeys","canToggle","color","label","FloatingPortal","getSelectionBoundingRect","TableActionItem","TableActionMenu","createVirtualReference","props","useLayoutEffect","isValidElement","getSuggestionItems","insertTriggerInBlockNode","insertTriggerInTextNode","Item","isEmpty","canCopyToClipboard","CopyIcon","canCopyAnchorLink","canDeleteNode","TurnIntoDropdown","canMoveNode","TransformActionGroup","cloneElement","tr","content"],"mappings":"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","file":"chunk-G6WM2PSU.js","sourcesContent":["\"use client\"\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\"\nimport type { Doc as YDoc } from \"yjs\"\n\n/**\n * 包消费者通过 `<EditorConfigProvider>` 注入业务侧能力。\n *\n * 设计原则:包内不感知业务 store / API / 路由,所有外部依赖都从这里取。\n * 也不直接依赖私有付费包(如 @tiptap-pro/provider),所以 provider 用最小接口约束。\n */\n\n/**\n * 协同 provider 的最小接口约束。\n * 任何 yjs awareness provider(TiptapCollabProvider / HocuspocusProvider / 自定义)\n * 只要实现 `destroy()` 就可以传入。`CollaborationCaret` 会通过 `provider.awareness`\n * 自取协同状态,不需要在这里 typed。\n */\nexport interface CollabProviderLike {\n destroy: () => void\n [key: string]: unknown\n}\n\nexport interface CollabCreateParams {\n /** 拼好的文档名:`${docPrefix}${room}` */\n name: string\n /** yjs 共享文档 */\n ydoc: YDoc\n /** 业务方通过 `fetchToken` 获取的 JWT */\n token: string\n}\n\nexport interface EditorCollabConfig {\n /** 协同服务的 App ID(透传给 createProvider,包不直接用) */\n appId?: string\n /** room 名前缀,最终 docName = `${docPrefix}${room}` */\n docPrefix?: string\n /**\n * 选项 A:业务方自己 new 好 provider,自管理生命周期。\n * 包不在内部创建/销毁,hasCollab 直接为 true。\n */\n provider?: CollabProviderLike\n /**\n * 选项 B:业务方提供 token 获取函数 + provider 工厂,包内调用工厂创建实例,\n * 并在组件卸载时调用 `provider.destroy()`。\n */\n fetchToken?: () => Promise<string | null>\n createProvider?: (params: CollabCreateParams) => CollabProviderLike\n}\n\nexport interface EditorUserConfig {\n id: string\n name: string\n color: string\n avatar?: string\n}\n\n/** 包内识别的媒体大类,决定走哪个 tiptap 节点 + 哪个 size 上限。 */\nexport type MediaKind = \"image\" | \"video\" | \"audio\" | \"file\"\n\nexport interface EditorUploadConfig {\n /**\n * 上传文件,返回最终可访问的 URL。业务侧按 file.type 自己决定走哪个端点\n * (图片走 /assets/image,其它走 /assets/attachment 等)。\n * 包内 ImageUploadNode / PasteDropMedia / 工具栏 / slash 菜单都走它。\n */\n onUpload: (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n ) => Promise<string>\n /**\n * @deprecated 用 `maxFileSizes.image` 替代。保留用于向后兼容。\n */\n maxFileSize?: number\n /**\n * 按媒体大类分别设置单文件大小上限(字节,0 = 不限制)。\n * 未设置的类型走包内默认值:image 5MB、video 100MB、audio/file 20MB。\n */\n maxFileSizes?: Partial<Record<MediaKind, number>>\n /**\n * 上传相关错误的统一回调。业务侧通常接到 toast / message.error。\n * 包内 ImageUploadNode 和 PasteDropMedia 都走这个 hook,没接的话退化为 console.error。\n */\n onError?: (error: Error) => void\n /**\n * 外链图片转存到 CDN 的全程进度(下载 → 上传 → 完成),业务侧通常接到\n * antd `message.loading`。同一 URL 的事件按相同 `url` 字段聚合,业务侧用\n * `message.loading({ key: 'rehost:' + url, ... })` / `message.destroy(key)`\n * 即可获得\"进度更新 → 完成销毁\"的体验。\n */\n onRehostProgress?: (event: RehostProgressEvent) => void\n}\n\nexport type RehostProgressEvent =\n | { url: string; phase: \"downloading\"; progress: number }\n | { url: string; phase: \"uploading\"; progress: number }\n | { url: string; phase: \"done\"; progress: 100 }\n\n/** 默认分类型大小上限(字节)。可被 EditorUploadConfig.maxFileSizes 覆盖。 */\nexport const DEFAULT_MAX_FILE_SIZES: Record<MediaKind, number> = {\n image: 5 * 1024 * 1024,\n video: 100 * 1024 * 1024,\n audio: 20 * 1024 * 1024,\n file: 20 * 1024 * 1024,\n}\n\n/** 通过 file.type 判断走哪个媒体节点。 */\nexport const detectMediaKind = (file: { type: string }): MediaKind => {\n if (file.type.startsWith(\"image/\")) return \"image\"\n if (file.type.startsWith(\"video/\")) return \"video\"\n if (file.type.startsWith(\"audio/\")) return \"audio\"\n return \"file\"\n}\n\n/** 合并业务配置 + 默认值,拿到指定类型的 size 上限。 */\nexport const resolveMaxSize = (\n kind: MediaKind,\n config: EditorUploadConfig | null | undefined,\n): number => {\n const fromTypes = config?.maxFileSizes?.[kind]\n if (typeof fromTypes === \"number\") return fromTypes\n if (kind === \"image\" && typeof config?.maxFileSize === \"number\") {\n return config.maxFileSize\n }\n return DEFAULT_MAX_FILE_SIZES[kind]\n}\n\nexport interface EditorConfig {\n collab?: EditorCollabConfig\n user?: EditorUserConfig\n upload?: EditorUploadConfig\n}\n\nconst EditorConfigContext = createContext<EditorConfig | null>(null)\n\nexport interface EditorConfigProviderProps {\n config: EditorConfig\n children: ReactNode\n}\n\nexport function EditorConfigProvider({\n config,\n children,\n}: EditorConfigProviderProps) {\n const value = useMemo(() => config, [config])\n return (\n <EditorConfigContext.Provider value={value}>\n {children}\n </EditorConfigContext.Provider>\n )\n}\n\n/** 拿到当前注入的编辑器业务配置;未注入时返回 null。 */\nexport const useEditorConfig = (): EditorConfig | null =>\n useContext(EditorConfigContext)\n","import type { Editor } from \"@tiptap/react\"\nimport { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { useEffect, useState } from \"react\"\n\nfunction getActivePageEditor(editor: Editor): Editor | null {\n const storage = editor.storage as unknown as Record<string, unknown>\n const pages = storage.pages as { activeEditor?: Editor | null } | undefined\n if (!pages || !(\"activeEditor\" in pages)) return null\n return pages.activeEditor ?? null\n}\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 = providedEditor ?? coreEditor\n\n const [storageEditor, setStorageEditor] = useState<Editor | null>(null)\n\n useEffect(() => {\n if (!mainEditor) {\n setStorageEditor(null)\n return\n }\n\n const updateHandler = () =>\n setStorageEditor(getActivePageEditor(mainEditor))\n\n updateHandler()\n\n mainEditor.on(\"update\", updateHandler)\n mainEditor.on(\"selectionUpdate\", updateHandler)\n\n return () => {\n mainEditor.off(\"update\", updateHandler)\n mainEditor.off(\"selectionUpdate\", updateHandler)\n }\n }, [mainEditor])\n\n useEffect(() => {\n if (!storageEditor) return\n\n const handleDestroy = () => setStorageEditor(null)\n\n storageEditor.on(\"destroy\", handleDestroy)\n return () => {\n storageEditor.off(\"destroy\", handleDestroy)\n }\n }, [storageEditor])\n\n const editorState = useEditorState({\n editor: storageEditor ?? mainEditor,\n selector(context) {\n if (!context.editor) {\n return { editor: null, editorState: undefined, canCommand: undefined }\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 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: PMNode | null = 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\n/**\n * Clamps a value between min and max bounds\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max))\n}\n\nexport function getSelectedBlockNodes(editor: Editor): PMNode[] {\n const { doc } = editor.state\n const { from, to } = editor.state.selection\n\n const blocks: PMNode[] = []\n const seen = new Set<number>()\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isBlock) return\n\n if (!seen.has(pos)) {\n seen.add(pos)\n blocks.push(node)\n }\n\n return false\n })\n\n return blocks\n}\n","import type { Attrs, Node } from \"@tiptap/pm/model\"\nimport { findNodePosition, isValidPosition } from \"./tiptap-utils\"\nimport { type Editor } from \"@tiptap/react\"\nimport { AllSelection, NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n/**\n * Splits an array into chunks of specified size\n */\nexport function chunkArray<T>(array: Array<T>, size: number): Array<Array<T>> {\n return Array.from({ length: Math.ceil(array.length / size) }, (_, index) =>\n array.slice(index * size, index * size + size)\n )\n}\n\n/**\n * Helper function to check if there's content above the current position\n */\nexport function hasContentAbove(editor: Editor | null): {\n hasContent: boolean\n content: string\n} {\n if (!editor) return { hasContent: false, content: \"\" }\n\n const { state } = editor\n const { $from } = state.selection\n\n for (let i = $from.index(0) - 1; i >= 0; i--) {\n const node = state.doc.child(i)\n const content = node.textContent.trim()\n\n if (content) {\n return { hasContent: true, content }\n }\n }\n\n return { hasContent: false, content: \"\" }\n}\n\n/**\n * Gets the active attributes of a specific mark in the current editor selection.\n *\n * @param editor - The Tiptap editor instance.\n * @param markName - The name of the mark to look for (e.g., \"highlight\", \"link\").\n * @returns The attributes of the active mark, or `null` if the mark is not active.\n */\nexport function getActiveMarkAttrs(\n editor: Editor | null,\n markName: string\n): Attrs | null {\n if (!editor) return null\n\n const { state } = editor\n const { from, to, empty, $from } = state.selection\n\n if (empty) {\n const mark = $from.marks().find((m) => m.type.name === markName)\n return mark?.attrs ?? null\n }\n\n const seen = new Set<string>()\n let foundAttrs: Attrs | null = null\n\n state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return\n\n for (const mark of node.marks) {\n if (mark.type.name === markName && !seen.has(mark.type.name)) {\n seen.add(mark.type.name)\n foundAttrs = mark.attrs\n }\n }\n })\n\n return foundAttrs\n}\n\n/**\n * Finds the position of a node in the editor selection\n * @param params Object containing editor, node (optional), and nodePos (optional)\n * @returns The position of the node in the selection or null if not found\n */\nexport function findSelectionPosition(params: {\n editor: Editor\n node?: Node | null\n nodePos?: number | null\n}): number | null {\n const { editor, node, nodePos } = params\n\n if (isValidPosition(nodePos)) return nodePos\n\n if (node) {\n const found = findNodePosition({ editor, node })\n if (found) return found.pos\n }\n\n const { selection } = editor.state\n if (!selection.empty) return null\n\n const resolvedPos = selection.$anchor\n const nodeDepth = 1\n const selectedNode = resolvedPos.node(nodeDepth)\n\n return selectedNode ? resolvedPos.before(nodeDepth) : null\n}\n\n/**\n * Gets the currently selected DOM element in the editor\n * @param editor The Tiptap editor instance\n * @returns The selected DOM element or null if no selection is present\n */\nexport function getSelectedDOMElement(editor: Editor): HTMLElement | null {\n const { state, view } = editor\n const { selection } = state\n\n if (selection instanceof NodeSelection) {\n return view.nodeDOM(selection.from) as HTMLElement | null\n }\n\n if (selection instanceof TextSelection) {\n const $anchor = selection.$anchor\n\n // Ensure the depth is sufficient to avoid errors\n if ($anchor.depth >= 1) {\n const dom = view.nodeDOM($anchor.before(1))\n if (dom instanceof HTMLElement) {\n return dom\n }\n }\n }\n\n if (selection instanceof AllSelection) {\n const firstChild = view.dom.firstElementChild\n if (firstChild instanceof HTMLElement) {\n return firstChild\n }\n }\n\n return null\n}\n\n/**\n * Gets the closest node from the current selection in the editor based on criteria\n * @param editor The Tiptap editor instance\n * @param options Configuration options for finding the node\n * @returns An object containing the closest matching node, its position, and depth, or null if not found\n */\nexport function getClosestNode(\n editor: Editor | null,\n options?: {\n nodeName?: string\n isBlock?: boolean\n predicate?: (node: Node) => boolean\n }\n) {\n if (!editor) return null\n\n const { selection } = editor.state\n const { $from } = selection\n const { nodeName, isBlock = true, predicate } = options || {} // Default to block nodes\n\n let depth = $from.depth\n while (depth > 0) {\n const node = $from.node(depth)\n\n // Check all conditions\n const matchesName = !nodeName || node.type.name === nodeName\n const matchesBlock = node.type.isBlock === isBlock\n const matchesPredicate = !predicate || predicate(node)\n\n if (matchesName && matchesBlock && matchesPredicate) {\n const pos = $from.before(depth)\n return { node, pos, depth }\n }\n depth--\n }\n return null\n}\n\n/**\n * Gets the closest node from a specific position in the document\n * @param editor The Tiptap editor instance\n * @param pos The position to search from\n * @param options Configuration options for finding the node\n * @returns An object containing the closest matching node, its position, and depth, or null if not found\n */\nexport function getClosestNodeByPos(\n editor: Editor | null,\n pos: number,\n options?: {\n nodeName?: string\n isBlock?: boolean\n predicate?: (node: Node) => boolean\n }\n) {\n if (!editor) return null\n\n const docSize = editor.state.doc.content.size\n if (pos < 0 || pos > docSize) {\n console.warn(`Position ${pos} is out of bounds (doc size: ${docSize})`)\n return null\n }\n\n try {\n const $pos = editor.state.doc.resolve(pos)\n const { nodeName, isBlock = true, predicate } = options || {}\n\n let depth = $pos.depth\n while (depth > 0) {\n const node = $pos.node(depth)\n\n const matchesName = !nodeName || node.type.name === nodeName\n const matchesBlock = node.type.isBlock === isBlock\n const matchesPredicate = !predicate || predicate(node)\n\n if (matchesName && matchesBlock && matchesPredicate) {\n const nodePos = $pos.before(depth)\n return { node, pos: nodePos, depth }\n }\n depth--\n }\n return null\n } catch (error) {\n console.error(\"Error resolving position:\", error)\n return null\n }\n}\n\n/**\n * Convenience function to find closest block node (maintains backward compatibility)\n */\nexport function getClosestBlockNode(editor: Editor | null) {\n return getClosestNode(editor, { isBlock: true })\n}\n\n/**\n * Convenience function to find closest node by name\n */\nexport function getClosestNodeByName(editor: Editor | null, nodeName: string) {\n return getClosestNode(editor, { nodeName })\n}\n\n/**\n * Find multiple matching nodes up the tree\n */\nexport function getAllMatchingNodes(\n editor: Editor | null,\n options?: {\n nodeName?: string\n isBlock?: boolean\n predicate?: (node: Node) => boolean\n }\n) {\n if (!editor) return []\n\n const { selection } = editor.state\n const { nodeName, isBlock = true, predicate } = options || {}\n const matches: { node: Node; pos: number; depth: number }[] = []\n\n const nodeMatches = (node: Node) => {\n const matchesName = !nodeName || node.type.name === nodeName\n const matchesBlock = node.type.isBlock === isBlock\n const matchesPredicate = !predicate || predicate(node)\n return matchesName && matchesBlock && matchesPredicate\n }\n\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n if (nodeMatches(selectedNode)) {\n matches.push({\n node: selectedNode,\n pos: selection.from,\n depth: 0,\n })\n }\n }\n\n const { $from } = selection\n let depth = $from.depth\n\n while (depth > 0) {\n const node = $from.node(depth)\n\n if (nodeMatches(node)) {\n const pos = $from.before(depth)\n matches.push({ node, pos, depth })\n }\n depth--\n }\n\n return matches\n}\n\n/**\n * Gets the anchor node and its position in the editor.\n * @param editor The Tiptap editor instance\n * @param allowEmptySelection If true, still returns the node at the cursor position even if selection is empty\n * @returns An object containing the anchor node and its position, or null if not found\n */\nexport function getAnchorNodeAndPos(\n editor: Editor | null,\n allowEmptySelection: boolean = true\n): { node: Node; pos: number } | null {\n if (!editor) return null\n\n const { state } = editor\n const { selection } = state\n\n if (selection instanceof NodeSelection) {\n const node = selection.node\n const pos = selection.from\n\n if (node && isValidPosition(pos)) {\n return { node, pos }\n }\n }\n\n if (selection.empty && !allowEmptySelection) return null\n\n const $anchor = selection.$anchor\n const depth = 1 // explicitly use depth 1\n const node = $anchor.node(depth)\n const pos = $anchor.before(depth)\n\n return { node, pos }\n}\n\n/**\n * Checks if the current selection in the editor contains any text.\n *\n * @param editor - The Tiptap editor instance.\n * @returns `true` if the selection contains text, `false` otherwise.\n */\nexport function selectionHasText(editor: Editor | null): boolean {\n if (!editor) return false\n\n const { state } = editor\n const { selection, doc } = state\n\n if (selection.empty) return false\n\n const text = doc.textBetween(selection.from, selection.to, \"\\n\", \"\\0\")\n return text.trim().length > 0\n}\n\n/**\n * Retrieves a specific extension by name from the Tiptap editor.\n * @param editor - The Tiptap editor instance\n * @param extensionName - The name of the extension to retrieve\n * @returns The extension instance if found, otherwise null\n */\nexport function getEditorExtension(\n editor: Editor | null,\n extensionName: string\n) {\n if (!editor) return null\n\n const extension = editor.extensionManager.extensions.find(\n (ext) => ext.name === extensionName\n )\n\n if (!extension) {\n console.warn(\n `Extension \"${extensionName}\" not found in the editor schema. Ensure it is included in the editor configuration.`\n )\n return null\n }\n\n return extension\n}\n","import { isNodeSelection, type Editor } from \"@tiptap/react\"\nimport { NodeSelection, type Transaction } from \"@tiptap/pm/state\"\nimport { useEffect, useRef, useState } from \"react\"\n\nexport const HIDE_FLOATING_META = \"hideFloatingToolbar\"\n\n/**\n * Centralizes all logic about when the floating toolbar should be hidden/shown.\n *\n * - Listens for transactions that carry HIDE_FLOATING_META\n * - Clears the hide flag on common “user intent” events\n * - Handles the “re-click on the same selected node” case\n * - Exposes `shouldShow` so UI can just render based on it\n * - Exposes helpers to set selections with the meta flag\n */\nexport function useFloatingToolbarVisibility(params: {\n editor: Editor | null\n isSelectionValid: (\n editor: Editor,\n selection: Editor[\"state\"][\"selection\"]\n ) => boolean\n extraHideWhen?: boolean // e.g. commentInputVisible\n}) {\n const { editor, isSelectionValid, extraHideWhen = false } = params\n const [shouldShow, setShouldShow] = useState(false)\n const hideRef = useRef(false)\n\n // --- TX listener: turn on hide when our meta is present, clear it on new Selection without the flag\n useEffect(() => {\n if (!editor) return\n\n const onTx = ({ transaction }: { transaction: Transaction }) => {\n if (transaction.getMeta(HIDE_FLOATING_META)) {\n hideRef.current = true\n } else if (\n // Clear hide flag when a new Selection is made without the meta\n // This ensures first-click on a new selection shows the floating toolbar again\n transaction.selectionSet\n ) {\n hideRef.current = false\n }\n }\n\n editor.on(\"transaction\", onTx)\n\n return () => {\n editor.off(\"transaction\", onTx)\n }\n }, [editor])\n\n // --- Re-click same selected node should immediately allow floating\n useEffect(() => {\n if (!editor) return\n const dom = editor.view.dom\n\n const onPointerDown = (e: PointerEvent) => {\n const sel = editor.state.selection\n if (!(sel instanceof NodeSelection)) return\n const nodeDom = editor.view.nodeDOM(sel.from) as HTMLElement | null\n if (!nodeDom) return\n if (nodeDom.contains(e.target as Node)) {\n hideRef.current = false\n // selection won't change, recompute now\n const valid = isSelectionValid(editor, sel)\n setShouldShow(valid && !extraHideWhen)\n }\n }\n\n dom.addEventListener(\"pointerdown\", onPointerDown, { capture: true })\n return () =>\n dom.removeEventListener(\"pointerdown\", onPointerDown, {\n capture: true,\n })\n }, [editor, extraHideWhen, isSelectionValid])\n\n // --- Selection-driven visibility\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n const { selection } = editor.state\n const valid = isSelectionValid(editor, selection)\n\n if (extraHideWhen || (isNodeSelection(selection) && hideRef.current)) {\n setShouldShow(false)\n return\n }\n setShouldShow(valid)\n }\n\n handleSelectionUpdate()\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, extraHideWhen, isSelectionValid])\n\n return { shouldShow }\n}\n\n/**\n * Programmatically select a node and hide floating for that selection\n * @param editor\n * @param pos\n */\nexport const selectNodeAndHideFloating = (editor: Editor, pos: number) => {\n if (!editor) return\n const { state, view } = editor\n view.dispatch(\n state.tr\n .setSelection(NodeSelection.create(state.doc, pos))\n .setMeta(HIDE_FLOATING_META, true)\n )\n}\n\n/**\n * Mark “hide floating” on the next relevant transaction (no selection change needed)\n * @param editor\n */\nexport const markHideFloatingOnNext = (editor: Editor) => {\n if (!editor) return\n editor.view.dispatch(editor.state.tr.setMeta(HIDE_FLOATING_META, true))\n}\n","import { Extension } from \"@tiptap/core\"\n\nexport interface UiState {\n commentInputVisible: boolean\n lockDragHandle: boolean\n isDragging: boolean\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n uiState: {\n commentInputShow: () => ReturnType\n commentInputHide: () => ReturnType\n\n setLockDragHandle: (value: boolean) => ReturnType\n\n resetUiState: () => ReturnType\n setIsDragging: (value: boolean) => ReturnType\n }\n }\n\n interface Storage {\n uiState: UiState\n }\n}\n\nexport const defaultUiState: UiState = {\n commentInputVisible: false,\n lockDragHandle: false,\n isDragging: false,\n} as const\n\nexport const UiState = Extension.create<UiState>({\n name: \"uiState\",\n\n addStorage() {\n return {\n uiState: { ...defaultUiState },\n }\n },\n\n addCommands() {\n const createBooleanSetter =\n (key: keyof UiState) => (value: boolean) => () => {\n this.storage[key] = value\n return true\n }\n\n const createToggle = (key: keyof UiState, value: boolean) => () => () => {\n this.storage[key] = value\n return true\n }\n\n return {\n // Comment input commands\n commentInputShow: createToggle(\"commentInputVisible\", true),\n commentInputHide: createToggle(\"commentInputVisible\", false),\n\n // Drag handle commands\n setLockDragHandle: createBooleanSetter(\"lockDragHandle\"),\n setIsDragging: createBooleanSetter(\"isDragging\"),\n\n // Reset command\n resetUiState: () => () => {\n Object.assign(this.storage, { ...defaultUiState })\n return true\n },\n }\n },\n\n onCreate() {\n this.storage = { ...defaultUiState }\n },\n})\n","import {\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 \"./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 extends Omit<\n React.HTMLProps<HTMLElement>,\n \"ref\"\n> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps extends Omit<\n React.HTMLProps<HTMLDivElement>,\n \"ref\"\n> {\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 \"../tooltip\"\n\n// --- Lib ---\nimport { cn, parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\nimport \"./button-colors.scss\"\nimport \"./button.scss\"\n\nexport type ButtonVariant = \"ghost\" | \"primary\"\nexport type ButtonSize = \"small\" | \"default\" | \"large\"\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n variant?: ButtonVariant\n size?: ButtonSize\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 variant,\n size,\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 data-slot=\"tiptap-button\"\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n data-style={variant}\n data-size={size}\n {...props}\n >\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger\n data-slot=\"tiptap-button\"\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n data-style={variant}\n data-size={size}\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 default Button\n","import { mergeAttributes, Node } from \"@tiptap/react\"\n\nexport interface VideoOptions {\n HTMLAttributes: Record<string, unknown>\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n video: {\n setVideo: (options: { src: string; title?: string }) => ReturnType\n }\n }\n}\n\n/**\n * 块级 atom:原生 <video controls> 播放器。\n * 不带自定义 NodeView,浏览器原生播放足够;将来要\"自动播放/封面/字幕\"再扩展。\n */\nexport const Video = Node.create<VideoOptions>({\n name: \"video\",\n group: \"block\",\n atom: true,\n selectable: true,\n draggable: true,\n\n addOptions() {\n return { HTMLAttributes: {} }\n },\n\n addAttributes() {\n return {\n src: { default: null },\n title: { default: null },\n width: { default: null },\n height: { default: null },\n poster: { default: null },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: \"video[src]\",\n getAttrs: (el) => {\n if (!(el instanceof HTMLElement)) return false\n return {\n src: el.getAttribute(\"src\"),\n title: el.getAttribute(\"title\"),\n width: el.getAttribute(\"width\"),\n height: el.getAttribute(\"height\"),\n poster: el.getAttribute(\"poster\"),\n }\n },\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const attrs: Record<string, unknown> = {\n controls: \"true\",\n preload: \"metadata\",\n src: node.attrs.src,\n }\n if (node.attrs.title) attrs.title = node.attrs.title\n if (node.attrs.width) attrs.width = node.attrs.width\n if (node.attrs.height) attrs.height = node.attrs.height\n if (node.attrs.poster) attrs.poster = node.attrs.poster\n\n return [\n \"video\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, attrs),\n ]\n },\n\n addCommands() {\n return {\n setVideo:\n (options) =>\n ({ commands }) => commands.insertContent({ type: this.name, attrs: options }),\n }\n },\n\n // 原生 <video controls> 是 atom+selectable+draggable 节点,ProseMirror 会在节点上\n // 接管 mousedown 做选中/拖拽,吞掉原生控件点击 → 只读 viewer 下视频点不动、播放不了。\n // 这里加 NodeView:只读(editable=false)时 stopEvent 返回 true,让 PM 忽略视频内部\n // DOM 事件,原生控件(播放/进度/全屏)才能正常工作;编辑器(可编辑)时返回 false,\n // PM 照常处理节点选中/拖拽,编辑行为不变。\n addNodeView() {\n return ({ node }) => {\n const dom = document.createElement(\"video\")\n dom.setAttribute(\"controls\", \"true\")\n dom.setAttribute(\"preload\", \"metadata\")\n if (node.attrs.src) dom.setAttribute(\"src\", node.attrs.src as string)\n if (node.attrs.title) dom.setAttribute(\"title\", node.attrs.title as string)\n if (node.attrs.width) dom.setAttribute(\"width\", String(node.attrs.width))\n if (node.attrs.height) dom.setAttribute(\"height\", String(node.attrs.height))\n if (node.attrs.poster) dom.setAttribute(\"poster\", node.attrs.poster as string)\n\n return {\n dom,\n stopEvent: () => !this.editor.isEditable,\n ignoreMutation: () => true,\n }\n }\n },\n})\n\nexport default Video\n","import { mergeAttributes, Node } from \"@tiptap/react\"\n\nexport interface AudioOptions {\n HTMLAttributes: Record<string, unknown>\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n audio: {\n setAudio: (options: { src: string; title?: string }) => ReturnType\n }\n }\n}\n\n/**\n * 块级 atom:原生 <audio controls> 播放器。\n */\nexport const Audio = Node.create<AudioOptions>({\n name: \"audio\",\n group: \"block\",\n atom: true,\n selectable: true,\n draggable: true,\n\n addOptions() {\n return { HTMLAttributes: {} }\n },\n\n addAttributes() {\n return {\n src: { default: null },\n title: { default: null },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: \"audio[src]\",\n getAttrs: (el) => {\n if (!(el instanceof HTMLElement)) return false\n return {\n src: el.getAttribute(\"src\"),\n title: el.getAttribute(\"title\"),\n }\n },\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const attrs: Record<string, unknown> = {\n controls: \"true\",\n preload: \"metadata\",\n src: node.attrs.src,\n }\n if (node.attrs.title) attrs.title = node.attrs.title\n\n return [\n \"audio\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, attrs),\n ]\n },\n\n addCommands() {\n return {\n setAudio:\n (options) =>\n ({ commands }) => commands.insertContent({ type: this.name, attrs: options }),\n }\n },\n})\n\nexport default Audio\n","/**\n * 文件类型图标:复刻 @lobehub/ui FileTypeIcon 的视觉——白色文档形状(带折角)+\n * 底部彩色类型条 + 大写扩展名标签,按扩展名上色。包内 SVG 实现,零依赖。\n * 配色移植自 lobe-chat 的 mimeTypeMap,并补充常见类型。\n */\n\nconst EXT_COLOR: Record<string, string> = {\n // documents\n pdf: \"#de2429\",\n doc: \"#2b56b1\",\n docx: \"#2b56b1\",\n rtf: \"#2b56b1\",\n // spreadsheets\n xls: \"#2f6d3f\",\n xlsx: \"#2f6d3f\",\n csv: \"#43aa55\",\n // slides\n ppt: \"#c43e1b\",\n pptx: \"#c43e1b\",\n // text / markup / data\n txt: \"#607180\",\n text: \"#607180\",\n md: \"#607180\",\n log: \"#607180\",\n json: \"#cb8b00\",\n xml: \"#cb8b00\",\n yaml: \"#cb8b00\",\n yml: \"#cb8b00\",\n // archives\n zip: \"#8a6d3b\",\n rar: \"#8a6d3b\",\n \"7z\": \"#8a6d3b\",\n tar: \"#8a6d3b\",\n gz: \"#5a7184\",\n tgz: \"#5a7184\",\n // media\n mp3: \"#7b5ea7\",\n wav: \"#7b5ea7\",\n m4a: \"#7b5ea7\",\n mp4: \"#b5446e\",\n mov: \"#b5446e\",\n webm: \"#b5446e\",\n // images\n png: \"#3a8ee6\",\n jpg: \"#3a8ee6\",\n jpeg: \"#3a8ee6\",\n gif: \"#3a8ee6\",\n svg: \"#3a8ee6\",\n webp: \"#3a8ee6\",\n // code\n js: \"#d6a13b\",\n ts: \"#2f74c0\",\n tsx: \"#2f74c0\",\n jsx: \"#d6a13b\",\n html: \"#e34c26\",\n css: \"#2f74c0\",\n}\n\nconst DEFAULT_COLOR = \"#5b6b7b\"\n\n/** 取文件名最后一段扩展名(小写)。 */\nexport const getExtension = (name: string): string => {\n const m = /\\.([a-z0-9]+)$/i.exec(name || \"\")\n return m ? m[1].toLowerCase() : \"\"\n}\n\nexport const colorForExtension = (ext: string): string =>\n EXT_COLOR[ext] ?? DEFAULT_COLOR\n\nexport interface FileTypeIconProps {\n /** 文件名(用于推断扩展名与标签) */\n name: string\n /** 像素尺寸(正方形),默认 40 */\n size?: number\n}\n\nexport const FileTypeIcon = ({ name, size = 40 }: FileTypeIconProps) => {\n const ext = getExtension(name)\n const color = colorForExtension(ext)\n const label = (ext || \"FILE\").toUpperCase().slice(0, 4)\n // 标签越长字号越小,保证落在类型条内\n const fontSize = label.length >= 4 ? 6.5 : label.length === 3 ? 8 : 9\n\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 40 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label={`${label} 文件`}\n >\n {/* 文档主体(白底 + 折角缺口),描边用类型色淡化 */}\n <path\n d=\"M9 5.5C9 4.12 10.12 3 11.5 3H24l7 7v22.5c0 1.38-1.12 2.5-2.5 2.5h-17A2.5 2.5 0 0 1 9 32.5z\"\n fill=\"#ffffff\"\n stroke={color}\n strokeOpacity=\"0.4\"\n strokeWidth=\"1.4\"\n />\n {/* 右上折角 */}\n <path d=\"M24 3l7 7h-4.8A2.2 2.2 0 0 1 24 7.8z\" fill={color} fillOpacity=\"0.28\" />\n {/* 底部彩色类型条(左侧略凸出,经典 file-type 观感) */}\n <rect x=\"5\" y=\"21\" width=\"23\" height=\"12.5\" rx=\"2.5\" fill={color} />\n <text\n x=\"16.5\"\n y=\"29.6\"\n textAnchor=\"middle\"\n fontSize={fontSize}\n fontWeight=\"700\"\n letterSpacing=\"0.3\"\n fill=\"#ffffff\"\n fontFamily=\"ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif\"\n >\n {label}\n </text>\n </svg>\n )\n}\n\nexport default FileTypeIcon\n","import type { NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport { FileTypeIcon } from \"./file-type-icon\"\n\nconst formatBytes = (bytes: number): string => {\n if (!bytes || bytes <= 0) return \"\"\n const units = [\"B\", \"KB\", \"MB\", \"GB\"]\n let v = bytes\n let i = 0\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024\n i++\n }\n return `${v.toFixed(v >= 10 || i === 0 ? 0 : 1)} ${units[i]}`\n}\n\n/** 下载箭头(lucide 风格线性图标,内联零依赖)。 */\nconst DownloadGlyph = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n)\n\nexport const FileAttachmentNodeView = (props: NodeViewProps) => {\n const { src, name, size } = props.node.attrs as {\n src: string\n name: string\n size: number\n mimeType: string\n }\n const filename = name || \"未命名文件\"\n const sizeText = formatBytes(Number(size) || 0)\n\n return (\n <NodeViewWrapper as=\"div\" className=\"tiptap-file-attachment\">\n <a\n className=\"tiptap-file-attachment-card\"\n href={src}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download={filename}\n // 阻止编辑器吞掉点击 / 选区\n onMouseDown={(e) => e.stopPropagation()}\n >\n <span className=\"tiptap-file-attachment-icon\" aria-hidden>\n <FileTypeIcon name={filename} size={40} />\n </span>\n <span className=\"tiptap-file-attachment-meta\">\n <span className=\"tiptap-file-attachment-name\" title={filename}>\n {filename}\n </span>\n {sizeText && (\n <span className=\"tiptap-file-attachment-size\">{sizeText}</span>\n )}\n </span>\n <span className=\"tiptap-file-attachment-download\" aria-label=\"下载\">\n <DownloadGlyph />\n </span>\n </a>\n </NodeViewWrapper>\n )\n}\n","import { mergeAttributes, Node, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { FileAttachmentNodeView } from \"./file-attachment-node-view\"\n\nexport interface FileAttachmentOptions {\n HTMLAttributes: Record<string, unknown>\n}\n\nexport interface FileAttachmentAttrs {\n src: string\n name: string\n size?: number\n mimeType?: string\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n fileAttachment: {\n setFileAttachment: (options: FileAttachmentAttrs) => ReturnType\n }\n }\n}\n\n/**\n * 块级 atom:通用文件卡片(pdf / doc / zip 等)。\n * 序列化为 <a data-type=\"file-attachment\" data-size data-mime href download>name</a>,\n * 没 NodeView 的环境(如纯阅读视图)也能显示成可点击链接。\n */\nexport const FileAttachment = Node.create<FileAttachmentOptions>({\n name: \"fileAttachment\",\n group: \"block\",\n atom: true,\n selectable: true,\n draggable: true,\n\n addOptions() {\n return { HTMLAttributes: {} }\n },\n\n addAttributes() {\n return {\n src: { default: null },\n name: { default: \"\" },\n size: { default: 0 },\n mimeType: { default: \"\" },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'a[data-type=\"file-attachment\"]',\n getAttrs: (el) => {\n if (!(el instanceof HTMLElement)) return false\n return {\n src: el.getAttribute(\"href\"),\n name: el.getAttribute(\"download\") || el.textContent || \"\",\n size: Number(el.getAttribute(\"data-size\") || 0),\n mimeType: el.getAttribute(\"data-mime\") || \"\",\n }\n },\n },\n ]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n \"a\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"file-attachment\",\n \"data-size\": node.attrs.size || 0,\n \"data-mime\": node.attrs.mimeType || \"\",\n href: node.attrs.src,\n download: node.attrs.name || \"\",\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n }),\n node.attrs.name || \"未命名文件\",\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FileAttachmentNodeView)\n },\n\n addCommands() {\n return {\n setFileAttachment:\n (options) =>\n ({ commands }) =>\n commands.insertContent({ type: this.name, attrs: options }),\n }\n },\n})\n\nexport default FileAttachment\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","import type { Editor } from \"@tiptap/react\"\n\n/** 占位节点在 schema 中的名字,注册表与扩展共享,避免硬编码字符串漂移。 */\nexport const PLACEHOLDER_NODE_NAME = \"mediaUploadPlaceholder\"\n\nexport interface MediaUploadEntry {\n file: File\n controller: AbortController\n /** image/video 的 blob 预览 URL;audio/file 为 null */\n blobUrl: string | null\n}\n\n// 模块级注册表:File / AbortController / blobUrl 不可序列化,不能放进节点 attrs\nconst registry = new Map<string, MediaUploadEntry>()\n\nexport function registerUpload(uploadId: string, entry: MediaUploadEntry): void {\n registry.set(uploadId, entry)\n}\n\n/** 该 uploadId 是否仍在进行中(未完成/未取消)。异步回调晚到时的存活守卫。 */\nexport function isLive(uploadId: string): boolean {\n return registry.has(uploadId)\n}\n\n/** 幂等:revoke blob + 删除注册项。成功/失败/取消都会调,重复调用安全。 */\nexport function clearUpload(uploadId: string): void {\n const entry = registry.get(uploadId)\n if (!entry) return\n if (entry.blobUrl) URL.revokeObjectURL(entry.blobUrl)\n registry.delete(uploadId)\n}\n\ninterface PlaceholderHit {\n pos: number\n nodeSize: number\n attrs: Record<string, unknown>\n}\n\n/** 按 uploadId 在文档里找占位节点(不依赖 blobUrl,消除并发/同图歧义)。 */\nexport function findPlaceholder(\n editor: Editor,\n uploadId: string,\n): PlaceholderHit | null {\n let hit: PlaceholderHit | null = null\n editor.state.doc.descendants((node, pos) => {\n if (hit) return false\n if (\n node.type.name === PLACEHOLDER_NODE_NAME &&\n node.attrs.uploadId === uploadId\n ) {\n hit = { pos, nodeSize: node.nodeSize, attrs: { ...node.attrs } }\n return false\n }\n return true\n })\n return hit\n}\n\n/**\n * 更新进度。节流:四舍五入到整数百分比,与现值相同则不 dispatch。\n * 进度事务标 `addToHistory:false`:上传期一个文件会产生上百次进度 tick,不应污染\n * undo 栈(用户按 Ctrl+Z 不该逐帧回退进度)。\n *\n * 协同(Yjs)说明:本编辑器总是挂 Collaboration,占位节点与进度更新在「有 collab\n * provider」时会经 y-prosemirror 同步给协作者并进入 ydoc。当前业务(new-editor)是\n * 本地模式(无 provider),不会跨端同步;真正的「占位对协作者隐藏」需用 decoration 或\n * 自定义 meta 过滤同步,超出本期范围(见 spec §6)。\n */\nexport function updatePlaceholderProgress(\n editor: Editor,\n uploadId: string,\n progress: number,\n): void {\n if (editor.isDestroyed) return\n const hit = findPlaceholder(editor, uploadId)\n if (!hit) return\n const next = Math.max(0, Math.min(100, Math.round(progress)))\n if (hit.attrs.progress === next) return\n editor.view.dispatch(\n editor.state.tr\n .setNodeMarkup(hit.pos, undefined, { ...hit.attrs, progress: next })\n .setMeta(\"addToHistory\", false),\n )\n}\n\n/** 成功:用真实节点 content 替换占位(一次 insertContentAt range 替换)。 */\nexport function replacePlaceholder(\n editor: Editor,\n uploadId: string,\n content: { type: string; attrs: Record<string, unknown> },\n): void {\n if (editor.isDestroyed) return\n const hit = findPlaceholder(editor, uploadId)\n if (!hit) return\n editor\n .chain()\n .insertContentAt({ from: hit.pos, to: hit.pos + hit.nodeSize }, content)\n .run()\n}\n\n/** 失败:移除占位。 */\nexport function removePlaceholder(editor: Editor, uploadId: string): void {\n if (editor.isDestroyed) return\n const hit = findPlaceholder(editor, uploadId)\n if (!hit) return\n editor.view.dispatch(\n editor.state.tr.delete(hit.pos, hit.pos + hit.nodeSize),\n )\n}\n\n/** 用户点 ✕:abort 上传 + 移除占位 + 清注册项。 */\nexport function abortUpload(editor: Editor, uploadId: string): void {\n const entry = registry.get(uploadId)\n entry?.controller.abort()\n removePlaceholder(editor, uploadId)\n clearUpload(uploadId)\n}\n","import type { NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport { CloseIcon } from \"../../tiptap-icons/close-icon\"\nimport { FileTypeIcon } from \"../file-attachment-node/file-type-icon\"\nimport { abortUpload } from \"./media-upload-registry\"\nimport \"./media-upload-placeholder-node.scss\"\n\nconst formatBytes = (bytes: number): string => {\n if (!bytes || bytes <= 0) return \"\"\n const units = [\"B\", \"KB\", \"MB\", \"GB\"]\n let v = bytes\n let i = 0\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024\n i++\n }\n return `${v.toFixed(v >= 10 || i === 0 ? 0 : 1)} ${units[i]}`\n}\n\nexport const MediaUploadPlaceholderNodeView = (props: NodeViewProps) => {\n const { uploadId, kind, name, size, previewUrl, progress } = props.node\n .attrs as {\n uploadId: string\n kind: \"image\" | \"video\" | \"audio\" | \"file\"\n name: string\n size: number\n previewUrl: string | null\n progress: number\n }\n\n const pct = Math.max(0, Math.min(100, Math.round(progress || 0)))\n const hasPreview = (kind === \"image\" || kind === \"video\") && !!previewUrl\n const sizeText = formatBytes(size)\n\n const cancel = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n abortUpload(props.editor, uploadId)\n }\n\n return (\n <NodeViewWrapper className=\"tiptap-media-upload-placeholder\" data-kind={kind}>\n {hasPreview ? (\n <div className=\"tiptap-mup-preview\">\n {kind === \"image\" ? (\n <img className=\"tiptap-mup-media\" src={previewUrl as string} alt={name} />\n ) : (\n <video className=\"tiptap-mup-media\" src={previewUrl as string} muted />\n )}\n <button\n type=\"button\"\n className=\"tiptap-mup-cancel\"\n onClick={cancel}\n aria-label=\"取消上传\"\n >\n <CloseIcon />\n </button>\n <div className=\"tiptap-mup-overlay\">\n <div className=\"tiptap-mup-bar\">\n <div className=\"tiptap-mup-bar-fill\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"tiptap-mup-pct\">{pct}%</span>\n </div>\n </div>\n ) : (\n <div className=\"tiptap-mup-card\">\n <span className=\"tiptap-mup-icon\" aria-hidden>\n <FileTypeIcon name={name || \"file\"} size={40} />\n </span>\n <div className=\"tiptap-mup-meta\">\n <span className=\"tiptap-mup-name\">{name || \"未命名文件\"}</span>\n <div className=\"tiptap-mup-bar\">\n <div className=\"tiptap-mup-bar-fill\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"tiptap-mup-sub\">\n {sizeText ? `${sizeText} · ` : \"\"}\n {pct}%\n </span>\n </div>\n <button\n type=\"button\"\n className=\"tiptap-mup-cancel\"\n onClick={cancel}\n aria-label=\"取消上传\"\n >\n <CloseIcon />\n </button>\n </div>\n )}\n </NodeViewWrapper>\n )\n}\n","import { mergeAttributes, Node, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { MediaUploadPlaceholderNodeView } from \"./media-upload-placeholder-node\"\nimport { PLACEHOLDER_NODE_NAME } from \"./media-upload-registry\"\n\n/**\n * 临时占位节点:拖拽/粘贴上传过程中显示进度,上传完成由 runMediaUpload 替换为\n * 真实 image/video/audio/fileAttachment 节点。正常不会进入保存内容(保存前已替换)。\n */\nexport const MediaUploadPlaceholder = Node.create({\n name: PLACEHOLDER_NODE_NAME,\n group: \"block\",\n atom: true,\n selectable: true,\n draggable: false,\n\n addAttributes() {\n return {\n uploadId: { default: \"\" },\n kind: { default: \"file\" },\n name: { default: \"\" },\n size: { default: 0 },\n previewUrl: { default: null },\n progress: { default: 0 },\n // status 为未来失败态预留(spec §3.2);当前 NodeView 不消费,失败即移除占位\n status: { default: \"uploading\" },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"media-upload-placeholder\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n // 临时节点;序列化为无意义占位(正常保存前已被真实节点替换)\n return [\n \"div\",\n mergeAttributes(\n { \"data-type\": \"media-upload-placeholder\" },\n HTMLAttributes,\n ),\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(MediaUploadPlaceholderNodeView)\n },\n})\n\nexport default MediaUploadPlaceholder\n","import { memo } from \"react\"\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\nexport const ColumnsTwoIcon = memo(({ className, ...props }: SvgProps) => (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"3\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\" />\n <rect x=\"13\" y=\"4\" width=\"8\" height=\"16\" rx=\"1\" />\n </svg>\n))\nColumnsTwoIcon.displayName = \"ColumnsTwoIcon\"\n","import { memo } from \"react\"\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\nexport const ColumnsThreeIcon = memo(({ className, ...props }: SvgProps) => (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"3\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" />\n <rect x=\"9.5\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" />\n <rect x=\"16\" y=\"4\" width=\"5\" height=\"16\" rx=\"1\" />\n </svg>\n))\nColumnsThreeIcon.displayName = \"ColumnsThreeIcon\"\n","import { memo } from \"react\"\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\nexport const ColumnsLeftIcon = memo(({ className, ...props }: SvgProps) => (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"3\" y=\"4\" width=\"6\" height=\"16\" rx=\"1\" />\n <rect x=\"11\" y=\"4\" width=\"10\" height=\"16\" rx=\"1\" />\n </svg>\n))\nColumnsLeftIcon.displayName = \"ColumnsLeftIcon\"\n","import { memo } from \"react\"\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\nexport const ColumnsRightIcon = memo(({ className, ...props }: SvgProps) => (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <rect x=\"3\" y=\"4\" width=\"10\" height=\"16\" rx=\"1\" />\n <rect x=\"15\" y=\"4\" width=\"6\" height=\"16\" rx=\"1\" />\n </svg>\n))\nColumnsRightIcon.displayName = \"ColumnsRightIcon\"\n","import {\n NodeViewContent,\n NodeViewWrapper,\n type NodeViewProps,\n} from \"@tiptap/react\"\nimport type { ColumnLayout } from \"./column-node-extension\"\nimport { ColumnsTwoIcon } from \"../../tiptap-icons/columns-two-icon\"\nimport { ColumnsThreeIcon } from \"../../tiptap-icons/columns-three-icon\"\nimport { ColumnsLeftIcon } from \"../../tiptap-icons/columns-left-icon\"\nimport { ColumnsRightIcon } from \"../../tiptap-icons/columns-right-icon\"\nimport { CloseIcon } from \"../../tiptap-icons/close-icon\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\nconst TWO_COL_PRESETS: {\n layout: ColumnLayout\n label: string\n Icon: React.ComponentType<IconProps>\n}[] = [\n { layout: \"column\", label: \"等宽两栏\", Icon: ColumnsTwoIcon },\n { layout: \"sidebar-left\", label: \"左窄右宽\", Icon: ColumnsLeftIcon },\n { layout: \"sidebar-right\", label: \"左宽右窄\", Icon: ColumnsRightIcon },\n]\n\nexport const ColumnsNodeView = (props: NodeViewProps) => {\n const layout = (props.node.attrs.layout as ColumnLayout) || \"column\"\n const isThree = layout === \"three-column\"\n\n // 只读态不渲染这条工具条——它全是编辑动作(改栏宽比例、解除分栏)。\n // 编辑态浮层(拖拽手柄 / 选中工具栏 / 移动端工具栏)统一被 EditorContentArea 的\n // `{isEditable && …}` 挡住了,但 NodeView 渲染在文档**内部**,走不到那道闸,\n // 于是只读文章里 hover 到分栏就会冒出四个按钮,点下去还真能改内容。\n // editable 在编辑器构造时就定死(EditorProvider 的 `editable: !readOnly`,全包没有\n // setEditable 调用),所以这里直读即可,不需要订阅变更。\n const isEditable = props.editor.isEditable\n\n // 关键:用实例级 API 锚定「本 NodeView 对应的 columns 节点」,不走 .focus()+选区相对命令。\n // hover 工具条点击时编辑器选区不保证在本分栏内(鼠标在 contentEditable=false 的工具条上),\n // 选区相对命令会改错节点/no-op。对齐 image-node-view 既有范式(props.updateAttributes / getPos)。\n const apply = (l: ColumnLayout) => {\n if (l === layout) return\n props.updateAttributes({ layout: l }) // 直接改本实例 attr,UI 仅给同列数选项故无需列数守卫\n }\n const remove = () => {\n const pos = props.getPos()\n if (typeof pos !== \"number\") return\n props.editor.chain().unsetColumns(pos).run() // 用本实例 pos 解包,不依赖选区\n }\n\n return (\n <NodeViewWrapper className=\"tiptap-columns-wrapper\">\n {isEditable && (\n <div className=\"tiptap-columns-toolbar\" contentEditable={false} role=\"toolbar\">\n {!isThree &&\n TWO_COL_PRESETS.map(({ layout: l, label, Icon }) => (\n <button\n key={l}\n type=\"button\"\n className={`tiptap-columns-toolbar-btn${l === layout ? \" is-active\" : \"\"}`}\n title={label}\n onClick={() => apply(l)}\n >\n <Icon className=\"tiptap-button-icon\" />\n </button>\n ))}\n {isThree && (\n <span className=\"tiptap-columns-toolbar-btn is-active\" title=\"等宽三栏\">\n <ColumnsThreeIcon className=\"tiptap-button-icon\" />\n </span>\n )}\n <button\n type=\"button\"\n className=\"tiptap-columns-toolbar-btn\"\n title=\"移除分栏\"\n onClick={remove}\n >\n <CloseIcon className=\"tiptap-button-icon\" />\n </button>\n </div>\n )}\n <NodeViewContent\n as=\"div\"\n className={`tiptap-columns layout-${layout}`}\n data-type=\"columns\"\n data-layout={layout}\n />\n </NodeViewWrapper>\n )\n}\n","import { Node, mergeAttributes, ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { Fragment, type Node as ProseMirrorNode } from \"@tiptap/pm/model\"\nimport { ColumnsNodeView } from \"./columns-node-view\"\n\nexport type ColumnLayout =\n | \"column\"\n | \"sidebar-left\"\n | \"sidebar-right\"\n | \"three-column\"\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n columns: {\n /** 插入分栏:layout 决定列数(three-column→3,其余→2)与比例 */\n setColumns: (layout?: ColumnLayout) => ReturnType\n /** 切换当前所在分栏的 layout(仅同列数档位间,带列数守卫) */\n setColumnsLayout: (layout: ColumnLayout) => ReturnType\n /**\n * 解包分栏,列内容提升为普通块。\n * pos 给定时按该位置的 columns 节点解包(NodeView 用 getPos() 传入,\n * 不依赖选区);不给则回退到选区所在 columns。\n */\n unsetColumns: (pos?: number) => ReturnType\n }\n }\n}\n\n/** 从旧/新 DOM 解析 layout:优先 class `layout-X`,回退 data-layout,默认 column。 */\nconst parseLayout = (el: HTMLElement): ColumnLayout => {\n const cls = el.getAttribute(\"class\") || \"\"\n if (cls.includes(\"layout-sidebar-left\")) return \"sidebar-left\"\n if (cls.includes(\"layout-sidebar-right\")) return \"sidebar-right\"\n if (cls.includes(\"layout-three-column\")) return \"three-column\"\n if (cls.includes(\"layout-column\")) return \"column\"\n const dataLayout = el.getAttribute(\"data-layout\")\n if (\n dataLayout === \"sidebar-left\" ||\n dataLayout === \"sidebar-right\" ||\n dataLayout === \"three-column\" ||\n dataLayout === \"column\"\n ) {\n return dataLayout\n }\n return \"column\"\n}\n\nexport const Column = Node.create({\n name: \"column\",\n content: \"block+\",\n isolating: true,\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"column\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, { \"data-type\": \"column\" }),\n 0,\n ]\n },\n})\n\nexport const Columns = Node.create({\n name: \"columns\",\n group: \"block\",\n content: \"column{2,3}\",\n isolating: true,\n selectable: true,\n\n addAttributes() {\n return {\n layout: {\n default: \"column\" as ColumnLayout,\n parseHTML: (el) => parseLayout(el as HTMLElement),\n // 故意返回空对象:class/data-layout 由节点级 renderHTML 统一产出,避免重复\n renderHTML: () => ({}),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"columns\"]' }]\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const layout = (node.attrs.layout as ColumnLayout) || \"column\"\n return [\n \"div\",\n mergeAttributes(HTMLAttributes, {\n \"data-type\": \"columns\",\n \"data-layout\": layout,\n class: `tiptap-columns layout-${layout}`,\n }),\n 0,\n ]\n },\n\n addCommands() {\n return {\n setColumns:\n (layout = \"column\") =>\n ({ commands }) => {\n const count = layout === \"three-column\" ? 3 : 2\n return commands.insertContent({\n type: \"columns\",\n attrs: { layout },\n content: Array.from({ length: count }, () => ({\n type: \"column\",\n content: [{ type: \"paragraph\" }],\n })),\n })\n },\n\n setColumnsLayout:\n (layout) =>\n ({ state, commands }) => {\n // 列数守卫(spec §4.3):只允许同列数档位互切,避免 2 列被设成\n // three-column 后第 3 列空缺、grid 错位。\n const { $from } = state.selection\n let depth = $from.depth\n while (depth > 0 && $from.node(depth).type.name !== \"columns\") {\n depth -= 1\n }\n if (depth === 0 || $from.node(depth).type.name !== \"columns\") {\n return false\n }\n const wantCount = layout === \"three-column\" ? 3 : 2\n if ($from.node(depth).childCount !== wantCount) {\n return false\n }\n return commands.updateAttributes(\"columns\", { layout })\n },\n\n unsetColumns:\n (pos) =>\n ({ state, dispatch }) => {\n // 优先用显式 pos(NodeView 经 getPos() 传入,锚定本实例、不依赖选区,\n // 同时覆盖 NodeSelection 整块选中的场景);否则回退到选区所在 columns。\n let columnsPos: number\n let columnsNode: ProseMirrorNode | null = null\n if (typeof pos === \"number\") {\n const node = state.doc.nodeAt(pos)\n if (!node || node.type.name !== \"columns\") return false\n columnsPos = pos\n columnsNode = node\n } else {\n const { $from } = state.selection\n let depth = $from.depth\n while (depth > 0 && $from.node(depth).type.name !== \"columns\") {\n depth -= 1\n }\n if (depth === 0 || $from.node(depth).type.name !== \"columns\") {\n return false\n }\n columnsNode = $from.node(depth)\n columnsPos = $from.before(depth)\n }\n\n const from = columnsPos\n const to = from + columnsNode.nodeSize\n const blocks: ProseMirrorNode[] = []\n columnsNode.forEach((column) => {\n column.forEach((block) => {\n blocks.push(block)\n })\n })\n\n if (dispatch) {\n const fragment = blocks.length\n ? Fragment.fromArray(blocks)\n : Fragment.from(state.schema.nodes.paragraph.create())\n dispatch(state.tr.replaceWith(from, to, fragment))\n }\n return true\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ColumnsNodeView)\n },\n})\n","import { Extension, type Editor } from \"@tiptap/react\"\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\"\n\nimport {\n DEFAULT_MAX_FILE_SIZES,\n detectMediaKind,\n type MediaKind,\n} from \"../../contexts/editor-config-context\"\nimport {\n PLACEHOLDER_NODE_NAME,\n registerUpload,\n clearUpload,\n isLive,\n updatePlaceholderProgress,\n replacePlaceholder,\n removePlaceholder,\n} from \"../tiptap-node/media-upload-placeholder-node/media-upload-registry\"\n\n/**\n * 编辑器整面的粘贴/拖拽多媒体接入。覆盖:\n * 1. 粘贴文件(截图、复制本地图片/视频/任意文件)— `clipboardData.files`\n * 2. 拖拽本地文件到正文 — `dataTransfer.files`\n * 3. 拖拽外链图片到正文 — `dataTransfer.text/uri-list` + 后缀名命中\n *\n * 按 `file.type` 分发到对应 tiptap 节点:\n * image/* → image,video/* → video,audio/* → audio,其它 → fileAttachment\n *\n * UX(统一占位流程,见 media-upload-placeholder-node):\n * - 所有类型先插入 `mediaUploadPlaceholder` 占位节点显示进度(image/video 带 blob 预览,\n * audio/file 显示卡片),上传完成后按 uploadId 替换为真实节点;失败移除占位 + onError;\n * 点 ✕ 取消则 abort 上传并移除占位。\n *\n * 外链 rehost 仅对图片做(视频通常太大、防盗链多,转存价值低),仍走\"乐观插入外链 +\n * 按 src 回填 CDN\"的旧路径(不经占位节点)。\n */\n\nexport type PasteDropMediaUploadFn = (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal,\n) => Promise<string>\n\nexport type PasteDropRehostProgressEvent =\n | { url: string; phase: \"downloading\"; progress: number }\n | { url: string; phase: \"uploading\"; progress: number }\n | { url: string; phase: \"done\"; progress: 100 }\n\nexport interface PasteDropMediaOptions {\n upload?: PasteDropMediaUploadFn\n /** 按媒体大类分别设置单文件大小上限(字节,0 = 不限制)。未配置走包内默认。 */\n maxFileSizes?: Partial<Record<MediaKind, number>>\n /**\n * 拖入外链图片时是否走 XHR → blob → onUpload 转存到自家 CDN。\n * 默认 true。CORS 失败 / 超大 / 上传失败时回退为外链直接显示并触发 onError。\n * 仅对图片 URL 生效。\n */\n rehostExternalUrls?: boolean\n onError?: (error: Error) => void\n /** 外链转存的全程进度(下载 / 上传 / 完成),按 url 聚合。 */\n onRehostProgress?: (event: PasteDropRehostProgressEvent) => void\n}\n\nconst PLUGIN_KEY = new PluginKey(\"pasteDropMedia\")\nconst IMAGE_EXT_REGEX = /\\.(png|jpe?g|gif|webp|svg|bmp|ico|avif|heic|heif)$/i\n\nconst KIND_LABEL: Record<MediaKind, string> = {\n image: \"图片\",\n video: \"视频\",\n audio: \"音频\",\n file: \"文件\",\n}\n\n/** 把 `image` / `video` / `audio` / `file` 映射到 tiptap 节点名。 */\nconst NODE_NAME_FOR_KIND: Record<MediaKind, string> = {\n image: \"image\",\n video: \"video\",\n audio: \"audio\",\n file: \"fileAttachment\",\n}\n\nconst looksLikeImageUrl = (raw: string): boolean => {\n try {\n const url = new URL(raw)\n if (url.protocol === \"data:\") return /^data:image\\//i.test(raw)\n return IMAGE_EXT_REGEX.test(url.pathname)\n } catch {\n return false\n }\n}\n\nconst firstUriFromList = (raw: string): string | null => {\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed && !trimmed.startsWith(\"#\")) return trimmed\n }\n return null\n}\n\nconst guessFilenameFromUrl = (url: string, mime: string): string => {\n try {\n const path = new URL(url).pathname\n const base = path.split(\"/\").filter(Boolean).pop()\n if (base && /\\.[a-z0-9]+$/i.test(base)) return base\n } catch {\n // ignore\n }\n const ext = mime.split(\"/\")[1]?.split(\"+\")[0] || \"png\"\n return `image.${ext}`\n}\n\n/** XHR 下载外链图片为 File,带进度回调,可被 AbortSignal 取消。 */\nconst downloadUrlAsFile = (\n url: string,\n onProgress?: (event: { progress: number }) => void,\n signal?: AbortSignal,\n): Promise<File> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open(\"GET\", url, true)\n xhr.responseType = \"blob\"\n\n if (signal) {\n if (signal.aborted) {\n reject(new Error(\"已取消\"))\n return\n }\n signal.addEventListener(\"abort\", () => xhr.abort(), { once: true })\n }\n\n xhr.onprogress = (event) => {\n if (event.lengthComputable && onProgress) {\n onProgress({ progress: Math.round((event.loaded / event.total) * 100) })\n }\n }\n\n xhr.onload = () => {\n if (xhr.status < 200 || xhr.status >= 300) {\n reject(new Error(`HTTP ${xhr.status}`))\n return\n }\n const blob = xhr.response as Blob | null\n if (!blob) {\n reject(new Error(\"下载响应为空\"))\n return\n }\n if (!blob.type.startsWith(\"image/\")) {\n reject(new Error(`返回类型不是图片:${blob.type || \"unknown\"}`))\n return\n }\n const filename = guessFilenameFromUrl(url, blob.type)\n resolve(new File([blob], filename, { type: blob.type }))\n }\n\n xhr.onerror = () => reject(new Error(\"网络错误(可能被 CORS 拦截)\"))\n xhr.onabort = () => reject(new Error(\"已取消\"))\n xhr.ontimeout = () => reject(new Error(\"下载超时\"))\n\n xhr.send()\n })\n}\n\n/** 在文档里按节点名 + src 找节点(用于乐观插入完成后回填 finalUrl)。 */\nconst findNodeBySrc = (\n editor: Editor,\n nodeName: string,\n src: string,\n):\n | { pos: number; nodeSize: number; attrs: Record<string, unknown> }\n | null => {\n let result:\n | { pos: number; nodeSize: number; attrs: Record<string, unknown> }\n | null = null\n editor.state.doc.descendants((node, pos) => {\n if (result) return false\n if (node.type.name === nodeName && node.attrs?.src === src) {\n result = { pos, nodeSize: node.nodeSize, attrs: { ...node.attrs } }\n return false\n }\n return true\n })\n return result\n}\n\n/** 按 kind 构造上传成功后要插入的真实节点 content。 */\nconst buildRealNodeContent = (\n kind: MediaKind,\n finalUrl: string,\n file: File,\n): { type: string; attrs: Record<string, unknown> } => {\n const title = file.name.replace(/\\.[^/.]+$/, \"\")\n switch (kind) {\n case \"image\":\n return { type: \"image\", attrs: { src: finalUrl, alt: title, title } }\n case \"video\":\n return { type: \"video\", attrs: { src: finalUrl, title } }\n case \"audio\":\n return { type: \"audio\", attrs: { src: finalUrl, title } }\n default:\n return {\n type: \"fileAttachment\",\n attrs: {\n src: finalUrl,\n name: file.name,\n size: file.size,\n mimeType: file.type,\n },\n }\n }\n}\n\n/**\n * 统一入口:插入进度占位 → 上传(带进度/取消)→ 成功替换为真实节点 / 失败移除 / 取消 abort。\n * 同时被 plugin(paste/drop)和 addCommands(slash 菜单 / 工具栏)调用。\n */\nexport const runMediaUpload = (\n editor: Editor,\n file: File,\n insertPos: number,\n options: PasteDropMediaOptions,\n) => {\n if (!options.upload) {\n options.onError?.(new Error(\"upload function is not configured\"))\n return\n }\n const kind = detectMediaKind(file)\n const limit = options.maxFileSizes?.[kind] ?? DEFAULT_MAX_FILE_SIZES[kind]\n if (limit > 0 && file.size > limit) {\n options.onError?.(\n new Error(\n `${KIND_LABEL[kind]}超过最大大小限制 ${(limit / 1024 / 1024).toFixed(0)}MB`,\n ),\n )\n return\n }\n if (!editor.schema.nodes[PLACEHOLDER_NODE_NAME]) {\n options.onError?.(new Error(\"schema 缺少 mediaUploadPlaceholder 节点\"))\n return\n }\n const targetName = NODE_NAME_FOR_KIND[kind]\n if (!editor.schema.nodes[targetName]) {\n options.onError?.(new Error(`schema 缺少 ${targetName} 节点`))\n return\n }\n\n const uploadId = crypto.randomUUID()\n const blobUrl =\n kind === \"image\" || kind === \"video\" ? URL.createObjectURL(file) : null\n const controller = new AbortController()\n registerUpload(uploadId, { file, controller, blobUrl })\n\n // 立即插入占位(用户秒看到)\n editor\n .chain()\n .insertContentAt(insertPos, {\n type: PLACEHOLDER_NODE_NAME,\n attrs: {\n uploadId,\n kind,\n name: file.name,\n size: file.size,\n previewUrl: blobUrl,\n progress: 0,\n status: \"uploading\",\n },\n })\n .run()\n\n options\n .upload(\n file,\n (e) => updatePlaceholderProgress(editor, uploadId, e.progress),\n controller.signal,\n )\n .then((finalUrl) => {\n // 存活守卫:已取消/已结算时晚到的 resolve 不再动文档(abortUpload 已清理)\n if (!isLive(uploadId)) return\n if (!finalUrl) throw new Error(\"上传未返回 URL\")\n replacePlaceholder(editor, uploadId, buildRealNodeContent(kind, finalUrl, file))\n })\n .catch((err) => {\n // 用户取消 或 已不在进行中:静默(abortUpload 已移除占位+清理)\n if (!isLive(uploadId) || controller.signal.aborted) return\n removePlaceholder(editor, uploadId)\n options.onError?.(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n clearUpload(uploadId) // 幂等:revoke blob + 删注册项\n })\n}\n\ndeclare module \"@tiptap/react\" {\n interface Commands<ReturnType> {\n pasteDropMedia: {\n /** slash 菜单 / 工具栏可调用:把 file 走跟 paste/drop 完全一样的流程插入到当前选区。 */\n uploadMediaFile: (file: File) => ReturnType\n }\n }\n}\n\nexport const PasteDropMedia = Extension.create<PasteDropMediaOptions>({\n name: \"pasteDropMedia\",\n\n addOptions() {\n return {\n upload: undefined,\n maxFileSizes: undefined,\n rehostExternalUrls: true,\n onError: undefined,\n onRehostProgress: undefined,\n }\n },\n\n addCommands() {\n return {\n uploadMediaFile:\n (file: File) =>\n ({ editor }) => {\n runMediaUpload(editor, file, editor.state.selection.from, this.options)\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor\n const options = this.options\n\n const insertRemoteImage = (src: string, insertPos: number): boolean => {\n const imageType = editor.schema.nodes.image\n if (!imageType) return false\n editor\n .chain()\n .insertContentAt(insertPos, { type: \"image\", attrs: { src } })\n .run()\n return true\n }\n\n const rehostExternalUrl = async (sourceUrl: string, insertPos: number) => {\n if (!insertRemoteImage(sourceUrl, insertPos)) return\n if (!options.upload || options.rehostExternalUrls === false) return\n\n const reportProgress = options.onRehostProgress\n\n try {\n const file = await downloadUrlAsFile(sourceUrl, (e) => {\n reportProgress?.({\n url: sourceUrl,\n phase: \"downloading\",\n progress: e.progress,\n })\n })\n\n const limit =\n options.maxFileSizes?.image ?? DEFAULT_MAX_FILE_SIZES.image\n if (limit > 0 && file.size > limit) {\n options.onError?.(\n new Error(\n `外链图片超过 ${(limit / 1024 / 1024).toFixed(1)}MB,保留外链显示`,\n ),\n )\n return\n }\n\n const finalUrl = await options.upload(file, (e) => {\n reportProgress?.({\n url: sourceUrl,\n phase: \"uploading\",\n progress: e.progress,\n })\n })\n if (!finalUrl) throw new Error(\"上传未返回 URL\")\n\n const hit = findNodeBySrc(editor, \"image\", sourceUrl)\n if (hit) {\n const tr = editor.state.tr.setNodeMarkup(hit.pos, undefined, {\n ...hit.attrs,\n src: finalUrl,\n })\n editor.view.dispatch(tr)\n }\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err)\n options.onError?.(\n new Error(`外链图片转存到 CDN 失败:${reason}(保留外链显示)`),\n )\n } finally {\n reportProgress?.({ url: sourceUrl, phase: \"done\", progress: 100 })\n }\n }\n\n /** 不再按 MIME 前缀过滤——支持所有文件类型,由 detectMediaKind 决定走哪个节点。 */\n const collectFiles = (\n list: FileList | DataTransferItemList | null,\n ): File[] => {\n if (!list) return []\n const files: File[] = []\n for (let i = 0; i < list.length; i++) {\n const entry = list[i] as File | DataTransferItem\n if (entry instanceof File) {\n files.push(entry)\n } else if (entry.kind === \"file\") {\n const f = entry.getAsFile()\n if (f) files.push(f)\n }\n }\n return files\n }\n\n return [\n new Plugin({\n key: PLUGIN_KEY,\n props: {\n handlePaste(view, event) {\n const clipboard = event.clipboardData\n if (!clipboard) return false\n\n const files = collectFiles(clipboard.items)\n if (files.length === 0) return false\n\n event.preventDefault()\n const pos = view.state.selection.from\n files.forEach((file) => runMediaUpload(editor, file, pos, options))\n return true\n },\n\n handleDrop(view, event, _slice, moved) {\n if (moved) return false\n const dt = event.dataTransfer\n if (!dt) return false\n\n const coords = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n const insertPos = coords ? coords.pos : view.state.selection.from\n\n const files = collectFiles(dt.files)\n if (files.length > 0) {\n event.preventDefault()\n files.forEach((file) =>\n runMediaUpload(editor, file, insertPos, options),\n )\n return true\n }\n\n const uri =\n dt.getData(\"text/uri-list\") || dt.getData(\"text/plain\") || \"\"\n const firstUrl = firstUriFromList(uri)\n if (firstUrl && looksLikeImageUrl(firstUrl)) {\n event.preventDefault()\n void rehostExternalUrl(firstUrl, insertPos)\n return true\n }\n\n return false\n },\n },\n }),\n ]\n },\n})\n\nexport default PasteDropMedia\n","import { useEffect, useLayoutEffect } from \"react\"\n\n/**\n * Custom hook that uses either `useLayoutEffect` or `useEffect` based on the environment (client-side or server-side).\n * @param {Function} effect - The effect function to be executed.\n * @param {Array<any>} [dependencies] - An array of dependencies for the effect (optional).\n */\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect\n","\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useEffect, useRef } from \"react\"\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\"\n\n// MediaQueryList Event based useEventListener interface\nfunction useEventListener<K extends keyof MediaQueryListEventMap>(\n eventName: K,\n handler: (event: MediaQueryListEventMap[K]) => void,\n element: RefObject<MediaQueryList>,\n options?: boolean | AddEventListenerOptions\n): void\n\n// Window Event based useEventListener interface\nfunction useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n element?: undefined,\n options?: boolean | AddEventListenerOptions\n): void\n\n// Element Event based useEventListener interface\nfunction useEventListener<\n K extends keyof HTMLElementEventMap & keyof SVGElementEventMap,\n T extends Element = K extends keyof HTMLElementEventMap\n ? HTMLDivElement\n : SVGElement,\n>(\n eventName: K,\n handler:\n | ((event: HTMLElementEventMap[K]) => void)\n | ((event: SVGElementEventMap[K]) => void),\n element: RefObject<T>,\n options?: boolean | AddEventListenerOptions\n): void\n\n// Document Event based useEventListener interface\nfunction useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n element: RefObject<Document>,\n options?: boolean | AddEventListenerOptions\n): void\n\n/**\n * Custom hook that attaches event listeners to DOM elements, the window, or media query lists.\n * @template KW - The type of event for window events.\n * @template KH - The type of event for HTML or SVG element events.\n * @template KM - The type of event for media query list events.\n * @template T - The type of the DOM element (default is `HTMLElement`).\n * @param {KW | KH | KM} eventName - The name of the event to listen for.\n * @param {(event: WindowEventMap[KW] | HTMLElementEventMap[KH] | SVGElementEventMap[KH] | MediaQueryListEventMap[KM] | Event) => void} handler - The event handler function.\n * @param {RefObject<T>} [element] - The DOM element or media query list to attach the event listener to (optional).\n * @param {boolean | AddEventListenerOptions} [options] - An options object that specifies characteristics about the event listener (optional).\n */\nfunction useEventListener<\n KW extends keyof WindowEventMap,\n KH extends keyof HTMLElementEventMap & keyof SVGElementEventMap,\n KM extends keyof MediaQueryListEventMap,\n T extends HTMLElement | SVGAElement | MediaQueryList = HTMLElement,\n>(\n eventName: KW | KH | KM,\n handler: (\n event:\n | WindowEventMap[KW]\n | HTMLElementEventMap[KH]\n | SVGElementEventMap[KH]\n | MediaQueryListEventMap[KM]\n | Event\n ) => void,\n element?: RefObject<T>,\n options?: boolean | AddEventListenerOptions\n) {\n // Create a ref that stores handler\n const savedHandler = useRef(handler)\n\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler\n }, [handler])\n\n useEffect(() => {\n // Define the listening target\n const targetElement: T | Window = element?.current ?? window\n\n if (!(targetElement && targetElement.addEventListener)) return\n\n // Create event listener that calls handler function stored in ref\n const listener: typeof handler = (event) => {\n savedHandler.current(event)\n }\n\n targetElement.addEventListener(eventName, listener, options)\n\n // Remove event listener on cleanup\n return () => {\n targetElement.removeEventListener(eventName, listener, options)\n }\n }, [eventName, element, options])\n}\n\nexport { useEventListener }\n\n/** Supported event types. */\ntype EventType =\n | \"mousedown\"\n | \"mouseup\"\n | \"touchstart\"\n | \"touchend\"\n | \"focusin\"\n | \"focusout\"\n\n/**\n * Custom hook that handles clicks outside a specified element.\n * @template T - The type of the element's reference.\n * @param {RefObject<T> | RefObject<T>[]} ref - The React ref object(s) representing the element(s) to watch for outside clicks.\n * @param {(event: MouseEvent | TouchEvent | FocusEvent) => void} handler - The callback function to be executed when a click outside the element occurs.\n * @param {EventType} [eventType] - The mouse event type to listen for (optional, default is 'mousedown').\n * @param {?AddEventListenerOptions} [eventListenerOptions] - The options object to be passed to the `addEventListener` method (optional).\n * @returns {void}\n */\nexport function useOnClickOutside<T extends HTMLElement | null = HTMLElement>(\n ref: RefObject<T> | RefObject<T>[],\n handler: (event: MouseEvent | TouchEvent | FocusEvent) => void,\n eventType: EventType = \"mousedown\",\n eventListenerOptions: AddEventListenerOptions = {}\n): void {\n useEventListener(\n eventType,\n (event) => {\n const target = event.target as Node\n\n // Do nothing if the target is not connected element with document\n if (!target || !target.isConnected) {\n return\n }\n\n const isOutside = Array.isArray(ref)\n ? ref\n .filter((r) => Boolean(r.current))\n .every((r) => r.current && !r.current.contains(target))\n : ref.current && !ref.current.contains(target)\n\n if (isOutside) {\n handler(event)\n }\n },\n undefined,\n eventListenerOptions\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 \"./separator.scss\"\nimport { cn } from \"../../../lib/tiptap-utils\"\n\nexport type Orientation = \"horizontal\" | \"vertical\"\n\nexport function Separator({\n decorative,\n orientation = \"vertical\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n orientation?: Orientation\n decorative?: boolean\n}) {\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 {...props}\n />\n )\n}\n","\"use client\"\n\nexport type SpacerOrientation = \"horizontal\" | \"vertical\"\n\nexport function Spacer({\n orientation = \"horizontal\",\n size,\n style = {},\n ...props\n}: React.ComponentProps<\"div\"> & {\n orientation?: SpacerOrientation\n size?: string | number\n}) {\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 { 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","\"use client\"\n\nimport 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 * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./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 type {\n AutoUpdateOptions,\n UseDismissProps,\n UseFloatingOptions,\n} from \"@floating-ui/react\"\nimport {\n autoUpdate,\n useDismiss,\n useFloating,\n useInteractions,\n useTransitionStyles,\n} from \"@floating-ui/react\"\nimport { useEffect, useMemo } from \"react\"\n\ninterface FloatingElementReturn {\n /**\n * Whether the floating element is currently mounted in the DOM.\n */\n isMounted: boolean\n /**\n * Ref function to attach to the floating element DOM node.\n */\n ref: (node: HTMLElement | null) => void\n /**\n * Combined styles for positioning, transitions, and z-index.\n */\n style: React.CSSProperties\n /**\n * Returns props that should be spread onto the floating element.\n */\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLElement>\n ) => Record<string, unknown>\n /**\n * Returns props that should be spread onto the reference element.\n */\n getReferenceProps: (\n userProps?: React.HTMLProps<Element>\n ) => Record<string, unknown>\n}\n\n/**\n * Custom hook for creating and managing floating elements relative to a reference position\n *\n * @param show - Boolean controlling visibility of the floating element\n * @param referencePos - DOMRect, function returning DOMRect, or null representing the position to anchor the floating element to\n * @param zIndex - Z-index value for the floating element\n * @param options - Additional options to pass to the underlying useFloating hook\n * @returns Object containing properties and methods to control the floating element\n */\nexport function useFloatingElement(\n show: boolean,\n reference: HTMLElement | DOMRect | (() => DOMRect | null) | null,\n zIndex: number,\n options?: Partial<UseFloatingOptions & { dismissOptions?: UseDismissProps }>,\n autoUpdateOptions?: AutoUpdateOptions\n): FloatingElementReturn {\n const { dismissOptions, ...floatingOptions } = options || {}\n\n const { refs, context, floatingStyles } = useFloating({\n open: show,\n whileElementsMounted(referenceEl, floatingEl, update) {\n const cleanup = autoUpdate(\n referenceEl,\n floatingEl,\n update,\n autoUpdateOptions\n )\n return cleanup\n },\n ...floatingOptions,\n })\n\n const { isMounted, styles } = useTransitionStyles(context)\n\n const dismiss = useDismiss(context, dismissOptions)\n\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss])\n\n useEffect(() => {\n if (reference === null) {\n refs.setReference(null)\n return\n }\n\n // If reference is an actual DOM element, use it directly\n // autoUpdate will automatically observe it for scroll/resize\n if (reference instanceof HTMLElement) {\n refs.setReference(reference)\n\n return\n }\n\n const getBoundingClientRect = () => {\n const rect = typeof reference === \"function\" ? reference() : reference\n return rect || new DOMRect()\n }\n\n refs.setReference({\n getBoundingClientRect,\n })\n }, [reference, refs])\n\n return useMemo(\n () => ({\n isMounted,\n ref: refs.setFloating,\n style: {\n ...styles,\n ...floatingStyles,\n zIndex,\n },\n getFloatingProps,\n getReferenceProps,\n }),\n [\n floatingStyles,\n isMounted,\n refs.setFloating,\n styles,\n zIndex,\n getFloatingProps,\n getReferenceProps,\n ]\n )\n}\n","import { NodeSelection, type Selection } from \"@tiptap/pm/state\"\nimport { CellSelection } from \"@tiptap/pm/tables\"\nimport type { JSONContent, Editor } from \"@tiptap/react\"\nimport { isTextSelection, isNodeSelection, posToDOMRect } from \"@tiptap/react\"\n\n\nconst NODE_TYPE_LABELS: Record<string, string> = {\n paragraph: \"Text\",\n heading: \"Heading\",\n blockquote: \"Blockquote\",\n listItem: \"List Item\",\n codeBlock: \"Code Block\",\n table: \"Table\",\n tocNode: \"Table of contents\",\n}\nexport type OverflowPosition = \"none\" | \"top\" | \"bottom\" | \"both\"\n\n/**\n * Utility function to get URL parameters\n */\nexport const getUrlParam = (param: string): string | null => {\n if (typeof window === \"undefined\") return null\n const params = new URLSearchParams(window.location.search)\n return params.get(param)\n}\n\n/**\n * Returns a display name for the current node in the editor\n * @param editor The Tiptap editor instance\n * @returns The display name of the current node\n */\nexport const getNodeDisplayName = (editor: Editor | null): string => {\n if (!editor) return \"Node\"\n\n const { selection } = editor.state\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node.type.name\n return NODE_TYPE_LABELS[nodeType] || nodeType.toLowerCase()\n }\n\n if (selection instanceof CellSelection) {\n return \"Table\"\n }\n\n const { $anchor } = selection\n const nodeType = $anchor.parent.type.name\n return NODE_TYPE_LABELS[nodeType] || nodeType.toLowerCase()\n}\n\n/**\n * Removes empty paragraph nodes from content\n */\nexport const removeEmptyParagraphs = (content: JSONContent) => ({\n ...content,\n content: content.content?.filter(\n (node) =>\n node.type !== \"paragraph\" ||\n node.content?.some((child) => child.text?.trim() || child.type !== \"text\")\n ),\n})\n\n/**\n * Determines how a target element overflows relative to a container element\n */\nexport function getElementOverflowPosition(\n targetElement: Element,\n containerElement: HTMLElement\n): OverflowPosition {\n const targetBounds = targetElement.getBoundingClientRect()\n const containerBounds = containerElement.getBoundingClientRect()\n\n const isOverflowingTop = targetBounds.top < containerBounds.top\n const isOverflowingBottom = targetBounds.bottom > containerBounds.bottom\n\n if (isOverflowingTop && isOverflowingBottom) return \"both\"\n if (isOverflowingTop) return \"top\"\n if (isOverflowingBottom) return \"bottom\"\n return \"none\"\n}\n\n/**\n * Checks if the current selection is valid for a given editor\n */\nexport const isSelectionValid = (\n editor: Editor | null,\n selection?: Selection,\n excludedNodeTypes: string[] = [\"imageUpload\", \"horizontalRule\"]\n): boolean => {\n if (!editor) return false\n if (!selection) selection = editor.state.selection\n\n const { state } = editor\n const { doc } = state\n const { empty, from, to } = selection\n\n const isEmptyTextBlock =\n !doc.textBetween(from, to).length && isTextSelection(selection)\n const isCodeBlock =\n selection.$from.parent.type.spec.code ||\n (isNodeSelection(selection) && selection.node.type.spec.code)\n const isExcludedNode =\n isNodeSelection(selection) &&\n excludedNodeTypes.includes(selection.node.type.name)\n const isTableCell = selection instanceof CellSelection\n\n return (\n !empty &&\n !isEmptyTextBlock &&\n !isCodeBlock &&\n !isExcludedNode &&\n !isTableCell\n )\n}\n\n/**\n * Checks if the current text selection is valid for editing\n * - Not empty\n * - Not a code block\n * - Not a node selection\n */\nexport const isTextSelectionValid = (editor: Editor | null): boolean => {\n if (!editor) return false\n const { state } = editor\n const { selection } = state\n const isValid =\n isTextSelection(selection) &&\n !selection.empty &&\n !selection.$from.parent.type.spec.code &&\n !isNodeSelection(selection)\n\n return isValid\n}\n\n/**\n * Gets the bounding rect of the current selection in the editor.\n */\nexport const getSelectionBoundingRect = (editor: Editor): DOMRect | null => {\n const { state } = editor.view\n const { selection } = state\n const { ranges } = selection\n\n const from = Math.min(...ranges.map((range) => range.$from.pos))\n const to = Math.max(...ranges.map((range) => range.$to.pos))\n\n if (isNodeSelection(selection)) {\n const node = editor.view.nodeDOM(from) as HTMLElement\n if (node) {\n return node.getBoundingClientRect()\n }\n }\n\n return posToDOMRect(editor.view, from, to)\n}\n\n/**\n * Generates a deterministic avatar URL from a user name\n */\nexport const getAvatar = (name: string) => {\n if (!name) {\n return \"/avatars/memoji_01.png\"\n }\n\n let hash = 0\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash)\n hash = hash & hash\n }\n\n const randomFraction = (Math.abs(hash) % 1000000) / 1000000\n const id = 1 + Math.floor(randomFraction * 20)\n const idString = id.toString().padStart(2, \"0\")\n return `/avatars/memoji_${idString}.png`\n}\n\n\n","/**\n * 程序触发原生文件选择器,返回选中的 File 数组。\n * 工具栏 / slash 菜单的\"插入媒体\"按钮共用,避免每个组件自己拼 input。\n *\n * 用户取消(按 ESC / 点关闭):现代浏览器派发 cancel 事件,老浏览器不发——\n * 没有 cancel 事件的浏览器会留一个隐藏 input 在 body,由 GC 兜底回收。\n */\nexport function pickFile(\n accept: string,\n multiple = false,\n): Promise<File[]> {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.accept = accept\n input.multiple = multiple\n input.style.position = \"fixed\"\n input.style.left = \"-9999px\"\n input.style.opacity = \"0\"\n\n const cleanup = () => {\n try {\n input.remove()\n } catch {\n // ignore\n }\n }\n\n input.addEventListener(\n \"change\",\n () => {\n const files = input.files ? Array.from(input.files) : []\n cleanup()\n resolve(files)\n },\n { once: true },\n )\n input.addEventListener(\n \"cancel\",\n () => {\n cleanup()\n resolve([])\n },\n { once: true },\n )\n\n document.body.appendChild(input)\n input.click()\n })\n}\n","import type { Editor } from \"@tiptap/react\"\nimport { useEditorState } from \"@tiptap/react\"\nimport {\n defaultUiState,\n type UiState,\n} from \"../components/tiptap-extension/ui-state-extension\"\n\nexport function useUiEditorState(editor: Editor | null): UiState {\n return (\n useEditorState({\n editor,\n selector: ({ editor }) => {\n if (!editor) return defaultUiState\n\n const state = editor.storage.uiState\n if (!state) {\n console.warn(\n \"Editor storage uiState is not initialized. Ensure you have the uiState extension added to your editor.\"\n )\n return defaultUiState\n }\n\n return { ...defaultUiState, ...state }\n },\n }) ?? defaultUiState\n )\n}\n\nexport default useUiEditorState\n","import { getAvatar } from \"../lib/tiptap-collab-utils\"\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\"\nimport { useEditorConfig } from \"./editor-config-context\"\n\nexport type User = {\n id: string\n name: string\n color: string\n avatar: string\n}\n\nexport type UserContextValue = {\n user: User\n}\n\nexport const UserContext = createContext<UserContextValue>({\n user: { color: \"\", id: \"\", name: \"\", avatar: \"\" },\n})\n\n/**\n * UserProvider:优先用 EditorConfigProvider 注入的 user,\n * 未注入时退化到 localStorage(生成随机用户名/颜色,仅用于本地开发或预览场景)。\n */\nexport function UserProvider({ children }: { children: React.ReactNode }) {\n const config = useEditorConfig()\n const injectedUser = config?.user\n\n const [fallbackUser] = useState<User>(() => ({\n color: getColorFromLocalStorage(),\n name: getUsernameFromLocalStorage(),\n id: getUserIdFromLocalStorage(),\n avatar: getAvatar(getUsernameFromLocalStorage()),\n }))\n\n const user = useMemo<User>(() => {\n if (injectedUser) {\n return {\n id: injectedUser.id,\n name: injectedUser.name,\n color: injectedUser.color,\n avatar: injectedUser.avatar ?? getAvatar(injectedUser.name),\n }\n }\n return fallbackUser\n }, [injectedUser, fallbackUser])\n\n useEffect(() => {\n if (injectedUser) return // 业务方注入时不写 localStorage\n window.localStorage.setItem(\"_tiptap_username\", user.name)\n window.localStorage.setItem(\"_tiptap_color\", user.color)\n window.localStorage.setItem(\"_tiptap_user_id\", user.id)\n }, [user, injectedUser])\n\n return (\n <UserContext.Provider value={{ user }}>{children}</UserContext.Provider>\n )\n}\n\nexport const useUser = () => useContext(UserContext)\n\nexport const FIRST_NAMES = [\n \"John\",\n \"Jane\",\n \"Alice\",\n \"Bob\",\n \"Eve\",\n \"Charlie\",\n \"David\",\n \"Frank\",\n \"Grace\",\n \"Helen\",\n \"Rob Lowe\",\n \"Rob\",\n]\n\nexport const LAST_NAMES = [\n \"Smith\",\n \"Johnson\",\n \"Williams\",\n \"Jones\",\n \"Brown\",\n \"Davis\",\n \"Miller\",\n \"Wilson\",\n \"Moore\",\n \"Taylor\",\n \"Anderson\",\n \"Thomas\",\n \"Lowe\",\n]\n\nexport const USER_COLORS = [\n \"#fb7185\",\n \"#fdba74\",\n \"#d9f99d\",\n \"#a7f3d0\",\n \"#a5f3fc\",\n \"#a5b4fc\",\n \"#f0abfc\",\n \"#fda58d\",\n \"#f2cc8f\",\n \"#9ae6b4\",\n]\n\nconst uuid = (): string => {\n const template = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n return template.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === \"x\" ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\nconst getRandomArrayItem = (array: string[]) => {\n if (array.length === 0) {\n throw new Error(\"Cannot get random item from empty array\")\n }\n return array[Math.floor(Math.random() * array.length)]!\n}\n\nconst generateRandomUsername = (): string => {\n const names = [getRandomArrayItem(FIRST_NAMES)]\n\n if (Math.random() > 0.85) {\n names.push(getRandomArrayItem(FIRST_NAMES))\n }\n names.push(getRandomArrayItem(LAST_NAMES))\n\n return names.join(\" \")\n}\n\nconst generateRandomColor = (): string => {\n return getRandomArrayItem(USER_COLORS) ?? \"#9ae6b4\"\n}\n\nconst getFromLocalStorage = (\n key: string,\n fallback: () => string,\n isServer: boolean = typeof window === \"undefined\"\n): string => {\n if (isServer) {\n return fallback()\n }\n const value = window.localStorage.getItem(key)\n return value !== null ? value : fallback()\n}\n\nconst getUsernameFromLocalStorage = (): string => {\n return getFromLocalStorage(\"_tiptap_username\", generateRandomUsername)\n}\n\nconst getColorFromLocalStorage = (): string => {\n return getFromLocalStorage(\"_tiptap_color\", generateRandomColor)\n}\n\nconst getUserIdFromLocalStorage = (): string => {\n return getFromLocalStorage(\"_tiptap_user_id\", () => uuid())\n}\n","\"use client\"\n\nimport { createContext, useContext, useEffect, useMemo, useState } from \"react\"\nimport { Doc as YDoc } from \"yjs\"\nimport { getUrlParam } from \"../lib/tiptap-collab-utils\"\nimport {\n useEditorConfig,\n type CollabProviderLike,\n} from \"./editor-config-context\"\n\nexport type CollabContextValue = {\n provider: CollabProviderLike | null\n ydoc: YDoc\n hasCollab: boolean\n setupError: boolean\n}\n\nexport const CollabContext = createContext<CollabContextValue>({\n hasCollab: false,\n provider: null,\n ydoc: new YDoc(),\n setupError: false,\n})\n\nexport const CollabConsumer = CollabContext.Consumer\nexport const useCollab = (): CollabContextValue => {\n const context = useContext(CollabContext)\n if (!context) {\n throw new Error(\"useCollab must be used within a CollabProvider\")\n }\n return context\n}\n\n/**\n * 协同钩子:从 EditorConfigProvider 注入的 config.collab 决定接入方式。\n *\n * 行为:\n * 1. `config.collab.provider` 存在 → 直接使用业务方传入的 provider(包不创建、不销毁)\n * 2. `config.collab.fetchToken` + `createProvider` → 包内调用工厂创建 provider,\n * 组件卸载时自动 `destroy()`\n * 3. URL `?noCollab=1` → 强制跳过协同(hasCollab=false,仅本地编辑)\n * 4. 业务方完全未配置 collab → hasCollab=false(本地编辑模式,不报错)\n * 5. 业务方部分配置但缺 fetchToken/createProvider → setupError\n */\nexport const useCollaboration = (room: string) => {\n const config = useEditorConfig()\n const collabConfig = config?.collab\n\n const externalProvider = collabConfig?.provider ?? null\n\n // 业务方是否提供了完整的 collab 配置\n const hasValidCollabConfig = Boolean(\n externalProvider ||\n (collabConfig?.fetchToken && collabConfig?.createProvider)\n )\n\n const [internalProvider, setInternalProvider] =\n useState<CollabProviderLike | null>(null)\n const [collabToken, setCollabToken] = useState<string | null>(null)\n const [hasCollab, setHasCollab] = useState<boolean>(hasValidCollabConfig)\n const [setupError, setSetupError] = useState<boolean>(false)\n const ydoc = useMemo(() => new YDoc(), [])\n\n useEffect(() => {\n const noCollabParam = getUrlParam(\"noCollab\")\n if (parseInt(noCollabParam || \"0\") === 1) {\n setHasCollab(false)\n }\n }, [])\n\n // 路径 1:业务方传入 provider,直接用,无需 fetch token / 创建\n // 路径 2:业务方提供 fetchToken + createProvider,包内调用\n useEffect(() => {\n if (!hasCollab) return\n if (externalProvider) return // 路径 1\n\n if (!collabConfig?.fetchToken || !collabConfig?.createProvider) {\n setSetupError(true)\n return\n }\n\n let cancelled = false\n collabConfig\n .fetchToken()\n .then((token) => {\n if (cancelled) return\n setCollabToken(token)\n if (!token) setSetupError(true)\n })\n .catch(() => {\n if (cancelled) return\n setSetupError(true)\n })\n return () => {\n cancelled = true\n }\n }, [hasCollab, externalProvider, collabConfig])\n\n useEffect(() => {\n if (!hasCollab) return\n if (externalProvider) return // 路径 1:不在包内创建\n if (!collabToken || !collabConfig?.createProvider) return\n\n const docPrefix = collabConfig.docPrefix ?? \"\"\n const documentName = room ? `${docPrefix}${room}` : docPrefix\n\n const newProvider = collabConfig.createProvider({\n name: documentName,\n token: collabToken,\n ydoc,\n })\n\n setInternalProvider(newProvider)\n\n return () => {\n newProvider.destroy()\n setInternalProvider(null)\n }\n }, [collabToken, ydoc, room, hasCollab, externalProvider, collabConfig])\n\n const provider = externalProvider ?? internalProvider\n\n return { provider, ydoc, hasCollab, setupError }\n}\n\nexport function CollabProvider({\n children,\n room,\n}: Readonly<{\n children: React.ReactNode\n room: string\n}>) {\n const { hasCollab, provider, ydoc, setupError } = useCollaboration(room)\n\n const value = useMemo<CollabContextValue>(\n () => ({\n hasCollab,\n provider,\n ydoc,\n setupError,\n }),\n [hasCollab, provider, ydoc, setupError]\n )\n\n return (\n <CollabContext.Provider value={value}>{children}</CollabContext.Provider>\n )\n}\n","\"use client\"\n\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport { CheckIcon } from \"../../tiptap-icons/check-icon\"\n\nimport \"./dropdown-menu.scss\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return (\n <DropdownMenuPrimitive.Root data-slot=\"tiptap-dropdown-menu\" {...props} />\n )\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal\n data-slot=\"tiptap-dropdown-menu-portal\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"tiptap-dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"tiptap-dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\"tiptap-dropdown-menu-content\", className)}\n onCloseAutoFocus={(e) => e.preventDefault()}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group\n data-slot=\"tiptap-dropdown-menu-group\"\n className={cn(\"tiptap-dropdown-menu-group\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"tiptap-dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\"tiptap-dropdown-menu-item\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"tiptap-dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\"tiptap-dropdown-menu-checkbox-item\", className)}\n checked={checked}\n {...props}\n >\n <span\n className=\"tiptap-dropdown-menu-item-indicator\"\n data-slot=\"tiptap-dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"tiptap-dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"tiptap-dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\"tiptap-dropdown-menu-radio-item\", className)}\n {...props}\n >\n <span\n className=\"tiptap-dropdown-menu-item-indicator\"\n data-slot=\"tiptap-dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"tiptap-dropdown-menu-label\"\n data-inset={inset}\n className={cn(\"tiptap-dropdown-menu-label\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"tiptap-dropdown-menu-separator\"\n className={cn(\"tiptap-dropdown-menu-separator\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tiptap-dropdown-menu-shortcut\"\n className={cn(\"tiptap-dropdown-menu-shortcut\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return (\n <DropdownMenuPrimitive.Sub\n data-slot=\"tiptap-dropdown-menu-sub\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"tiptap-dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\"tiptap-dropdown-menu-sub-trigger\", className)}\n {...props}\n >\n {children}\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"tiptap-dropdown-menu-sub-content\"\n className={cn(\"tiptap-dropdown-menu-sub-content\", className)}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import { useRef, useEffect } from \"react\"\n\n/**\n * Hook that executes a callback when the component unmounts.\n *\n * @param callback Function to be called on component unmount\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useUnmount = (callback: (...args: Array<any>) => any) => {\n const ref = useRef(callback)\n ref.current = callback\n\n useEffect(\n () => () => {\n ref.current()\n },\n []\n )\n}\n\nexport default useUnmount\n","import throttle from \"lodash.throttle\"\n\nimport { useUnmount } from \"./use-unmount\"\nimport { useMemo } from \"react\"\n\ninterface ThrottleSettings {\n leading?: boolean | undefined\n trailing?: boolean | undefined\n}\n\nconst defaultOptions: ThrottleSettings = {\n leading: false,\n trailing: true,\n}\n\n/**\n * A hook that returns a throttled callback function.\n *\n * @param fn The function to throttle\n * @param wait The time in ms to wait before calling the function\n * @param dependencies The dependencies to watch for changes\n * @param options The throttle options\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useThrottledCallback<T extends (...args: any[]) => any>(\n fn: T,\n wait = 250,\n dependencies: React.DependencyList = [],\n options: ThrottleSettings = defaultOptions\n): {\n (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n flush: () => void\n} {\n const handler = useMemo(\n () => throttle<T>(fn, wait, options),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n )\n\n useUnmount(() => {\n handler.cancel()\n })\n\n return handler\n}\n\nexport default useThrottledCallback\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useThrottledCallback } from \"./use-throttled-callback\"\n\nexport interface WindowSizeState {\n /**\n * The width of the window's visual viewport in pixels.\n */\n width: number\n /**\n * The height of the window's visual viewport in pixels.\n */\n height: number\n /**\n * The distance from the top of the visual viewport to the top of the layout viewport.\n * Particularly useful for handling mobile keyboard appearance.\n */\n offsetTop: number\n /**\n * The distance from the left of the visual viewport to the left of the layout viewport.\n */\n offsetLeft: number\n /**\n * The scale factor of the visual viewport.\n * This is useful for scaling elements based on the current zoom level.\n */\n scale: number\n}\n\n/**\n * Hook that tracks the window's visual viewport dimensions, position, and provides\n * a CSS transform for positioning elements.\n *\n * Uses the Visual Viewport API to get accurate measurements, especially important\n * for mobile devices where virtual keyboards can change the visible area.\n * Only updates state when values actually change to optimize performance.\n *\n * @returns An object containing viewport properties and a CSS transform string\n */\nexport function useWindowSize(): WindowSizeState {\n const [windowSize, setWindowSize] = useState<WindowSizeState>({\n width: 0,\n height: 0,\n offsetTop: 0,\n offsetLeft: 0,\n scale: 0,\n })\n\n const handleViewportChange = useThrottledCallback(() => {\n if (typeof window === \"undefined\") return\n\n const vp = window.visualViewport\n if (!vp) return\n\n const {\n width = 0,\n height = 0,\n offsetTop = 0,\n offsetLeft = 0,\n scale = 0,\n } = vp\n\n setWindowSize((prevState) => {\n if (\n width === prevState.width &&\n height === prevState.height &&\n offsetTop === prevState.offsetTop &&\n offsetLeft === prevState.offsetLeft &&\n scale === prevState.scale\n ) {\n return prevState\n }\n\n return { width, height, offsetTop, offsetLeft, scale }\n })\n }, 200)\n\n useEffect(() => {\n const visualViewport = window.visualViewport\n if (!visualViewport) return\n\n visualViewport.addEventListener(\"resize\", handleViewportChange)\n\n handleViewportChange()\n\n return () => {\n visualViewport.removeEventListener(\"resize\", handleViewportChange)\n }\n }, [handleViewportChange])\n\n return windowSize\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const VideoIcon = 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=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"m22 8-6 4 6 4V8Z\" />\n <rect width=\"14\" height=\"12\" x=\"2\" y=\"6\" rx=\"2\" ry=\"2\" />\n </svg>\n )\n})\n\nVideoIcon.displayName = \"VideoIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AudioIcon = 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=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n )\n})\n\nAudioIcon.displayName = \"AudioIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const FileIcon = 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=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\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\nFileIcon.displayName = \"FileIcon\"\n","import { forwardRef, useCallback, useState } from \"react\"\n\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { isExtensionAvailable, isNodeInSchema } from \"../../../lib/tiptap-utils\"\nimport { pickFile } from \"../../../lib/file-picker\"\n\nimport { VideoIcon } from \"../../tiptap-icons/video-icon\"\nimport { AudioIcon } from \"../../tiptap-icons/audio-icon\"\nimport { FileIcon } from \"../../tiptap-icons/file-icon\"\n\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\n\nimport type { Editor } from \"@tiptap/react\"\n\nexport type MediaKindForButton = \"video\" | \"audio\" | \"file\"\n\nconst META: Record<\n MediaKindForButton,\n { label: string; accept: string; nodeName: string; Icon: React.ComponentType<React.SVGProps<SVGSVGElement>> }\n> = {\n video: { label: \"添加视频\", accept: \"video/*\", nodeName: \"video\", Icon: VideoIcon },\n audio: { label: \"添加音频\", accept: \"audio/*\", nodeName: \"audio\", Icon: AudioIcon },\n file: { label: \"添加文件\", accept: \"*/*\", nodeName: \"fileAttachment\", Icon: FileIcon },\n}\n\nexport interface MediaUploadButtonProps extends Omit<ButtonProps, \"type\"> {\n /** 决定 accept / icon / 目标节点 / aria-label */\n kind: MediaKindForButton\n /** 编辑器实例;不传则走 useTiptapEditor 默认(EditorContext) */\n editor?: Editor | null\n /** 按钮文本,不传只显示图标 */\n text?: string\n /** 节点不在 schema 时是否隐藏(默认 false:始终显示但 disabled) */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * 工具栏 / 自定义 UI 用的\"上传媒体\"按钮。点击后打开原生文件选择器,\n * 选中的 File 通过 `editor.commands.uploadMediaFile(file)` 走 PasteDropMedia 的\n * 完整流程(size 校验 / 乐观插入 / message.error)。\n *\n * 注意:依赖 PasteDropMedia 扩展和对应目标节点(video / audio / fileAttachment)。\n */\nexport const MediaUploadButton = forwardRef<HTMLButtonElement, MediaUploadButtonProps>(\n (\n { kind, editor: providedEditor, text, hideWhenUnavailable = false, onClick, children, ...buttonProps },\n ref,\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const meta = META[kind]\n const [pending, setPending] = useState(false)\n\n const isAvailable =\n !!editor &&\n editor.isEditable &&\n isExtensionAvailable(editor, [\"pasteDropMedia\"]) &&\n isNodeInSchema(meta.nodeName, editor)\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n if (!editor || !isAvailable || pending) return\n try {\n setPending(true)\n const files = await pickFile(meta.accept, false)\n if (files.length === 0) return\n editor.chain().focus().run()\n editor.commands.uploadMediaFile(files[0])\n } finally {\n setPending(false)\n }\n },\n [editor, isAvailable, meta.accept, onClick, pending],\n )\n\n if (hideWhenUnavailable && !isAvailable) return null\n\n const Icon = meta.Icon\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n disabled={!isAvailable || pending}\n data-disabled={!isAvailable || pending}\n aria-label={meta.label}\n tooltip={meta.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 </>\n )}\n </Button>\n )\n },\n)\n\nMediaUploadButton.displayName = \"MediaUploadButton\"\n","\"use client\"\n\nimport { forwardRef, useCallback, useEffect, useRef, useState } from \"react\"\nimport { Separator } from \"../separator\"\nimport \"./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","import { useCallback, useEffect, useState } from \"react\"\nimport { useThrottledCallback } from \"./use-throttled-callback\"\n\nexport type RectState = Omit<DOMRect, \"toJSON\">\n\nexport interface ElementRectOptions {\n /**\n * The element to track. Can be an Element, ref, or selector string.\n * Defaults to document.body if not provided.\n */\n element?: Element | React.RefObject<Element> | string | null\n /**\n * Whether to enable rect tracking\n */\n enabled?: boolean\n /**\n * Throttle delay in milliseconds for rect updates\n */\n throttleMs?: number\n /**\n * Whether to use ResizeObserver for more accurate tracking\n */\n useResizeObserver?: boolean\n}\n\nconst initialRect: RectState = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n}\n\nconst isSSR = typeof window === \"undefined\"\nconst hasResizeObserver = !isSSR && typeof ResizeObserver !== \"undefined\"\n\n/**\n * Helper function to check if code is running on client side\n */\nconst isClientSide = (): boolean => !isSSR\n\n/**\n * Custom hook that tracks an element's bounding rectangle and updates on resize, scroll, etc.\n *\n * @param options Configuration options for element rect tracking\n * @returns The current bounding rectangle of the element\n */\nexport function useElementRect({\n element,\n enabled = true,\n throttleMs = 100,\n useResizeObserver = true,\n}: ElementRectOptions = {}): RectState {\n const [rect, setRect] = useState<RectState>(initialRect)\n\n const getTargetElement = useCallback((): Element | null => {\n if (!enabled || !isClientSide()) return null\n\n if (!element) {\n return document.body\n }\n\n if (typeof element === \"string\") {\n return document.querySelector(element)\n }\n\n if (\"current\" in element) {\n return element.current\n }\n\n return element\n }, [element, enabled])\n\n const updateRect = useThrottledCallback(\n () => {\n if (!enabled || !isClientSide()) return\n\n const targetElement = getTargetElement()\n if (!targetElement) {\n setRect(initialRect)\n return\n }\n\n const newRect = targetElement.getBoundingClientRect()\n setRect({\n x: newRect.x,\n y: newRect.y,\n width: newRect.width,\n height: newRect.height,\n top: newRect.top,\n right: newRect.right,\n bottom: newRect.bottom,\n left: newRect.left,\n })\n },\n throttleMs,\n [enabled, getTargetElement],\n { leading: true, trailing: true }\n )\n\n useEffect(() => {\n if (!enabled || !isClientSide()) {\n setRect(initialRect)\n return\n }\n\n const targetElement = getTargetElement()\n if (!targetElement) return\n\n updateRect()\n\n const cleanup: (() => void)[] = []\n\n if (useResizeObserver && hasResizeObserver) {\n const resizeObserver = new ResizeObserver(() => {\n window.requestAnimationFrame(updateRect)\n })\n resizeObserver.observe(targetElement)\n cleanup.push(() => resizeObserver.disconnect())\n }\n\n const handleUpdate = () => updateRect()\n\n window.addEventListener(\"scroll\", handleUpdate, true)\n window.addEventListener(\"resize\", handleUpdate, true)\n\n cleanup.push(() => {\n window.removeEventListener(\"scroll\", handleUpdate)\n window.removeEventListener(\"resize\", handleUpdate)\n })\n\n return () => {\n cleanup.forEach((fn) => fn())\n setRect(initialRect)\n }\n }, [enabled, getTargetElement, updateRect, useResizeObserver])\n\n return rect\n}\n\n/**\n * Convenience hook for tracking document.body rect\n */\nexport function useBodyRect(\n options: Omit<ElementRectOptions, \"element\"> = {}\n): RectState {\n return useElementRect({\n ...options,\n element: isClientSide() ? document.body : null,\n })\n}\n\n/**\n * Convenience hook for tracking a ref element's rect\n */\nexport function useRefRect<T extends Element>(\n ref: React.RefObject<T>,\n options: Omit<ElementRectOptions, \"element\"> = {}\n): RectState {\n return useElementRect({ ...options, element: ref })\n}\n","import type { Editor } from \"@tiptap/react\"\nimport { useWindowSize } from \"./use-window-size\"\nimport { useBodyRect } from \"./use-element-rect\"\nimport { useEffect } from \"react\"\n\nexport interface CursorVisibilityOptions {\n /**\n * The Tiptap editor instance\n */\n editor?: Editor | null\n /**\n * Reference to the toolbar element that may obscure the cursor\n */\n overlayHeight?: number\n}\n\n/**\n * Custom hook that ensures the cursor remains visible when typing in a Tiptap editor.\n * Automatically scrolls the window when the cursor would be hidden by the toolbar.\n *\n * @param options.editor The Tiptap editor instance\n * @param options.overlayHeight Toolbar height to account for\n * @returns The bounding rect of the body\n */\nexport function useCursorVisibility({\n editor,\n overlayHeight = 0,\n}: CursorVisibilityOptions) {\n const { height: windowHeight } = useWindowSize()\n const rect = useBodyRect({\n enabled: true,\n throttleMs: 100,\n useResizeObserver: true,\n })\n\n useEffect(() => {\n const ensureCursorVisibility = () => {\n if (!editor) return\n\n const { state, view } = editor\n if (!view.hasFocus()) return\n\n // Get current cursor position coordinates\n const { from } = state.selection\n const cursorCoords = view.coordsAtPos(from)\n\n if (windowHeight < rect.height && cursorCoords) {\n const availableSpace = windowHeight - cursorCoords.top\n\n // If the cursor is hidden behind the overlay or offscreen, scroll it into view\n if (availableSpace < overlayHeight) {\n const targetCursorY = Math.max(windowHeight / 2, overlayHeight)\n const currentScrollY = window.scrollY\n const cursorAbsoluteY = cursorCoords.top + currentScrollY\n const newScrollY = cursorAbsoluteY - targetCursorY\n\n window.scrollTo({\n top: Math.max(0, newScrollY),\n behavior: \"smooth\",\n })\n }\n }\n }\n\n ensureCursorVisibility()\n }, [editor, overlayHeight, windowHeight, rect.height])\n\n return rect\n}\n","import type { Editor } from \"@tiptap/react\"\n\nexport const isElementWithinEditor = (\n editor: Editor | null,\n element: Node | null\n) => {\n if (!element || !editor) {\n return false\n }\n\n const editorWrapper = editor.view.dom.parentElement\n const editorDom = editor.view.dom\n\n if (!editorWrapper) {\n return false\n }\n\n return (\n editorWrapper === element ||\n editorDom === element ||\n editorWrapper.contains(element)\n )\n}\n\nexport const isElementWithinExternalPortal = (\n element: Node | null\n): boolean => {\n if (!(element instanceof HTMLElement)) return false\n return (\n element.closest(\n [\"[data-radix-popper-content-wrapper]\", \"[data-base-ui-portal]\"].join(\",\")\n ) !== null\n )\n}\n","\"use client\"\n\nimport type { HTMLAttributes } from \"react\"\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport {\n flip,\n offset,\n shift,\n useMergeRefs,\n type UseFloatingOptions,\n} from \"@floating-ui/react\"\nimport { Selection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useFloatingElement } from \"../../../hooks/use-floating-element\"\n\n// --- Lib ---\nimport {\n getSelectionBoundingRect,\n isSelectionValid,\n} from \"../../../lib/tiptap-collab-utils\"\n\nimport {\n isElementWithinEditor,\n isElementWithinExternalPortal,\n} from \".\"\nimport { isValidPosition } from \"../../../lib/tiptap-utils\"\n\nexport interface FloatingElementProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The Tiptap editor instance to attach to.\n */\n editor?: Editor | null\n /**\n * Controls whether the floating element should be visible.\n * @default undefined\n */\n shouldShow?: boolean\n /**\n * Additional options to pass to the floating UI.\n */\n floatingOptions?: Partial<UseFloatingOptions>\n /**\n * Z-index for the floating element.\n * @default 50\n */\n zIndex?: number\n /**\n * Callback fired when the visibility state changes.\n */\n onOpenChange?: (open: boolean) => void\n /**\n * Reference element to position the floating element relative to.\n * If provided, this takes precedence over getBoundingClientRect.\n */\n referenceElement?: HTMLElement | null\n /**\n * Custom function to determine the position of the floating element.\n * Only used if referenceElement is not provided.\n * @default getSelectionBoundingRect\n */\n getBoundingClientRect?: (editor: Editor) => DOMRect | null\n /**\n * Whether to close the floating element when Escape key is pressed.\n * @default true\n */\n closeOnEscape?: boolean\n /**\n * Whether to reset the text selection when the floating element is closed or clicked outside the editor.\n * @default true\n */\n resetTextSelectionOnClose?: boolean\n}\n\n/**\n * A floating UI element that positions itself relative to the current selection in a Tiptap editor.\n * Used for floating toolbars, menus, and other UI elements that need to appear near the text cursor.\n */\nexport const FloatingElement = forwardRef<HTMLDivElement, FloatingElementProps>(\n (\n {\n editor: providedEditor,\n shouldShow = undefined,\n floatingOptions,\n zIndex = 50,\n onOpenChange,\n referenceElement,\n getBoundingClientRect = getSelectionBoundingRect,\n closeOnEscape = true,\n resetTextSelectionOnClose = true,\n children,\n style: propStyle,\n ...props\n },\n forwardedRef\n ) => {\n const [open, setOpen] = useState<boolean>(\n shouldShow !== undefined ? shouldShow : false\n )\n\n const floatingElementRef = useRef<HTMLDivElement | null>(null)\n const preventHideRef = useRef(false)\n const preventShowRef = useRef(false)\n const editorRef = useRef<Editor | null>(null)\n const getBoundingClientRectRef = useRef(getBoundingClientRect)\n\n const { editor } = useTiptapEditor(providedEditor)\n\n // Keep refs up to date\n useEffect(() => {\n editorRef.current = editor\n getBoundingClientRectRef.current = getBoundingClientRect\n }, [editor, getBoundingClientRect])\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n onOpenChange?.(newOpen)\n setOpen(newOpen)\n },\n [onOpenChange]\n )\n\n const handleFloatingOpenChange = (open: boolean) => {\n if (!open && editor && resetTextSelectionOnClose) {\n // When the floating element closes, reset the selection.\n // This lets the user place the cursor again and ensures the drag handle reappears,\n // as it's intentionally hidden during valid text selections.\n const tr = editor.state.tr.setSelection(\n Selection.near(editor.state.doc.resolve(0))\n )\n editor.view.dispatch(tr)\n }\n\n handleOpenChange(open)\n }\n\n // Use referenceElement if provided, otherwise create dynamic rect function\n const reference = useMemo(() => {\n if (referenceElement) {\n return referenceElement\n }\n\n return () => {\n if (!editorRef.current) return null\n return getBoundingClientRectRef.current(editorRef.current)\n }\n }, [referenceElement])\n\n const { isMounted, ref, style, getFloatingProps } = useFloatingElement(\n open,\n reference,\n zIndex,\n {\n placement: \"top\",\n middleware: [shift(), flip(), offset(4)],\n onOpenChange: handleFloatingOpenChange,\n dismissOptions: {\n enabled: true,\n escapeKey: true,\n outsidePress(event) {\n const relatedTarget = event.target as Node\n if (!relatedTarget) return false\n\n // Don't close if clicking inside a portaled UI\n if (isElementWithinExternalPortal(relatedTarget)) return false\n\n return !isElementWithinEditor(editor, relatedTarget)\n },\n },\n ...floatingOptions,\n }\n )\n\n const updateSelectionState = useCallback(() => {\n if (!editor) return\n\n const newRect = getBoundingClientRect(editor)\n\n if (newRect && shouldShow !== undefined && !preventShowRef.current) {\n handleOpenChange(shouldShow)\n return\n }\n\n const shouldShowResult = isSelectionValid(editor)\n\n if (\n newRect &&\n !preventShowRef.current &&\n (shouldShowResult || preventHideRef.current)\n ) {\n handleOpenChange(true)\n } else if (\n !preventHideRef.current &&\n (!shouldShowResult || preventShowRef.current || !editor.isEditable)\n ) {\n handleOpenChange(false)\n }\n }, [editor, getBoundingClientRect, handleOpenChange, shouldShow])\n\n useEffect(() => {\n if (!editor || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n handleOpenChange(false)\n return true\n }\n return false\n }\n\n editor.view.dom.addEventListener(\"keydown\", handleKeyDown)\n return () => {\n editor.view.dom.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [editor, open, closeOnEscape, handleOpenChange])\n\n useEffect(() => {\n if (!editor) return\n\n const handleBlur = (event: FocusEvent) => {\n if (preventHideRef.current) {\n preventHideRef.current = false\n return\n }\n\n const relatedTarget = event.relatedTarget as Node\n if (!relatedTarget) return\n\n const isWithinEditor = isElementWithinEditor(editor, relatedTarget)\n\n const floatingElement = floatingElementRef.current\n const isWithinFloatingElement =\n floatingElement &&\n (floatingElement === relatedTarget ||\n floatingElement.contains(relatedTarget))\n\n // Don't close if focus moved to a portaled UI\n const isWithinExternalPortal =\n isElementWithinExternalPortal(relatedTarget)\n\n if (\n !isWithinEditor &&\n !isWithinFloatingElement &&\n !isWithinExternalPortal &&\n open\n ) {\n handleOpenChange(false)\n }\n }\n\n editor.view.dom.addEventListener(\"blur\", handleBlur)\n return () => {\n editor.view.dom.removeEventListener(\"blur\", handleBlur)\n }\n }, [editor, handleOpenChange, open])\n\n useEffect(() => {\n if (!editor) return\n\n const handleDrag = () => {\n if (open) {\n handleOpenChange(false)\n }\n }\n\n editor.view.dom.addEventListener(\"dragstart\", handleDrag)\n editor.view.dom.addEventListener(\"dragover\", handleDrag)\n\n return () => {\n editor.view.dom.removeEventListener(\"dragstart\", handleDrag)\n editor.view.dom.removeEventListener(\"dragover\", handleDrag)\n }\n }, [editor, open, handleOpenChange])\n\n useEffect(() => {\n if (!editor) return\n\n const handleMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) return\n\n preventShowRef.current = true\n\n const { state, view } = editor\n const posCoords = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!posCoords || !isValidPosition(posCoords.pos)) return\n\n const $pos = state.doc.resolve(posCoords.pos)\n const nodeBefore = $pos.nodeBefore\n\n if (!nodeBefore || nodeBefore.isBlock) return\n\n const tr = state.tr.setSelection(\n Selection.near(state.doc.resolve(posCoords.pos))\n )\n view.dispatch(tr)\n }\n\n const handleMouseUp = () => {\n if (preventShowRef.current) {\n preventShowRef.current = false\n updateSelectionState()\n }\n }\n\n editor.view.dom.addEventListener(\"mousedown\", handleMouseDown)\n editor.view.root.addEventListener(\"mouseup\", handleMouseUp)\n\n return () => {\n editor.view.dom.removeEventListener(\"mousedown\", handleMouseDown)\n editor.view.root.removeEventListener(\"mouseup\", handleMouseUp)\n }\n }, [editor, updateSelectionState])\n\n useEffect(() => {\n if (!editor) return\n\n editor.on(\"selectionUpdate\", updateSelectionState)\n\n return () => {\n editor.off(\"selectionUpdate\", updateSelectionState)\n }\n }, [editor, updateSelectionState])\n\n useEffect(() => {\n if (!editor) return\n updateSelectionState()\n }, [editor, updateSelectionState])\n\n const finalStyle = useMemo(\n () =>\n propStyle && Object.keys(propStyle).length > 0 ? propStyle : style,\n [propStyle, style]\n )\n const mergedRef = useMergeRefs([ref, forwardedRef, floatingElementRef])\n\n if (!editor || !isMounted || !open) return null\n\n return (\n <div\n ref={mergedRef}\n style={finalStyle}\n {...props}\n {...getFloatingProps()}\n >\n {children}\n </div>\n )\n }\n)\n\nFloatingElement.displayName = \"FloatingElement\"\n","\"use client\"\n\nimport { useCallback, useEffect, useRef } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { getEditorExtension } from \"../../../lib/tiptap-advanced-utils\"\nimport { selectNodeAndHideFloating } from \"../../../hooks/use-floating-toolbar-visibility\"\n\nexport interface UseScrollToHashConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Callback called when the target node is found.\n * @param nodeId The ID of the found node\n */\n onTargetFound?: (nodeId: string) => void\n /**\n * Callback called when the target node is not found.\n * @param hash The hash that was attempted to be scrolled to\n */\n onTargetNotFound?: (hash: string) => void\n}\n\n/**\n * Hook to scroll to a specific hash in the Tiptap editor.\n * It finds the node with the given ID and scrolls it into view.\n *\n * @param config Configuration for the scroll behavior\n * @returns Function to scroll to a specific hash\n */\nexport function useScrollToHash(config: UseScrollToHashConfig = {}) {\n const {\n editor: providedEditor,\n onTargetFound = () => {},\n onTargetNotFound = () => {},\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const lastProcessedHashRef = useRef<string | null>(null)\n\n const onTargetFoundRef = useRef(onTargetFound)\n const onTargetNotFoundRef = useRef(onTargetNotFound)\n onTargetFoundRef.current = onTargetFound\n onTargetNotFoundRef.current = onTargetNotFound\n\n const scrollToNode = useCallback(\n (id: string): boolean => {\n if (!editor) return false\n\n const attributeName =\n getEditorExtension(editor, \"uniqueID\")?.options?.attributeName ??\n \"data-id\"\n let position: number | null = null\n\n editor.state.doc.descendants((node, pos) => {\n if (node.attrs?.[attributeName] === id) {\n position = pos\n return false\n }\n return true\n })\n\n if (position === null) return false\n\n selectNodeAndHideFloating(editor, position)\n\n setTimeout(() => {\n const dom = editor.view.nodeDOM(position!) as HTMLElement | null\n\n if (dom) {\n dom.scrollIntoView({ behavior: \"smooth\", block: \"center\" })\n }\n }, 0)\n\n return true\n },\n [editor]\n )\n\n const handleScroll = useCallback(\n (delay = 0) => {\n const hash = window.location.hash?.substring(1)\n if (!hash) return\n\n // Skip if we already scrolled to this exact hash\n if (hash === lastProcessedHashRef.current) return\n\n setTimeout(() => {\n if (scrollToNode(hash)) {\n lastProcessedHashRef.current = hash\n onTargetFoundRef.current(hash)\n } else {\n onTargetNotFoundRef.current(hash)\n }\n }, delay)\n },\n [scrollToNode]\n )\n\n useEffect(() => {\n if (!editor) return\n\n // Handle collaboration sync or immediate scroll\n const provider = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"collaborationCaret\"\n )?.options?.provider\n\n if (provider?.on) {\n const syncHandler = () => handleScroll(500)\n provider.on(\"synced\", syncHandler)\n\n return () => {\n provider.off?.(\"synced\", syncHandler)\n }\n } else {\n handleScroll(500)\n }\n }, [editor, handleScroll])\n\n useEffect(() => {\n const immediateScroll = () => handleScroll()\n const delayedScroll = () => handleScroll(500)\n\n window.addEventListener(\"hashchange\", immediateScroll)\n window.addEventListener(\"pageshow\", delayedScroll)\n window.addEventListener(\"popstate\", immediateScroll)\n\n return () => {\n window.removeEventListener(\"hashchange\", immediateScroll)\n window.removeEventListener(\"pageshow\", delayedScroll)\n window.removeEventListener(\"popstate\", immediateScroll)\n }\n }, [handleScroll])\n\n return { scrollToHash: scrollToNode }\n}\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 { useCallback, useEffect, useRef, useState } from \"react\"\nimport type { Editor, NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper, NodeViewContent } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\n\nimport { isValidPosition } from \"../../../lib/tiptap-utils\"\n\nimport \"./image-node-view.scss\"\n\nexport interface ResizeParams {\n handleUsed: \"left\" | \"right\"\n initialWidth: number\n initialClientX: number\n}\n\nexport interface ResizableImageProps extends React.HTMLAttributes<HTMLDivElement> {\n src: string\n alt?: string\n editor?: Editor\n minWidth?: number\n maxWidth?: number\n align?: \"left\" | \"center\" | \"right\"\n initialWidth?: number\n showCaption?: boolean\n hasContent?: boolean\n onImageResize?: (width?: number) => void\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onUpdateAttributes?: (attrs: Record<string, any>) => void\n getPos: () => number | undefined\n nodeSize?: number\n}\n\nexport function ImageNodeView(props: NodeViewProps) {\n const { editor, node, updateAttributes, getPos } = props\n const hasContent = node.content.size > 0\n\n return (\n <ResizableImage\n src={node.attrs.src}\n alt={node.attrs.alt || \"\"}\n editor={editor}\n align={node.attrs[\"data-align\"]}\n initialWidth={node.attrs.width}\n showCaption={node.attrs.showCaption}\n hasContent={hasContent}\n nodeSize={node.nodeSize}\n onImageResize={(width) => updateAttributes({ width })}\n onUpdateAttributes={updateAttributes}\n getPos={getPos}\n />\n )\n}\n\nexport const ResizableImage: React.FC<ResizableImageProps> = ({\n src,\n alt = \"\",\n editor,\n minWidth = 96,\n maxWidth = 800,\n align = \"left\",\n initialWidth,\n showCaption = false,\n hasContent = false,\n nodeSize,\n onImageResize,\n onUpdateAttributes,\n getPos,\n}) => {\n const [resizeParams, setResizeParams] = useState<ResizeParams | undefined>()\n const [width, setWidth] = useState<number | undefined>(initialWidth)\n const [showHandles, setShowHandles] = useState(false)\n const isResizingRef = useRef(false)\n const isMountedRef = useRef(true)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const leftResizeHandleRef = useRef<HTMLDivElement>(null)\n const rightResizeHandleRef = useRef<HTMLDivElement>(null)\n const imageRef = useRef<HTMLImageElement>(null)\n\n // Listen to editor selection changes to detect when focus leaves the caption\n useEffect(() => {\n if (!editor || !showCaption) return\n\n const handleSelectionUpdate = () => {\n const pos = getPos()\n if (!isValidPosition(pos) || !nodeSize) return\n\n const { from, to } = editor.state.selection\n const nodeStart = pos\n const nodeEnd = pos + nodeSize\n\n // Check if selection is outside this image node\n const isOutsideNode = to < nodeStart || from > nodeEnd\n\n if (isOutsideNode && !hasContent && onUpdateAttributes) {\n onUpdateAttributes({ showCaption: false })\n }\n }\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, showCaption, hasContent, getPos, nodeSize, onUpdateAttributes])\n\n // Had to manually set the node selection on image click because\n // We treat the image-node-extension.ts as content: \"inline*\"\n const handleImageClick = useCallback(\n (event: React.MouseEvent) => {\n if (!editor || !getPos || resizeParams) return\n\n // 只读模式:不拦截点击,放行原生冒泡,交给宿主页面处理(如文章页 #pageContent\n // 的图片预览委托 e.target.nodeName==='IMG' → 打开 antd Image 预览)。\n if (!editor.isEditable) return\n\n event.preventDefault()\n event.stopPropagation()\n\n const pos = getPos()\n if (isValidPosition(pos)) {\n editor.chain().focus().setNodeSelection(pos).run()\n }\n },\n [editor, getPos, resizeParams]\n )\n\n const windowMouseMoveHandler = useCallback(\n (event: MouseEvent | TouchEvent): void => {\n if (!resizeParams || !editor || !isMountedRef.current) return\n\n const clientX =\n \"touches\" in event ? (event.touches[0]?.clientX ?? 0) : event.clientX\n const isLeftHandle = resizeParams.handleUsed === \"left\"\n const multiplier = align === \"center\" ? 2 : 1\n\n const delta = isLeftHandle\n ? (resizeParams.initialClientX - clientX) * multiplier\n : (clientX - resizeParams.initialClientX) * multiplier\n\n const newWidth = resizeParams.initialWidth + delta\n const effectiveMaxWidth =\n editor.view.dom?.firstElementChild?.clientWidth || maxWidth\n const clampedWidth = Math.min(\n Math.max(newWidth, minWidth),\n effectiveMaxWidth\n )\n\n setWidth(clampedWidth)\n if (wrapperRef.current) {\n wrapperRef.current.style.width = `${clampedWidth}px`\n }\n },\n [editor, align, maxWidth, minWidth, resizeParams]\n )\n\n const windowMouseUpHandler = useCallback(\n (event: MouseEvent | TouchEvent): void => {\n if (!editor || !isMountedRef.current) return\n\n const target =\n \"touches\" in event\n ? document.elementFromPoint(\n event.changedTouches[0]?.clientX ?? 0,\n event.changedTouches[0]?.clientY ?? 0\n )\n : event.target\n\n const isInsideWrapper =\n target && wrapperRef.current?.contains(target as Node)\n\n if (\n (!isInsideWrapper || !editor.isEditable) &&\n showHandles &&\n isMountedRef.current\n ) {\n setShowHandles(false)\n }\n\n if (!resizeParams) return\n\n const wasNodeSelection =\n editor.state.selection instanceof NodeSelection &&\n editor.state.selection.node.type.name === \"image\"\n\n if (isMountedRef.current) {\n setResizeParams(undefined)\n }\n onImageResize?.(width)\n\n // Restore the node selection after resizing\n // This because we treat the image-node-extension.ts as content: \"inline*\"\n const pos = getPos()\n\n // Had to use isResizingRef flag because during resizing,\n // the selection gets lost and cannot be detected here\n // Its because image-node-extension.ts contain content: \"inline*\"\n if (isValidPosition(pos) && wasNodeSelection && isMountedRef.current) {\n editor.chain().focus().setNodeSelection(pos).run()\n }\n\n isResizingRef.current = false\n },\n [editor, getPos, onImageResize, resizeParams, showHandles, width]\n )\n\n const startResize = useCallback(\n (handleUsed: \"left\" | \"right\", clientX: number) => {\n setResizeParams({\n handleUsed,\n initialWidth: wrapperRef.current?.clientWidth ?? minWidth,\n initialClientX: clientX,\n })\n isResizingRef.current = true\n },\n [minWidth]\n )\n\n const leftResizeHandleMouseDownHandler = (\n event: React.MouseEvent<HTMLDivElement>\n ) => {\n event.preventDefault()\n event.stopPropagation()\n startResize(\"left\", event.clientX)\n }\n\n const leftResizeHandleTouchStartHandler = (\n event: React.TouchEvent<HTMLDivElement>\n ) => {\n event.preventDefault()\n const touch = event.touches[0]\n if (touch) startResize(\"left\", touch.clientX)\n }\n\n const rightResizeHandleMouseDownHandler = (\n event: React.MouseEvent<HTMLDivElement>\n ) => {\n event.preventDefault()\n event.stopPropagation()\n startResize(\"right\", event.clientX)\n }\n\n const rightResizeHandleTouchStartHandler = (\n event: React.TouchEvent<HTMLDivElement>\n ) => {\n event.preventDefault()\n const touch = event.touches[0]\n if (touch) startResize(\"right\", touch.clientX)\n }\n\n const wrapperMouseEnterHandler = () => {\n if (editor?.isEditable && isMountedRef.current) setShowHandles(true)\n }\n\n const wrapperMouseLeaveHandler = (\n event: React.MouseEvent<HTMLDivElement>\n ) => {\n if (!isMountedRef.current) return\n\n if (\n event.relatedTarget === leftResizeHandleRef.current ||\n event.relatedTarget === rightResizeHandleRef.current ||\n resizeParams\n )\n return\n\n if (editor?.isEditable) setShowHandles(false)\n }\n\n const wrapperTouchStartHandler = () => {\n if (editor?.isEditable && isMountedRef.current) setShowHandles(true)\n }\n\n // move 监听只在**真正拖着把手改尺寸**期间挂(windowMouseMoveHandler 本来第一行就是\n // `if (!resizeParams) return`,其余时间它只是个空回调)。\n //\n // ⚠️ 这不是省几次空调用的事:touchmove 用的是 `{ passive: false }`,即「我可能\n // preventDefault」,而 addNodeView 是无条件的 —— 只读文章里每张图都会挂一个 window 级的。\n // 只要页面上存在这样一个监听,Chrome 就放弃合成器快速滚动路径:触摸滚动的每一帧都要先把\n // touchmove 派发给 JS、等它返回才应用位移。sticky 顶栏因此比内容晚一帧,表现为\n // 「按住往下拖时顶栏细微来回跳动」,图越多越明显(运维期刊那种整篇是图的最明显)。\n // 鼠标滚轮不走这条路径,所以只有触摸/拖拽时能看出来。\n useEffect(() => {\n if (!resizeParams) return\n\n window.addEventListener(\"mousemove\", windowMouseMoveHandler)\n window.addEventListener(\"touchmove\", windowMouseMoveHandler, {\n passive: false,\n })\n\n return () => {\n window.removeEventListener(\"mousemove\", windowMouseMoveHandler)\n window.removeEventListener(\"touchmove\", windowMouseMoveHandler)\n }\n }, [resizeParams, windowMouseMoveHandler])\n\n // up 监听不能只在 resize 期间挂:它还负责「在图片外抬手时收起把手」(showHandles 分支\n // 在 `if (!resizeParams) return` 之前)。这两个不是 passive:false,不阻塞滚动,\n // 但同样只在有事可做时才挂。只读态 showHandles 恒 false(要 editor.isEditable 才置位),\n // 于是 viewer 里一个监听都不留。\n useEffect(() => {\n if (!resizeParams && !showHandles) return\n\n window.addEventListener(\"mouseup\", windowMouseUpHandler)\n window.addEventListener(\"touchend\", windowMouseUpHandler)\n\n return () => {\n window.removeEventListener(\"mouseup\", windowMouseUpHandler)\n window.removeEventListener(\"touchend\", windowMouseUpHandler)\n }\n }, [resizeParams, showHandles, windowMouseUpHandler])\n\n useEffect(() => {\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const shouldShowCaption = showCaption || hasContent\n\n return (\n <NodeViewWrapper\n onMouseEnter={wrapperMouseEnterHandler}\n onMouseLeave={wrapperMouseLeaveHandler}\n onTouchStart={wrapperTouchStartHandler}\n data-align={align}\n data-width={width}\n className=\"tiptap-image\"\n >\n <div\n ref={wrapperRef}\n className=\"tiptap-image-container\"\n style={{ width: width ? `${width}px` : \"fit-content\" }}\n >\n <div className=\"tiptap-image-content\">\n <img\n ref={imageRef}\n src={src}\n alt={alt}\n className=\"tiptap-image-img\"\n contentEditable={false}\n draggable={false}\n onClick={handleImageClick}\n style={{ cursor: editor?.isEditable ? \"pointer\" : \"zoom-in\" }}\n />\n\n {showHandles && editor?.isEditable && (\n <>\n <div\n ref={leftResizeHandleRef}\n className=\"tiptap-image-handle tiptap-image-handle-left\"\n onMouseDown={leftResizeHandleMouseDownHandler}\n onTouchStart={leftResizeHandleTouchStartHandler}\n />\n <div\n ref={rightResizeHandleRef}\n className=\"tiptap-image-handle tiptap-image-handle-right\"\n onMouseDown={rightResizeHandleMouseDownHandler}\n onTouchStart={rightResizeHandleTouchStartHandler}\n />\n </>\n )}\n </div>\n\n {editor?.isEditable && shouldShowCaption && (\n <NodeViewContent\n as=\"div\"\n className=\"tiptap-image-caption\"\n data-placeholder=\"添加图片说明...\"\n />\n )}\n </div>\n </NodeViewWrapper>\n )\n}\n","import { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport type { ImageOptions } from \"@tiptap/extension-image\"\nimport { Image as TiptapImage } from \"@tiptap/extension-image\"\nimport { ImageNodeView } from \"./image-node-view\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\ninterface ImageAttributes {\n src: string | null\n alt?: string | null\n title?: string | null\n width?: string | null\n height?: string | null\n \"data-align\"?: string | null\n}\n\nconst parseImageAttributes = (img: Element): Partial<ImageAttributes> => ({\n src: img.getAttribute(\"src\"),\n alt: img.getAttribute(\"alt\"),\n title: img.getAttribute(\"title\"),\n width: img.getAttribute(\"width\"),\n height: img.getAttribute(\"height\"),\n})\n\nfunction buildImageHTMLAttributes(\n attrs: ImageAttributes\n): Record<string, string> {\n const result: Record<string, string> = { src: attrs.src || \"\" }\n\n if (attrs.alt) result.alt = attrs.alt\n if (attrs.title) result.title = attrs.title\n if (attrs.width) result.width = attrs.width\n if (attrs.height) result.height = attrs.height\n\n return result\n}\n\nexport const Image = TiptapImage.extend<ImageOptions>({\n content: \"inline*\",\n\n addAttributes() {\n return {\n ...this.parent?.(),\n \"data-align\": {\n default: null,\n },\n showCaption: {\n default: false,\n parseHTML: (element) => {\n return (\n element.tagName === \"FIGURE\" ||\n element.getAttribute(\"data-show-caption\") === \"true\"\n )\n },\n renderHTML: (attributes) => {\n if (!attributes.showCaption) return {}\n return { \"data-show-caption\": \"true\" }\n },\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: \"figure\",\n getAttrs: (node) => {\n const img = node.querySelector(\"img\")\n if (!img) return false\n\n return {\n ...parseImageAttributes(img),\n \"data-align\": node.getAttribute(\"data-align\"),\n showCaption: true,\n }\n },\n contentElement: \"figcaption\",\n },\n {\n tag: \"img[src]\",\n getAttrs: (node) => {\n if (node.closest(\"figure\")) return false\n\n return {\n ...parseImageAttributes(node),\n \"data-align\": node.getAttribute(\"data-align\"),\n showCaption: false,\n }\n },\n },\n ]\n },\n\n renderHTML({ node }) {\n const { src, alt, title, width, height, showCaption } = node.attrs\n const align = node.attrs[\"data-align\"]\n\n const imgAttrs = buildImageHTMLAttributes({\n src,\n alt,\n title,\n width,\n height,\n })\n\n const hasContent = node.content.size > 0\n\n if (showCaption || hasContent) {\n const figureAttrs: Record<string, string> = {\n \"data-url\": src || \"\",\n }\n if (showCaption) figureAttrs[\"data-show-caption\"] = \"true\"\n if (align) figureAttrs[\"data-align\"] = align\n\n return [\"figure\", figureAttrs, [\"img\", imgAttrs], [\"figcaption\", {}, 0]]\n }\n\n if (align) imgAttrs[\"data-align\"] = align\n return [\"img\", imgAttrs]\n },\n\n addKeyboardShortcuts() {\n // Helper: locate an image node based on the current selection. Returns the\n // image node, its position, and whether the selection is at the start/end\n // of the image's inline content (or a NodeSelection on the image itself).\n const resolveImageFromSelection = (\n selection: import(\"@tiptap/pm/state\").Selection,\n type: typeof this.type\n ): {\n imageNode: Node\n imagePos: number\n atStart: boolean\n atEnd: boolean\n } | null => {\n if (selection instanceof NodeSelection && selection.node.type === type) {\n return {\n imageNode: selection.node,\n imagePos: selection.from,\n atStart: true,\n atEnd: true,\n }\n }\n\n if (selection.empty && selection.$from.parent.type === type) {\n const { $from } = selection\n return {\n imageNode: $from.parent,\n imagePos: $from.before(),\n atStart: $from.parentOffset === 0,\n atEnd: $from.parentOffset === $from.parent.content.size,\n }\n }\n\n return null\n }\n\n return {\n \"Mod-a\": ({ editor }) => {\n const { state, view } = editor\n const { selection } = state\n const { $from } = selection\n\n let imagePos: number | null = null\n let imageNode: Node | null = null\n\n for (let depth = $from.depth; depth >= 0; depth--) {\n const nodeAtDepth = $from.node(depth)\n if (nodeAtDepth.type === this.type) {\n imageNode = nodeAtDepth\n // posBefore is the resolved position *before* this node\n imagePos = depth === 0 ? 0 : $from.before(depth)\n break\n }\n }\n\n // Not inside an Image → let default behavior happen\n if (!imageNode || imagePos == null) {\n return false\n }\n\n // If the caption/content is empty, allow the default progressive select-all\n const contentIsEmpty =\n imageNode.content.size === 0 || imageNode.textContent.length === 0\n\n if (contentIsEmpty) {\n return false\n }\n\n // Compute the content range of the image node:\n // content starts at (nodePos + 1) and ends at (nodePos + node.nodeSize - 1)\n const start = imagePos + 1\n const end = imagePos + imageNode.nodeSize - 1\n\n const tr = state.tr.setSelection(\n TextSelection.create(state.doc, start, end)\n )\n view.dispatch(tr)\n\n return true\n },\n\n // Because the Image node has `content: \"inline*\"` (to support captions)\n // it is treated as a textblock, which means ProseMirror's Gapcursor does\n // not activate before/after it. If the image is the first or last child\n // of the document there is no way to place the cursor above/below it.\n // These handlers detect that situation and insert an empty paragraph at\n // the boundary so the caret can naturally move outside of the image —\n // giving us the \"atom-like\" caret behaviour while keeping the caption.\n ArrowUp: ({ editor }) => {\n const { state } = editor\n const match = resolveImageFromSelection(state.selection, this.type)\n\n if (!match || !match.atStart) {\n return false\n }\n\n // Only intercept when the image is the first child of the document.\n if (match.imagePos !== 0) {\n return false\n }\n\n return editor\n .chain()\n .insertContentAt(0, { type: \"paragraph\" })\n .setTextSelection(1)\n .run()\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageNodeView)\n },\n})\n\nexport default Image\n","import type { NodeWithPos } from \"@tiptap/core\"\nimport { Extension } from \"@tiptap/core\"\nimport type { EditorState, Transaction } from \"@tiptap/pm/state\"\nimport { getSelectedNodesOfType } from \"../../lib/tiptap-utils\"\nimport { updateNodesAttr } from \"../../lib/tiptap-utils\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n nodeBackground: {\n setNodeBackgroundColor: (backgroundColor: string) => ReturnType\n unsetNodeBackgroundColor: () => ReturnType\n toggleNodeBackgroundColor: (backgroundColor: string) => ReturnType\n }\n }\n}\n\nexport interface NodeBackgroundOptions {\n /**\n * Node types that should support background colors\n * @default [\"paragraph\", \"heading\", \"blockquote\", \"taskList\", \"bulletList\", \"orderedList\", \"tableCell\", \"tableHeader\"]\n */\n types: string[]\n /**\n * Use inline style instead of data attribute\n * @default true\n */\n useStyle?: boolean\n}\n\n/**\n * Determines the target color for toggle operations\n */\nfunction getToggleColor(\n targets: NodeWithPos[],\n inputColor: string\n): string | null {\n if (targets.length === 0) return null\n\n for (const target of targets) {\n const currentColor = target.node.attrs?.backgroundColor ?? null\n if (currentColor !== inputColor) {\n return inputColor\n }\n }\n\n return null\n}\n\nexport const NodeBackground = Extension.create<NodeBackgroundOptions>({\n name: \"nodeBackground\",\n\n addOptions() {\n return {\n types: [\n \"paragraph\",\n \"heading\",\n \"blockquote\",\n \"taskList\",\n \"bulletList\",\n \"orderedList\",\n \"tableCell\",\n \"tableHeader\",\n ],\n useStyle: true,\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n backgroundColor: {\n default: null as string | null,\n\n parseHTML: (element: HTMLElement) => {\n const styleColor = element.style?.backgroundColor\n if (styleColor) return styleColor\n\n const dataColor = element.getAttribute(\"data-background-color\")\n return dataColor || null\n },\n\n renderHTML: (attributes) => {\n const color = attributes.backgroundColor as string | null\n if (!color) return {}\n\n if (this.options.useStyle) {\n return {\n style: `background-color: ${color}`,\n }\n } else {\n return {\n \"data-background-color\": color,\n }\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n /**\n * Generic command executor for background color operations\n */\n const executeBackgroundCommand = (\n getTargetColor: (\n targets: NodeWithPos[],\n inputColor?: string\n ) => string | null\n ) => {\n return (inputColor?: string) =>\n ({ state, tr }: { state: EditorState; tr: Transaction }) => {\n const targets = getSelectedNodesOfType(\n state.selection,\n this.options.types\n )\n\n if (targets.length === 0) return false\n\n const targetColor = getTargetColor(targets, inputColor)\n\n return updateNodesAttr(tr, targets, \"backgroundColor\", targetColor)\n }\n }\n\n return {\n /**\n * Set background color to specific value\n */\n setNodeBackgroundColor: executeBackgroundCommand(\n (_, inputColor) => inputColor || null\n ),\n\n /**\n * Remove background color\n */\n unsetNodeBackgroundColor: executeBackgroundCommand(() => null),\n\n /**\n * Toggle background color (set if different/missing, unset if all have it)\n */\n toggleNodeBackgroundColor: executeBackgroundCommand(\n (targets, inputColor) => getToggleColor(targets, inputColor || \"\")\n ),\n }\n },\n})\n","import type { NodeWithPos } from \"@tiptap/core\"\nimport { Extension } from \"@tiptap/core\"\nimport type { EditorState, Transaction } from \"@tiptap/pm/state\"\nimport { getSelectedNodesOfType } from \"../../lib/tiptap-utils\"\nimport { updateNodesAttr } from \"../../lib/tiptap-utils\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n nodeAlignment: {\n setNodeTextAlign: (textAlign: string) => ReturnType\n unsetNodeTextAlign: () => ReturnType\n toggleNodeTextAlign: (textAlign: string) => ReturnType\n setNodeVAlign: (verticalAlign: string) => ReturnType\n unsetNodeVAlign: () => ReturnType\n toggleNodeVAlign: (verticalAlign: string) => ReturnType\n setNodeAlignment: (\n textAlign?: string,\n verticalAlign?: string\n ) => ReturnType\n unsetNodeAlignment: () => ReturnType\n }\n }\n}\n\nexport interface NodeAlignmentOptions {\n /**\n * Node types that should support alignment\n * @default [\"paragraph\", \"heading\", \"blockquote\", \"tableCell\", \"tableHeader\"]\n */\n types: string[]\n /**\n * Use inline style instead of data attribute\n * @default true\n */\n useStyle?: boolean\n /**\n * Valid text alignment values\n * @default [\"left\", \"center\", \"right\", \"justify\"]\n */\n textAlignValues: string[]\n /**\n * Valid vertical alignment values\n * @default [\"top\", \"middle\", \"bottom\"]\n */\n verticalAlignValues: string[]\n}\n\nfunction getToggleValue(\n targets: NodeWithPos[],\n attributeName: string,\n inputValue: string\n): string | null {\n if (targets.length === 0) return null\n\n for (const target of targets) {\n const currentValue = target.node.attrs?.[attributeName] ?? null\n if (currentValue !== inputValue) {\n return inputValue\n }\n }\n return null\n}\n\nexport const NodeAlignment = Extension.create<NodeAlignmentOptions>({\n name: \"nodeAlignment\",\n\n addOptions() {\n return {\n types: [\"paragraph\", \"heading\", \"blockquote\", \"tableCell\", \"tableHeader\"],\n useStyle: true,\n textAlignValues: [\"left\", \"center\", \"right\", \"justify\"],\n verticalAlignValues: [\"top\", \"middle\", \"bottom\"],\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n nodeTextAlign: {\n default: null as string | null,\n\n parseHTML: (element: HTMLElement) => {\n const styleAlign = element.style?.textAlign\n if (\n styleAlign &&\n this.options.textAlignValues.includes(styleAlign)\n ) {\n return styleAlign\n }\n\n const dataAlign = element.getAttribute(\"data-node-text-align\")\n if (\n dataAlign &&\n this.options.textAlignValues.includes(dataAlign)\n ) {\n return dataAlign\n }\n return null\n },\n\n renderHTML: (attributes) => {\n const align = attributes.nodeTextAlign as string | null\n if (!align || !this.options.textAlignValues.includes(align))\n return {}\n\n if (this.options.useStyle) {\n return { style: `text-align: ${align}` }\n } else {\n return { \"data-node-text-align\": align }\n }\n },\n },\n\n nodeVerticalAlign: {\n default: null as string | null,\n\n parseHTML: (element: HTMLElement) => {\n const styleVAlign = element.style?.verticalAlign\n if (\n styleVAlign &&\n this.options.verticalAlignValues.includes(styleVAlign)\n ) {\n return styleVAlign\n }\n const dataVAlign = element.getAttribute(\n \"data-node-vertical-align\"\n )\n if (\n dataVAlign &&\n this.options.verticalAlignValues.includes(dataVAlign)\n ) {\n return dataVAlign\n }\n return null\n },\n\n renderHTML: (attributes) => {\n const vAlign = attributes.nodeVerticalAlign as string | null\n if (!vAlign || !this.options.verticalAlignValues.includes(vAlign))\n return {}\n\n if (this.options.useStyle) {\n return { style: `vertical-align: ${vAlign}` }\n } else {\n return { \"data-node-vertical-align\": vAlign }\n }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n const executeAlignmentCommand = (\n attributeName: \"nodeTextAlign\" | \"nodeVerticalAlign\",\n getTargetValue: (\n targets: NodeWithPos[],\n inputValue?: string\n ) => string | null\n ) => {\n return (inputValue?: string) =>\n ({ state, tr }: { state: EditorState; tr: Transaction }) => {\n const targets = getSelectedNodesOfType(\n state.selection,\n this.options.types\n )\n if (targets.length === 0) return false\n const targetValue = getTargetValue(targets, inputValue)\n return updateNodesAttr(tr, targets, attributeName, targetValue)\n }\n }\n\n return {\n // TEXT ALIGN\n setNodeTextAlign: executeAlignmentCommand(\n \"nodeTextAlign\",\n (_, inputValue) => {\n if (!inputValue || !this.options.textAlignValues.includes(inputValue))\n return null\n return inputValue\n }\n ),\n unsetNodeTextAlign: executeAlignmentCommand(\"nodeTextAlign\", () => null),\n toggleNodeTextAlign: executeAlignmentCommand(\n \"nodeTextAlign\",\n (targets, inputValue) => {\n if (!inputValue || !this.options.textAlignValues.includes(inputValue))\n return null\n return getToggleValue(targets, \"nodeTextAlign\", inputValue)\n }\n ),\n\n // VERTICAL ALIGN\n setNodeVAlign: executeAlignmentCommand(\n \"nodeVerticalAlign\",\n (_, inputValue) => {\n if (\n !inputValue ||\n !this.options.verticalAlignValues.includes(inputValue)\n )\n return null\n return inputValue\n }\n ),\n unsetNodeVAlign: executeAlignmentCommand(\"nodeVerticalAlign\", () => null),\n toggleNodeVAlign: executeAlignmentCommand(\n \"nodeVerticalAlign\",\n (targets, inputValue) => {\n if (\n !inputValue ||\n !this.options.verticalAlignValues.includes(inputValue)\n )\n return null\n return getToggleValue(targets, \"nodeVerticalAlign\", inputValue)\n }\n ),\n\n // BOTH\n setNodeAlignment:\n (textAlign?: string, verticalAlign?: string) =>\n ({ state, tr }: { state: EditorState; tr: Transaction }) => {\n const targets = getSelectedNodesOfType(\n state.selection,\n this.options.types\n )\n if (targets.length === 0) return false\n\n let hasChanges = false\n\n for (const { node, pos } of targets) {\n const newAttrs = { ...node.attrs }\n\n if (textAlign && this.options.textAlignValues.includes(textAlign)) {\n newAttrs.nodeTextAlign = textAlign\n hasChanges = true\n }\n\n if (\n verticalAlign &&\n this.options.verticalAlignValues.includes(verticalAlign)\n ) {\n newAttrs.nodeVerticalAlign = verticalAlign\n hasChanges = true\n }\n\n if (hasChanges) tr.setNodeMarkup(pos, undefined, newAttrs)\n }\n\n return hasChanges\n },\n\n unsetNodeAlignment:\n () =>\n ({ state, tr }: { state: EditorState; tr: Transaction }) => {\n const targets = getSelectedNodesOfType(\n state.selection,\n this.options.types\n )\n if (targets.length === 0) return false\n\n let hasChanges = false\n\n for (const { node, pos } of targets) {\n const hasText = node.attrs?.nodeTextAlign ?? null\n const hasV = node.attrs?.nodeVerticalAlign ?? null\n\n if (hasText || hasV) {\n const newAttrs = {\n ...node.attrs,\n nodeTextAlign: null,\n nodeVerticalAlign: null,\n }\n tr.setNodeMarkup(pos, undefined, newAttrs)\n hasChanges = true\n }\n }\n\n return hasChanges\n },\n }\n },\n})\n","import {\n createContext,\n useContext,\n useState,\n useCallback,\n type ReactNode,\n} from \"react\"\nimport type {\n TableOfContentData,\n TableOfContentDataItem,\n} from \"@tiptap/extension-table-of-contents\"\nimport { selectNodeAndHideFloating } from \"../../../../hooks/use-floating-toolbar-visibility\"\n\ntype TocState = {\n tocContent: TableOfContentData | null\n setTocContent: (value: TableOfContentData | null) => void\n\n navigateToHeading: (\n item: TableOfContentDataItem,\n options?: {\n topOffset?: number\n behavior?: ScrollBehavior\n }\n ) => void\n\n normalizeHeadingDepths: <\n T extends { level?: number; originalLevel?: number },\n >(\n headingList: T[]\n ) => number[]\n}\n\nconst TocContext = createContext<TocState | undefined>(undefined)\n\n/**\n * Normalizes heading depths for a table of contents (TOC) structure.\n *\n * This function ensures proper hierarchical nesting where a heading can only be\n * a child of a previous heading with a smaller level number (higher priority).\n * It prevents incorrect structures like h2 being listed under h3.\n *\n * Algorithm:\n * 1. Rebases all levels so the minimum level becomes 1 (root level)\n * 2. Maintains a stack of ancestors; pops entries until a smaller level is found\n * 3. If found, nests it under that parent (parent depth + 1)\n * 4. If not found, treats it as a root-level item (depth = 1)\n *\n * @param items - Array of heading items with `level` or `originalLevel` properties\n * @returns Array of normalized depths corresponding to each heading item\n */\nexport function normalizeHeadingDepths<\n T extends { level?: number; originalLevel?: number },\n>(items: T[]): number[] {\n if (items.length === 0) return []\n\n const raw = items.map((h) => h.originalLevel ?? h.level ?? 1)\n\n const positives = raw.filter((l) => l > 0)\n const root = positives.includes(1) ? 1 : Math.min(...positives)\n\n const lvl = raw.map((l) => Math.max(1, l - (root - 1)))\n\n const depths: number[] = []\n const stack: { level: number; depth: number }[] = []\n\n for (let i = 0; i < lvl.length; i++) {\n const currentLevel = lvl[i] ?? 1\n\n // Pop until we find a valid parent (strictly smaller level)\n while (stack.length > 0 && stack[stack.length - 1]!.level >= currentLevel) {\n stack.pop()\n }\n\n const depth = stack.length === 0 ? 1 : stack[stack.length - 1]!.depth + 1\n\n depths.push(depth)\n\n stack.push({ level: currentLevel, depth })\n }\n\n return depths\n}\n\n/**\n * Find the nearest scrollable ancestor of an element.\n * Falls back to `window` when no scrollable container is found.\n */\nexport const getScrollableAncestor = (\n element: HTMLElement\n): HTMLElement | Window => {\n let parent = element.parentElement\n\n while (parent) {\n const { overflowY } = getComputedStyle(parent)\n\n if (\n (overflowY === \"auto\" || overflowY === \"scroll\") &&\n parent.scrollHeight > parent.clientHeight\n ) {\n return parent\n }\n\n parent = parent.parentElement\n }\n\n return window\n}\n\n/**\n * Check if an element is visible in the viewport (or scrollable container)\n */\nconst isElementVisible = (element: HTMLElement, topOffset: number): boolean => {\n const rect = element.getBoundingClientRect()\n const viewportHeight =\n window.innerHeight || document.documentElement.clientHeight\n\n // Element is visible if:\n // - Its top is below the topOffset\n // - Its bottom is above the viewport top\n // - Its top is above the viewport bottom\n return (\n rect.top >= topOffset &&\n rect.bottom > topOffset &&\n rect.top < viewportHeight\n )\n}\n\n/**\n * Low-level navigate helper (not exported in context directly)\n */\nconst doNavigateToHeading = (\n item: TableOfContentDataItem,\n topOffset: number,\n behavior: ScrollBehavior = \"smooth\"\n) => {\n if (!item.dom || typeof window === \"undefined\") return\n\n // Only scroll if element is not already visible\n if (!isElementVisible(item.dom, topOffset)) {\n const scroller = getScrollableAncestor(item.dom)\n\n if (scroller instanceof Window) {\n const rect = item.dom.getBoundingClientRect()\n const top = rect.top + window.scrollY - topOffset\n window.scrollTo({ top, behavior })\n } else {\n const rect = item.dom.getBoundingClientRect()\n const containerRect = scroller.getBoundingClientRect()\n const top = rect.top - containerRect.top + scroller.scrollTop - topOffset\n scroller.scrollTo({ top, behavior })\n }\n }\n\n if (item.editor && typeof item.pos === \"number\") {\n selectNodeAndHideFloating(item.editor, item.pos)\n }\n\n if (item.id) {\n const url = new URL(window.location.href)\n url.hash = item.id\n window.history.replaceState(null, \"\", url.toString())\n }\n}\n\nexport const TocProvider = ({ children }: { children: ReactNode }) => {\n const [tocContent, setTocContent] = useState<TableOfContentData | null>(null)\n\n const navigateToHeading = useCallback<TocState[\"navigateToHeading\"]>(\n (item, options) => {\n const topOffset = options?.topOffset ?? 0\n const behavior = options?.behavior ?? \"smooth\"\n doNavigateToHeading(item, topOffset, behavior)\n },\n []\n )\n\n return (\n <TocContext.Provider\n value={{\n tocContent,\n setTocContent,\n navigateToHeading,\n normalizeHeadingDepths,\n }}\n >\n {children}\n </TocContext.Provider>\n )\n}\n\nexport const useToc = () => {\n const ctx = useContext(TocContext)\n if (!ctx) {\n throw new Error(\"useToc must be used inside <TocProvider>\")\n }\n return ctx\n}\n","import { useCallback, useMemo } from \"react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\nimport type {\n TableOfContentData,\n TableOfContentDataItem,\n} from \"@tiptap/extension-table-of-contents\"\n\nimport { useToc } from \"./context/toc-context\"\n\nimport \"./toc-node.scss\"\n\ntype TocTreeNode = {\n item: TableOfContentDataItem\n depth: number\n}\n\nexport function TocNodeComponent(props: NodeViewProps) {\n const { node, extension } = props\n const { tocContent, navigateToHeading, normalizeHeadingDepths } = useToc()\n\n const {\n topOffset: optionTopOffset = 0,\n maxShowCount: optionMaxShowCount = 20,\n showTitle: optionShowTitle = true,\n } = extension.options\n\n const attrs = node.attrs ?? {}\n const { backgroundColor } = attrs\n const topOffset = attrs.topOffset ?? optionTopOffset\n const maxShowCount = attrs.maxShowCount ?? optionMaxShowCount\n const showTitle = attrs.showTitle ?? optionShowTitle\n\n const headingList = useMemo<TableOfContentData>(\n () => tocContent ?? [],\n [tocContent]\n )\n\n const visibleHeadings = useMemo(\n () => headingList.slice(0, maxShowCount),\n [headingList, maxShowCount]\n )\n\n const normalizedDepths = useMemo<number[]>(\n () => normalizeHeadingDepths(visibleHeadings),\n [visibleHeadings, normalizeHeadingDepths]\n )\n\n const flatTocList = useMemo<TocTreeNode[]>(() => {\n return visibleHeadings.map((item, index) => ({\n item,\n depth: normalizedDepths[index] ?? 1,\n }))\n }, [visibleHeadings, normalizedDepths])\n\n const handleContentClick = useCallback(\n (e: React.MouseEvent, item: TableOfContentDataItem) => {\n e.preventDefault()\n e.stopPropagation()\n navigateToHeading(item, { topOffset })\n },\n [navigateToHeading, topOffset]\n )\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { style: _, ...HTMLAttributes } = props.HTMLAttributes\n\n const wrapperProps = {\n className: \"tiptap-table-of-contents-node\",\n style: { backgroundColor: backgroundColor || undefined },\n ...HTMLAttributes,\n }\n\n if (!visibleHeadings.length) {\n return (\n <NodeViewWrapper {...wrapperProps}>\n <div className=\"tiptap-table-of-contents-empty\">\n Add headings to create a table of contents.\n </div>\n </NodeViewWrapper>\n )\n }\n\n return (\n <NodeViewWrapper {...wrapperProps}>\n {showTitle && (\n <div className=\"tiptap-table-of-contents-title\">目录</div>\n )}\n <nav\n aria-label=\"目录\"\n className=\"tiptap-table-of-contents-list\"\n >\n {flatTocList.map((node, index) => (\n <a\n key={node.item.id ?? `${index}-${node.item.textContent}`}\n href={`#${node.item.id}`}\n rel=\"noopener noreferrer\"\n className=\"tiptap-table-of-contents-item notranslate\"\n data-depth={node.depth}\n style={{ \"--toc-depth\": node.depth } as React.CSSProperties}\n onClick={(e) => handleContentClick(e, node.item)}\n >\n {node.item.textContent}\n </a>\n ))}\n </nav>\n </NodeViewWrapper>\n )\n}\n\nexport default TocNodeComponent\n","import { Node, mergeAttributes } from \"@tiptap/core\"\nimport { ReactNodeViewRenderer } from \"@tiptap/react\"\nimport { TocNodeComponent } from \"../toc-node\"\n\nexport interface TocNodeAttrs {\n /**\n * The maximum number of headings to show in the TOC node.\n * @default 20\n */\n maxShowCount?: number | null\n /**\n * Offset from the top of the viewport when scrolling to a heading.\n * @default 0\n */\n topOffset?: number | null\n /**\n * Whether to show the \"Table of contents\" title.\n * @default true\n */\n showTitle?: boolean | null\n}\n\nexport interface TocNodeOptions extends TocNodeAttrs {\n /**\n * HTML attributes to add to the TOC node 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\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n tocNode: {\n /**\n * Insert a table of contents node.\n *\n * Example:\n * editor.commands.insertTocNode({ maxShowCount: 10 })\n */\n insertTocNode: (attrs?: TocNodeAttrs) => ReturnType\n }\n }\n}\n\n/**\n * A Tiptap node extension that creates a table of contents node.\n * @see registry/tiptap-node/toc-node/toc-node-component\n */\nexport const TocNode = Node.create<TocNodeOptions>({\n name: \"tocNode\",\n\n group: \"block customNode\",\n\n draggable: true,\n\n selectable: true,\n\n atom: true,\n\n addOptions() {\n return {\n topOffset: 0,\n maxShowCount: 20,\n showTitle: true,\n HTMLAttributes: {},\n }\n },\n\n addAttributes() {\n return {\n topOffset: {\n default: null as number | null,\n parseHTML: (element: HTMLElement) => {\n const val = element.getAttribute(\"data-top-offset\")\n const num = val != null ? Number(val) : null\n return Number.isFinite(num) ? num : null\n },\n renderHTML: (attrs: TocNodeAttrs) => {\n if (attrs.topOffset == null) return {}\n return { \"data-top-offset\": attrs.topOffset }\n },\n },\n maxShowCount: {\n default: null as number | null,\n parseHTML: (element: HTMLElement) => {\n const val = element.getAttribute(\"data-max-show-count\")\n const num = val != null ? Number(val) : null\n return Number.isFinite(num) ? num : null\n },\n renderHTML: (attrs: TocNodeAttrs) => {\n if (attrs.maxShowCount == null) return {}\n return { \"data-max-show-count\": attrs.maxShowCount }\n },\n },\n showTitle: {\n default: true,\n\n parseHTML: (element: HTMLElement) => {\n const val = element.getAttribute(\"data-show-title\")\n if (val === \"false\") return false\n if (val === \"true\") return true\n return null\n },\n\n renderHTML: (attrs: TocNodeAttrs) => {\n if (attrs.showTitle == null) return {}\n return { \"data-show-title\": String(attrs.showTitle) }\n },\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"toc-node\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n \"data-type\": \"toc-node\",\n }),\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TocNodeComponent, {\n stopEvent: ({ event }) => {\n if (!(event instanceof MouseEvent)) return false\n\n const el = event.target as HTMLElement | null\n if (!el) return false\n\n return Boolean(el.closest(\".tiptap-table-of-contents-item\"))\n },\n })\n },\n\n addCommands() {\n return {\n insertTocNode:\n (attrs) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n })\n },\n }\n },\n})\n\nexport default TocNode\n","import { useRef, useState } from \"react\"\nimport type { NodeViewProps } from \"@tiptap/react\"\nimport { NodeViewWrapper } from \"@tiptap/react\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { CloseIcon } from \"../../tiptap-icons/close-icon\"\nimport \"./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 (event: { progress: number }) => {\n setFileItems((prev) =>\n prev.map((item) =>\n item.id === fileId ? { ...item, progress: event.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 * Optional child elements to render inside the drag area\n * @optional\n * @default undefined\n */\n children?: React.ReactNode\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 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)\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 B\"\n const k = 1024\n const sizes = [\"B\", \"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 variant=\"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<{ maxSize: number; limit: number }> = ({\n maxSize,\n limit,\n}) => (\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>点击上传</em> 或拖放文件\n </span>\n <span className=\"tiptap-image-upload-subtext\">\n 最多 {limit} 个文件,每个不超过 {maxSize / 1024 / 1024}MB。\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\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}>\n <DropZoneContent maxSize={maxSize} limit={limit} />\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>Uploading {fileItems.length} files</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n clearAllFiles()\n }}\n >\n 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 \"./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\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 }\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 type { Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport type { Command } from \"@tiptap/pm/state\"\nimport { Selection, type EditorState, type Transaction } from \"@tiptap/pm/state\"\nimport type { FindNodeResult, Rect } from \"@tiptap/pm/tables\"\nimport {\n TableMap,\n CellSelection,\n findTable,\n selectedRect,\n cellAround,\n selectionCell,\n isInTable,\n} from \"@tiptap/pm/tables\"\nimport { Mapping } from \"@tiptap/pm/transform\"\n\nexport const RESIZE_MIN_WIDTH = 35\nexport const EMPTY_CELL_WIDTH = 120\nexport const EMPTY_CELL_HEIGHT = 40\n\nexport type Orientation = \"row\" | \"column\"\nexport interface CellInfo extends FindNodeResult {\n row: number\n column: number\n}\n\nexport type CellCoordinates = {\n row: number\n col: number\n}\n\nexport type SelectionReturnMode = \"state\" | \"transaction\" | \"dispatch\"\n\nexport type BaseSelectionOptions = { mode?: SelectionReturnMode }\nexport type DispatchSelectionOptions = {\n mode: \"dispatch\"\n dispatch: (tr: Transaction) => void\n}\nexport type TransactionSelectionOptions = { mode: \"transaction\" }\nexport type StateSelectionOptions = { mode?: \"state\" }\n\nexport type TableInfo = {\n map: TableMap\n} & FindNodeResult\n\n// ============================================================================\n// HELPER CONSTANTS & UTILITIES\n// ============================================================================\n\nconst EMPTY_CELLS_RESULT = { cells: [], mergedCells: [] }\n\nexport function isHTMLElement(n: unknown): n is HTMLElement {\n return n instanceof HTMLElement\n}\n\nexport type DomCellAroundResult =\n | {\n type: \"cell\"\n domNode: HTMLElement\n tbodyNode: HTMLTableSectionElement | null\n }\n | {\n type: \"wrapper\"\n domNode: HTMLElement\n tbodyNode: HTMLTableSectionElement | null\n }\n\nexport function safeClosest<T extends Element>(\n start: Element | null,\n selector: string\n): T | null {\n return (start?.closest?.(selector) as T | null) ?? null\n}\n\n/**\n * Walk up from an element until we find a TD/TH or the table wrapper.\n * Returns the found element plus its tbody (if present).\n */\nexport function domCellAround(\n target: Element\n): DomCellAroundResult | undefined {\n let current: Element | null = target\n\n while (\n current &&\n current.tagName !== \"TD\" &&\n current.tagName !== \"TH\" &&\n !current.classList.contains(\"tableWrapper\")\n ) {\n if (current.classList.contains(\"ProseMirror\")) return undefined\n current = isHTMLElement(current.parentNode)\n ? (current.parentNode as Element)\n : null\n }\n\n if (!current) return undefined\n\n if (current.tagName === \"TD\" || current.tagName === \"TH\") {\n return {\n type: \"cell\",\n domNode: current as HTMLElement,\n tbodyNode: safeClosest<HTMLTableSectionElement>(current, \"tbody\"),\n }\n }\n\n return {\n type: \"wrapper\",\n domNode: current as HTMLElement,\n tbodyNode: (current as HTMLElement).querySelector(\"tbody\"),\n }\n}\n\n/**\n * Clamps a value between min and max bounds\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max))\n}\n\n/**\n * Validates if row/col indices are within table bounds\n */\nfunction isWithinBounds(row: number, col: number, map: TableMap): boolean {\n return row >= 0 && row < map.height && col >= 0 && col < map.width\n}\n\n/**\n * Resolves the index for a row or column based on current selection or provided value\n */\nfunction resolveOrientationIndex(\n state: EditorState,\n table: TableInfo,\n orientation: Orientation,\n providedIndex?: number\n): number | null {\n if (typeof providedIndex === \"number\") {\n return providedIndex\n }\n\n if (state.selection instanceof CellSelection) {\n const rect = selectedRect(state)\n return orientation === \"row\" ? rect.top : rect.left\n }\n\n const $cell = cellAround(state.selection.$anchor) ?? selectionCell(state)\n if (!$cell) return null\n\n const rel = $cell.pos - table.start\n const rect = table.map.findCell(rel)\n return orientation === \"row\" ? rect.top : rect.left\n}\n\n/**\n * Creates a CellInfo object from position data\n */\nfunction createCellInfo(\n row: number,\n column: number,\n cellPos: number,\n cellNode: Node\n): CellInfo {\n return {\n row,\n column,\n pos: cellPos,\n node: cellNode,\n start: cellPos + 1,\n depth: cellNode ? cellNode.content.size : 0,\n }\n}\n\n/**\n * Checks if a cell is merged (has colspan or rowspan > 1)\n */\nexport function isCellMerged(node: Node | null): boolean {\n if (!node) return false\n const colspan = node.attrs.colspan ?? 1\n const rowspan = node.attrs.rowspan ?? 1\n return colspan > 1 || rowspan > 1\n}\n\n/**\n * Generic function to collect cells along a row or column\n */\nfunction collectCells(\n editor: Editor | null,\n orientation: Orientation,\n index?: number,\n tablePos?: number\n): { cells: CellInfo[]; mergedCells: CellInfo[] } {\n if (!editor) return EMPTY_CELLS_RESULT\n\n const { state } = editor\n const table = getTable(editor, tablePos)\n if (!table) return EMPTY_CELLS_RESULT\n\n const tableStart = table.start\n const tableNode = table.node\n const map = table.map\n\n const resolvedIndex = resolveOrientationIndex(\n state,\n table,\n orientation,\n index\n )\n if (resolvedIndex === null) return EMPTY_CELLS_RESULT\n\n // Bounds check\n const maxIndex = orientation === \"row\" ? map.height : map.width\n if (resolvedIndex < 0 || resolvedIndex >= maxIndex) {\n return EMPTY_CELLS_RESULT\n }\n\n const cells: CellInfo[] = []\n const mergedCells: CellInfo[] = []\n const seenMerged = new Set<number>()\n\n const iterationCount = orientation === \"row\" ? map.width : map.height\n\n for (let i = 0; i < iterationCount; i++) {\n const row = orientation === \"row\" ? resolvedIndex : i\n const col = orientation === \"row\" ? i : resolvedIndex\n const cellIndex = row * map.width + col\n const mapCell = map.map[cellIndex]\n\n if (mapCell === undefined) continue\n\n const cellPos = tableStart + mapCell\n const cellNode = tableNode.nodeAt(mapCell)\n if (!cellNode) continue\n\n const cell = createCellInfo(row, col, cellPos, cellNode)\n\n if (isCellMerged(cellNode)) {\n if (!seenMerged.has(cellPos)) {\n mergedCells.push(cell)\n seenMerged.add(cellPos)\n }\n }\n\n cells.push(cell)\n }\n\n return { cells, mergedCells }\n}\n\n/**\n * Generic function to count empty cells from the end of a row or column\n */\nfunction countEmptyCellsFromEnd(\n editor: Editor,\n tablePos: number,\n orientation: Orientation\n): number {\n const table = getTable(editor, tablePos)\n if (!table) return 0\n\n const { doc } = editor.state\n const maxIndex = orientation === \"row\" ? table.map.height : table.map.width\n\n let emptyCount = 0\n for (let idx = maxIndex - 1; idx >= 0; idx--) {\n const seen = new Set<number>()\n let isLineEmpty = true\n\n const iterationCount =\n orientation === \"row\" ? table.map.width : table.map.height\n\n for (let i = 0; i < iterationCount; i++) {\n const row = orientation === \"row\" ? idx : i\n const col = orientation === \"row\" ? i : idx\n const rel = table.map.positionAt(row, col, table.node)\n\n if (seen.has(rel)) continue\n seen.add(rel)\n\n const abs = tablePos + 1 + rel\n const cell = doc.nodeAt(abs)\n if (!cell) continue\n\n if (!isCellEmpty(cell)) {\n isLineEmpty = false\n break\n }\n }\n\n if (isLineEmpty) emptyCount++\n else break\n }\n\n return emptyCount\n}\n\n/**\n * Get information about the table at the current selection or a specific position.\n *\n * If `tablePos` is provided, it looks for a table at that exact position.\n * Otherwise, it finds the nearest table containing the current selection.\n *\n * Returns an object with:\n * - `node`: the table node\n * - `pos`: the position of the table in the document\n * - `start`: the position just after the table node (where its content starts)\n * - `map`: the `TableMap` for layout info (rows, columns, spans)\n *\n * If no table is found, returns null.\n */\nexport function getTable(editor: Editor | null, tablePos?: number) {\n if (!editor) return null\n\n type FoundTable = { node: Node; pos: number; start: number; depth: number }\n let table: FoundTable | null = null\n\n if (typeof tablePos === \"number\") {\n const tableNode = editor.state.doc.nodeAt(tablePos)\n if (tableNode?.type.name === \"table\") {\n table = {\n node: tableNode,\n pos: tablePos,\n start: tablePos + 1,\n depth: editor.state.doc.resolve(tablePos).depth,\n }\n }\n }\n\n if (!table) {\n const { state } = editor\n const $from = state.doc.resolve(state.selection.from)\n table = findTable($from)\n }\n\n if (!table) return null\n\n const tableMap = TableMap.get(table.node)\n if (!tableMap) return null\n\n return { ...table, map: tableMap }\n}\n\n/**\n * Checks if the current text selection is inside a table cell.\n * @param state - The editor state to check\n * @returns true if the selection is inside a table cell; false otherwise\n */\nexport function isSelectionInCell(state: EditorState): boolean {\n const { selection } = state\n const $from = selection.$from\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth)\n if (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\") {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Cells overlap a rectangle if any of the cells in the rectangle are merged\n * with cells outside the rectangle.\n */\nexport function cellsOverlapRectangle(\n { width, height, map }: TableMap,\n rect: Rect\n) {\n let indexTop = rect.top * width + rect.left,\n indexLeft = indexTop\n let indexBottom = (rect.bottom - 1) * width + rect.left,\n indexRight = indexTop + (rect.right - rect.left - 1)\n for (let i = rect.top; i < rect.bottom; i++) {\n if (\n (rect.left > 0 && map[indexLeft] == map[indexLeft - 1]) ||\n (rect.right < width && map[indexRight] == map[indexRight + 1])\n )\n return true\n indexLeft += width\n indexRight += width\n }\n for (let i = rect.left; i < rect.right; i++) {\n if (\n (rect.top > 0 && map[indexTop] == map[indexTop - width]) ||\n (rect.bottom < height && map[indexBottom] == map[indexBottom + width])\n )\n return true\n indexTop++\n indexBottom++\n }\n return false\n}\n\n/**\n * Runs a function while preserving the editor's selection.\n * @param editor The Tiptap editor instance\n * @param fn The function to run\n * @returns True if the selection was successfully restored, false otherwise\n */\nexport function runPreservingCursor(editor: Editor, fn: () => void): boolean {\n const view = editor.view\n const startSel = view.state.selection\n const bookmark = startSel.getBookmark()\n\n const mapping = new Mapping()\n const originalDispatch = view.dispatch\n\n view.dispatch = (tr) => {\n mapping.appendMapping(tr.mapping)\n originalDispatch(tr)\n }\n\n try {\n fn()\n } finally {\n view.dispatch = originalDispatch\n }\n\n try {\n const sel = bookmark.map(mapping).resolve(view.state.doc)\n view.dispatch(view.state.tr.setSelection(sel))\n return true\n } catch {\n // Fallback: if the exact spot vanished (e.g., cell deleted),\n // go to the nearest valid position.\n const mappedPos = mapping.map(startSel.from, -1)\n const clamped = clamp(mappedPos, 0, view.state.doc.content.size)\n const near = Selection.near(view.state.doc.resolve(clamped), -1)\n view.dispatch(view.state.tr.setSelection(near))\n return false\n }\n}\n\n/**\n * Determines whether a table cell is effectively empty.\n *\n * A cell is considered empty when:\n * - it has no children, or\n * - it contains only whitespace text, or\n * - it contains no text and no non-text leaf nodes (images, embeds, etc.)\n *\n * Early-outs as soon as any meaningful content is found.\n *\n * @param cellNode - The table cell node to check\n * @returns true if the cell is empty; false otherwise\n */\nexport function isCellEmpty(cellNode: Node): boolean {\n if (cellNode.childCount === 0) return true\n\n let isEmpty = true\n cellNode.descendants((n) => {\n if (n.isText && n.text?.trim()) {\n isEmpty = false\n return false\n }\n if (n.isLeaf && !n.isText) {\n isEmpty = false\n return false\n }\n return true\n })\n\n return isEmpty\n}\n\n/**\n * Determine if the current selection is a full row or column selection.\n *\n * If the selection is a `CellSelection` that spans an entire row or column,\n * returns an object indicating the type and index:\n * - `{ type: \"row\", index: number }` for full row selections\n * - `{ type: \"column\", index: number }` for full column selections\n *\n * If the selection is not a full row/column, or if no table is found, returns null.\n */\nexport function getTableSelectionType(\n editor: Editor | null,\n index?: number,\n orientation?: Orientation,\n tablePos?: number\n): { orientation: Orientation; index: number } | null {\n if (typeof index === \"number\" && orientation) {\n return { orientation, index }\n }\n\n if (!editor) return null\n\n const { state } = editor\n\n const table = getTable(editor, tablePos)\n if (!table) return null\n\n if (state.selection instanceof CellSelection) {\n const rect = selectedRect(state)\n const width = rect.right - rect.left\n const height = rect.bottom - rect.top\n\n if (height === 1 && width >= 1) {\n return { orientation: \"row\", index: rect.top }\n }\n\n if (width === 1 && height >= 1) {\n return { orientation: \"column\", index: rect.left }\n }\n\n return null\n }\n\n return null\n}\n\n/**\n * Get all cells (and unique merged cells) in the selected row or column.\n *\n * - If `index` is provided, uses that row/column index.\n * - If omitted, uses the first selected row/column based on current selection.\n *\n * Returns an object with:\n * - `cells`: all cells in the row/column\n * - `mergedCells`: only the unique cells that have rowspan/colspan > 1\n *\n * If no valid selection or index is found, returns empty arrays.\n */\nexport function getRowOrColumnCells(\n editor: Editor | null,\n index?: number,\n orientation?: Orientation,\n tablePos?: number\n): {\n cells: CellInfo[]\n mergedCells: CellInfo[]\n index?: number\n orientation?: Orientation\n tablePos?: number\n} {\n const emptyResult = {\n cells: [],\n mergedCells: [],\n index: undefined,\n orientation: undefined,\n tablePos: undefined,\n }\n\n if (!editor) {\n return emptyResult\n }\n\n if (\n typeof index !== \"number\" &&\n !(editor.state.selection instanceof CellSelection)\n ) {\n return emptyResult\n }\n\n let finalIndex = index\n let finalOrientation = orientation\n\n if (\n typeof finalIndex !== \"number\" ||\n !finalOrientation ||\n ![\"row\", \"column\"].includes(finalOrientation)\n ) {\n const selectionType = getTableSelectionType(editor)\n if (!selectionType) return emptyResult\n\n finalIndex = selectionType.index\n finalOrientation = selectionType.orientation\n }\n\n const result = collectCells(editor, finalOrientation, finalIndex, tablePos)\n return { ...result, index: finalIndex, orientation: finalOrientation }\n}\n\n/**\n * Collect cells (and unique merged cells) from a specific row.\n * - If `rowIndex` is provided, scans that row.\n * - If omitted, uses the first (topmost) selected row based on the current selection.\n */\nexport function getRowCells(\n editor: Editor | null,\n rowIndex?: number,\n tablePos?: number\n): { cells: CellInfo[]; mergedCells: CellInfo[] } {\n return collectCells(editor, \"row\", rowIndex, tablePos)\n}\n\n/**\n * Collect cells (and unique merged cells) from the current table.\n * - If `columnIndex` is provided, scans that column.\n * - If omitted, uses the first (leftmost) selected column based on the current selection.\n */\nexport function getColumnCells(\n editor: Editor | null,\n columnIndex?: number,\n tablePos?: number\n): { cells: CellInfo[]; mergedCells: CellInfo[] } {\n return collectCells(editor, \"column\", columnIndex, tablePos)\n}\n\n/**\n * After moving a row or column, update the selection to the moved item.\n *\n * This ensures that after a move operation, the selection remains on the\n * moved row or column, providing better user feedback.\n *\n * @param editor - The editor instance\n * @param orientation - \"row\" or \"column\" indicating what was moved\n * @param newIndex - The new index of the moved row/column\n * @param tablePos - Optional position of the table in the document\n */\nexport function updateSelectionAfterAction(\n editor: Editor,\n orientation: Orientation,\n newIndex: number,\n tablePos?: number\n): void {\n try {\n const table = getTable(editor, tablePos)\n if (!table) return\n\n const { state } = editor\n const { map } = table\n\n if (orientation === \"row\") {\n if (newIndex >= 0 && newIndex < map.height) {\n const startCol = 0\n const endCol = map.width - 1\n\n const startCellPos =\n table.start + map.positionAt(newIndex, startCol, table.node)\n const endCellPos =\n table.start + map.positionAt(newIndex, endCol, table.node)\n\n const $start = state.doc.resolve(startCellPos)\n const $end = state.doc.resolve(endCellPos)\n\n const newSelection = CellSelection.create(\n state.doc,\n $start.pos,\n $end.pos\n )\n const tr = state.tr.setSelection(newSelection)\n editor.view.dispatch(tr)\n }\n } else if (orientation === \"column\") {\n if (newIndex >= 0 && newIndex < map.width) {\n const startRow = 0\n const endRow = map.height - 1\n\n const startCellPos =\n table.start + map.positionAt(startRow, newIndex, table.node)\n const endCellPos =\n table.start + map.positionAt(endRow, newIndex, table.node)\n\n const $start = state.doc.resolve(startCellPos)\n const $end = state.doc.resolve(endCellPos)\n\n const newSelection = CellSelection.create(\n state.doc,\n $start.pos,\n $end.pos\n )\n const tr = state.tr.setSelection(newSelection)\n editor.view.dispatch(tr)\n }\n }\n } catch (error) {\n console.warn(\"Failed to update selection after move:\", error)\n }\n}\n\n/**\n * Returns a command that sets the given attributes to the given values,\n * and is only available when the currently selected cell doesn't\n * already have those attributes set to those values.\n *\n * @public\n */\nexport function setCellAttr(attrs: Record<string, unknown>): Command\nexport function setCellAttr(name: string, value: unknown): Command\nexport function setCellAttr(\n nameOrAttrs: string | Record<string, unknown>,\n value?: unknown\n): Command {\n return function (state, dispatch) {\n if (!isInTable(state)) return false\n const $cell = selectionCell(state)\n\n const attrs =\n typeof nameOrAttrs === \"string\" ? { [nameOrAttrs]: value } : nameOrAttrs\n\n if (dispatch) {\n const tr = state.tr\n if (state.selection instanceof CellSelection) {\n state.selection.forEachCell((node, pos) => {\n const needsUpdate = Object.entries(attrs).some(\n ([name, val]) => node.attrs[name] !== val\n )\n\n if (needsUpdate) {\n tr.setNodeMarkup(pos, null, {\n ...node.attrs,\n ...attrs,\n })\n }\n })\n } else {\n const needsUpdate = Object.entries(attrs).some(\n ([name, val]) => $cell.nodeAfter!.attrs[name] !== val\n )\n\n if (needsUpdate) {\n tr.setNodeMarkup($cell.pos, null, {\n ...$cell.nodeAfter!.attrs,\n ...attrs,\n })\n }\n }\n dispatch(tr)\n }\n return true\n }\n}\n\n/**\n * Counts how many consecutive empty rows exist at the bottom of a given table.\n *\n * This function:\n * - Locates the exact table in the document via reference matching\n * - Iterates from the last visual row upward\n * - Deduplicates cells per row using `TableMap` (merged cells can repeat positions)\n * - Treats a row as empty only if all its unique cells are empty by `isCellEmpty`\n *\n * @param editor - The editor whose document contains the table\n * @param target - The table node instance to analyze (must be the same reference as in the doc)\n * @returns The number of trailing empty rows (0 if table not found)\n */\nexport function countEmptyRowsFromEnd(\n editor: Editor,\n tablePos: number\n): number {\n return countEmptyCellsFromEnd(editor, tablePos, \"row\")\n}\n\n/**\n * Counts how many consecutive empty columns exist at the right edge of a given table.\n *\n * Similar to `countEmptyRowsFromEnd`, but scans by columns:\n * - Iterates from the last visual column leftward\n * - Deduplicates per-column cells using `TableMap`\n * - A column is empty only if all unique cells in that column are empty\n *\n * @param editor - The editor whose document contains the table\n * @param target - The table node instance to analyze (must be the same reference as in the doc)\n * @returns The number of trailing empty columns (0 if table not found)\n */\nexport function countEmptyColumnsFromEnd(\n editor: Editor,\n tablePos: number\n): number {\n return countEmptyCellsFromEnd(editor, tablePos, \"column\")\n}\n\n/**\n * Rounds a number with a symmetric \"dead-zone\" around integer boundaries,\n * which makes drag/resize UX feel less jittery near thresholds.\n *\n * For example, with `margin = 0.3`:\n * - values < n + 0.3 snap down to `n`\n * - values > n + 0.7 snap up to `n + 1`\n * - values in [n + 0.3, n + 0.7] fall back to `Math.round`\n *\n * @param num - The floating value to round\n * @param margin - Half-width of the dead-zone around integer boundaries (default 0.3)\n * @returns The rounded value using the dead-zone heuristic\n */\nexport function marginRound(num: number, margin = 0.3): number {\n const floor = Math.floor(num)\n const ceil = Math.ceil(num)\n const lowerBound = floor + margin\n const upperBound = ceil - margin\n\n if (num < lowerBound) return floor\n if (num > upperBound) return ceil\n return Math.round(num)\n}\n\n/**\n * Compares two DOMRect objects for equality.\n *\n * Treats `undefined` as a valid state, where two `undefined` rects are equal,\n * and `undefined` is not equal to any defined rect.\n *\n * @param a - The first DOMRect or undefined\n * @param b - The second DOMRect or undefined\n * @returns true if both rects are equal or both are undefined; false otherwise\n */\nexport function rectEq(a?: DOMRect | null, b?: DOMRect | null): boolean {\n if (!a && !b) return true\n if (!a || !b) return false\n return (\n a.left === b.left &&\n a.top === b.top &&\n a.width === b.width &&\n a.height === b.height\n )\n}\n\n/**\n * Applies the transaction based on the specified mode\n */\nfunction applySelectionWithMode(\n state: EditorState,\n transaction: Transaction,\n options: BaseSelectionOptions | DispatchSelectionOptions\n): EditorState | Transaction | void {\n const mode: SelectionReturnMode = options.mode ?? \"state\"\n\n switch (mode) {\n case \"dispatch\": {\n const dispatchOptions = options as DispatchSelectionOptions\n if (typeof dispatchOptions.dispatch === \"function\") {\n dispatchOptions.dispatch(transaction)\n }\n return\n }\n\n case \"transaction\":\n return transaction\n\n default: // \"state\"\n return state.apply(transaction)\n }\n}\n\n/**\n * Create or apply a `CellSelection` inside a table.\n *\n * Depending on the `mode` option, this helper behaves differently:\n *\n * - `\"state\"` (default) → Returns a new `EditorState` with the selection applied.\n * - `\"transaction\"` → Returns a `Transaction` with the selection set, without applying it.\n * - `\"dispatch\"` → Immediately calls `dispatch(tr)` with the new selection.\n *\n * This allows you to reuse the same helper in commands, tests, or utilities\n * without duplicating logic.\n *\n * Example:\n * ```ts\n * // Get new state\n * const nextState = createTableCellSelection(state, tablePosition, { row: 1, col: 1 }, { row: 2, col: 3 })\n *\n * // Get transaction only\n * const tr = createTableCellSelection(state, tablePosition, { row: 0, col: 0 }, { row: 0, col: 2 }, { mode: \"transaction\" })\n *\n * // Dispatch directly\n * createTableCellSelection(state, tablePosition, { row: 1, col: 1 }, { row: 3, col: 2 }, { mode: \"dispatch\", dispatch })\n * ```\n */\nexport function createTableCellSelection(\n state: EditorState,\n tablePosition: number,\n startCell: CellCoordinates,\n endCell?: CellCoordinates,\n options?: StateSelectionOptions\n): EditorState\nexport function createTableCellSelection(\n state: EditorState,\n tablePosition: number,\n startCell: CellCoordinates,\n endCell: CellCoordinates | undefined,\n options: TransactionSelectionOptions\n): Transaction\nexport function createTableCellSelection(\n state: EditorState,\n tablePosition: number,\n startCell: CellCoordinates,\n endCell: CellCoordinates | undefined,\n options: DispatchSelectionOptions\n): void\n\nexport function createTableCellSelection(\n state: EditorState,\n tablePosition: number,\n startCell: CellCoordinates,\n endCell: CellCoordinates = startCell,\n options: BaseSelectionOptions | DispatchSelectionOptions = { mode: \"state\" }\n): EditorState | Transaction | void {\n const startCellPosition = getCellPosition(state, tablePosition, startCell)\n const endCellPosition = getCellPosition(state, tablePosition, endCell)\n\n if (!startCellPosition || !endCellPosition) {\n return\n }\n\n const transaction = state.tr.setSelection(\n new CellSelection(startCellPosition, endCellPosition)\n )\n\n return applySelectionWithMode(state, transaction, options)\n}\n\n/**\n * Get the position of a cell inside a table by relative row/col indices.\n * Returns the position *before* the cell, which is what `CellSelection` expects.\n */\nexport function getCellPosition(\n state: EditorState,\n tablePosition: number,\n cellCoordinates: CellCoordinates\n) {\n const resolvedTablePosition = state.doc.resolve(tablePosition)\n const resolvedRowPosition = state.doc.resolve(\n resolvedTablePosition.posAtIndex(cellCoordinates.row) + 1\n )\n const resolvedColPosition = state.doc.resolve(\n resolvedRowPosition.posAtIndex(cellCoordinates.col)\n )\n\n const $cell = cellAround(resolvedColPosition)\n if (!$cell) return null\n\n return resolvedColPosition\n}\n\n/**\n * Selects table cells by their (row, col) coordinates.\n *\n * This function can be used in three modes:\n * - `\"state\"` (default) → Returns a new `EditorState` with the selection applied, or null if failed.\n * - `\"transaction\"` → Returns a `Transaction` with the selection set, or null if failed.\n * - `\"dispatch\"` → Immediately dispatches the selection and returns boolean success status.\n *\n * @param editor - The editor instance\n * @param tablePos - Position of the table in the document\n * @param coords - Array of {row, col} coordinates to select\n * @param options - Mode and dispatch options\n */\nexport function selectCellsByCoords(\n editor: Editor | null,\n tablePos: number,\n coords: { row: number; col: number }[],\n options?: StateSelectionOptions\n): EditorState\nexport function selectCellsByCoords(\n editor: Editor | null,\n tablePos: number,\n coords: { row: number; col: number }[],\n options: TransactionSelectionOptions\n): Transaction\nexport function selectCellsByCoords(\n editor: Editor | null,\n tablePos: number,\n coords: { row: number; col: number }[],\n options: DispatchSelectionOptions\n): void\nexport function selectCellsByCoords(\n editor: Editor | null,\n tablePos: number,\n coords: { row: number; col: number }[],\n options: BaseSelectionOptions | DispatchSelectionOptions = { mode: \"state\" }\n): EditorState | Transaction | void {\n if (!editor) return\n\n const table = getTable(editor, tablePos)\n if (!table) return\n\n const { state } = editor\n const tableMap = table.map\n\n const cleanedCoords = coords\n .map((coord) => ({\n row: clamp(coord.row, 0, tableMap.height - 1),\n col: clamp(coord.col, 0, tableMap.width - 1),\n }))\n .filter((coord) => isWithinBounds(coord.row, coord.col, tableMap))\n\n if (cleanedCoords.length === 0) {\n return\n }\n\n // --- Find the smallest rectangle that contains all our coordinates ---\n const allRows = cleanedCoords.map((coord) => coord.row)\n const topRow = Math.min(...allRows)\n const bottomRow = Math.max(...allRows)\n\n const allCols = cleanedCoords.map((coord) => coord.col)\n const leftCol = Math.min(...allCols)\n const rightCol = Math.max(...allCols)\n\n // --- Convert visual coordinates to document positions ---\n // Use TableMap.map array directly to handle merged cells correctly\n const getCellPositionFromMap = (row: number, col: number): number | null => {\n // TableMap.map is a flat array where each entry represents a cell\n // For merged cells, the same offset appears multiple times\n const cellOffset = tableMap.map[row * tableMap.width + col]\n if (cellOffset === undefined) return null\n\n // Convert the relative offset to an absolute position in the document\n // tablePos + 1 skips the table opening tag\n return tablePos + 1 + cellOffset\n }\n\n // Anchor = where the selection starts (top-left of bounding box)\n const anchorPosition = getCellPositionFromMap(topRow, leftCol)\n if (anchorPosition === null) return\n\n // Head = where the selection ends (usually bottom-right of bounding box)\n let headPosition = getCellPositionFromMap(bottomRow, rightCol)\n if (headPosition === null) return\n\n // --- Handle edge case with merged cells ---\n // If anchor and head point to the same cell, we need to find a different head\n // This happens when selecting a single merged cell or when all coords point to one cell\n if (headPosition === anchorPosition) {\n let foundDifferentCell = false\n\n // Search backwards from bottom-right to find a cell with a different position\n for (let row = bottomRow; row >= topRow && !foundDifferentCell; row--) {\n for (let col = rightCol; col >= leftCol && !foundDifferentCell; col--) {\n const candidatePosition = getCellPositionFromMap(row, col)\n\n if (\n candidatePosition !== null &&\n candidatePosition !== anchorPosition\n ) {\n headPosition = candidatePosition\n foundDifferentCell = true\n }\n }\n }\n }\n\n try {\n const anchorRef = state.doc.resolve(anchorPosition)\n const headRef = state.doc.resolve(headPosition)\n\n const cellSelection = new CellSelection(anchorRef, headRef)\n const transaction = state.tr.setSelection(cellSelection)\n\n return applySelectionWithMode(state, transaction, options)\n } catch (error) {\n console.error(\"Failed to create cell selection:\", error)\n return\n }\n}\n\n/**\n * Select the cell at (row, col) using `cellAround` to respect merged cells.\n *\n * @param editor Tiptap editor\n * @param row Row index (0-based)\n * @param col Column index (0-based)\n * @param tablePos Optional absolute position of the table node\n * @param dispatch Optional dispatch; defaults to editor.view.dispatch\n */\nexport function selectCellAt({\n editor,\n row,\n col,\n tablePos,\n dispatch,\n}: {\n editor: Editor | null\n row: number\n col: number\n tablePos?: number\n dispatch?: (tr: Transaction) => void\n}): boolean {\n if (!editor) return false\n\n const { state, view } = editor\n const found = getTable(editor, tablePos)\n if (!found) return false\n\n // Bounds check\n if (!isWithinBounds(row, col, found.map)) {\n return false\n }\n\n const relCellPos = found.map.positionAt(row, col, found.node)\n const absCellPos = found.start + relCellPos\n\n const $abs = state.doc.resolve(absCellPos)\n const $cell = cellAround($abs)\n const cellPos = $cell ? $cell.pos : absCellPos\n\n const sel = CellSelection.create(state.doc, cellPos)\n\n const doDispatch = dispatch ?? view?.dispatch\n if (!doDispatch) return false\n\n doDispatch(state.tr.setSelection(sel))\n return true\n}\n\n/**\n * Selects a boundary cell of the table based on orientation.\n *\n * For row orientation, selects the bottom-left cell of the table.\n * For column orientation, selects the top-right cell of the table.\n *\n * This function accounts for merged cells to ensure the correct cell is selected.\n *\n * @param editor The Tiptap editor instance\n * @param tableNode The table node\n * @param tablePos The position of the table node in the document\n * @param orientation \"row\" to select bottom-left, \"column\" to select top-right\n * @returns true if the selection was successful; false otherwise\n */\nexport function selectLastCell(\n editor: Editor,\n tableNode: Node,\n tablePos: number,\n orientation: Orientation\n) {\n const map = TableMap.get(tableNode)\n const isRow = orientation === \"row\"\n\n // For rows, select bottom-left cell; for columns, select top-right cell\n const row = isRow ? map.height - 1 : 0\n const col = isRow ? 0 : map.width - 1\n\n // Calculate the index in the table map\n const index = row * map.width + col\n\n // Get the actual cell position from the map (handles merged cells)\n const cellPos = map.map[index]\n if (!cellPos && cellPos !== 0) {\n console.warn(\"selectLastCell: cell position not found in map\", {\n index,\n row,\n col,\n map,\n })\n return false\n }\n\n // Find the row and column of the actual cell\n const cellIndex = map.map.indexOf(cellPos)\n const actualRow = cellIndex >= 0 ? Math.floor(cellIndex / map.width) : 0\n const actualCol = cellIndex >= 0 ? cellIndex % map.width : 0\n\n return selectCellAt({\n editor,\n row: actualRow,\n col: actualCol,\n tablePos,\n dispatch: editor.view.dispatch.bind(editor.view),\n })\n}\n\n/**\n * Get all (row, col) coordinates for a given row or column index.\n *\n * - If `orientation` is \"row\", returns all columns in that row.\n * - If `orientation` is \"column\", returns all rows in that column.\n *\n * Returns null if:\n * - the editor or table is not found\n * - the index is out of bounds\n *\n * @param editor The Tiptap editor instance\n * @param index The row or column index (0-based)\n * @param orientation \"row\" to get row coordinates, \"column\" for column coordinates\n * @param tablePos Optional position of the table node in the document\n * @returns Array of {row, col} objects or null if invalid\n */\nexport function getIndexCoordinates({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index: number\n orientation?: Orientation\n tablePos?: number\n}): { row: number; col: number }[] | null {\n if (!editor) return null\n\n const table = getTable(editor, tablePos)\n if (!table) return null\n\n const { map } = table\n const { width, height } = map\n\n if (index < 0) return null\n if (orientation === \"row\" && index >= height) return null\n if (orientation === \"column\" && index >= width) return null\n\n return orientation === \"row\"\n ? Array.from({ length: map.width }, (_, col) => ({ row: index, col }))\n : Array.from({ length: map.height }, (_, row) => ({ row, col: index }))\n}\n\n/**\n * Given a DOM cell element, find its (row, col) indices within the table.\n *\n * This function:\n * - Locates the nearest ancestor table element\n * - Uses the editor's document model to resolve the cell's position\n * - Traverses up the node hierarchy to find the corresponding table cell node\n * - Uses `TableMap` to translate the cell's position into (row, col) indices\n *\n * Returns null if:\n * - the table or cell cannot be found in the editor's document\n * - any error occurs during position resolution\n *\n * @param cell The HTMLTableCellElement (td or th)\n * @param tableNode The table node in the ProseMirror document\n * @param editor The Tiptap editor instance\n * @returns An object with { rowIndex, colIndex } or null if not found\n */\nexport function getCellIndicesFromDOM(\n cell: HTMLTableCellElement,\n tableNode: Node | null,\n editor: Editor\n): { rowIndex: number; colIndex: number } | null {\n if (!tableNode) return null\n\n try {\n const cellPos = editor.view.posAtDOM(cell, 0)\n const $cellPos = editor.view.state.doc.resolve(cellPos)\n\n for (let d = $cellPos.depth; d > 0; d--) {\n const node = $cellPos.node(d)\n if (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\") {\n const tableMap = TableMap.get(tableNode)\n const cellNodePos = $cellPos.before(d)\n const tableStart = $cellPos.start(d - 2)\n const cellOffset = cellNodePos - tableStart\n const cellIndex = tableMap.map.indexOf(cellOffset)\n\n return {\n rowIndex: Math.floor(cellIndex / tableMap.width),\n colIndex: cellIndex % tableMap.width,\n }\n }\n }\n } catch (error) {\n console.warn(\"Could not get cell position:\", error)\n }\n return null\n}\n\n/**\n * Given a DOM element inside a table, find the corresponding table node and its position.\n *\n * This function:\n * - Locates the nearest ancestor table element\n * - Uses the editor's document model to resolve the table's position\n * - Traverses up the node hierarchy to find the corresponding table node\n *\n * Returns null if:\n * - the table cannot be found in the editor's document\n * - any error occurs during position resolution\n *\n * @param tableElement The HTMLTableElement or an element inside it\n * @param editor The Tiptap editor instance\n * @returns An object with { node: tableNode, pos: tablePos } or null if not found\n */\nexport function getTableFromDOM(\n tableElement: HTMLElement,\n editor: Editor\n): { node: Node; pos: number } | null {\n try {\n const pos = editor.view.posAtDOM(tableElement, 0)\n const $pos = editor.view.state.doc.resolve(pos)\n\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d)\n if (isTableNode(node)) {\n return { node, pos: d === 0 ? 0 : $pos.before(d) }\n }\n }\n } catch (error) {\n console.warn(\"Could not get table from DOM:\", error)\n }\n return null\n}\n\n/**\n * Checks if a node is a table node\n */\nexport function isTableNode(node: Node | null | undefined): node is Node {\n return (\n !!node &&\n (node.type.name === \"table\" || node.type.spec.tableRole === \"table\")\n )\n}\n","import type { ViewMutationRecord } from \"@tiptap/pm/view\"\nimport { Table } from \"@tiptap/extension-table/table\"\nimport type {\n TableCellOptions,\n TableHeaderOptions,\n TableOptions,\n TableRowOptions,\n} from \"@tiptap/extension-table\"\nimport { TableCell, TableHeader, TableRow } from \"@tiptap/extension-table\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport { Extension } from \"@tiptap/core\"\nimport {\n cellAround,\n columnResizing,\n tableEditing,\n TableView,\n} from \"@tiptap/pm/tables\"\nimport { TextSelection } from \"@tiptap/pm/state\"\n\nimport {\n EMPTY_CELL_WIDTH,\n RESIZE_MIN_WIDTH,\n} from \"../lib/tiptap-table-utils\"\n\nexport const TableNode = Table.extend<TableOptions>({\n addProseMirrorPlugins() {\n const isResizable = this.options.resizable && this.editor.isEditable\n\n const defaultCellMinWidth =\n this.options.cellMinWidth < EMPTY_CELL_WIDTH\n ? EMPTY_CELL_WIDTH\n : this.options.cellMinWidth\n\n return [\n ...(isResizable\n ? [\n columnResizing({\n handleWidth: this.options.handleWidth,\n cellMinWidth: RESIZE_MIN_WIDTH,\n defaultCellMinWidth,\n View: null,\n lastColumnResizable: this.options.lastColumnResizable,\n }),\n ]\n : []),\n tableEditing({\n allowTableNodeSelection: this.options.allowTableNodeSelection,\n }),\n ]\n },\n\n addNodeView() {\n return ({ node, HTMLAttributes }) => {\n class TiptapTableView extends TableView {\n private readonly blockContainer: HTMLDivElement\n private readonly innerTableContainer: HTMLDivElement\n private readonly widgetsContainer: HTMLDivElement\n private readonly overlayContainer: HTMLDivElement\n\n declare readonly node: Node\n declare readonly minCellWidth: number\n private readonly containerAttributes: Record<string, string>\n\n constructor(\n node: Node,\n minCellWidth: number,\n containerAttributes: Record<string, string>\n ) {\n super(node, minCellWidth)\n\n this.containerAttributes = containerAttributes ?? {}\n\n this.blockContainer = this.createBlockContainer()\n this.innerTableContainer = this.createInnerTableContainer()\n this.widgetsContainer = this.createWidgetsContainer()\n this.overlayContainer = this.createOverlayContainer()\n\n this.setupDOMStructure()\n }\n\n private createBlockContainer(): HTMLDivElement {\n const container = document.createElement(\"div\")\n container.setAttribute(\"data-content-type\", \"table\")\n\n this.applyContainerAttributes(container)\n return container\n }\n\n private createInnerTableContainer(): HTMLDivElement {\n const container = document.createElement(\"div\")\n container.className = \"table-container\"\n return container\n }\n\n private createWidgetsContainer(): HTMLDivElement {\n const container = document.createElement(\"div\")\n container.className = \"table-controls\"\n container.style.position = \"relative\"\n return container\n }\n\n private createOverlayContainer(): HTMLDivElement {\n const container = document.createElement(\"div\")\n container.className = \"table-selection-overlay-container\"\n return container\n }\n\n private applyContainerAttributes(element: HTMLDivElement): void {\n Object.entries(this.containerAttributes).forEach(([key, value]) => {\n if (key !== \"class\") {\n element.setAttribute(key, value)\n }\n })\n }\n\n private setupDOMStructure(): void {\n const originalTable = this.dom\n const tableElement = originalTable.firstChild!\n\n // Move table into inner container\n this.innerTableContainer.appendChild(tableElement)\n\n // Build the hierarchy: blockContainer > originalTable > innerContainer + widgetsContainer\n originalTable.appendChild(this.innerTableContainer)\n originalTable.appendChild(this.widgetsContainer)\n originalTable.appendChild(this.overlayContainer)\n\n this.blockContainer.appendChild(originalTable)\n\n this.dom = this.blockContainer\n }\n\n ignoreMutation(mutation: ViewMutationRecord): boolean {\n const target = mutation.target as HTMLElement\n const isInsideTable = target.closest(\".table-container\")\n\n return !isInsideTable || super.ignoreMutation(mutation)\n }\n }\n\n const cellMinWidth =\n this.options.cellMinWidth < EMPTY_CELL_WIDTH\n ? EMPTY_CELL_WIDTH\n : this.options.cellMinWidth\n return new TiptapTableView(node, cellMinWidth, HTMLAttributes)\n }\n },\n})\n\nconst TableCellNode = TableCell.extend<TableCellOptions>({\n addKeyboardShortcuts() {\n return {\n ...this.parent?.(),\n \"Mod-a\": () => {\n const { state, view } = this.editor\n const { selection, doc } = state\n\n const $anchor = selection.$anchor\n const cellPos = cellAround($anchor)\n if (!cellPos) {\n return false\n }\n\n const cellNode = doc.nodeAt(cellPos.pos)\n if (!cellNode || !cellNode.textContent) {\n return false\n }\n\n const from = cellPos.pos + 1\n const to = cellPos.pos + cellNode.nodeSize - 1\n\n if (from >= to) {\n return true\n }\n\n const $from = doc.resolve(from)\n const $to = doc.resolve(to)\n\n const nextSel = TextSelection.between($from, $to, 1)\n if (!nextSel) {\n return true\n }\n\n if (state.selection.eq(nextSel)) {\n return true\n }\n\n view.dispatch(state.tr.setSelection(nextSel))\n return true\n },\n }\n },\n})\n\nexport interface TableNodeOptions {\n /**\n * If set to false, the table extension will not be registered\n * @example table: false\n */\n table: Partial<TableOptions> | false\n /**\n * If set to false, the table extension will not be registered\n * @example tableCell: false\n */\n tableCell: Partial<TableCellOptions> | false\n /**\n * If set to false, the table extension will not be registered\n * @example tableHeader: false\n */\n tableHeader: Partial<TableHeaderOptions> | false\n /**\n * If set to false, the table extension will not be registered\n * @example tableRow: false\n */\n tableRow: Partial<TableRowOptions> | false\n}\n\n/**\n * The table kit is a collection of table editor extensions.\n *\n * It’s a good starting point for building your own table in Tiptap.\n */\nexport const TableKit = Extension.create<TableNodeOptions>({\n name: \"tableKit\",\n\n addExtensions() {\n // noImplicitAny:false 的消费方编译此处时会把空数组推断为 never[],显式 any 避开\n const extensions: any[] = []\n\n if (this.options.table !== false) {\n extensions.push(TableNode.configure(this.options.table))\n }\n\n if (this.options.tableCell !== false) {\n extensions.push(TableCellNode.configure(this.options.tableCell))\n }\n\n if (this.options.tableHeader !== false) {\n extensions.push(TableHeader.configure(this.options.tableHeader))\n }\n\n if (this.options.tableRow !== false) {\n extensions.push(TableRow.configure(this.options.tableRow))\n }\n\n return extensions\n },\n})\n","import type { Editor } from \"@tiptap/core\"\n\nconst STYLE_PROPS: (keyof CSSStyleDeclaration | string)[] = [\n // Box & border\n \"boxSizing\",\n \"backgroundColor\",\n \"borderTopColor\",\n \"borderRightColor\",\n \"borderBottomColor\",\n \"borderLeftColor\",\n \"borderTopStyle\",\n \"borderRightStyle\",\n \"borderBottomStyle\",\n \"borderLeftStyle\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"borderRadius\",\n // Spacing\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n // Typography\n \"color\",\n \"font\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"fontStyle\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textTransform\",\n \"textDecoration\",\n \"textAlign\",\n \"verticalAlign\",\n \"whiteSpace\",\n // Sizing\n \"width\",\n \"minWidth\",\n \"maxWidth\",\n \"height\",\n \"minHeight\",\n \"maxHeight\",\n // Table specifics\n \"backgroundClip\",\n]\n\nconst toDash = (p: string) => p.replace(/[A-Z]/g, (m) => \"-\" + m.toLowerCase())\n\n/**\n * Copy a curated list of computed styles from source -> target\n * (Works for TD/TH and most inline content you'd expect inside.)\n */\nfunction copyComputedStyles(source: HTMLElement, target: HTMLElement) {\n const cs = getComputedStyle(source)\n\n for (const p of STYLE_PROPS) {\n const prop = String(p)\n const val = cs.getPropertyValue(toDash(prop))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (val) (target.style as any)[prop] = val\n }\n\n // Ensure long content doesn't overflow the drag image\n target.style.overflow = \"hidden\"\n target.style.textOverflow = \"ellipsis\"\n // Respect existing wrapping if set on the source; otherwise prefer single line\n if (cs.whiteSpace === \"\" || cs.whiteSpace === \"normal\") {\n target.style.whiteSpace = \"nowrap\"\n }\n}\n\n/**\n * Deep clone a node and copy computed styles element-by-element.\n * Avoids the browser's default cloning which loses computed styles.\n */\nfunction cloneWithStyles(root: HTMLElement): HTMLElement {\n const clone = root.cloneNode(true) as HTMLElement\n\n // Iterative walk to avoid recursion limits\n const q: Array<{ src: Element; dst: Element }> = [{ src: root, dst: clone }]\n while (q.length) {\n const { src, dst } = q.shift()!\n if (src instanceof HTMLElement && dst instanceof HTMLElement) {\n copyComputedStyles(src, dst)\n }\n const srcChildren = Array.from(src.children)\n const dstChildren = Array.from(dst.children)\n const len = Math.min(srcChildren.length, dstChildren.length)\n for (let i = 0; i < len; i++) {\n const srcChild = srcChildren[i]\n const dstChild = dstChildren[i]\n if (srcChild && dstChild) {\n q.push({ src: srcChild, dst: dstChild })\n }\n }\n }\n\n return clone\n}\n\n/**\n * Apply crisp, rounded, off-screen wrapper styling for drag image.\n */\nfunction styleDragWrapper(el: HTMLElement, maxWidth: number) {\n Object.assign(el.style, {\n position: \"fixed\",\n top: \"-10000px\",\n left: \"-10000px\",\n pointerEvents: \"none\",\n zIndex: \"2147483647\",\n maxWidth: `${maxWidth}px`,\n borderRadius: \"12px\",\n background: \"transparent\",\n filter:\n \"drop-shadow(0 8px 24px rgba(0,0,0,0.18)) drop-shadow(0 2px 8px rgba(0,0,0,0.10))\",\n overflow: \"hidden\",\n } as CSSStyleDeclaration)\n}\n\n/**\n * Scale an element down if it exceeds the max width, keeping crisp layout.\n * Assumes the element is already positioned off-screen (so attaching to body is safe).\n */\nfunction scaleToFit(el: HTMLElement, maxWidth: number): void {\n // Attach once (if not already) so measurements are correct.\n if (!el.isConnected) document.body.appendChild(el)\n const rect = el.getBoundingClientRect()\n if (rect.width > maxWidth && rect.width > 0) {\n const scale = maxWidth / rect.width\n el.style.transformOrigin = \"top left\"\n el.style.transform = `scale(${scale})`\n }\n}\n\n/**\n * Copy table-level styles that affect layout.\n */\nfunction applyTableBoxStyles(\n srcTable: HTMLTableElement,\n dstTable: HTMLTableElement\n) {\n const tcs = getComputedStyle(srcTable)\n dstTable.style.borderCollapse = tcs.borderCollapse\n dstTable.style.borderSpacing = tcs.borderSpacing\n dstTable.style.tableLayout = \"fixed\" // consistent drag image\n dstTable.className = srcTable.className\n}\n\n/**\n * Lock a cell's width to its rendered width.\n */\nfunction lockCellWidth(fromCell: HTMLElement, toCell: HTMLElement) {\n const rect = fromCell.getBoundingClientRect()\n if (rect.width > 0) {\n toCell.style.width = `${rect.width}px`\n toCell.style.maxWidth = `${rect.width}px`\n }\n}\n\n/**\n * Build a 1-row preview table.\n */\nfunction buildRowPreview(\n tableEl: HTMLTableElement,\n rowIndex: number\n): HTMLTableElement | null {\n const body = tableEl.tBodies?.[0] ?? tableEl.querySelector(\"tbody\")\n if (!body) return null\n\n const row = body.rows?.[rowIndex] as HTMLTableRowElement | undefined\n if (!row) return null\n\n const tableClone = document.createElement(\"table\")\n const tbodyClone = document.createElement(\"tbody\")\n const rowClone = cloneWithStyles(row) as HTMLTableRowElement\n\n applyTableBoxStyles(tableEl, tableClone)\n\n // Lock each cell width\n for (let i = 0; i < row.cells.length; i++) {\n const src = row.cells[i] as HTMLElement\n const dst = rowClone.cells[i] as HTMLElement | undefined\n if (dst) lockCellWidth(src, dst)\n }\n\n tbodyClone.appendChild(rowClone)\n tableClone.appendChild(tbodyClone)\n return tableClone\n}\n\n/**\n * Build a 1-column preview table (one cell per row).\n */\nfunction buildColumnPreview(\n tableEl: HTMLTableElement,\n colIndex: number\n): HTMLTableElement | null {\n const body = tableEl.tBodies?.[0] ?? tableEl.querySelector(\"tbody\")\n if (!body) return null\n\n const tableClone = document.createElement(\"table\")\n const tbodyClone = document.createElement(\"tbody\")\n applyTableBoxStyles(tableEl, tableClone)\n\n let firstCellWidth = 0\n\n for (let r = 0; r < body.rows.length; r++) {\n const srcRow = body.rows[r]\n if (!srcRow) continue\n const srcCell = srcRow.cells?.[colIndex] as HTMLElement | undefined\n if (!srcCell) continue\n\n const tr = document.createElement(\"tr\")\n const cellClone = cloneWithStyles(srcCell)\n\n const rect = srcCell.getBoundingClientRect()\n if (!firstCellWidth && rect.width > 0) firstCellWidth = rect.width\n lockCellWidth(srcCell, cellClone)\n\n tr.appendChild(cellClone)\n tbodyClone.appendChild(tr)\n }\n\n if (firstCellWidth > 0) {\n tableClone.style.width = `${firstCellWidth}px`\n tableClone.style.maxWidth = `${firstCellWidth}px`\n }\n\n tableClone.appendChild(tbodyClone)\n return tableClone\n}\n\n/**\n * Public API\n * Creates a polished drag image for a row/column from a TipTap/ProseMirror table.\n * - Subtle rounded corners & shadow\n * - Scales down if it exceeds editor width\n * - Preserves computed styles to look 1:1 with the table\n */\nexport function createTableDragImage(\n editor: Editor,\n orientation: \"row\" | \"col\",\n index: number,\n tablePos: number\n): HTMLElement {\n const editorRect = editor.view.dom.getBoundingClientRect()\n const maxWidth = Math.max(0, editorRect.width)\n\n const wrapper = document.createElement(\"div\")\n styleDragWrapper(wrapper, maxWidth)\n\n const tableEl = editor.view.nodeDOM(tablePos) as HTMLTableElement | null\n if (!tableEl) {\n document.body.appendChild(wrapper)\n return wrapper\n }\n\n const tableRect = tableEl.getBoundingClientRect()\n const dragWidth = Math.min(tableRect.width, editorRect.width)\n wrapper.style.width = `${dragWidth}px`\n\n const preview =\n orientation === \"row\"\n ? buildRowPreview(tableEl, index)\n : buildColumnPreview(tableEl, index)\n\n if (preview) {\n const card = document.createElement(\"div\")\n Object.assign(card.style, {\n background: \"var(--drag-image-bg, transparent)\",\n overflow: \"hidden\",\n } as CSSStyleDeclaration)\n\n card.appendChild(preview)\n wrapper.appendChild(card)\n }\n\n // Measure & scale after attaching\n scaleToFit(wrapper, maxWidth)\n\n return wrapper\n}\n// === END UTILS ===\n","import type { Editor } from \"@tiptap/core\"\nimport type { Node as TiptapNode } from \"@tiptap/pm/model\"\nimport type { PluginView, Transaction } from \"@tiptap/pm/state\"\nimport { Plugin, PluginKey, TextSelection } from \"@tiptap/pm/state\"\nimport { Decoration, DecorationSet, type EditorView } from \"@tiptap/pm/view\"\nimport {\n CellSelection,\n moveTableColumn,\n moveTableRow,\n TableMap,\n} from \"@tiptap/pm/tables\"\nimport {\n clamp,\n domCellAround,\n getCellIndicesFromDOM,\n getColumnCells,\n getIndexCoordinates,\n getRowCells,\n getTableFromDOM,\n isHTMLElement,\n isTableNode,\n safeClosest,\n selectCellsByCoords,\n} from \"../../lib/tiptap-table-utils\"\nimport { isValidPosition } from \"../../../../../lib/tiptap-utils\"\nimport { createTableDragImage } from \"./helpers/create-image\"\n\nexport type TableHandlesState = {\n show: boolean\n showAddOrRemoveRowsButton: boolean\n showAddOrRemoveColumnsButton: boolean\n referencePosCell?: DOMRect\n referencePosTable: DOMRect\n block: TiptapNode\n blockPos: number\n colIndex: number | undefined\n rowIndex: number | undefined\n draggingState?:\n | {\n draggedCellOrientation: \"row\" | \"col\"\n originalIndex: number\n mousePos: number\n initialOffset: number\n }\n | undefined\n widgetContainer: HTMLElement | undefined\n}\n\nfunction hideElements(selector: string, rootEl: Document | ShadowRoot) {\n rootEl.querySelectorAll<HTMLElement>(selector).forEach((el) => {\n el.style.visibility = \"hidden\"\n })\n}\n\nexport const tableHandlePluginKey = new PluginKey(\"tableHandlePlugin\")\n\nclass TableHandleView implements PluginView {\n public editor: Editor\n public editorView: EditorView\n\n public state: TableHandlesState | undefined = undefined\n public menuFrozen = false\n public mouseState: \"up\" | \"down\" | \"selecting\" = \"up\"\n public tableId: string | undefined\n public tablePos: number | undefined\n public tableElement: HTMLElement | undefined\n\n public emitUpdate: () => void\n\n constructor(\n editor: Editor,\n editorView: EditorView,\n emitUpdate: (state: TableHandlesState) => void\n ) {\n this.editor = editor\n this.editorView = editorView\n this.emitUpdate = () => this.state && emitUpdate(this.state)\n\n this.editorView.dom.addEventListener(\"mousemove\", this.mouseMoveHandler)\n this.editorView.dom.addEventListener(\"mousedown\", this.viewMousedownHandler)\n window.addEventListener(\"mouseup\", this.mouseUpHandler)\n\n this.editorView.root.addEventListener(\n \"dragover\",\n this.dragOverHandler as EventListener\n )\n this.editorView.root.addEventListener(\n \"drop\",\n this.dropHandler as unknown as EventListener\n )\n }\n\n private viewMousedownHandler = (event: MouseEvent) => {\n this.mouseState = \"down\"\n\n const { state, view } = this.editor\n if (!(state.selection instanceof CellSelection) || this.editor.isFocused)\n return\n\n const posInfo = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n if (!posInfo) return\n\n const $pos = state.doc.resolve(posInfo.pos)\n const { nodes } = state.schema\n let paraDepth = -1\n let inTableCell = false\n\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d)\n if (\n !inTableCell &&\n (node.type === nodes.tableCell || node.type === nodes.tableHeader)\n ) {\n inTableCell = true\n }\n if (paraDepth === -1 && node.type === nodes.paragraph) {\n paraDepth = d\n }\n if (inTableCell && paraDepth !== -1) break\n }\n\n if (!inTableCell || paraDepth === -1) return\n\n const from = $pos.start(paraDepth)\n const to = $pos.end(paraDepth)\n const nextSel = TextSelection.create(state.doc, from, to)\n if (state.selection.eq(nextSel)) return\n\n view.dispatch(state.tr.setSelection(nextSel))\n view.focus()\n }\n\n private mouseUpHandler = (event: MouseEvent) => {\n this.mouseState = \"up\"\n this.mouseMoveHandler(event)\n }\n\n private mouseMoveHandler = (event: MouseEvent) => {\n if (this.menuFrozen || this.mouseState === \"selecting\") return\n\n const target = event.target\n if (!isHTMLElement(target) || !this.editorView.dom.contains(target)) return\n\n this._handleMouseMoveNow(event)\n }\n\n private hideHandles() {\n if (!this.state?.show) return\n\n this.state = {\n ...this.state,\n show: false,\n showAddOrRemoveRowsButton: false,\n showAddOrRemoveColumnsButton: false,\n colIndex: undefined,\n rowIndex: undefined,\n referencePosCell: undefined,\n }\n this.emitUpdate()\n }\n\n private _handleMouseMoveNow(event: MouseEvent) {\n const around = domCellAround(event.target as Element)\n\n // Hide handles while selecting inside a cell\n if (\n around?.type === \"cell\" &&\n this.mouseState === \"down\" &&\n !this.state?.draggingState\n ) {\n this.mouseState = \"selecting\"\n this.hideHandles()\n return\n }\n\n if (!around || !this.editor.isEditable) {\n this.hideHandles()\n return\n }\n\n const tbody = around.tbodyNode\n if (!tbody) return\n\n const tableRect = tbody.getBoundingClientRect()\n const coords = this.editor.view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n if (!coords) return\n\n // Find the table node at this position\n const $pos = this.editor.view.state.doc.resolve(coords.pos)\n let blockInfo: { node: TiptapNode; pos: number } | undefined\n for (let d = $pos.depth; d >= 0; d--) {\n const node = $pos.node(d)\n if (isTableNode(node)) {\n blockInfo = { node, pos: d === 0 ? 0 : $pos.before(d) }\n break\n }\n }\n if (!blockInfo || blockInfo.node.type.name !== \"table\") return\n\n this.tableElement = this.editor.view.nodeDOM(blockInfo.pos) as\n | HTMLElement\n | undefined\n this.tablePos = blockInfo.pos\n this.tableId = blockInfo.node.attrs.id\n\n const wrapper = safeClosest<HTMLElement>(around.domNode, \".tableWrapper\")\n const widgetContainer = wrapper?.querySelector(\".table-controls\") as\n | HTMLElement\n | undefined\n\n // Hovering around the table (outside cells)\n if (around.type === \"wrapper\") {\n const below =\n event.clientY >= tableRect.bottom - 1 &&\n event.clientY < tableRect.bottom + 20\n const right =\n event.clientX >= tableRect.right - 1 &&\n event.clientX < tableRect.right + 20\n const cursorBeyondRightOrBottom =\n event.clientX > tableRect.right || event.clientY > tableRect.bottom\n\n this.state = {\n ...this.state,\n show: true,\n showAddOrRemoveRowsButton: below,\n showAddOrRemoveColumnsButton: right,\n referencePosTable: tableRect,\n block: blockInfo.node,\n blockPos: blockInfo.pos,\n widgetContainer,\n colIndex: cursorBeyondRightOrBottom ? undefined : this.state?.colIndex,\n rowIndex: cursorBeyondRightOrBottom ? undefined : this.state?.rowIndex,\n referencePosCell: cursorBeyondRightOrBottom\n ? undefined\n : this.state?.referencePosCell,\n }\n } else {\n // Hovering over a cell\n const cellPosition = getCellIndicesFromDOM(\n around.domNode as HTMLTableCellElement,\n blockInfo.node,\n this.editor\n )\n if (!cellPosition) return\n\n const { rowIndex, colIndex } = cellPosition\n const cellRect = (around.domNode as HTMLElement).getBoundingClientRect()\n const lastRowIndex = blockInfo.node.content.childCount - 1\n const lastColIndex =\n (blockInfo.node.content.firstChild?.content.childCount ?? 0) - 1\n\n // Skip update if same cell\n if (\n this.state?.show &&\n this.tableId === blockInfo.node.attrs.id &&\n this.state.rowIndex === rowIndex &&\n this.state.colIndex === colIndex\n ) {\n return\n }\n\n this.state = {\n show: true,\n showAddOrRemoveColumnsButton: colIndex === lastColIndex,\n showAddOrRemoveRowsButton: rowIndex === lastRowIndex,\n referencePosTable: tableRect,\n block: blockInfo.node,\n blockPos: blockInfo.pos,\n draggingState: undefined,\n referencePosCell: cellRect,\n colIndex,\n rowIndex,\n widgetContainer,\n }\n }\n\n this.emitUpdate()\n return false\n }\n\n dragOverHandler = (event: DragEvent) => {\n if (this.state?.draggingState === undefined) {\n return\n }\n\n event.preventDefault()\n event.dataTransfer!.dropEffect = \"move\"\n\n hideElements(\n \".prosemirror-dropcursor-block, .prosemirror-dropcursor-inline\",\n this.editorView.root\n )\n\n // The mouse cursor coordinates, bounded to the table's bounding box.\n const {\n left: tableLeft,\n right: tableRight,\n top: tableTop,\n bottom: tableBottom,\n } = this.state.referencePosTable\n\n const boundedMouseCoords = {\n left: clamp(event.clientX, tableLeft + 1, tableRight - 1),\n top: clamp(event.clientY, tableTop + 1, tableBottom - 1),\n }\n\n // Gets the table cell element\n const tableCellElements = this.editorView.root\n .elementsFromPoint(boundedMouseCoords.left, boundedMouseCoords.top)\n .filter((element) => element.tagName === \"TD\" || element.tagName === \"TH\")\n if (tableCellElements.length === 0) {\n return\n }\n const tableCellElement = tableCellElements[0]\n if (!isHTMLElement(tableCellElement)) {\n return\n }\n\n const cellPosition = getCellIndicesFromDOM(\n tableCellElement as HTMLTableCellElement,\n this.state.block,\n this.editor\n )\n if (!cellPosition) return\n\n const { rowIndex, colIndex } = cellPosition\n\n // Check what changed\n const oldIndex =\n this.state.draggingState.draggedCellOrientation === \"row\"\n ? this.state.rowIndex\n : this.state.colIndex\n const newIndex =\n this.state.draggingState.draggedCellOrientation === \"row\"\n ? rowIndex\n : colIndex\n const dispatchDecorationsTransaction = newIndex !== oldIndex\n\n const mousePos =\n this.state.draggingState.draggedCellOrientation === \"row\"\n ? boundedMouseCoords.top\n : boundedMouseCoords.left\n\n // Check if anything needs updating\n const cellChanged =\n this.state.rowIndex !== rowIndex || this.state.colIndex !== colIndex\n const mousePosChanged = this.state.draggingState.mousePos !== mousePos\n\n if (cellChanged || mousePosChanged) {\n this.state = {\n ...this.state,\n rowIndex: rowIndex,\n colIndex: colIndex,\n referencePosCell: tableCellElement.getBoundingClientRect(),\n draggingState: {\n ...this.state.draggingState,\n mousePos: mousePos,\n },\n }\n\n this.emitUpdate()\n }\n\n // Dispatch decorations transaction if needed\n if (dispatchDecorationsTransaction) {\n this.editor.view.dispatch(\n this.editor.state.tr.setMeta(tableHandlePluginKey, true)\n )\n }\n }\n\n dropHandler = () => {\n this.mouseState = \"up\"\n\n const st = this.state\n if (!st?.draggingState) return false\n\n const { draggingState, rowIndex, colIndex, blockPos } = st\n if (!isValidPosition(blockPos)) return false\n\n if (\n (draggingState.draggedCellOrientation === \"row\" &&\n rowIndex === undefined) ||\n (draggingState.draggedCellOrientation === \"col\" && colIndex === undefined)\n ) {\n throw new Error(\n \"Attempted to drop table row or column, but no table block was hovered prior.\"\n )\n }\n\n const isRow = draggingState.draggedCellOrientation === \"row\"\n const orientation = isRow ? \"row\" : \"column\"\n const destIndex = isRow ? rowIndex! : colIndex!\n\n const cellCoords = getIndexCoordinates({\n editor: this.editor,\n index: draggingState.originalIndex,\n orientation,\n tablePos: blockPos,\n })\n if (!cellCoords) return false\n\n const stateWithCellSel = selectCellsByCoords(\n this.editor,\n blockPos,\n cellCoords,\n { mode: \"state\" }\n )\n if (!stateWithCellSel) return false\n\n const dispatch = (tr: Transaction) => this.editor.view.dispatch(tr)\n\n if (isRow) {\n moveTableRow({\n from: draggingState.originalIndex,\n to: destIndex,\n select: true,\n pos: blockPos + 1,\n })(stateWithCellSel, dispatch)\n } else {\n moveTableColumn({\n from: draggingState.originalIndex,\n to: destIndex,\n select: true,\n pos: blockPos + 1,\n })(stateWithCellSel, dispatch)\n }\n\n this.state = { ...st, draggingState: undefined }\n this.emitUpdate()\n\n this.editor.view.dispatch(\n this.editor.state.tr.setMeta(tableHandlePluginKey, null)\n )\n\n return true\n }\n\n update(view: EditorView): void {\n const pluginState = tableHandlePluginKey.getState(view.state)\n if (pluginState !== undefined && pluginState !== this.menuFrozen) {\n this.menuFrozen = pluginState\n }\n\n if (!this.state?.show) return\n\n if (!this.tableElement?.isConnected) {\n this.hideHandles()\n return\n }\n\n const tableInfo = getTableFromDOM(this.tableElement, this.editor)\n if (!tableInfo) {\n this.hideHandles()\n return\n }\n\n // Check if table changed\n const blockChanged =\n this.state.block !== tableInfo.node ||\n this.state.blockPos !== tableInfo.pos\n\n if (\n !tableInfo.node ||\n tableInfo.node.type.name !== \"table\" ||\n !this.tableElement?.isConnected\n ) {\n this.hideHandles()\n return\n }\n\n const { height: rowCount, width: colCount } = TableMap.get(tableInfo.node)\n\n // Calculate new indices\n let newRowIndex = this.state.rowIndex\n let newColIndex = this.state.colIndex\n\n // Clamp indices if rows/columns were deleted\n if (newRowIndex !== undefined && newRowIndex >= rowCount) {\n newRowIndex = rowCount ? rowCount - 1 : undefined\n }\n if (newColIndex !== undefined && newColIndex >= colCount) {\n newColIndex = colCount ? colCount - 1 : undefined\n }\n\n const tableBody = this.tableElement.querySelector(\"tbody\")\n if (!tableBody) {\n throw new Error(\n \"Table block does not contain a 'tbody' HTML element. This should never happen.\"\n )\n }\n\n // Calculate new reference positions\n let newReferencePosCell = this.state.referencePosCell\n if (newRowIndex !== undefined && newColIndex !== undefined) {\n const rowEl = tableBody.children[newRowIndex]\n const cellEl = rowEl?.children[newColIndex]\n\n if (cellEl) {\n newReferencePosCell = cellEl.getBoundingClientRect()\n } else {\n newRowIndex = undefined\n newColIndex = undefined\n newReferencePosCell = undefined\n }\n }\n\n const newReferencePosTable = tableBody.getBoundingClientRect()\n\n // Check if anything changed\n const indicesChanged =\n newRowIndex !== this.state.rowIndex || newColIndex !== this.state.colIndex\n const refPosChanged =\n newReferencePosCell !== this.state.referencePosCell ||\n newReferencePosTable !== this.state.referencePosTable\n\n if (blockChanged || indicesChanged || refPosChanged) {\n this.state = {\n ...this.state,\n block: tableInfo.node,\n blockPos: tableInfo.pos,\n rowIndex: newRowIndex,\n colIndex: newColIndex,\n referencePosCell: newReferencePosCell,\n referencePosTable: newReferencePosTable,\n }\n this.emitUpdate()\n }\n }\n\n destroy(): void {\n this.editorView.dom.removeEventListener(\n \"mousemove\",\n this.mouseMoveHandler as EventListener\n )\n window.removeEventListener(\"mouseup\", this.mouseUpHandler as EventListener)\n this.editorView.dom.removeEventListener(\n \"mousedown\",\n this.viewMousedownHandler as EventListener\n )\n this.editorView.root.removeEventListener(\n \"dragover\",\n this.dragOverHandler as EventListener\n )\n this.editorView.root.removeEventListener(\n \"drop\",\n this.dropHandler as unknown as EventListener\n )\n }\n}\n\nlet tableHandleView: TableHandleView | null = null\n\nexport function TableHandlePlugin(\n editor: Editor,\n emitUpdate: (state: TableHandlesState) => void\n): Plugin {\n return new Plugin({\n key: tableHandlePluginKey,\n\n state: {\n init: () => false,\n apply: (tr, frozen) => {\n const meta = tr.getMeta(tableHandlePluginKey)\n return meta !== undefined ? meta : frozen\n },\n },\n\n view: (editorView) => {\n tableHandleView = new TableHandleView(editor, editorView, emitUpdate)\n\n return tableHandleView\n },\n\n props: {\n decorations: (state) => {\n if (!tableHandleView) return null\n\n if (\n tableHandleView === undefined ||\n tableHandleView.state === undefined ||\n tableHandleView.state.draggingState === undefined ||\n tableHandleView.tablePos === undefined\n ) {\n return\n }\n\n const newIndex =\n tableHandleView.state.draggingState.draggedCellOrientation === \"row\"\n ? tableHandleView.state.rowIndex\n : tableHandleView.state.colIndex\n\n if (newIndex === undefined) {\n return\n }\n\n const decorations: Decoration[] = []\n const { draggingState } = tableHandleView.state\n const { originalIndex } = draggingState\n\n if (\n tableHandleView.state.draggingState.draggedCellOrientation === \"row\"\n ) {\n const originalCells = getRowCells(\n editor,\n originalIndex,\n tableHandleView.state.blockPos\n )\n originalCells.cells.forEach((cell) => {\n if (cell.node) {\n decorations.push(\n Decoration.node(cell.pos, cell.pos + cell.node.nodeSize, {\n class: \"table-cell-dragging-source\",\n })\n )\n }\n })\n } else {\n const originalCells = getColumnCells(\n editor,\n originalIndex,\n tableHandleView.state.blockPos\n )\n originalCells.cells.forEach((cell) => {\n if (cell.node) {\n decorations.push(\n Decoration.node(cell.pos, cell.pos + cell.node.nodeSize, {\n class: \"table-cell-dragging-source\",\n })\n )\n }\n })\n }\n\n // Return empty decorations if:\n // - original index is same as new index (no change)\n // - editor is not defined for some reason\n if (newIndex === originalIndex || !editor) {\n return DecorationSet.create(state.doc, decorations)\n }\n\n if (\n tableHandleView.state.draggingState.draggedCellOrientation === \"row\"\n ) {\n const cellsInRow = getRowCells(\n editor,\n newIndex,\n tableHandleView.state.blockPos\n )\n\n cellsInRow.cells.forEach((cell) => {\n const cellNode = cell.node\n if (!cellNode) {\n return\n }\n\n // Creates a decoration at the start or end of each cell,\n // depending on whether the new index is before or after the\n // original index.\n const decorationPos =\n cell.pos + (newIndex > originalIndex ? cellNode.nodeSize - 2 : 2)\n decorations.push(\n Decoration.widget(decorationPos, () => {\n const widget = document.createElement(\"div\")\n widget.className = \"tiptap-table-dropcursor\"\n widget.style.left = \"0\"\n widget.style.right = \"0\"\n // This is only necessary because the drop indicator's height\n // is an even number of pixels, whereas the border between\n // table cells is an odd number of pixels. So this makes the\n // positioning slightly more consistent regardless of where\n // the row is being dropped.\n if (newIndex > originalIndex) {\n widget.style.bottom = \"-1px\"\n } else {\n widget.style.top = \"-1px\"\n }\n widget.style.height = \"3px\"\n\n return widget\n })\n )\n })\n } else {\n const cellsInColumn = getColumnCells(\n editor,\n newIndex,\n tableHandleView.state.blockPos\n )\n cellsInColumn.cells.forEach((cell) => {\n const cellNode = cell.node\n if (!cellNode) {\n return\n }\n // Creates a decoration at the start or end of each cell,\n // depending on whether the new index is before or after the\n // original index.\n const decorationPos =\n cell.pos + (newIndex > originalIndex ? cellNode.nodeSize - 2 : 2)\n decorations.push(\n Decoration.widget(decorationPos, () => {\n const widget = document.createElement(\"div\")\n widget.className = \"tiptap-table-dropcursor\"\n widget.style.top = \"0\"\n widget.style.bottom = \"0\"\n // This is only necessary because the drop indicator's width\n // is an even number of pixels, whereas the border between\n // table cells is an odd number of pixels. So this makes the\n // positioning slightly more consistent regardless of where\n // the column is being dropped.\n if (newIndex > originalIndex) {\n widget.style.right = \"-1px\"\n } else {\n widget.style.left = \"-1px\"\n }\n widget.style.width = \"3px\"\n return widget\n })\n )\n })\n }\n\n return DecorationSet.create(state.doc, decorations)\n },\n },\n })\n}\n\n/**\n * Shared drag start handler for table rows and columns\n */\nconst tableDragStart = (\n orientation: \"col\" | \"row\",\n event: {\n dataTransfer: DataTransfer | null\n currentTarget: EventTarget & Element\n clientX: number\n clientY: number\n }\n) => {\n if (!tableHandleView?.state) {\n throw new Error(\n `Attempted to drag table ${orientation}, but no table block was hovered prior.`\n )\n }\n\n const { state, editor } = tableHandleView\n const index = orientation === \"col\" ? state.colIndex : state.rowIndex\n\n if (index === undefined) {\n throw new Error(\n `Attempted to drag table ${orientation}, but no table block was hovered prior.`\n )\n }\n\n const { blockPos, referencePosCell } = state\n const mousePos = orientation === \"col\" ? event.clientX : event.clientY\n\n // Clear cell selection to prevent table reference collapse\n if (editor.state.selection instanceof CellSelection) {\n const safeSel = TextSelection.near(editor.state.doc.resolve(blockPos), 1)\n editor.view.dispatch(editor.state.tr.setSelection(safeSel))\n }\n\n const dragImage = createTableDragImage(editor, orientation, index, blockPos)\n\n // Configure drag image\n if (event.dataTransfer) {\n const handleRect = (\n event.currentTarget as HTMLElement\n ).getBoundingClientRect()\n const offset =\n orientation === \"col\"\n ? { x: handleRect.width / 2, y: 0 }\n : { x: 0, y: handleRect.height / 2 }\n\n event.dataTransfer.effectAllowed =\n orientation === \"col\" ? \"move\" : \"copyMove\"\n event.dataTransfer.setDragImage(dragImage, offset.x, offset.y)\n }\n\n // Cleanup drag image\n const cleanup = () => dragImage.parentNode?.removeChild(dragImage)\n document.addEventListener(\"drop\", cleanup, { once: true })\n document.addEventListener(\"dragend\", cleanup, { once: true })\n\n const initialOffset = referencePosCell\n ? (orientation === \"col\" ? referencePosCell.left : referencePosCell.top) -\n mousePos\n : 0\n\n // Update dragging state\n tableHandleView.state = {\n ...state,\n draggingState: {\n draggedCellOrientation: orientation,\n originalIndex: index,\n mousePos,\n initialOffset,\n },\n }\n tableHandleView.emitUpdate()\n editor.view.dispatch(editor.state.tr.setMeta(tableHandlePluginKey, true))\n}\n\n/**\n * Callback for column drag handle\n */\nexport const colDragStart = (event: {\n dataTransfer: DataTransfer | null\n currentTarget: EventTarget & Element\n clientX: number\n}) => tableDragStart(\"col\", { ...event, clientY: 0 })\n\n/**\n * Callback for row drag handle\n */\nexport const rowDragStart = (event: {\n dataTransfer: DataTransfer | null\n currentTarget: EventTarget & Element\n clientY: number\n}) => tableDragStart(\"row\", { ...event, clientX: 0 })\n\n/**\n * Drag end cleanup\n */\nexport const dragEnd = () => {\n if (!tableHandleView || tableHandleView.state === undefined) {\n return\n }\n\n tableHandleView.state = {\n ...tableHandleView.state,\n draggingState: undefined,\n }\n tableHandleView.emitUpdate()\n\n const editor = tableHandleView.editor\n editor.view.dispatch(editor.state.tr.setMeta(tableHandlePluginKey, null))\n}\n","import { Extension } from \"@tiptap/core\"\nimport type { TableHandlesState } from \".\"\nimport {\n TableHandlePlugin,\n tableHandlePluginKey,\n} from \"./table-handle-plugin\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n tableHandle: {\n freezeHandles: () => ReturnType\n unfreezeHandles: () => ReturnType\n }\n }\n\n interface EditorEvents {\n tableHandleState: TableHandlesState\n }\n}\n\nexport const TableHandleExtension = Extension.create({\n name: \"tableHandleExtension\",\n\n addCommands() {\n return {\n freezeHandles:\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) tr.setMeta(tableHandlePluginKey, true)\n return true\n },\n\n unfreezeHandles:\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) tr.setMeta(tableHandlePluginKey, false)\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n return [\n TableHandlePlugin(editor, (state) => {\n this.editor.emit(\"tableHandleState\", state)\n }),\n ]\n },\n})\n","import {\n offset,\n size,\n useFloating,\n useTransitionStyles,\n} from \"@floating-ui/react\"\nimport { useEffect, useMemo } from \"react\"\nimport { clamp } from \"../../lib/tiptap-table-utils\"\n\ntype Orientation = \"row\" | \"col\" | \"cell\"\n\ntype DraggingState = {\n draggedCellOrientation: Exclude<Orientation, \"cell\">\n mousePos: number\n initialOffset?: number\n}\n\n/**\n * Creates a DOMRect for row handle positioning\n */\nfunction makeRowRect(\n cell: DOMRect,\n table: DOMRect,\n dragging?: DraggingState\n): DOMRect {\n if (dragging?.draggedCellOrientation === \"row\") {\n // Apply the initial offset to maintain handle position\n const adjustedY = dragging.mousePos + (dragging.initialOffset ?? 0)\n const clampedY = clamp(adjustedY, table.y, table.bottom - cell.height)\n return new DOMRect(table.x, clampedY, table.width, cell.height)\n }\n return new DOMRect(table.x, cell.y, table.width, cell.height)\n}\n\n/**\n * Creates a DOMRect for column handle positioning\n */\nfunction makeColRect(\n cell: DOMRect,\n table: DOMRect,\n dragging?: DraggingState\n): DOMRect {\n if (dragging?.draggedCellOrientation === \"col\") {\n // Apply the initial offset to maintain handle position\n const adjustedX = dragging.mousePos + (dragging.initialOffset ?? 0)\n const clampedX = clamp(adjustedX, table.x, table.right - cell.width)\n return new DOMRect(clampedX, table.y, cell.width, table.height)\n }\n return new DOMRect(cell.x, table.y, cell.width, table.height)\n}\n\n/**\n * Creates a DOMRect for cell handle positioning\n */\nfunction makeCellRect(cell: DOMRect): DOMRect {\n return new DOMRect(cell.x, cell.y, cell.width, 0)\n}\n\n/**\n * Gets the placement configuration for different handle orientations\n */\nfunction getPlacement(orientation: Orientation) {\n switch (orientation) {\n case \"row\":\n return \"left\" as const\n case \"col\":\n return \"top\" as const\n case \"cell\":\n default:\n return \"bottom-end\" as const\n }\n}\n\n/**\n * Gets the offset configuration for different handle orientations\n */\nfunction getOffset(orientation: Orientation) {\n switch (orientation) {\n case \"row\":\n return 4\n case \"col\":\n return 4\n case \"cell\":\n default:\n return { mainAxis: 1, crossAxis: -1 } as const\n }\n}\n\n/**\n * Factory function to create DOMRect based on orientation\n */\nfunction rectFactory(\n orientation: Orientation,\n cell: DOMRect,\n table: DOMRect,\n dragging?: DraggingState\n): DOMRect {\n switch (orientation) {\n case \"row\":\n return makeRowRect(cell, table, dragging)\n case \"col\":\n return makeColRect(cell, table, dragging)\n case \"cell\":\n default:\n return makeCellRect(cell)\n }\n}\n\n/**\n * Hook for positioning individual table handles using Floating UI\n */\nexport function useTableHandlePosition(\n orientation: Orientation,\n show: boolean,\n referencePosCell: DOMRect | null,\n referencePosTable: DOMRect | null,\n draggingState?: DraggingState\n): {\n isMounted: boolean\n ref: (node: HTMLElement | null) => void\n style: React.CSSProperties\n} {\n const placement = useMemo(() => getPlacement(orientation), [orientation])\n const offsetValue = useMemo(() => getOffset(orientation), [orientation])\n\n const { refs, update, context, floatingStyles } = useFloating({\n open: show,\n placement,\n middleware: [\n offset(offsetValue),\n size({\n apply({ rects, elements }) {\n if (!elements.floating) return\n\n const refWidth =\n (orientation === \"col\"\n ? (referencePosCell?.width ?? referencePosTable?.width)\n : referencePosTable?.width) ?? rects.reference.width\n\n const refHeight =\n (orientation === \"row\"\n ? (referencePosCell?.height ?? referencePosTable?.height)\n : referencePosTable?.height) ?? rects.reference.height\n\n // Set CSS custom properties for styling\n elements.floating.style.setProperty(\n \"--table-handle-ref-width\",\n `${refWidth}px`\n )\n elements.floating.style.setProperty(\n \"--table-handle-ref-height\",\n `${refHeight}px`\n )\n\n // Set the main size dimension based on orientation\n const mainSize = orientation === \"row\" ? refHeight : refWidth\n elements.floating.style.setProperty(\n \"--table-handle-available-size\",\n `${mainSize}px`\n )\n },\n }),\n ],\n })\n\n const { isMounted, styles } = useTransitionStyles(context)\n\n useEffect(() => {\n update()\n }, [\n update,\n show,\n orientation,\n referencePosCell,\n referencePosTable,\n draggingState,\n ])\n\n // Provide a virtual reference rect to Floating UI\n useEffect(() => {\n // Nothing to reference yet\n if (!referencePosCell || !referencePosTable) return\n\n // Ignore cell handle while dragging (matches original behavior)\n if (draggingState && orientation === \"cell\") return\n\n refs.setReference({\n getBoundingClientRect: () =>\n rectFactory(\n orientation,\n referencePosCell,\n referencePosTable,\n draggingState\n ),\n })\n }, [refs, orientation, referencePosCell, referencePosTable, draggingState])\n\n return useMemo(\n () => ({\n isMounted,\n ref: refs.setFloating,\n style: {\n display: \"flex\",\n ...styles,\n ...floatingStyles,\n },\n }),\n [isMounted, refs.setFloating, styles, floatingStyles]\n )\n}\n\n/**\n * Hook for managing positioning of all table handles (row, column, and cell)\n *\n * @param show - Whether handles should be shown\n * @param referencePosCell - The bounding rect of the current cell\n * @param referencePosTable - The bounding rect of the table\n * @param draggingState - Current dragging state if any\n * @returns Positioning data for all handle types\n */\nexport function useTableHandlePositioning(\n show: boolean,\n referencePosCell: DOMRect | null,\n referencePosTable: DOMRect | null,\n draggingState?: DraggingState\n) {\n const rowHandle = useTableHandlePosition(\n \"row\",\n show,\n referencePosCell,\n referencePosTable,\n draggingState\n )\n\n const colHandle = useTableHandlePosition(\n \"col\",\n show,\n referencePosCell,\n referencePosTable,\n draggingState\n )\n\n const cellHandle = useTableHandlePosition(\n \"cell\",\n show,\n referencePosCell,\n referencePosTable,\n draggingState\n )\n\n return useMemo(\n () => ({ rowHandle, colHandle, cellHandle }),\n [rowHandle, colHandle, cellHandle]\n )\n}\n","\"use client\"\n\nimport { useEffect, useState, useCallback, useRef } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { TableHandlesState } from \"../extensions/table-handle\"\nimport { useTiptapEditor } from \"../../../../hooks/use-tiptap-editor\"\n\nexport interface UseTableHandleStateConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * Initial state of the table handles\n */\n initialState?: TableHandlesState | null\n /**\n * Only update state when specific fields change\n */\n watchFields?: (keyof TableHandlesState)[]\n /**\n * Callback when state changes\n */\n onStateChange?: (state: TableHandlesState | null) => void\n}\n\nexport function useTableHandleState(config: UseTableHandleStateConfig = {}) {\n const {\n editor: providedEditor,\n initialState = null,\n watchFields,\n onStateChange,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [state, setState] = useState<TableHandlesState | null>(initialState)\n const prevStateRef = useRef<TableHandlesState | null>(initialState)\n\n const updateState = useCallback(\n (newState: TableHandlesState) => {\n if (watchFields && prevStateRef.current) {\n const shouldUpdate = watchFields.some(\n (field) => prevStateRef.current![field] !== newState[field]\n )\n if (!shouldUpdate) return\n }\n\n setState(newState)\n prevStateRef.current = newState\n onStateChange?.(newState)\n },\n [watchFields, onStateChange]\n )\n\n useEffect(() => {\n if (!editor) {\n setState(null)\n prevStateRef.current = null\n onStateChange?.(null)\n return\n }\n\n editor.on(\"tableHandleState\", updateState)\n\n return () => {\n editor.off(\"tableHandleState\", updateState)\n }\n }, [editor, onStateChange, updateState])\n\n return state\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const MoreVerticalIcon = 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=\"M10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 10 13.1046 10 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 5C10 3.89543 10.8954 3 12 3C13.1046 3 14 3.89543 14 5C14 6.10457 13.1046 7 12 7C10.8954 7 10 6.10457 10 5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 19C10 17.8954 10.8954 17 12 17C13.1046 17 14 17.8954 14 19C14 20.1046 13.1046 21 12 21C10.8954 21 10 20.1046 10 19Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nMoreVerticalIcon.displayName = \"MoreVerticalIcon\"\n","\"use client\"\n\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./input.scss\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"tiptap-input\"\n className={cn(\"tiptap-input\", className)}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as Ariakit from \"@ariakit/react\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./combobox.scss\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"../input-group\"\n\nfunction ComboboxProvider({ ...props }: Ariakit.ComboboxProviderProps) {\n return (\n <Ariakit.ComboboxProvider\n includesBaseElement={false}\n resetValueOnHide\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({ className, ...props }: Ariakit.ComboboxLabelProps) {\n return (\n <Ariakit.ComboboxLabel\n data-slot=\"tiptap-combobox-label\"\n className={cn(\"tiptap-combobox-label\", className)}\n {...props}\n />\n )\n}\n\nfunction Combobox({ className, ...props }: Ariakit.ComboboxProps) {\n return (\n <Ariakit.Combobox\n autoSelect\n {...props}\n className={cn(\"tiptap-combobox\", className)}\n />\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: Ariakit.ComboboxProps & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(className)}>\n <Ariakit.Combobox\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <Ariakit.ComboboxDisclosure\n render={\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n data-slot=\"input-group-button\"\n disabled={disabled}\n />\n }\n />\n )}\n {showClear && <ComboboxCancel disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxCancel({ className, ...props }: Ariakit.ComboboxCancelProps) {\n return (\n <Ariakit.ComboboxCancel\n data-slot=\"tiptap-combobox-cancel\"\n className={cn(\"tiptap-combobox-cancel\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxDisclosure({\n className,\n ...props\n}: Ariakit.ComboboxDisclosureProps) {\n return (\n <Ariakit.ComboboxDisclosure\n data-slot=\"tiptap-combobox-disclosure\"\n className={cn(\"tiptap-combobox-disclosure\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxValue({ ...props }: Ariakit.ComboboxValueProps) {\n return <Ariakit.ComboboxValue data-slot=\"tiptap-combobox-value\" {...props} />\n}\n\nfunction ComboboxList({ className, ...props }: Ariakit.ComboboxListProps) {\n return (\n <Ariakit.ComboboxList\n data-slot=\"tiptap-combobox-list\"\n className={cn(\"tiptap-combobox-list\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxPopover({\n className,\n ...props\n}: Ariakit.ComboboxPopoverProps) {\n return (\n <Ariakit.ComboboxPopover\n data-slot=\"tiptap-combobox-popover\"\n className={cn(\"tiptap-combobox-popover\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: Ariakit.ComboboxGroupProps) {\n return (\n <Ariakit.ComboboxGroup\n data-slot=\"tiptap-combobox-group\"\n className={cn(\"tiptap-combobox-group\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxGroupLabel({\n className,\n ...props\n}: Ariakit.ComboboxGroupLabelProps) {\n return (\n <Ariakit.ComboboxGroupLabel\n data-slot=\"tiptap-combobox-group-label\"\n className={cn(\"tiptap-combobox-group-label\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxRow({ className, ...props }: Ariakit.ComboboxRowProps) {\n return (\n <Ariakit.ComboboxRow\n data-slot=\"tiptap-combobox-row\"\n className={cn(\"tiptap-combobox-row\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({ className, ...props }: Ariakit.ComboboxItemProps) {\n return (\n <Ariakit.ComboboxItem\n data-slot=\"tiptap-combobox-item\"\n className={cn(\"tiptap-combobox-item\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxItemCheck({\n className,\n ...props\n}: Ariakit.ComboboxItemCheckProps) {\n return (\n <Ariakit.ComboboxItemCheck\n data-slot=\"tiptap-combobox-item-check\"\n className={cn(\"tiptap-combobox-item-check\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxItemValue({\n className,\n ...props\n}: Ariakit.ComboboxItemValueProps) {\n return (\n <Ariakit.ComboboxItemValue\n data-slot=\"tiptap-combobox-item-value\"\n className={cn(\"tiptap-combobox-item-value\", className)}\n {...props}\n />\n )\n}\n\nexport {\n ComboboxProvider,\n ComboboxLabel,\n Combobox,\n ComboboxInput,\n ComboboxCancel,\n ComboboxDisclosure,\n ComboboxValue,\n ComboboxList,\n ComboboxPopover,\n ComboboxGroup,\n ComboboxGroupLabel,\n ComboboxRow,\n ComboboxItem,\n ComboboxItemCheck,\n ComboboxItemValue,\n}\n","import * as Ariakit from \"@ariakit/react\"\nimport { useCallback, useMemo, useRef, useState } from \"react\"\n\n// -- Hooks --\nimport { useOnClickOutside } from \"../../../hooks/use-on-click-outside\"\nimport { useComposedRef } from \"../../../hooks/use-composed-ref\"\n\n// -- Utils --\nimport { cn } from \"../../../lib/tiptap-utils\"\n\n// -- UI Primitives --\nimport {\n ComboboxItem,\n ComboboxProvider,\n} from \"../combobox\"\n\n// -- Local imports --\nimport type {\n MenuProps,\n MenuContentProps,\n MenuItemProps,\n} from \".\"\nimport {\n SearchableContext,\n MenuContext,\n useSearchableContext,\n useMenuContext,\n} from \".\"\nimport {\n useMenuPlacement,\n useMenuItemClick,\n} from \".\"\n\n// -- Styles --\nimport \"./menu.scss\"\n\nexport function MenuProvider({ ...props }: Ariakit.MenuProviderProps) {\n return <Ariakit.MenuProvider {...props} />\n}\n\nexport function Menu({\n children,\n trigger,\n value,\n onOpenChange,\n onValueChange,\n onValuesChange,\n ...props\n}: MenuProps) {\n const isRootMenu = !Ariakit.useMenuContext()\n const [open, setOpen] = useState<boolean>(false)\n const searchable = !!onValuesChange || isRootMenu\n\n const handleOpenChange = useCallback(\n (v: boolean) => {\n if (props.open === undefined) {\n setOpen(v)\n }\n onOpenChange?.(v)\n },\n [props.open, onOpenChange]\n )\n\n const menuContextValue = useMemo(\n () => ({\n isRootMenu,\n open: props.open ?? open,\n }),\n [isRootMenu, props.open, open]\n )\n\n const menuProvider = (\n <Ariakit.MenuProvider\n open={open}\n setOpen={handleOpenChange}\n setValues={onValuesChange}\n showTimeout={100}\n {...props}\n >\n {trigger}\n <MenuContext.Provider value={menuContextValue}>\n <SearchableContext.Provider value={searchable}>\n {children}\n </SearchableContext.Provider>\n </MenuContext.Provider>\n </Ariakit.MenuProvider>\n )\n\n if (searchable) {\n return (\n <ComboboxProvider value={value} setValue={onValueChange}>\n {menuProvider}\n </ComboboxProvider>\n )\n }\n\n return menuProvider\n}\n\nexport function MenuContent({\n children,\n className,\n ref,\n onClickOutside,\n ...props\n}: MenuContentProps) {\n const menuRef = useRef<HTMLDivElement | null>(null)\n const { open } = useMenuContext()\n const side = useMenuPlacement()\n\n useOnClickOutside(menuRef, onClickOutside || (() => {}))\n\n return (\n <Ariakit.Menu\n ref={useComposedRef(menuRef, ref)}\n className={cn(\"tiptap-menu-content\", className)}\n data-side={side}\n data-state={open ? \"open\" : \"closed\"}\n gutter={4}\n flip\n unmountOnHide\n {...props}\n >\n {children}\n </Ariakit.Menu>\n )\n}\n\nexport function MenuList({ className, ...props }: Ariakit.MenuListProps) {\n return (\n <Ariakit.MenuList\n data-slot=\"tiptap-menu-list\"\n className={cn(\"tiptap-menu-list\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuButton({ className, ...props }: Ariakit.MenuButtonProps) {\n return (\n <Ariakit.MenuButton\n {...props}\n className={cn(\"tiptap-menu-button\", className)}\n />\n )\n}\n\nexport function MenuButtonArrow({\n className,\n ...props\n}: Ariakit.MenuButtonArrowProps) {\n return (\n <Ariakit.MenuButtonArrow\n {...props}\n className={cn(\"tiptap-menu-button-arrow\", className)}\n />\n )\n}\n\nexport function MenuArrow({ className, ...props }: Ariakit.MenuArrowProps) {\n return (\n <Ariakit.MenuArrow\n data-slot=\"tiptap-menu-arrow\"\n className={cn(\"tiptap-menu-arrow\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuHeading({ className, ...props }: Ariakit.MenuHeadingProps) {\n return (\n <Ariakit.MenuHeading\n data-slot=\"tiptap-menu-heading\"\n className={cn(\"tiptap-menu-heading\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuDescription({\n className,\n ...props\n}: Ariakit.MenuDescriptionProps) {\n return (\n <Ariakit.MenuDescription\n data-slot=\"tiptap-menu-description\"\n className={cn(\"tiptap-menu-description\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuDismiss({ className, ...props }: Ariakit.MenuDismissProps) {\n return (\n <Ariakit.MenuDismiss\n data-slot=\"tiptap-menu-dismiss\"\n className={cn(\"tiptap-menu-dismiss\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuGroup({ className, ...props }: Ariakit.MenuGroupProps) {\n return (\n <Ariakit.MenuGroup\n {...props}\n className={cn(\"tiptap-menu-group\", className)}\n />\n )\n}\n\nexport function MenuGroupLabel({\n className,\n ...props\n}: Ariakit.MenuGroupLabelProps) {\n return (\n <Ariakit.MenuGroupLabel\n {...props}\n className={cn(\"tiptap-menu-group-label\", className)}\n />\n )\n}\n\nexport function MenuSeparator({\n className,\n ...props\n}: Ariakit.MenuSeparatorProps) {\n return (\n <Ariakit.MenuSeparator\n data-slot=\"tiptap-menu-separator\"\n className={cn(\"tiptap-menu-separator\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuItemCheck({\n className,\n ...props\n}: Ariakit.MenuItemCheckProps) {\n return (\n <Ariakit.MenuItemCheck\n {...props}\n className={cn(\"tiptap-menu-item-check\", className)}\n />\n )\n}\n\nexport function MenuItemCheckbox({\n className,\n ...props\n}: Ariakit.MenuItemCheckboxProps) {\n return (\n <Ariakit.MenuItemCheckbox\n data-slot=\"tiptap-menu-item-checkbox\"\n className={cn(\"tiptap-menu-item-checkbox\", className)}\n {...props}\n />\n )\n}\n\nexport function MenuItemRadio({\n className,\n ...props\n}: Ariakit.MenuItemRadioProps) {\n return (\n <Ariakit.MenuItemRadio\n {...props}\n className={cn(\"tiptap-menu-item-radio\", className)}\n />\n )\n}\n\nexport function MenuItem({\n name,\n value,\n preventClose,\n className,\n ...props\n}: MenuItemProps) {\n const menu = Ariakit.useMenuContext()\n const searchable = useSearchableContext()\n\n const hideOnClick = useMenuItemClick(menu, preventClose)\n\n const itemProps: MenuItemProps = {\n blurOnHoverEnd: false,\n focusOnHover: true,\n className: cn(\"tiptap-menu-item\", className),\n ...props,\n }\n\n if (!searchable) {\n if (name && value) {\n return (\n <MenuItemRadio\n {...itemProps}\n hideOnClick={true}\n name={name}\n value={value}\n />\n )\n }\n\n return <Ariakit.MenuItem {...itemProps} />\n }\n\n return <ComboboxItem {...itemProps} hideOnClick={hideOnClick} />\n}\n","\"use client\"\n\nimport { createContext, useContext } from \"react\"\nimport type { MenuContextValue } from \"./menu-types\"\n\nexport const SearchableContext = createContext<boolean>(false)\n\nexport const MenuContext = createContext<MenuContextValue>({\n isRootMenu: false,\n open: false,\n})\n\nexport const useSearchableContext = (): boolean => {\n return useContext(SearchableContext)\n}\n\nexport const useMenuContext = (): MenuContextValue => {\n return useContext(MenuContext)\n}\n","import { useCallback, useEffect, useMemo } from \"react\"\nimport * as Ariakit from \"@ariakit/react\"\nimport type {\n ContextMenuAnchor,\n UseContextMenuReturn,\n UseMenuStoreReturn,\n} from \"./menu-types\"\n\nexport function useComboboxValueState(): readonly [\n string,\n (value: string) => void,\n] {\n const store = Ariakit.useComboboxContext()\n const searchValue = Ariakit.useStoreState(store, \"value\") ?? \"\"\n\n if (!store) {\n throw new Error(\n \"useComboboxValueState must be used within ComboboxProvider\"\n )\n }\n\n return [searchValue, store.setValue] as const\n}\n\nexport function useMenuPlacement(): string {\n const store = Ariakit.useMenuStore()\n const currentPlacement = Ariakit.useStoreState(\n store,\n (state) => state.currentPlacement?.split(\"-\")[0] || \"bottom\"\n )\n return currentPlacement\n}\n\nexport function useContextMenu(\n anchorRect: ContextMenuAnchor\n): UseContextMenuReturn {\n const menu = Ariakit.useMenuStore()\n\n useEffect(() => {\n if (anchorRect) {\n menu.render()\n }\n }, [anchorRect, menu])\n\n const getAnchorRect = useCallback(() => anchorRect, [anchorRect])\n\n const show = useCallback(() => {\n menu.show()\n menu.setAutoFocusOnShow(true)\n }, [menu])\n\n return useMemo(\n () => ({\n store: menu,\n getAnchorRect,\n show,\n }),\n [menu, getAnchorRect, show]\n )\n}\n\nexport function useFloatingMenuStore(): UseMenuStoreReturn {\n const menu = Ariakit.useMenuStore()\n\n const show = useCallback(\n (anchorElement: HTMLElement) => {\n menu.setAnchorElement(anchorElement)\n menu.show()\n menu.setAutoFocusOnShow(true)\n },\n [menu]\n )\n\n return useMemo(\n () => ({\n store: menu,\n show,\n }),\n [menu, show]\n )\n}\n\nexport function useMenuItemClick(\n menu?: Ariakit.MenuStore,\n preventClose?: boolean\n) {\n return useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const expandable = event.currentTarget.hasAttribute(\"aria-expanded\")\n\n if (expandable || preventClose) {\n return false\n }\n\n menu?.hideAll()\n return false\n },\n [menu, preventClose]\n )\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CopyIcon = 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=\"M10 9C9.44772 9 9 9.44772 9 10V20C9 20.5523 9.44772 21 10 21H20C20.5523 21 21 20.5523 21 20V10C21 9.44772 20.5523 9 20 9H10ZM7 10C7 8.34315 8.34315 7 10 7H20C21.6569 7 23 8.34315 23 10V20C23 21.6569 21.6569 23 20 23H10C8.34315 23 7 21.6569 7 20V10Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 3C3.45228 3 3 3.45228 3 4V14C3 14.5477 3.45228 15 4 15C4.55228 15 5 15.4477 5 16C5 16.5523 4.55228 17 4 17C2.34772 17 1 15.6523 1 14V4C1 2.34772 2.34772 1 4 1H14C15.6523 1 17 2.34772 17 4C17 4.55228 16.5523 5 16 5C15.4477 5 15 4.55228 15 4C15 3.45228 14.5477 3 14 3H4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCopyIcon.displayName = \"CopyIcon\"\n","\"use client\"\n\nimport { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { addColumnAfter, addRowAfter, CellSelection } from \"@tiptap/pm/tables\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getTableSelectionType,\n getRowOrColumnCells,\n updateSelectionAfterAction,\n selectCellsByCoords,\n getIndexCoordinates,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { CopyIcon } from \"../../../../tiptap-icons/copy-icon\"\n\nexport interface UseTableDuplicateRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to duplicate.\n */\n index?: number\n /**\n * Whether you're duplicating a row or a column.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * Hide the button when duplication isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful duplication.\n */\n onDuplicated?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"tableHandleExtension\"]\n\nexport const tableDuplicateRowColumnLabels: Record<Orientation, string> = {\n row: \"复制行\",\n column: \"复制列\",\n}\n\n/**\n * Checks if a table row/column duplication can be performed\n * in the current editor state.\n */\nfunction canDuplicateRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const cellData = getRowOrColumnCells(editor, index, orientation, tablePos)\n\n if (cellData.mergedCells.length > 0) {\n return false\n }\n\n return cellData.cells.length > 0\n } catch {\n return false\n }\n}\n\n/**\n * Duplicates a row by using addRowAfter and then replacing the content.\n */\nfunction duplicateRow({\n editor,\n index,\n tablePos,\n}: {\n editor: Editor\n index: number\n tablePos?: number\n}): boolean {\n try {\n const originalRowCells = getRowOrColumnCells(editor, index, \"row\", tablePos)\n\n if (originalRowCells.cells.length === 0) {\n return false\n }\n\n let addSuccess = false\n if (editor.state.selection instanceof CellSelection) {\n addSuccess = editor.chain().focus().addRowAfter().run()\n } else {\n if (!tablePos) return false\n const sourceCoords = getIndexCoordinates({\n editor,\n index,\n orientation: \"row\",\n tablePos,\n })\n if (!sourceCoords) return false\n\n const state = selectCellsByCoords(editor, tablePos, sourceCoords, {\n mode: \"state\",\n })\n addSuccess = addRowAfter(state, editor.view.dispatch)\n }\n\n if (!addSuccess) return false\n\n const newRowCells = getRowOrColumnCells(editor, index + 1, \"row\", tablePos)\n\n if (newRowCells.cells.length === 0) {\n return false\n }\n\n const { state, view } = editor\n const tr = state.tr\n\n // Replace each cell in the new row with duplicated content\n // Process in reverse order to maintain correct positions\n const cellsToReplace = [...newRowCells.cells].reverse()\n const originalCells = [...originalRowCells.cells].reverse()\n\n cellsToReplace.forEach((newCell, reverseIndex) => {\n const originalCell = originalCells[reverseIndex]\n if (newCell.node && originalCell?.node) {\n const duplicatedCell = newCell.node.type.create(\n { ...originalCell.node.attrs },\n originalCell.node.content,\n originalCell.node.marks\n )\n\n const cellEnd = newCell.pos + newCell.node.nodeSize\n tr.replaceWith(newCell.pos, cellEnd, duplicatedCell)\n }\n })\n\n if (tr.docChanged) {\n view.dispatch(tr)\n\n updateSelectionAfterAction(editor, \"row\", index + 1, tablePos)\n\n return true\n }\n\n return false\n } catch (error) {\n console.error(\"Error duplicating row:\", error)\n return false\n }\n}\n\n/**\n * Duplicates a column by using addColumnAfter and then replacing the content.\n */\nfunction duplicateColumn({\n editor,\n index,\n tablePos,\n}: {\n editor: Editor\n index: number\n tablePos?: number\n}): boolean {\n try {\n const originalColumnCells = getRowOrColumnCells(\n editor,\n index,\n \"column\",\n tablePos\n )\n if (originalColumnCells.cells.length === 0) return false\n\n let addSuccess = false\n if (editor.state.selection instanceof CellSelection) {\n addSuccess = editor.chain().focus().addColumnAfter().run()\n } else {\n if (!tablePos) return false\n const sourceCoords = getIndexCoordinates({\n editor,\n index,\n orientation: \"column\",\n tablePos,\n })\n if (!sourceCoords) return false\n\n const state = selectCellsByCoords(editor, tablePos, sourceCoords, {\n mode: \"state\",\n })\n addSuccess = addColumnAfter(state, editor.view.dispatch)\n }\n\n if (!addSuccess) return false\n\n const newColumnCells = getRowOrColumnCells(\n editor,\n index + 1,\n \"column\",\n tablePos\n )\n\n if (newColumnCells.cells.length === 0) {\n return false\n }\n\n const { state, view } = editor\n const tr = state.tr\n\n // Replace each cell in the new column with duplicated content\n // Process in reverse order to maintain correct positions\n const cellsToReplace = [...newColumnCells.cells].reverse()\n const originalCells = [...originalColumnCells.cells].reverse()\n\n cellsToReplace.forEach((newCell, reverseIndex) => {\n const originalCell = originalCells[reverseIndex]\n if (newCell.node && originalCell?.node) {\n const duplicatedCell = newCell.node.type.create(\n { ...originalCell.node.attrs },\n originalCell.node.content,\n originalCell.node.marks\n )\n\n const cellEnd = newCell.pos + newCell.node.nodeSize\n tr.replaceWith(newCell.pos, cellEnd, duplicatedCell)\n }\n })\n\n if (tr.docChanged) {\n view.dispatch(tr)\n\n updateSelectionAfterAction(editor, \"column\", index + 1, tablePos)\n\n return true\n }\n\n return false\n } catch (error) {\n console.error(\"Error duplicating column:\", error)\n return false\n }\n}\n\n/**\n * Executes the row/column duplication in the editor.\n */\nfunction tableDuplicateRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !canDuplicateRowColumn({ editor, index, orientation, tablePos }) ||\n !editor\n ) {\n return false\n }\n\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n if (!selectionType) return false\n\n try {\n if (selectionType.orientation === \"row\") {\n return duplicateRow({\n editor,\n index: selectionType.index,\n tablePos,\n })\n } else if (selectionType.orientation === \"column\") {\n return duplicateColumn({\n editor,\n index: selectionType.index,\n tablePos,\n })\n }\n\n return false\n } catch (error) {\n console.error(\"Error duplicating row/column:\", error)\n return false\n }\n}\n\n/**\n * Determines if the duplicate button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n hideWhenUnavailable: boolean\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n return hideWhenUnavailable\n ? canDuplicateRowColumn({ editor, index, orientation })\n : true\n}\n\n/**\n * Custom hook that provides **table row/column duplication**\n * functionality for the Tiptap editor.\n */\nexport function useTableDuplicateRowColumn(\n config: UseTableDuplicateRowColumnConfig\n) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable = false,\n onDuplicated,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n })\n\n const canPerformDuplicate = canDuplicateRowColumn({\n editor,\n index,\n tablePos,\n orientation,\n })\n\n const handleDuplicate = useCallback(() => {\n const success = tableDuplicateRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n if (success) onDuplicated?.()\n return success\n }, [editor, index, orientation, tablePos, onDuplicated])\n\n const label = useMemo(() => {\n return tableDuplicateRowColumnLabels[selectionType?.orientation || \"row\"]\n }, [selectionType])\n\n const Icon = CopyIcon\n\n return {\n isVisible,\n canDuplicateRowColumn: canPerformDuplicate,\n handleDuplicate,\n label,\n Icon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowLeftIcon = 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=\"M12.7071 5.70711C13.0976 5.31658 13.0976 4.68342 12.7071 4.29289C12.3166 3.90237 11.6834 3.90237 11.2929 4.29289L4.29289 11.2929C3.90237 11.6834 3.90237 12.3166 4.29289 12.7071L11.2929 19.7071C11.6834 20.0976 12.3166 20.0976 12.7071 19.7071C13.0976 19.3166 13.0976 18.6834 12.7071 18.2929L7.41421 13L19 13C19.5523 13 20 12.5523 20 12C20 11.4477 19.5523 11 19 11L7.41421 11L12.7071 5.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowLeftIcon.displayName = \"ArrowLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowRightIcon = 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 4.29289C12.3166 3.90237 11.6834 3.90237 11.2929 4.29289C10.9024 4.68342 10.9024 5.31658 11.2929 5.70711L16.5858 11H5C4.44772 11 4 11.4477 4 12C4 12.5523 4.44772 13 5 13H16.5858L11.2929 18.2929C10.9024 18.6834 10.9024 19.3166 11.2929 19.7071C11.6834 20.0976 12.3166 20.0976 12.7071 19.7071L19.7071 12.7071C20.0976 12.3166 20.0976 11.6834 19.7071 11.2929L12.7071 4.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowRightIcon.displayName = \"ArrowRightIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowUpIcon = 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 4.29289C12.3166 3.90237 11.6834 3.90237 11.2929 4.29289L4.29289 11.2929C3.90237 11.6834 3.90237 12.3166 4.29289 12.7071C4.68342 13.0976 5.31658 13.0976 5.70711 12.7071L11 7.41421V19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19V7.41421L18.2929 12.7071C18.6834 13.0976 19.3166 13.0976 19.7071 12.7071C20.0976 12.3166 20.0976 11.6834 19.7071 11.2929L12.7071 4.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowUpIcon.displayName = \"ArrowUpIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowDownIcon = 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=\"M12.707 19.707C12.3165 20.0976 11.6835 20.0976 11.293 19.707L4.29297 12.707C3.90245 12.3165 3.90245 11.6835 4.29297 11.293C4.68349 10.9024 5.31651 10.9024 5.70703 11.293L11 16.5859L11 5C11 4.44771 11.4477 4 12 4C12.5523 4 13 4.44771 13 5L13 16.5859L18.293 11.293C18.6835 10.9024 19.3165 10.9024 19.707 11.293C20.0976 11.6835 20.0976 12.3165 19.707 12.707L12.707 19.707Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowDownIcon.displayName = \"ArrowDownIcon\"\n","import { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { TableMap } from \"@tiptap/pm/tables\"\nimport {\n CellSelection,\n columnIsHeader,\n moveTableColumn,\n moveTableRow,\n rowIsHeader,\n selectedRect,\n} from \"@tiptap/pm/tables\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getTableSelectionType,\n selectCellsByCoords,\n cellsOverlapRectangle,\n getIndexCoordinates,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { ArrowLeftIcon } from \"../../../../tiptap-icons/arrow-left-icon\"\nimport { ArrowRightIcon } from \"../../../../tiptap-icons/arrow-right-icon\"\nimport { ArrowUpIcon } from \"../../../../tiptap-icons/arrow-up-icon\"\nimport { ArrowDownIcon } from \"../../../../tiptap-icons/arrow-down-icon\"\n\nexport type MoveDirection = \"up\" | \"down\" | \"left\" | \"right\"\n\nexport interface UseTableMoveRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to move.\n * If omitted, will use the current selection.\n */\n index?: number\n /**\n * Whether you're moving a row or a column.\n * If omitted, will use the current selection.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * The direction to move (up/down for rows, left/right for columns).\n */\n direction: MoveDirection\n /**\n * Hide the button when moving isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful move.\n */\n onMoved?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"tableHandleExtension\"]\n\nexport const tableMoveRowColumnLabels: Record<\n Orientation,\n Record<MoveDirection, string>\n> = {\n row: {\n up: \"上移行\",\n down: \"下移行\",\n left: \"左移行\",\n right: \"右移行\",\n },\n column: {\n up: \"上移列\",\n down: \"下移列\",\n left: \"左移列\",\n right: \"右移列\",\n },\n}\n\nexport const tableMoveRowColumnIcons = {\n up: ArrowUpIcon,\n down: ArrowDownIcon,\n left: ArrowLeftIcon,\n right: ArrowRightIcon,\n}\n\nfunction safeColumnIsHeader(map: TableMap, node: Node, index: number): boolean {\n try {\n return columnIsHeader(map, node, index)\n } catch {\n return false\n }\n}\n\nfunction safeRowIsHeader(map: TableMap, node: Node, index: number): boolean {\n try {\n return rowIsHeader(map, node, index)\n } catch {\n return false\n }\n}\n\n/**\n * Validates that the direction is compatible with the orientation.\n */\nfunction isValidDirectionForOrientation(\n orientation: Orientation,\n direction: MoveDirection\n): boolean {\n if (orientation === \"row\") {\n return direction === \"up\" || direction === \"down\"\n } else if (orientation === \"column\") {\n return direction === \"left\" || direction === \"right\"\n }\n return false\n}\n\n/**\n * Checks if a table row/column can be moved in the specified direction.\n */\nfunction canMoveRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n direction: MoveDirection\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n const { orientation: finalOrientation, index: finalIndex } = selectionType\n\n if (!isValidDirectionForOrientation(finalOrientation, direction)) {\n return false\n }\n\n // START\n // This is just internal preference, you can comment it out if you want\n // to allow moving header rows/columns\n if (\n finalOrientation === \"row\" &&\n safeRowIsHeader(table.map, table.node, finalIndex)\n ) {\n return false\n }\n\n if (\n finalOrientation === \"column\" &&\n safeColumnIsHeader(table.map, table.node, finalIndex)\n ) {\n return false\n }\n // END\n\n const { width, height } = table.map\n\n const targetIndex =\n finalOrientation === \"row\"\n ? direction === \"up\"\n ? finalIndex - 1\n : finalIndex + 1\n : direction === \"left\"\n ? finalIndex - 1\n : finalIndex + 1\n\n const maxIndex = finalOrientation === \"row\" ? height : width\n if (targetIndex < 0 || targetIndex >= maxIndex) {\n return false\n }\n\n const sourceCoords = getIndexCoordinates({\n editor,\n index: finalIndex,\n orientation: finalOrientation,\n tablePos,\n })\n const targetCoords = getIndexCoordinates({\n editor,\n index: targetIndex,\n orientation: finalOrientation,\n tablePos,\n })\n if (!sourceCoords || !targetCoords) return false\n\n const sourceSelection = selectCellsByCoords(\n editor,\n table.pos,\n sourceCoords,\n { mode: \"state\" }\n )\n if (!sourceSelection) return false\n const sourceRect = selectedRect(sourceSelection)\n\n const targetSelection = selectCellsByCoords(\n editor,\n table.pos,\n targetCoords,\n { mode: \"state\" }\n )\n if (!targetSelection) return false\n const targetRect = selectedRect(targetSelection)\n\n if (\n cellsOverlapRectangle(table.map, sourceRect) &&\n cellsOverlapRectangle(table.map, targetRect)\n ) {\n return false\n }\n\n return finalOrientation === \"row\"\n ? direction === \"up\"\n ? finalIndex > 0\n : finalIndex < height - 1\n : direction === \"left\"\n ? finalIndex > 0\n : finalIndex < width - 1\n } catch {\n return false\n }\n}\n\n/**\n * Executes the row/column move in the editor.\n */\nfunction tableMoveRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n direction: MoveDirection\n tablePos?: number\n}): boolean {\n if (\n !canMoveRowColumn({ editor, index, orientation, direction, tablePos }) ||\n !editor\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n const { orientation: finalOrientation, index: from } = selectionType\n\n if (!isValidDirectionForOrientation(finalOrientation, direction)) {\n return false\n }\n\n const delta: Record<MoveDirection, number> = {\n up: -1,\n down: 1,\n left: -1,\n right: 1,\n }\n\n const to = from + delta[direction]\n\n const moveOperation =\n finalOrientation === \"row\" ? moveTableRow : moveTableColumn\n\n console.log({ from, to, finalOrientation, direction })\n\n const dispatch = (tr: Transaction) => editor.view.dispatch(tr)\n\n if (editor.state.selection instanceof CellSelection) {\n return moveOperation({ from, to, select: true, pos: table.start })(\n editor.state,\n dispatch\n )\n } else {\n const sourceCoords = getIndexCoordinates({\n editor,\n index: from,\n orientation: finalOrientation,\n tablePos,\n })\n if (!sourceCoords) return false\n\n const selectionState = selectCellsByCoords(\n editor,\n table.pos,\n sourceCoords,\n { mode: \"state\" }\n )\n\n if (!selectionState) return false\n\n return moveOperation({ from, to, select: true, pos: table.start })(\n selectionState,\n dispatch\n )\n }\n } catch (error) {\n console.error(\"Error moving table row/column:\", error)\n return false\n }\n}\n\n/**\n * Determines if the move button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n direction,\n hideWhenUnavailable,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n direction: MoveDirection\n hideWhenUnavailable: boolean\n tablePos?: number\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n if (!isValidDirectionForOrientation(selectionType.orientation, direction)) {\n return false\n }\n\n return hideWhenUnavailable\n ? canMoveRowColumn({ editor, index, orientation, direction, tablePos })\n : true\n}\n\n/**\n * Custom hook that provides **table row/column moving**\n * functionality for the Tiptap editor.\n *\n * @example\n * ```tsx\n * // Move row up\n * function MoveRowUpButton({ rowIndex }: { rowIndex: number }) {\n * const { isVisible, handleMove, canMoveRowColumn, label, Icon } = useTableMoveRowColumn({\n * index: rowIndex,\n * orientation: \"row\",\n * direction: \"up\",\n * hideWhenUnavailable: true,\n * onMoved: () => console.log(\"Row moved up!\"),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleMove}\n * disabled={!canMoveRowColumn}\n * aria-label={label}\n * >\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * // Move column based on current selection\n * function MoveColumnButton({ direction }: { direction: \"left\" | \"right\" }) {\n * const { isVisible, handleMove, label } = useTableMoveRowColumn({\n * orientation: \"column\",\n * direction,\n * hideWhenUnavailable: true,\n * })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleMove}>{label}</button>\n * }\n * ```\n */\nexport function useTableMoveRowColumn(config: UseTableMoveRowColumnConfig) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n direction,\n hideWhenUnavailable = false,\n onMoved,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n direction,\n hideWhenUnavailable,\n tablePos,\n })\n\n const canPerformMove = canMoveRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n })\n\n const handleMove = useCallback(() => {\n const success = tableMoveRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n })\n if (success) onMoved?.()\n return success\n }, [editor, index, orientation, direction, tablePos, onMoved])\n\n const label = useMemo(() => {\n const orientationLabels =\n tableMoveRowColumnLabels[selectionType?.orientation || \"row\"]\n return (\n orientationLabels[direction] ||\n `移动${selectionType?.orientation === \"row\" ? \"行\" : \"列\"}(${direction})`\n )\n }, [selectionType, direction])\n\n const Icon = useMemo(() => {\n return tableMoveRowColumnIcons[direction]\n }, [direction])\n\n return {\n isVisible,\n canMoveRowColumn: canPerformMove,\n handleMove,\n label,\n Icon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SquareXIcon = 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 4C4.44772 4 4 4.44772 4 5V19C4 19.5523 4.44772 20 5 20H19C19.5523 20 20 19.5523 20 19V5C20 4.44772 19.5523 4 19 4H5ZM2 5C2 3.34315 3.34315 2 5 2H19C20.6569 2 22 3.34315 22 5V19C22 20.6569 20.6569 22 19 22H5C3.34315 22 2 20.6569 2 19V5ZM15.7071 8.29289C16.0976 8.68342 16.0976 9.31658 15.7071 9.70711L13.4142 12L15.7071 14.2929C16.0976 14.6834 16.0976 15.3166 15.7071 15.7071C15.3166 16.0976 14.6834 16.0976 14.2929 15.7071L12 13.4142L9.70711 15.7071C9.31658 16.0976 8.68342 16.0976 8.29289 15.7071C7.90237 15.3166 7.90237 14.6834 8.29289 14.2929L10.5858 12L8.29289 9.70711C7.90237 9.31658 7.90237 8.68342 8.29289 8.29289C8.68342 7.90237 9.31658 7.90237 9.70711 8.29289L12 10.5858L14.2929 8.29289C14.6834 7.90237 15.3166 7.90237 15.7071 8.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSquareXIcon.displayName = \"SquareXIcon\"\n","\"use client\"\n\nimport { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport {\n cellAround,\n CellSelection,\n deleteCellSelection,\n} from \"@tiptap/pm/tables\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getTableSelectionType,\n getRowOrColumnCells,\n setCellAttr,\n isCellEmpty,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { SquareXIcon } from \"../../../../tiptap-icons/square-x-icon\"\n\nexport interface UseTableClearRowColumnContentConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to clear.\n * If omitted, will clear the currently selected cells.\n */\n index?: number\n /**\n * Whether you're clearing a row or a column.\n * If omitted, will clear the currently selected cells.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * Hide the button when clearing isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Whether to reset cell attributes (backgroundColor, nodeVerticalAlign, nodeTextAlign) when clearing.\n * @default false\n */\n resetAttrs?: boolean\n /**\n * Callback function called after a successful clear.\n */\n onCleared?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableClearRowColumnContentLabels: Record<Orientation, string> = {\n row: \"清空行内容\",\n column: \"清空列内容\",\n}\n\n/**\n * Default cell attributes to reset when clearing content\n */\nconst DEFAULT_CELL_ATTRS = {\n backgroundColor: null,\n nodeVerticalAlign: null,\n nodeTextAlign: null,\n}\n\n/**\n * Resets cell attributes to default values\n */\nfunction resetCellAttributes(editor: Editor): boolean {\n try {\n return setCellAttr(DEFAULT_CELL_ATTRS)(editor.state, editor.view.dispatch)\n } catch (error) {\n console.error(\"Error resetting cell attributes:\", error)\n return false\n }\n}\n\n/**\n * Checks if a table row/column content clearing can be performed\n * in the current editor state.\n */\nfunction canClearRowColumnContent({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n\n if (selectionType) {\n const cellData = getRowOrColumnCells(\n editor,\n selectionType.index,\n selectionType.orientation,\n tablePos\n )\n if (cellData.cells.length === 0) return false\n\n return cellData.cells.some(\n (cellInfo) => cellInfo.node && !isCellEmpty(cellInfo.node)\n )\n } else {\n const { selection } = editor.state\n\n if (selection instanceof CellSelection) {\n let hasContent = false\n selection.forEachCell((cell) => {\n if (!isCellEmpty(cell)) {\n hasContent = true\n }\n })\n return hasContent\n }\n\n // Single cell case\n const { $anchor } = selection\n const cell = cellAround($anchor)\n if (!cell) return false\n\n const cellNode = editor.state.doc.nodeAt(cell.pos)\n return cellNode ? !isCellEmpty(cellNode) : false\n }\n } catch {\n return false\n }\n}\n\n/**\n * Clears content from selected cells and optionally resets attributes.\n */\nfunction clearSelectedCells(\n editor: Editor,\n resetAttrs: boolean = false\n): boolean {\n try {\n const { selection } = editor.state\n\n if (selection instanceof CellSelection) {\n if (resetAttrs) {\n resetCellAttributes(editor)\n }\n\n deleteCellSelection(editor.state, editor.view.dispatch)\n\n return true\n }\n\n // Handle single cell\n const { $anchor } = selection\n const cell = cellAround($anchor)\n if (!cell) return false\n\n const cellNode = editor.state.doc.nodeAt(cell.pos)\n if (!cellNode) return false\n\n const from = cell.pos + 1\n const to = cell.pos + cellNode.nodeSize - 1\n if (from >= to) return false\n\n if (resetAttrs) {\n resetCellAttributes(editor)\n }\n\n editor.view.dispatch(editor.state.tr.delete(from, to))\n\n return true\n } catch (error) {\n console.error(\"Error clearing selected cells:\", error)\n return false\n }\n}\n\n/**\n * Clears content from all cells in a specific row or column and optionally resets attributes.\n */\nfunction clearRowColumnCells({\n editor,\n index,\n orientation,\n tablePos,\n resetAttrs = false,\n}: {\n editor: Editor\n index: number\n orientation: Orientation\n tablePos?: number\n resetAttrs?: boolean\n}): boolean {\n try {\n const { state, view } = editor\n const tr = state.tr\n\n const cellData = getRowOrColumnCells(editor, index, orientation, tablePos)\n\n if (cellData.cells.length === 0) {\n return false\n }\n\n const cellsToProcess = [...cellData.cells].reverse()\n\n cellsToProcess.forEach((cellInfo) => {\n if (cellInfo.node && !isCellEmpty(cellInfo.node)) {\n const from = cellInfo.pos + 1\n const to = cellInfo.pos + cellInfo.node.nodeSize - 1\n if (from < to) {\n tr.delete(from, to)\n }\n\n if (resetAttrs) {\n tr.setNodeMarkup(cellInfo.pos, null, {\n ...cellInfo.node.attrs,\n ...DEFAULT_CELL_ATTRS,\n })\n }\n }\n })\n\n if (tr.docChanged) {\n view.dispatch(tr)\n return true\n }\n\n return false\n } catch (error) {\n console.error(`Error clearing ${orientation} content:`, error)\n return false\n }\n}\n\n/**\n * Executes the row/column content clearing in the editor.\n */\nfunction tableClearRowColumnContent({\n editor,\n index,\n orientation,\n tablePos,\n resetAttrs = false,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n resetAttrs?: boolean\n}): boolean {\n if (\n !canClearRowColumnContent({ editor, index, orientation, tablePos }) ||\n !editor\n ) {\n return false\n }\n\n try {\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n\n if (selectionType) {\n return clearRowColumnCells({\n editor,\n index: selectionType.index,\n orientation: selectionType.orientation,\n resetAttrs,\n tablePos,\n })\n } else {\n return clearSelectedCells(editor, resetAttrs)\n }\n } catch (error) {\n console.error(\"Error clearing table content:\", error)\n return false\n }\n}\n\n/**\n * Determines if the clear button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n hideWhenUnavailable: boolean\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n const { selection } = editor.state\n const isInTableCell =\n selection instanceof CellSelection || cellAround(selection.$anchor)\n\n if (!selectionType && !isInTableCell) return false\n\n return hideWhenUnavailable\n ? canClearRowColumnContent({ editor, index, orientation, tablePos })\n : true\n}\n\n/**\n * Custom hook that provides **table row/column content clearing**\n * functionality for the Tiptap editor.\n *\n * @example\n * ```tsx\n * // Clear currently selected cells (no parameters needed)\n * function ClearSelectedButton() {\n * const { isVisible, handleClear } = useTableClearRowColumnContent()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleClear}>Clear Selection</button>\n * }\n *\n * // Clear specific row with attribute reset\n * function ClearRowButton({ rowIndex }: { rowIndex: number }) {\n * const { isVisible, handleClear, label, canClearRowColumnContent } = useTableClearRowColumnContent({\n * index: rowIndex,\n * orientation: \"row\",\n * resetAttrs: true,\n * hideWhenUnavailable: true,\n * onCleared: () => console.log(\"Row cleared and attributes reset!\"),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleClear}\n * disabled={!canClearRowColumnContent}\n * aria-label={label}\n * >\n * {label}\n * </button>\n * )\n * }\n *\n * // Clear content based on current table selection (row/column/cells)\n * function SmartClearButton() {\n * const { isVisible, handleClear, label } = useTableClearRowColumnContent({\n * resetAttrs: true,\n * hideWhenUnavailable: true\n * })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleClear}>{label}</button>\n * }\n * ```\n */\nexport function useTableClearRowColumnContent(\n config: UseTableClearRowColumnContentConfig = {}\n) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable = false,\n resetAttrs = false,\n onCleared,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable,\n })\n\n const canPerformClear = canClearRowColumnContent({\n editor,\n index,\n orientation,\n tablePos,\n })\n\n const handleClear = useCallback(() => {\n const success = tableClearRowColumnContent({\n editor,\n index,\n orientation,\n tablePos,\n resetAttrs,\n })\n if (success) onCleared?.()\n return success\n }, [editor, index, orientation, tablePos, resetAttrs, onCleared])\n\n const label = useMemo(() => {\n if (selectionType) {\n return tableClearRowColumnContentLabels[selectionType.orientation]\n }\n return \"清空内容\"\n }, [selectionType])\n\n const Icon = SquareXIcon\n\n return {\n isVisible,\n canClearRowColumnContent: canPerformClear,\n handleClear,\n label,\n Icon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TableHeaderRowIcon = 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 5V7V19C2 20.6569 3.34315 22 5 22H19C20.6569 22 22 20.6569 22 19V7V5C22 3.34315 20.6569 2 19 2H5C3.34315 2 2 3.34315 2 5ZM20 19V8H16V20H19C19.5523 20 20 19.5523 20 19ZM14 20L14 8H10L10 20H14ZM8 20L8 8H4V19C4 19.5523 4.44772 20 5 20H8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTableHeaderRowIcon.displayName = \"TableHeaderRowIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TableHeaderColumnIcon = memo(\n ({ 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=\"M22 19V5C22 3.34315 20.6569 2 19 2H5C3.34315 2 2 3.34315 2 5V19C2 20.6569 3.34315 22 5 22H19C20.6569 22 22 20.6569 22 19ZM8 20V16H20V19C20 19.5523 19.5523 20 19 20H8ZM8 14L20 14V10L8 10V14ZM20 8L8 8V4H19C19.5523 4 20 4.44772 20 5V8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n }\n)\n\nTableHeaderColumnIcon.displayName = \"TableHeaderColumnIcon\"\n","import { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { CellSelection, toggleHeader } from \"@tiptap/pm/tables\"\nimport type { Transaction } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isValidPosition,\n} from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getIndexCoordinates,\n getRowOrColumnCells,\n getTableSelectionType,\n selectCellsByCoords,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { TableHeaderRowIcon } from \"../../../../tiptap-icons/table-header-row-icon\"\nimport { TableHeaderColumnIcon } from \"../../../../tiptap-icons/table-header-column-icon\"\n\nexport interface UseTableHeaderRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column. Header functionality only applies to index 0.\n * If omitted, will use the current selection.\n */\n index?: number\n /**\n * Whether you're toggling header for a row or a column.\n * If omitted, will use the current selection.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n * Used when there's no cell selection so we can target a specific table.\n */\n tablePos?: number\n /**\n * Hide the button when header toggle isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful header toggle.\n */\n onToggled?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableHeaderRowColumnLabels: Record<Orientation, string> = {\n row: \"标题行\",\n column: \"标题列\",\n}\n\nexport const tableHeaderRowColumnIcons = {\n row: TableHeaderRowIcon,\n column: TableHeaderColumnIcon,\n}\n\n/**\n * Checks if a table header row/column toggle can be performed\n * in the current editor state (or at tablePos when no selection).\n */\nfunction canToggleHeader({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n if (!selectionType) return false\n\n return selectionType.index === 0\n}\n\n/**\n * Executes the header row/column toggle. If there is no cell selection,\n * it will derive the target from (index, orientation) and the table at tablePos.\n */\nfunction toggleTableHeader({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (!editor) return false\n if (!canToggleHeader({ editor, index, orientation, tablePos })) return false\n\n try {\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n if (!selectionType) return false\n\n const isRow = selectionType.orientation === \"row\"\n\n if (editor.state.selection instanceof CellSelection) {\n return isRow\n ? editor.commands.toggleHeaderRow()\n : editor.commands.toggleHeaderColumn()\n }\n\n if (!isValidPosition(tablePos)) return false\n\n const cellCoords = getIndexCoordinates({\n editor,\n index: selectionType.index,\n orientation: selectionType.orientation,\n tablePos,\n })\n if (!cellCoords) return false\n\n const stateWithCellSel = selectCellsByCoords(editor, tablePos, cellCoords, {\n mode: \"state\",\n })\n if (!stateWithCellSel) return false\n\n const dispatch = (tr: Transaction) => editor.view.dispatch(tr)\n return isRow\n ? toggleHeader(\"row\")(stateWithCellSel, dispatch)\n : toggleHeader(\"column\")(stateWithCellSel, dispatch)\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the header toggle button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n hideWhenUnavailable: boolean\n tablePos?: number\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n if (hideWhenUnavailable) {\n return canToggleHeader({ editor, index, orientation, tablePos })\n }\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n return Boolean(selectionType)\n}\n\n/**\n * Custom hook that provides **table header row/column toggle**\n * functionality for the Tiptap editor. Supports `tablePos` when\n * no cell is selected.\n */\nexport function useTableHeaderRowColumn(config: UseTableHeaderRowColumnConfig) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n tablePos,\n })\n\n const canPerformToggle = canToggleHeader({\n editor,\n index,\n orientation,\n tablePos,\n })\n\n let isActive = false\n if (editor?.state.selection instanceof CellSelection) {\n isActive = editor?.isActive(\"tableHeader\") || false\n } else {\n const rowsOrCols = getRowOrColumnCells(\n editor,\n index,\n selectionType?.orientation,\n tablePos\n )\n\n if (rowsOrCols) {\n const secondIndex = rowsOrCols.cells.length > 1 ? 1 : 0\n isActive =\n rowsOrCols.cells[secondIndex]?.node?.type.name === \"tableHeader\" ||\n false\n }\n }\n\n const handleToggle = useCallback(() => {\n const success = toggleTableHeader({ editor, index, orientation, tablePos })\n if (success) onToggled?.()\n return success\n }, [editor, index, orientation, tablePos, onToggled])\n\n const label = tableHeaderRowColumnLabels[selectionType?.orientation || \"row\"]\n const Icon = tableHeaderRowColumnIcons[selectionType?.orientation || \"row\"]\n\n return {\n isVisible,\n canToggleHeader: canPerformToggle,\n handleToggle,\n label,\n Icon,\n isActive,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AddColLeftIcon = 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=\"M19 2C20.6569 2 22 3.34315 22 5V19C22 20.6569 20.6569 22 19 22H15C13.3431 22 12 20.6569 12 19V5C12 3.34315 13.3431 2 15 2H19ZM14 19C14 19.5523 14.4477 20 15 20H19C19.5523 20 20 19.5523 20 19V13H14V19ZM15 4C14.4477 4 14 4.44772 14 5V11H20V5C20 4.44772 19.5523 4 19 4H15Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6 8C6.55228 8 7 8.44772 7 9V11H9C9.55228 11 10 11.4477 10 12C10 12.5523 9.55228 13 9 13H7V15C7 15.5523 6.55228 16 6 16C5.44772 16 5 15.5523 5 15V13H3C2.44772 13 2 12.5523 2 12C2 11.4477 2.44772 11 3 11H5V9C5 8.44772 5.44772 8 6 8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAddColLeftIcon.displayName = \"AddColLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AddColRightIcon = 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 2C10.6569 2 12 3.34315 12 5V19C12 20.6569 10.6569 22 9 22H5C3.34315 22 2 20.6569 2 19V5C2 3.34315 3.34315 2 5 2H9ZM4 19C4 19.5523 4.44772 20 5 20H9C9.55228 20 10 19.5523 10 19V13H4V19ZM5 4C4.44772 4 4 4.44772 4 5V11H10V5C10 4.44772 9.55228 4 9 4H5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18 8C18.5523 8 19 8.44772 19 9V11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H19V15C19 15.5523 18.5523 16 18 16C17.4477 16 17 15.5523 17 15V13H15C14.4477 13 14 12.5523 14 12C14 11.4477 14.4477 11 15 11H17V9C17 8.44772 17.4477 8 18 8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAddColRightIcon.displayName = \"AddColRightIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AddRowBottomIcon = 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=\"M12 14C12.5523 14 13 14.4477 13 15V17H15C15.5523 17 16 17.4477 16 18C16 18.5523 15.5523 19 15 19H13V21C13 21.5523 12.5523 22 12 22C11.4477 22 11 21.5523 11 21V19H9C8.44772 19 8 18.5523 8 18C8 17.4477 8.44772 17 9 17H11V15C11 14.4477 11.4477 14 12 14Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19 2C20.6569 2 22 3.34315 22 5V9C22 10.6569 20.6569 12 19 12H5C3.34315 12 2 10.6569 2 9V5C2 3.34315 3.34315 2 5 2H19ZM5 4C4.44772 4 4 4.44772 4 5V9C4 9.55228 4.44772 10 5 10H11V4H5ZM13 10H19C19.5523 10 20 9.55228 20 9V5C20 4.44772 19.5523 4 19 4H13V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAddRowBottomIcon.displayName = \"AddRowBottomIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AddRowTopIcon = 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=\"M19 12C20.6569 12 22 13.3431 22 15V19C22 20.6569 20.6569 22 19 22H5C3.34315 22 2 20.6569 2 19V15C2 13.3431 3.34315 12 5 12H19ZM5 14C4.44772 14 4 14.4477 4 15V19C4 19.5523 4.44772 20 5 20H11V14H5ZM13 20H19C19.5523 20 20 19.5523 20 19V15C20 14.4477 19.5523 14 19 14H13V20Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 2C12.5523 2 13 2.44772 13 3V5H15C15.5523 5 16 5.44772 16 6C16 6.55228 15.5523 7 15 7H13V9C13 9.55228 12.5523 10 12 10C11.4477 10 11 9.55228 11 9V7H9C8.44772 7 8 6.55228 8 6C8 5.44772 8.44772 5 9 5H11V3C11 2.44772 11.4477 2 12 2Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAddRowTopIcon.displayName = \"AddRowTopIcon\"\n","\"use client\"\n\nimport { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { TableMap } from \"@tiptap/pm/tables\"\nimport {\n addRowBefore,\n addRowAfter,\n addColumnBefore,\n addColumnAfter,\n CellSelection,\n rowIsHeader,\n columnIsHeader,\n} from \"@tiptap/pm/tables\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getTableSelectionType,\n selectCellsByCoords,\n updateSelectionAfterAction,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { AddColLeftIcon } from \"../../../../tiptap-icons/add-col-left-icon\"\nimport { AddColRightIcon } from \"../../../../tiptap-icons/add-col-right-icon\"\nimport { AddRowBottomIcon } from \"../../../../tiptap-icons/add-row-bottom-icon\"\nimport { AddRowTopIcon } from \"../../../../tiptap-icons/add-row-top-icon\"\n\nexport type RowSide = \"above\" | \"below\"\nexport type ColSide = \"left\" | \"right\"\n\nexport interface UseTableAddRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to add relative to.\n * If omitted, will use the current selection.\n */\n index?: number\n /**\n * Whether you're adding a row or a column.\n * If omitted, will use the current selection.\n */\n orientation?: Orientation\n /**\n * The side to add on - above/below for rows, left/right for columns.\n */\n side: RowSide | ColSide\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * Hide the button when addition isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful addition.\n */\n onAdded?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableAddRowColumnLabels = {\n row: {\n above: \"在上方插入行\",\n below: \"在下方插入行\",\n } as Record<RowSide, string>,\n column: {\n left: \"在左侧插入列\",\n right: \"在右侧插入列\",\n } as Record<ColSide, string>,\n} as const\n\nfunction safeColumnIsHeader(map: TableMap, node: Node, index: number): boolean {\n try {\n return columnIsHeader(map, node, index)\n } catch {\n return false\n }\n}\n\nfunction safeRowIsHeader(map: TableMap, node: Node, index: number): boolean {\n try {\n return rowIsHeader(map, node, index)\n } catch {\n return false\n }\n}\n\n/**\n * Checks if a table row/column addition can be performed\n * in the current editor state.\n */\nfunction canAddRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n side,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n side: RowSide | ColSide\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n const { map, node } = table\n const selIndex = selectionType.index\n const selOrient = selectionType.orientation\n\n // Bounds check\n if (typeof selIndex !== \"number\" || selIndex < 0) return false\n if (selOrient === \"column\" && selIndex >= map.width) return false\n if (selOrient === \"row\" && selIndex >= map.height) return false\n\n // Block inserting to the LEFT of a header column\n if (side === \"left\" && selOrient === \"column\") {\n if (safeColumnIsHeader(map, node, selIndex)) return false\n }\n\n // Block inserting ABOVE a header row\n if (side === \"above\" && selOrient === \"row\") {\n if (safeRowIsHeader(map, node, selIndex)) return false\n }\n\n return true\n}\n\n/**\n * Calculates the index of the newly added row or column.\n */\nfunction calculateNewIndex(\n index: number,\n orientation: Orientation,\n side: RowSide | ColSide\n): number {\n if (orientation === \"row\") {\n // For rows: above means the new row is at the same index (pushes original down)\n // below means the new row is at index + 1\n return side === \"above\" ? index : index + 1\n } else {\n // For columns: left means the new column is at the same index (pushes original right)\n // right means the new column is at index + 1\n return side === \"left\" ? index : index + 1\n }\n}\n\n/**\n * Executes the row/column addition in the editor.\n */\nfunction tableAddRowColumn({\n editor,\n index,\n orientation,\n side,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n side: RowSide | ColSide\n tablePos: number | undefined\n}): boolean {\n if (\n !canAddRowColumn({ editor, index, orientation, tablePos, side }) ||\n !editor\n ) {\n return false\n }\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n const { orientation: finalOrientation, index: finalIndex } = selectionType\n\n const isRow = finalOrientation === \"row\"\n const dispatch = (tr: Transaction) => editor.view.dispatch(tr)\n const addOperation = isRow\n ? side === \"above\"\n ? addRowBefore\n : addRowAfter\n : side === \"left\"\n ? addColumnBefore\n : addColumnAfter\n\n try {\n let success = false\n\n if (editor.state.selection instanceof CellSelection) {\n success = addOperation(editor.state, dispatch)\n } else {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const cellCoords =\n finalOrientation === \"row\"\n ? { row: finalIndex, col: 0 }\n : { row: 0, col: finalIndex }\n\n const cellState = selectCellsByCoords(editor, table.pos, [cellCoords], {\n mode: \"state\",\n })\n\n if (!cellState) return false\n\n success = addOperation(cellState, dispatch)\n }\n\n if (success) {\n const newIndex = calculateNewIndex(finalIndex, finalOrientation, side)\n updateSelectionAfterAction(editor, finalOrientation, newIndex, tablePos)\n }\n\n return success\n } catch (error) {\n console.error(\"Error adding row/column:\", error)\n return false\n }\n}\n\n/**\n * Determines if the add button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n tablePos,\n side,\n hideWhenUnavailable,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n side: RowSide | ColSide\n hideWhenUnavailable: boolean\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n if (hideWhenUnavailable) {\n return canAddRowColumn({ editor, index, orientation, tablePos, side })\n }\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n return Boolean(selectionType)\n}\n\n/**\n * Custom hook that provides **table row/column addition**\n * functionality for the Tiptap editor.\n */\nexport function useTableAddRowColumn(config: UseTableAddRowColumnConfig) {\n const {\n editor: providedEditor,\n index,\n orientation,\n side,\n tablePos,\n hideWhenUnavailable = false,\n onAdded,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n tablePos,\n side,\n hideWhenUnavailable,\n })\n\n const canPerformAdd = canAddRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n side,\n })\n\n const handleAdd = useCallback(() => {\n const success = tableAddRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n side,\n })\n if (success) onAdded?.()\n return success\n }, [editor, index, orientation, tablePos, side, onAdded])\n\n const label =\n selectionType?.orientation === \"row\"\n ? tableAddRowColumnLabels.row[side as RowSide]\n : tableAddRowColumnLabels.column[side as ColSide]\n\n const Icon =\n selectionType?.orientation === \"row\"\n ? side === \"above\"\n ? AddRowTopIcon\n : AddRowBottomIcon\n : side === \"left\"\n ? AddColLeftIcon\n : AddColRightIcon\n\n return {\n isVisible,\n canAddRowColumn: canPerformAdd,\n handleAdd,\n label,\n Icon,\n }\n}\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","\"use client\"\n\nimport { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { deleteRow, deleteColumn, CellSelection } from \"@tiptap/pm/tables\"\nimport type { Transaction } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getTableSelectionType,\n selectCellsByCoords,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { TrashIcon } from \"../../../../tiptap-icons/trash-icon\"\n\nexport interface UseTableDeleteRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to delete.\n */\n index?: number\n /**\n * Whether you're deleting a row or a column.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * Hide the button when deletion isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful delete.\n */\n onDeleted?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableDeleteRowColumnLabels: Record<Orientation, string> = {\n row: \"删除行\",\n column: \"删除列\",\n}\n\n/**\n * Checks if a table row/column delete can be performed\n * in the current editor state.\n */\nfunction canDeleteRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Executes the row/column deletion in the editor.\n */\nfunction tableDeleteRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !canDeleteRowColumn({ editor, index, orientation, tablePos }) ||\n !editor\n ) {\n return false\n }\n\n try {\n const selectionType = getTableSelectionType(editor, index, orientation)\n if (!selectionType) return false\n\n const { orientation: finalOrientation, index: finalIndex } = selectionType\n\n const isRow = finalOrientation === \"row\"\n const dispatch = (tr: Transaction) => editor.view.dispatch(tr)\n const deleteOperation = isRow ? deleteRow : deleteColumn\n\n if (editor.state.selection instanceof CellSelection) {\n return deleteOperation(editor.state, dispatch)\n }\n\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const cellCoords = isRow\n ? { row: finalIndex, col: 0 }\n : { row: 0, col: finalIndex }\n\n const cellState = selectCellsByCoords(editor, table.pos, [cellCoords], {\n mode: \"state\",\n })\n\n if (!cellState) return false\n\n return deleteOperation(cellState, dispatch)\n } catch (error) {\n console.error(`Error deleting table row/column:`, error)\n return false\n }\n}\n\n/**\n * Determines if the delete button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n hideWhenUnavailable: boolean\n tablePos?: number\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n return hideWhenUnavailable\n ? canDeleteRowColumn({ editor, index, orientation, tablePos })\n : true\n}\n\n/**\n * Custom hook that provides **table row/column deletion**\n * functionality for the Tiptap editor.\n *\n * @example\n * ```tsx\n * // Simple usage with default editor context\n * function DeleteRowButton() {\n * const { isVisible, handleDelete } = useTableDeleteRowColumn({\n * index: 0,\n * orientation: \"row\",\n * })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleDelete}>Delete Row</button>\n * }\n *\n * // Advanced usage with custom editor instance\n * function DeleteColumnButton({ editor }: { editor: Editor }) {\n * const { isVisible, handleDelete, label, canDeleteRowColumn, Icon } = useTableDeleteRowColumn({\n * editor,\n * index: 1,\n * orientation: \"column\",\n * hideWhenUnavailable: true,\n * onDeleted: () => console.log(\"Column deleted!\"),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleDelete}\n * aria-disabled={!canDeleteRowColumn}\n * aria-label={label}\n * >\n * <Icon /> Delete Column\n * </button>\n * )\n * }\n * ```\n */\nexport function useTableDeleteRowColumn(config: UseTableDeleteRowColumnConfig) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable = false,\n onDeleted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n })\n\n const canPerformDelete = canDeleteRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n\n const handleDelete = useCallback(() => {\n const success = tableDeleteRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n if (success) onDeleted?.()\n return success\n }, [editor, index, orientation, tablePos, onDeleted])\n\n const label = useMemo(() => {\n return tableDeleteRowColumnLabels[selectionType?.orientation || \"row\"]\n }, [selectionType])\n\n return {\n isVisible,\n canDeleteRowColumn: canPerformDelete,\n handleDelete,\n label,\n Icon: TrashIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowDownAZIcon = 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=\"M7.00017 3C7.55242 3.00004 8.00017 3.44774 8.00017 4V17.5859L10.2931 15.293C10.6837 14.9025 11.3167 14.9025 11.7072 15.293C12.0976 15.6835 12.0976 16.3165 11.7072 16.707L7.7072 20.707C7.66067 20.7536 7.60881 20.7944 7.55388 20.8311C7.51475 20.8572 7.47445 20.8804 7.43279 20.9004C7.38729 20.9223 7.34018 20.9412 7.29118 20.9561C7.27445 20.9611 7.25734 20.9646 7.2404 20.9688C7.2248 20.9726 7.20941 20.9774 7.19353 20.9805C7.18643 20.9819 7.17916 20.9822 7.17204 20.9834C7.1161 20.9931 7.05889 21 7.00017 21L6.89763 20.9951C6.87615 20.9929 6.85521 20.9879 6.83415 20.9844C6.82375 20.9826 6.81326 20.9816 6.8029 20.9795C6.7914 20.9772 6.78008 20.9744 6.76872 20.9717C6.74815 20.9668 6.72749 20.9622 6.7072 20.9561C6.65855 20.9412 6.61176 20.9222 6.56658 20.9004C6.5247 20.8802 6.48381 20.8574 6.4445 20.8311C6.39008 20.7946 6.3393 20.7532 6.29314 20.707L2.29314 16.707C1.90261 16.3165 1.90261 15.6835 2.29314 15.293C2.68367 14.9025 3.3167 14.9025 3.7072 15.293L6.00017 17.5859V4C6.00017 3.44772 6.44788 3 7.00017 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20.1437 13.0107C20.4734 13.0585 20.7615 13.2687 20.9054 13.5762C21.0699 13.9275 21.0171 14.3426 20.7687 14.6406L17.1359 19H20.0002C20.5524 19 21.0002 19.4477 21.0002 20C21.0002 20.5523 20.5524 21 20.0002 21H15.0002C14.6122 21 14.2595 20.7752 14.0949 20.4238C13.9304 20.0725 13.9832 19.6574 14.2316 19.3594L17.8644 15H15.0002C14.4479 15 14.0002 14.5523 14.0002 14C14.0002 13.4477 14.4479 13 15.0002 13H20.0002L20.1437 13.0107Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.5002 3C18.4284 3.00002 19.3184 3.36903 19.9748 4.02539C20.6311 4.68176 21.0002 5.57176 21.0002 6.5V10C21.0002 10.5523 20.5524 11 20.0002 11C19.4479 11 19.0002 10.5523 19.0002 10V9H16.0002V10C16.0002 10.5523 15.5524 11 15.0002 11C14.4479 11 14.0002 10.5523 14.0002 10V6.5C14.0002 5.57174 14.3692 4.68177 15.0256 4.02539C15.6819 3.36904 16.5719 3 17.5002 3ZM17.5002 5C17.1024 5 16.7209 5.15817 16.4396 5.43945C16.1583 5.72076 16.0002 6.10218 16.0002 6.5V7H19.0002V6.5C19.0002 6.10219 18.842 5.72075 18.5607 5.43945C18.2794 5.15817 17.898 5.00002 17.5002 5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowDownAZIcon.displayName = \"ArrowDownAZIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowDownZAIcon = 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=\"M7.00017 3C7.55242 3.00004 8.00017 3.44774 8.00017 4V17.5859L10.2931 15.293C10.6837 14.9025 11.3167 14.9025 11.7072 15.293C12.0976 15.6835 12.0976 16.3165 11.7072 16.707L7.7072 20.707C7.66067 20.7536 7.60881 20.7944 7.55388 20.8311C7.51475 20.8572 7.47445 20.8804 7.43279 20.9004C7.38729 20.9223 7.34018 20.9412 7.29118 20.9561C7.27445 20.9611 7.25734 20.9646 7.2404 20.9688C7.2248 20.9726 7.20941 20.9774 7.19353 20.9805C7.18643 20.9819 7.17916 20.9822 7.17204 20.9834C7.1161 20.9931 7.05889 21 7.00017 21L6.89763 20.9951C6.87615 20.9929 6.85521 20.9879 6.83415 20.9844C6.82375 20.9826 6.81326 20.9816 6.8029 20.9795C6.7914 20.9772 6.78008 20.9744 6.76872 20.9717C6.74815 20.9668 6.72749 20.9622 6.7072 20.9561C6.65855 20.9412 6.61176 20.9222 6.56658 20.9004C6.5247 20.8802 6.48381 20.8574 6.4445 20.8311C6.39008 20.7946 6.3393 20.7532 6.29314 20.707L2.29314 16.707C1.90261 16.3165 1.90261 15.6835 2.29314 15.293C2.68367 14.9025 3.3167 14.9025 3.7072 15.293L6.00017 17.5859V4C6.00017 3.44772 6.44788 3 7.00017 3Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.5002 13C18.4284 13 19.3184 13.369 19.9748 14.0254C20.6311 14.6818 21.0002 15.5718 21.0002 16.5V20C21.0002 20.5523 20.5524 21 20.0002 21C19.4479 21 19.0002 20.5523 19.0002 20V19H16.0002V20C16.0002 20.5523 15.5524 21 15.0002 21C14.4479 21 14.0002 20.5523 14.0002 20V16.5C14.0002 15.5717 14.3692 14.6818 15.0256 14.0254C15.6819 13.369 16.5719 13 17.5002 13ZM17.5002 15C17.1024 15 16.7209 15.1582 16.4396 15.4395C16.1583 15.7208 16.0002 16.1022 16.0002 16.5V17H19.0002V16.5C19.0002 16.1022 18.842 15.7208 18.5607 15.4395C18.2794 15.1582 17.898 15 17.5002 15Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20.1437 3.01074C20.4734 3.05854 20.7615 3.26875 20.9054 3.57617C21.0699 3.9275 21.0171 4.34259 20.7687 4.64062L17.1359 9H20.0002C20.5524 9.00004 21.0002 9.44774 21.0002 10C21.0002 10.5523 20.5524 11 20.0002 11H15.0002C14.6122 11 14.2595 10.7752 14.0949 10.4238C13.9304 10.0725 13.9832 9.65742 14.2316 9.35938L17.8644 5H15.0002C14.4479 5 14.0002 4.55228 14.0002 4C14.0002 3.44772 14.4479 3 15.0002 3H20.0002L20.1437 3.01074Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowDownZAIcon.displayName = \"ArrowDownZAIcon\"\n","import { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n type CellInfo,\n getTable,\n getTableSelectionType,\n getRowOrColumnCells,\n isCellEmpty,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { ArrowDownAZIcon } from \"../../../../tiptap-icons/arrow-down-a-z-icon\"\nimport { ArrowDownZAIcon } from \"../../../../tiptap-icons/arrow-down-z-a-icon\"\n\nexport type SortDirection = \"asc\" | \"desc\"\n\nexport interface UseTableSortRowColumnConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The index of the row or column to sort.\n * If omitted, will use the current selection.\n */\n index?: number\n /**\n * Whether you're sorting a row or a column.\n * If omitted, will use the current selection.\n */\n orientation?: Orientation\n /**\n * The position of the table in the document.\n */\n tablePos?: number\n /**\n * The sort direction (ascending or descending).\n */\n direction: SortDirection\n /**\n * Hide the button when sorting isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful sort.\n */\n onSorted?: () => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"tableHandleExtension\"]\n\nexport const tableSortRowColumnLabels: Record<\n Orientation,\n Record<SortDirection, string>\n> = {\n row: {\n asc: \"行升序排序\",\n desc: \"行降序排序\",\n },\n column: {\n asc: \"列升序排序\",\n desc: \"列降序排序\",\n },\n}\n\nexport const tableSortRowColumnIcons = {\n asc: ArrowDownAZIcon,\n desc: ArrowDownZAIcon,\n}\n\n/**\n * Check if a specific cell is a header cell\n */\nfunction isCellHeader(cellNode: Node | null): boolean {\n if (!cellNode) return false\n\n return (\n cellNode.type.name === \"tableHeader\" ||\n cellNode.type.name === \"table_header\" ||\n cellNode.attrs?.header === true\n )\n}\n\n/**\n * Extract text content from a cell node for sorting comparison\n */\nfunction getCellSortText(cellNode: Node | null): string {\n if (!cellNode) return \"\"\n\n let text = \"\"\n cellNode.descendants((node) => {\n if (node.isText) {\n text += node.text || \"\"\n }\n return true\n })\n\n return text.trim().toLowerCase()\n}\n\n/**\n * Create a sortable item with all necessary data for restoration\n */\ninterface SortableCell {\n sortText: string\n originalNode: Node | null\n cellInfo: CellInfo\n originalIndex: number\n isHeader: boolean\n isEmpty: boolean\n}\n\n/**\n * Checks if a table row/column sort can be performed\n * in the current editor state.\n */\nfunction canSortRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n tablePos?: number\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const cellData = getRowOrColumnCells(editor, index, orientation, tablePos)\n\n // Need at least 2 items to sort\n if (cellData.orientation === \"row\") {\n if (table.map.width < 2) return false\n } else {\n if (table.map.height < 2) return false\n }\n\n if (cellData.mergedCells.length > 0) {\n return false\n }\n\n // Check if there's actual content to sort (excluding headers)\n const hasContent = cellData.cells.some(\n (cellInfo) =>\n cellInfo.node &&\n !isCellHeader(cellInfo.node) &&\n !isCellEmpty(cellInfo.node)\n )\n\n if (!hasContent) {\n return false\n }\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Executes the row/column sort in the editor while preserving marks and attributes.\n * Header cells are excluded from sorting and remain in their original positions.\n * Empty cells are always sorted to the end.\n */\nfunction tableSortRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n direction: SortDirection\n tablePos?: number\n}): boolean {\n if (!canSortRowColumn({ editor, index, orientation, tablePos }) || !editor)\n return false\n\n try {\n const { state, view } = editor\n const tr = state.tr\n\n const cellData = getRowOrColumnCells(editor, index, orientation, tablePos)\n\n if (cellData.mergedCells.length > 0) {\n console.warn(`Cannot sort ${orientation} ${index}: contains merged cells`)\n return false\n }\n\n if (cellData.cells.length < 2) {\n return false\n }\n\n // Create sortable items, marking headers, data cells, and empty cells\n const allItems: SortableCell[] = cellData.cells.map(\n (cellInfo, originalIndex) => {\n const isHeader = isCellHeader(cellInfo.node)\n const isEmpty = cellInfo.node ? isCellEmpty(cellInfo.node) : true\n return {\n sortText: getCellSortText(cellInfo.node),\n originalNode: cellInfo.node,\n cellInfo,\n originalIndex,\n isHeader,\n isEmpty,\n }\n }\n )\n\n const dataItems = allItems.filter((item) => !item.isHeader)\n\n if (dataItems.length < 2) {\n console.log(\"No sortable data cells found (excluding headers)\")\n return false\n }\n\n // Sort data items with special handling for empty cells\n dataItems.sort((a, b) => {\n // Empty cells always go to the end, regardless of sort direction\n if (a.isEmpty && !b.isEmpty) return 1\n if (!a.isEmpty && b.isEmpty) return -1\n if (a.isEmpty && b.isEmpty) return 0\n\n // For non-empty cells, sort normally\n const comparison = a.sortText.localeCompare(b.sortText, undefined, {\n sensitivity: \"base\",\n })\n return direction === \"asc\" ? comparison : -comparison\n })\n\n const newCellNodes: Node[] = []\n let dataIndex = 0\n\n for (let i = 0; i < allItems.length; i++) {\n const originalItem = allItems[i]\n const targetCell = cellData.cells[i]\n\n if (!targetCell || !originalItem) continue\n\n let nodeToPlace: Node | null = null\n\n if (originalItem.isHeader) {\n // Keep header in its original position\n nodeToPlace = originalItem.originalNode\n } else {\n // Use the next sorted data cell\n const sortedDataItem = dataItems[dataIndex]\n nodeToPlace = sortedDataItem?.originalNode || null\n dataIndex++\n }\n\n if (nodeToPlace && targetCell.node) {\n const cellType = targetCell.node.type\n const newCellNode = cellType.create(\n nodeToPlace.attrs,\n nodeToPlace.content,\n nodeToPlace.marks\n )\n newCellNodes.push(newCellNode)\n } else {\n newCellNodes.push(targetCell.node!)\n }\n }\n\n // Replace each cell with the new cell (headers preserved, data sorted)\n // We need to go in reverse order to maintain correct positions\n const cellsToReplace = [...cellData.cells].reverse()\n const newNodesToPlace = [...newCellNodes].reverse()\n\n cellsToReplace.forEach((targetCell, reverseIndex) => {\n const newNode = newNodesToPlace[reverseIndex]\n if (newNode && targetCell.node) {\n // Replace the entire cell node\n const cellEnd = targetCell.pos + targetCell.node.nodeSize\n tr.replaceWith(targetCell.pos, cellEnd, newNode)\n }\n })\n\n if (tr.docChanged) {\n view.dispatch(tr)\n return true\n }\n\n return false\n } catch (error) {\n console.error(`Error sorting table ${orientation}:`, error)\n return false\n }\n}\n\n/**\n * Determines if the sort button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n tablePos,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n hideWhenUnavailable: boolean\n tablePos: number | undefined\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n const table = getTable(editor, tablePos)\n if (!table) return false\n\n const selectionType = getTableSelectionType(\n editor,\n index,\n orientation,\n tablePos\n )\n if (!selectionType) return false\n\n return hideWhenUnavailable\n ? canSortRowColumn({ editor, index, orientation, tablePos })\n : true\n}\n\n/**\n * Custom hook that provides **table row/column sorting**\n * functionality for the Tiptap editor.\n *\n * **Header Handling:** Header cells are automatically detected and excluded\n * from sorting. During a sort operation, header cells remain in their original\n * positions while only data cells are rearranged. Headers are identified by\n * node type (`tableHeader`) or attributes (`header: true`).\n *\n * **Empty Cell Handling:** Empty cells are always sorted to the end,\n * regardless of sort direction (A-Z or Z-A).\n *\n * @example\n * ```tsx\n * // Sort currently selected row/column (smart mode)\n * function SortButton() {\n * const { isVisible, handleSort } = useTableSortRowColumn({ direction: \"asc\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleSort}>Sort A-Z</button>\n * }\n *\n * // Sort specific row, headers will be preserved\n * function SortRowButton({ rowIndex }: { rowIndex: number }) {\n * const { isVisible, handleSort, label, canSortRowColumn } = useTableSortRowColumn({\n * index: rowIndex,\n * orientation: \"row\",\n * direction: \"asc\",\n * hideWhenUnavailable: true,\n * onSorted: () => console.log(\"Row sorted! Headers stayed in place.\"),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleSort}\n * disabled={!canSortRowColumn}\n * aria-label={label}\n * >\n * {label}\n * </button>\n * )\n * }\n *\n * // Sort with callback to handle the result\n * function SmartSortButton() {\n * const { isVisible, handleSort, label } = useTableSortRowColumn({\n * direction: \"desc\",\n * hideWhenUnavailable: true,\n * onSorted: () => {\n * console.log(\"Sort completed! Headers were automatically preserved.\")\n * }\n * })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleSort}>{label}</button>\n * }\n * ```\n */\nexport function useTableSortRowColumn(\n config: UseTableSortRowColumnConfig = { direction: \"asc\" }\n) {\n const {\n editor: providedEditor,\n index,\n orientation,\n tablePos,\n direction,\n hideWhenUnavailable = false,\n onSorted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const selectionType = getTableSelectionType(editor, index, orientation)\n\n const isVisible = shouldShowButton({\n editor,\n index,\n orientation,\n hideWhenUnavailable,\n tablePos,\n })\n\n const canPerformSort = canSortRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n\n const handleSort = useCallback(() => {\n const success = tableSortRowColumn({\n editor,\n index,\n orientation,\n direction,\n tablePos,\n })\n if (success) onSorted?.()\n return success\n }, [editor, index, orientation, direction, tablePos, onSorted])\n\n const label = useMemo(() => {\n const orientationLabels =\n tableSortRowColumnLabels[selectionType?.orientation || \"row\"]\n return (\n orientationLabels[direction] ||\n `排序${selectionType?.orientation === \"row\" ? \"行\" : \"列\"}(${direction})`\n )\n }, [selectionType, direction])\n\n const Icon = useMemo(() => {\n return tableSortRowColumnIcons[direction] || ArrowDownAZIcon\n }, [direction])\n\n return {\n isVisible,\n canSortRowColumn: canPerformSort,\n handleSort,\n label,\n Icon,\n }\n}\n","\"use client\"\n\nimport { forwardRef } from \"react\"\nimport \"./badge-colors.scss\"\nimport \"./badge-group.scss\"\nimport \"./badge.scss\"\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"ghost\" | \"white\" | \"gray\" | \"green\" | \"yellow\" | \"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","\"use client\"\n\nimport { 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 { UseColorTextConfig } from \".\"\nimport {\n COLOR_TEXT_SHORTCUT_KEY,\n useColorText,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\n// --- Styles ---\nimport \"./color-text-button.scss\"\n\nexport interface ColorTextButtonProps\n extends Omit<ButtonProps, \"type\">, UseColorTextConfig {\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 ColorTextShortcutBadge({\n shortcutKeys = COLOR_TEXT_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for applying text colors in a Tiptap editor.\n *\n * For custom button implementations, use the `useColorText` hook instead.\n */\nexport const ColorTextButton = forwardRef<\n HTMLButtonElement,\n ColorTextButtonProps\n>(\n (\n {\n editor: providedEditor,\n textColor,\n text,\n hideWhenUnavailable = false,\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 canColorText,\n isActive,\n handleColorText,\n label,\n shortcutKeys,\n Icon,\n } = useColorText({\n editor,\n textColor,\n label: text || `Color text to ${textColor}`,\n hideWhenUnavailable,\n onApplied,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleColorText()\n },\n [handleColorText, onClick]\n )\n\n const buttonStyle = useMemo(\n () =>\n ({\n ...style,\n \"--color-text-button-color\": textColor,\n }) as React.CSSProperties,\n [textColor, style]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canColorText}\n data-disabled={!canColorText}\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-color-text\"\n style={{ color: textColor }}\n >\n <Icon\n className=\"tiptap-button-icon\"\n style={{ color: textColor, flexGrow: 1 }}\n />\n </span>\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ColorTextShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nColorTextButton.displayName = \"ColorTextButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TextColorSmallIcon = 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.8944 5.55279C12.725 5.214 12.3787 5 12 5C11.6212 5 11.2749 5.214 11.1055 5.55279L5.10555 17.5528C4.85856 18.0468 5.05878 18.6474 5.55276 18.8944C6.04674 19.1414 6.64741 18.9412 6.8944 18.4472L8.64957 14.9369C8.75862 14.9777 8.87671 15 9 15H15C15.1233 15 15.2413 14.9777 15.3504 14.9369L17.1055 18.4472C17.3525 18.9412 17.9532 19.1414 18.4472 18.8944C18.9412 18.6474 19.1414 18.0468 18.8944 17.5528L12.8944 5.55279ZM14.3819 13L12 8.23607L9.61801 13H14.3819Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTextColorSmallIcon.displayName = \"TextColorSmallIcon\"\n","import { 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 selectCurrentBlockContent,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { TextColorSmallIcon } from \"../../tiptap-icons/text-color-small-icon\"\n\nexport const COLOR_TEXT_SHORTCUT_KEY = \"mod+shift+t\"\nexport const TEXT_COLORS = [\n {\n label: \"默认文字\",\n value: \"var(--tt-color-text)\",\n border: \"var(--tt-color-text-contrast)\",\n },\n {\n label: \"灰色文字\",\n value: \"var(--tt-color-text-gray)\",\n border: \"var(--tt-color-text-gray-contrast)\",\n },\n {\n label: \"棕色文字\",\n value: \"var(--tt-color-text-brown)\",\n border: \"var(--tt-color-text-brown-contrast)\",\n },\n {\n label: \"橙色文字\",\n value: \"var(--tt-color-text-orange)\",\n border: \"var(--tt-color-text-orange-contrast)\",\n },\n {\n label: \"黄色文字\",\n value: \"var(--tt-color-text-yellow)\",\n border: \"var(--tt-color-text-yellow-contrast)\",\n },\n {\n label: \"绿色文字\",\n value: \"var(--tt-color-text-green)\",\n border: \"var(--tt-color-text-green-contrast)\",\n },\n {\n label: \"蓝色文字\",\n value: \"var(--tt-color-text-blue)\",\n border: \"var(--tt-color-text-blue-contrast)\",\n },\n {\n label: \"紫色文字\",\n value: \"var(--tt-color-text-purple)\",\n border: \"var(--tt-color-text-purple-contrast)\",\n },\n {\n label: \"粉色文字\",\n value: \"var(--tt-color-text-pink)\",\n border: \"var(--tt-color-text-pink-contrast)\",\n },\n {\n label: \"红色文字\",\n value: \"var(--tt-color-text-red)\",\n border: \"var(--tt-color-text-red-contrast)\",\n },\n]\n\n/**\n * Configuration for the color text functionality\n */\nexport interface UseColorTextConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The text color to apply.\n * Can be any valid CSS color value.\n */\n textColor: string\n /**\n * Optional text 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 * Called when the text color is applied.\n */\n onApplied?: ({ color, label }: { color: string; label: string }) => void\n}\n\n/**\n * Checks if text color can be toggled in the current editor state\n */\nexport function canColorText(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isMarkInSchema(\"textStyle\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n try {\n return editor.can().setMark(\"textStyle\", { color: \"currentColor\" })\n } catch {\n return false\n }\n}\n\n/**\n * Checks if text color is active in the current selection\n */\nexport function isColorTextActive(\n editor: Editor | null,\n textColor: string\n): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"textStyle\", { color: textColor })\n}\n\n/**\n * Determines if the color text 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isMarkInSchema(\"textStyle\", editor)) return false\n\n if (!editor.isActive(\"code\")) {\n return canColorText(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides color text functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage with required textColor\n * function MySimpleTextColorButton() {\n * const { isVisible, handleColorText, isActive } = useColorText({\n * textColor: \"red\",\n * label: \"Red Text\",\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleColorText}\n * style={{ color: isActive ? \"red\" : \"inherit\" }}\n * >\n * Red Text\n * </button>\n * )\n * }\n *\n * // Advanced usage\n * function MyAdvancedTextColorButton() {\n * const { isVisible, handleColorText, label, isActive } = useColorText({\n * editor: myEditor,\n * textColor: \"#ff0000\",\n * label: \"Apply Red\",\n * hideWhenUnavailable: true,\n * onApplied: ({ color }) => console.log(\"Applied:\", color),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleColorText}\n * aria-label={label}\n * data-active={isActive}\n * >\n * Apply Text Color\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useColorText(config: UseColorTextConfig) {\n const {\n editor: providedEditor,\n label,\n textColor,\n hideWhenUnavailable = false,\n onApplied,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canColorTextState = canColorText(editor)\n const isActive = isColorTextActive(editor, textColor)\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 handleColorText = useCallback(() => {\n if (!editor || !canColorTextState) return false\n\n if (editor.state.storedMarks) {\n const textStyleMarkType = editor.schema.marks.textStyle\n if (textStyleMarkType) {\n editor.view.dispatch(\n editor.state.tr.removeStoredMark(textStyleMarkType)\n )\n }\n }\n\n setTimeout(() => {\n selectCurrentBlockContent(editor)\n\n const success = editor\n .chain()\n .focus()\n .toggleMark(\"textStyle\", { color: textColor })\n .run()\n if (success) {\n onApplied?.({ color: textColor, label })\n }\n return success\n }, 0)\n }, [editor, canColorTextState, textColor, onApplied, label])\n\n useHotkeys(\n COLOR_TEXT_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleColorText()\n },\n {\n enabled: isVisible && canColorTextState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleColorText,\n canColorText: canColorTextState,\n label: label || `Color text to ${textColor}`,\n shortcutKeys: COLOR_TEXT_SHORTCUT_KEY,\n Icon: TextColorSmallIcon,\n }\n}\n","\"use client\"\n\nimport { 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 \".\"\nimport {\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n useColorHighlight,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\n// --- Styles ---\nimport \"./color-highlight-button.scss\"\n\nexport interface ColorHighlightButtonProps\n extends Omit<ButtonProps, \"type\">, 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 useColorValue = false,\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 useColorValue,\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 variant=\"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","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 { 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 \"../../tiptap-icons/highlighter-icon\"\n\nexport const COLOR_HIGHLIGHT_SHORTCUT_KEY = \"mod+shift+h\"\nexport const HIGHLIGHT_COLORS = [\n {\n label: \"默认背景\",\n value: \"var(--tt-bg-color)\",\n colorValue: \"#ffffff\",\n border: \"var(--tt-bg-color-contrast)\",\n },\n {\n label: \"灰色背景\",\n value: \"var(--tt-color-highlight-gray)\",\n colorValue: \"#f8f8f7\",\n border: \"var(--tt-color-highlight-gray-contrast)\",\n },\n {\n label: \"棕色背景\",\n value: \"var(--tt-color-highlight-brown)\",\n colorValue: \"#f4eeee\",\n border: \"var(--tt-color-highlight-brown-contrast)\",\n },\n {\n label: \"橙色背景\",\n value: \"var(--tt-color-highlight-orange)\",\n colorValue: \"#fbecdd\",\n border: \"var(--tt-color-highlight-orange-contrast)\",\n },\n {\n label: \"黄色背景\",\n value: \"var(--tt-color-highlight-yellow)\",\n colorValue: \"#fef9c3\",\n border: \"var(--tt-color-highlight-yellow-contrast)\",\n },\n {\n label: \"绿色背景\",\n value: \"var(--tt-color-highlight-green)\",\n colorValue: \"#dcfce7\",\n border: \"var(--tt-color-highlight-green-contrast)\",\n },\n {\n label: \"蓝色背景\",\n value: \"var(--tt-color-highlight-blue)\",\n colorValue: \"#e0f2fe\",\n border: \"var(--tt-color-highlight-blue-contrast)\",\n },\n {\n label: \"紫色背景\",\n value: \"var(--tt-color-highlight-purple)\",\n colorValue: \"#f3e8ff\",\n border: \"var(--tt-color-highlight-purple-contrast)\",\n },\n {\n label: \"粉色背景\",\n value: \"var(--tt-color-highlight-pink)\",\n colorValue: \"#fcf1f6\",\n border: \"var(--tt-color-highlight-pink-contrast)\",\n },\n {\n label: \"红色背景\",\n value: \"var(--tt-color-highlight-red)\",\n colorValue: \"#ffe4e6\",\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 * When true, uses the actual color value (colorValue) instead of CSS variable (value).\n * @default false\n */\n useColorValue?: boolean\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 * Gets the appropriate color value based on configuration\n */\nexport function getHighlightColorValue(\n color: string,\n useColorValue: boolean = false\n): string {\n if (!useColorValue) return color\n\n const colorItem = HIGHLIGHT_COLORS.find(\n (c) => c.value === color || c.colorValue === color\n )\n return colorItem?.colorValue || 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n // hideWhenUnavailable=true: check schema/extension availability\n if (mode === \"mark\") {\n if (!isMarkInSchema(\"highlight\", editor)) return false\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n }\n\n if (!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 useColorValue = false,\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 actualColor = highlightColor\n ? getHighlightColorValue(highlightColor, useColorValue)\n : highlightColor\n const isActive = isColorHighlightActive(editor, actualColor, 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 || !actualColor || !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 .toggleHighlight({ color: actualColor })\n .run()\n if (success) {\n onApplied?.({ color: actualColor, label, mode })\n }\n return success\n }, 0)\n\n return true\n } else {\n const success = editor\n .chain()\n .focus()\n .toggleNodeBackgroundColor(actualColor)\n .run()\n\n if (success) {\n onApplied?.({ color: actualColor, label, mode })\n }\n return success\n }\n }, [canColorHighlightState, actualColor, editor, label, onApplied, mode])\n\n const handleRemoveHighlight = useCallback(() => {\n const success = removeHighlight(editor, mode)\n if (success) {\n onApplied?.({ color: \"\", label: \"移除高亮\", 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 { 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 { forwardRef } from \"react\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./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 { mergeProps } from \"@base-ui/react/merge-props\"\nimport { useRender } from \"@base-ui/react/use-render\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport { Separator } from \"../separator\"\nimport \"./button-group.scss\"\n\nconst buttonGroupVariants = cva(\"tiptap-button-group\", {\n variants: {\n orientation: {\n horizontal: \"tiptap-button-group-horizontal\",\n vertical: \"tiptap-button-group-vertical\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n})\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"tiptap-button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps<\"div\">(\n { className: cn(\"tiptap-button-group-text\", className) },\n props\n ),\n render,\n state: { slot: \"tiptap-button-group-text\" },\n })\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"tiptap-button-group-separator\"\n orientation={orientation}\n className={cn(\"tiptap-button-group-separator\", className)}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","\"use client\"\n\nimport { useCallback, useMemo, useRef, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"../../tiptap-icons/chevron-down-icon\"\n\n// --- Tiptap UI ---\nimport type {\n ColorType,\n ColorItem,\n RecentColor,\n UseColorTextPopoverConfig,\n} from \".\"\nimport {\n useColorTextPopover,\n useRecentColors,\n getColorByValue,\n} from \".\"\nimport {\n TEXT_COLORS,\n ColorTextButton,\n} from \"../color-text-button\"\nimport {\n HIGHLIGHT_COLORS,\n ColorHighlightButton,\n} from \"../color-highlight-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../../tiptap-ui-primitive/popover\"\nimport {\n Card,\n CardBody,\n CardGroupLabel,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\n// --- Utils ---\nimport { chunkArray } from \"../../../lib/tiptap-advanced-utils\"\n\n// --- Styles ---\nimport \"./color-text-popover.scss\"\nimport { ButtonGroup } from \"../../tiptap-ui-primitive/button-group\"\n\n// ─── Shared types ────────────────────────────────────────────────────────────\n\ntype ColorChangePayload = {\n type: ColorType\n label: string\n value: string\n}\n\n// ─── RecentColorButton ───────────────────────────────────────────────────────\n\nexport interface RecentColorButtonProps extends ButtonProps {\n colorObj: RecentColor\n withLabel?: boolean\n onColorChanged?: (payload: ColorChangePayload) => void\n editor?: Editor | null\n}\n\nexport function RecentColorButton({\n colorObj,\n withLabel = false,\n onColorChanged,\n editor,\n ...props\n}: RecentColorButtonProps) {\n const colorSet = colorObj.type === \"text\" ? TEXT_COLORS : HIGHLIGHT_COLORS\n const color = getColorByValue(colorObj.value, colorSet)\n\n const commonProps = {\n tooltip: color.label,\n text: withLabel ? color.label : undefined,\n onApplied: () =>\n onColorChanged?.({\n type: colorObj.type,\n label: color.label,\n value: color.value,\n }),\n ...props,\n }\n\n return colorObj.type === \"text\" ? (\n <ColorTextButton\n textColor={color.value}\n label={color.label}\n editor={editor}\n {...commonProps}\n />\n ) : (\n <ColorHighlightButton\n highlightColor={color.value}\n label={color.label}\n editor={editor}\n {...commonProps}\n />\n )\n}\n\n// ─── ColorGroup ──────────────────────────────────────────────────────────────\n\nexport interface ColorGroupProps {\n type: ColorType\n colors: ColorItem[][]\n onColorSelected: (payload: ColorChangePayload) => void\n selectedIndex?: number\n startIndexOffset: number\n editor?: Editor | null\n}\n\nexport function ColorGroup({\n type,\n colors,\n onColorSelected,\n selectedIndex,\n startIndexOffset,\n editor,\n}: ColorGroupProps) {\n return colors.map((group, groupIndex) => (\n <ButtonGroup key={`${type}-group-${groupIndex}`}>\n {group.map((color, colorIndex) => {\n const itemIndex =\n startIndexOffset +\n colors.slice(0, groupIndex).reduce((acc, g) => acc + g.length, 0) +\n colorIndex\n\n const isHighlighted = selectedIndex === itemIndex\n\n const commonProps = {\n tooltip: color.label,\n onApplied: () =>\n onColorSelected({ type, label: color.label, value: color.value }),\n tabIndex: isHighlighted ? 0 : -1,\n \"data-highlighted\": isHighlighted,\n \"aria-label\": `${color.label} ${type === \"text\" ? \"text\" : \"highlight\"} color`,\n }\n\n return type === \"text\" ? (\n <ButtonGroup key={`${type}-${color.value}-${colorIndex}`}>\n <ColorTextButton\n textColor={color.value}\n label={color.label}\n editor={editor}\n {...commonProps}\n />\n </ButtonGroup>\n ) : (\n <ButtonGroup key={`${type}-${color.value}-${colorIndex}`}>\n <ColorHighlightButton\n highlightColor={color.value}\n label={color.label}\n editor={editor}\n {...commonProps}\n />\n </ButtonGroup>\n )\n })}\n </ButtonGroup>\n ))\n}\n\n// ─── RecentColorsSection ─────────────────────────────────────────────────────\n\ninterface RecentColorsSectionProps {\n recentColors: RecentColor[]\n onColorSelected: (payload: ColorChangePayload) => void\n selectedIndex?: number\n editor?: Editor | null\n}\n\nfunction RecentColorsSection({\n recentColors,\n onColorSelected,\n selectedIndex,\n editor,\n}: RecentColorsSectionProps) {\n if (recentColors.length === 0) return null\n\n return (\n <CardItemGroup>\n <CardGroupLabel>最近使用</CardGroupLabel>\n <ButtonGroup>\n {recentColors.map((colorObj, index) => (\n <RecentColorButton\n key={`recent-${colorObj.type}-${colorObj.value}`}\n colorObj={colorObj}\n onColorChanged={onColorSelected}\n tabIndex={selectedIndex === index ? 0 : -1}\n data-highlighted={selectedIndex === index}\n editor={editor}\n />\n ))}\n </ButtonGroup>\n </CardItemGroup>\n )\n}\n\n// ─── TextStyleColorPanel ─────────────────────────────────────────────────────\n\nexport interface TextStyleColorPanelProps {\n maxColorsPerGroup?: number\n maxRecentColors?: number\n onColorChanged?: (payload: ColorChangePayload) => void\n editor?: Editor | null\n}\n\nexport function TextStyleColorPanel({\n maxColorsPerGroup = 5,\n maxRecentColors = 3,\n onColorChanged,\n editor,\n}: TextStyleColorPanelProps) {\n const { recentColors, addRecentColor, isInitialized } =\n useRecentColors(maxRecentColors)\n const containerRef = useRef<HTMLDivElement>(null)\n\n const textColorGroups = useMemo(\n () => chunkArray(TEXT_COLORS, maxColorsPerGroup),\n [maxColorsPerGroup]\n )\n\n const highlightColorGroups = useMemo(\n () => chunkArray(HIGHLIGHT_COLORS, maxColorsPerGroup),\n [maxColorsPerGroup]\n )\n\n const allTextColors = useMemo(() => textColorGroups.flat(), [textColorGroups])\n const allHighlightColors = useMemo(\n () => highlightColorGroups.flat(),\n [highlightColorGroups]\n )\n\n const textColorStartIndex = useMemo(\n () => (isInitialized ? recentColors.length : 0),\n [isInitialized, recentColors.length]\n )\n\n const highlightColorStartIndex = useMemo(\n () => textColorStartIndex + allTextColors.length,\n [textColorStartIndex, allTextColors.length]\n )\n\n const menuItems = useMemo(() => {\n type ColorMenuItem = { type: ColorType; value: string; label: string; group: string }\n const items: ColorMenuItem[] = []\n\n if (isInitialized && recentColors.length > 0) {\n items.push(\n ...recentColors.map((color) => ({\n type: color.type,\n value: color.value,\n label: `最近${color.type === \"text\" ? \"文字\" : \"高亮\"}颜色`,\n group: \"recent\",\n }))\n )\n }\n\n items.push(\n ...allTextColors.map((color) => ({\n type: \"text\" as ColorType,\n value: color.value,\n label: color.label,\n group: \"text\",\n }))\n )\n\n items.push(\n ...allHighlightColors.map((color) => ({\n type: \"highlight\" as ColorType,\n value: color.value,\n label: color.label,\n group: \"highlight\",\n }))\n )\n\n return items\n }, [isInitialized, recentColors, allTextColors, allHighlightColors])\n\n const handleColorSelected = useCallback(\n ({ type, label, value }: ColorChangePayload) => {\n if (!containerRef.current) return false\n\n const highlighted = containerRef.current.querySelector(\n '[data-highlighted=\"true\"]'\n ) as HTMLElement | null\n\n highlighted?.click()\n\n addRecentColor({ type, label, value })\n onColorChanged?.({ type, label, value })\n },\n [addRecentColor, onColorChanged]\n )\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n onSelect: (item) => {\n if (item)\n handleColorSelected({\n type: item.type,\n label: item.label,\n value: item.value,\n })\n },\n orientation: \"both\",\n autoSelectFirstItem: false,\n })\n\n return (\n <Card ref={containerRef} tabIndex={0} role=\"menu\">\n <CardBody>\n {isInitialized && (\n <RecentColorsSection\n recentColors={recentColors}\n onColorSelected={handleColorSelected}\n selectedIndex={selectedIndex}\n editor={editor}\n />\n )}\n\n <CardItemGroup>\n <CardGroupLabel>文字颜色</CardGroupLabel>\n <ColorGroup\n type=\"text\"\n colors={textColorGroups}\n onColorSelected={handleColorSelected}\n selectedIndex={selectedIndex}\n startIndexOffset={textColorStartIndex}\n editor={editor}\n />\n </CardItemGroup>\n\n <CardItemGroup>\n <CardGroupLabel>高亮颜色</CardGroupLabel>\n <ColorGroup\n type=\"highlight\"\n colors={highlightColorGroups}\n onColorSelected={handleColorSelected}\n selectedIndex={selectedIndex}\n startIndexOffset={highlightColorStartIndex}\n editor={editor}\n />\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\n// ─── ColorTextPopover ────────────────────────────────────────────────────────\n\nexport interface ColorTextPopoverProps\n extends\n Omit<React.ComponentProps<typeof Button>, \"type\">,\n UseColorTextPopoverConfig {}\n\n/**\n * Color text popover component for Tiptap editors.\n *\n * For custom popover implementations, use the `useColorTextPopover` hook instead.\n */\nexport function ColorTextPopover({\n editor: providedEditor,\n hideWhenUnavailable = false,\n onColorChanged,\n onClick,\n children,\n ref,\n ...buttonProps\n}: ColorTextPopoverProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n const {\n isVisible,\n canToggle,\n activeTextStyle,\n activeHighlight,\n handleColorChanged,\n label,\n Icon,\n } = useColorTextPopover({ editor, hideWhenUnavailable, onColorChanged })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n setIsOpen((prev) => !prev)\n },\n [onClick]\n )\n\n if (!isVisible) return null\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n aria-label={label}\n tooltip={label}\n disabled={!canToggle}\n data-disabled={!canToggle}\n onClick={handleClick}\n ref={ref}\n {...buttonProps}\n >\n {children ?? (\n <>\n <span\n className=\"tiptap-button-color-text-popover\"\n style={\n activeHighlight.color\n ? ({\n \"--active-highlight-color\": activeHighlight.color,\n } as React.CSSProperties)\n : {}\n }\n >\n <Icon\n className=\"tiptap-button-icon\"\n style={{ color: activeTextStyle.color || undefined }}\n />\n </span>\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n aria-label=\"文字颜色选项\"\n side=\"bottom\"\n align=\"start\"\n >\n <TextStyleColorPanel\n onColorChanged={handleColorChanged}\n editor={editor}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default ColorTextPopover\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 { TextColorSmallIcon } from \"../../tiptap-icons/text-color-small-icon\"\n\n// --- Lib ---\nimport { isMarkInSchema } from \"../../../lib/tiptap-utils\"\nimport { getActiveMarkAttrs } from \"../../../lib/tiptap-advanced-utils\"\n\n// --- Tiptap UI ---\nimport { canColorText } from \"../color-text-button\"\nimport { canColorHighlight } from \"../color-highlight-button\"\n\nexport type ColorType = \"text\" | \"highlight\"\n\nexport interface ColorItem {\n value: string\n label: string\n}\n\nexport interface RecentColor {\n type: ColorType\n label: string\n value: string\n}\n\n/**\n * Configuration for the color text popover functionality\n */\nexport interface UseColorTextPopoverConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the popover should hide when color text is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a color is applied.\n */\n onColorChanged?: ({\n type,\n label,\n value,\n }: {\n type: ColorType\n label: string\n value: string\n }) => void\n}\n\n/**\n * Get a color object by its value\n */\nexport function getColorByValue(\n value: string,\n colorArray: ColorItem[]\n): ColorItem {\n return (\n colorArray.find((color) => color.value === value) ?? {\n value,\n label: value,\n }\n )\n}\n\n/**\n * Checks if color text popover should be shown\n */\nexport function shouldShowColorTextPopover(params: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = params\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canColorText(editor) || canColorHighlight(editor)\n }\n\n return true\n}\n\n/**\n * Hook to manage recently used colors\n */\nexport function useRecentColors(maxColors: number = 3) {\n const [recentColors, setRecentColors] = useState<RecentColor[]>([])\n const [isInitialized, setIsInitialized] = useState(false)\n\n useEffect(() => {\n try {\n const storedColors = localStorage.getItem(\"tiptapRecentlyUsedColors\")\n if (storedColors) {\n const colors = JSON.parse(storedColors) as RecentColor[]\n setRecentColors(colors.slice(0, maxColors))\n }\n } catch (e) {\n console.error(\"Failed to load stored colors:\", e)\n } finally {\n setIsInitialized(true)\n }\n }, [maxColors])\n\n const addRecentColor = useCallback(\n ({\n type,\n label,\n value,\n }: {\n type: ColorType\n label: string\n value: string\n }) => {\n setRecentColors((prevColors) => {\n const filtered = prevColors.filter(\n (c) => !(c.type === type && c.value === value)\n )\n const updated = [{ type, label, value }, ...filtered].slice(\n 0,\n maxColors\n )\n\n try {\n localStorage.setItem(\n \"tiptapRecentlyUsedColors\",\n JSON.stringify(updated)\n )\n } catch (e) {\n console.error(\"Failed to store colors:\", e)\n }\n\n return updated\n })\n },\n [maxColors]\n )\n\n return { recentColors, addRecentColor, isInitialized }\n}\n\n/**\n * Custom hook that provides color text popover functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleColorTextPopover() {\n * const { isVisible, handleColorChanged } = useColorTextPopover()\n *\n * if (!isVisible) return null\n *\n * return (\n * <Popover>\n * <PopoverTrigger asChild>\n * <button>Color Text</button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <TextStyleColorPanel onColorChanged={handleColorChanged} />\n * </PopoverContent>\n * </Popover>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedColorTextPopover() {\n * const {\n * isVisible,\n * activeTextStyle,\n * activeHighlight,\n * handleColorChanged,\n * label,\n * Icon,\n * } = useColorTextPopover({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onColorChanged: ({ type, label, value }) => console.log('Color changed!', { type, label, value })\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button\n * disabled={isDisabled}\n * aria-label={label}\n * >\n * <Icon style={{ color: activeTextStyle.color }} />\n * </Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <TextStyleColorPanel onColorChanged={handleColorChanged} />\n * </PopoverContent>\n * </Popover>\n * )\n * }\n * ```\n */\nexport function useColorTextPopover(config?: UseColorTextPopoverConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onColorChanged,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const textStyleInSchema = isMarkInSchema(\"textStyle\", editor)\n const highlightInSchema = isMarkInSchema(\"highlight\", editor)\n\n const activeTextStyle = getActiveMarkAttrs(editor, \"textStyle\") || {}\n const activeHighlight = getActiveMarkAttrs(editor, \"highlight\") || {}\n\n const canToggle = canColorText(editor) || canColorHighlight(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const updateVisibility = () => {\n setIsVisible(\n shouldShowColorTextPopover({\n editor,\n hideWhenUnavailable,\n })\n )\n }\n\n updateVisibility()\n\n editor.on(\"selectionUpdate\", updateVisibility)\n\n return () => {\n editor.off(\"selectionUpdate\", updateVisibility)\n }\n }, [editor, hideWhenUnavailable, highlightInSchema, textStyleInSchema])\n\n const handleColorChanged = useCallback(\n ({\n type,\n label,\n value,\n }: {\n type: ColorType\n label: string\n value: string\n }) => {\n onColorChanged?.({ type, label, value })\n },\n [onColorChanged]\n )\n\n return {\n isVisible,\n canToggle,\n activeTextStyle,\n activeHighlight,\n handleColorChanged,\n label: \"文字颜色\",\n Icon: TextColorSmallIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const PaintBucketIcon = 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.70711 1.29289C5.31658 0.902369 4.68342 0.902369 4.29289 1.29289C3.90237 1.68342 3.90237 2.31658 4.29289 2.70711L7.08575 5.49997L1.69282 10.8929L1.68582 10.9C1.13614 11.4608 0.828247 12.2147 0.828247 13C0.828247 13.7853 1.1361 14.5392 1.68578 15.1L6.89285 20.3071C8.08338 21.4976 9.91654 21.4976 11.1071 20.3071L19.7071 11.7071C20.0976 11.3166 20.0976 10.6834 19.7071 10.2929L11.7071 2.29289C11.3165 1.90237 10.6834 1.90237 10.2929 2.29289L8.49997 4.08576L5.70711 1.29289ZM17.5857 11L16.5857 12H3.41418L8.49998 6.91419L9.29289 7.70711C9.68342 8.09763 10.3166 8.09763 10.7071 7.70711C11.0976 7.31658 11.0976 6.68342 10.7071 6.29289L9.91419 5.49998L11 4.41421L17.5857 11ZM14.5857 14H3.41418L8.30707 18.8929C8.71654 19.3024 9.28338 19.3024 9.69285 18.8929L14.5857 14Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.9829 15.8157C20.8942 15.3427 20.4812 15 20 15C19.5188 15 19.1058 15.3427 19.0171 15.8157C18.9233 16.3161 18.6226 16.706 18.1385 17.3337L18.0955 17.3895C17.6418 17.9781 17 18.8237 17 20C17 20.7957 17.3161 21.5587 17.8787 22.1213C18.4413 22.6839 19.2043 23 20 23C20.7957 23 21.5587 22.6839 22.1213 22.1213C22.6839 21.5587 23 20.7957 23 20C23 18.8237 22.3582 17.9781 21.9045 17.3895L21.8615 17.3337C21.3774 16.706 21.0767 16.3161 20.9829 15.8157ZM19 20C19 19.5763 19.2082 19.2219 19.6795 18.6105C19.714 18.5658 19.7503 18.5192 19.7881 18.4709C19.855 18.3851 19.9265 18.2935 20 18.1963C20.0735 18.2935 20.1449 18.385 20.2119 18.4708C20.2496 18.5192 20.286 18.5658 20.3205 18.6105C20.7918 19.2219 21 19.5763 21 20C21 20.2652 20.8946 20.5196 20.7071 20.7071C20.5196 20.8946 20.2652 21 20 21C19.7348 21 19.4804 20.8946 19.2929 20.7071C19.1054 20.5196 19 20.2652 19 20Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nPaintBucketIcon.displayName = \"MoreVerticalIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ChevronRightIcon = 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.29289 5.29289C8.68342 4.90237 9.31658 4.90237 9.70711 5.29289L15.7071 11.2929C16.0976 11.6834 16.0976 12.3166 15.7071 12.7071L9.70711 18.7071C9.31658 19.0976 8.68342 19.0976 8.29289 18.7071C7.90237 18.3166 7.90237 17.6834 8.29289 17.2929L13.5858 12L8.29289 6.70711C7.90237 6.31658 7.90237 5.68342 8.29289 5.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nChevronRightIcon.displayName = \"ChevronRightIcon\"\n","import type { Editor } from \"@tiptap/react\"\n\n// Primitive UI Components\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Spacer } from \"../../tiptap-ui-primitive/spacer\"\nimport {\n Menu,\n MenuContent,\n MenuItem,\n MenuGroup,\n MenuGroupLabel,\n MenuButton,\n} from \"../../tiptap-ui-primitive/menu\"\nimport { ComboboxList } from \"../../tiptap-ui-primitive/combobox\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\n\n// Tiptap UI\nimport {\n TEXT_COLORS,\n useColorText,\n} from \"../color-text-button\"\nimport {\n HIGHLIGHT_COLORS,\n useColorHighlight,\n} from \"../color-highlight-button\"\nimport type { RecentColor } from \"../color-text-popover\"\nimport {\n getColorByValue,\n useRecentColors,\n} from \"../color-text-popover\"\n\n// Icons\nimport { PaintBucketIcon } from \"../../tiptap-icons/paint-bucket-icon\"\nimport { ChevronRightIcon } from \"../../tiptap-icons/chevron-right-icon\"\nimport { TextColorSmallIcon } from \"../../tiptap-icons/text-color-small-icon\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\ninterface ColorMenuItemProps {\n color: { value: string; label: string }\n}\n\nconst TextColorMenuItem: React.FC<ColorMenuItemProps> = ({ color }) => {\n const { addRecentColor } = useRecentColors()\n const { isActive, handleColorText, label } = useColorText({\n label: color.label,\n textColor: color.value,\n onApplied: ({ color, label }) =>\n addRecentColor({ type: \"text\", label, value: color }),\n })\n\n return (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={handleColorText}\n >\n <span className=\"tiptap-button-color-text\" style={{ color: color.value }}>\n <TextColorSmallIcon\n className=\"tiptap-button-icon\"\n style={{ color: color.value, flexGrow: 1 }}\n />\n </span>\n <span className=\"tiptap-button-text\">{label}</span>\n </MenuItem>\n )\n}\n\nconst HighlightColorMenuItem: React.FC<ColorMenuItemProps> = ({ color }) => {\n const { addRecentColor } = useRecentColors()\n const { isActive, handleColorHighlight, label } = useColorHighlight({\n label: color.label,\n highlightColor: color.value,\n mode: \"node\",\n onApplied: ({ color, label }) =>\n addRecentColor({ type: \"highlight\", label, value: color }),\n })\n\n return (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={handleColorHighlight}\n >\n <span\n className=\"tiptap-button-highlight\"\n style={{ \"--highlight-color\": color.value } as React.CSSProperties}\n />\n <span className=\"tiptap-button-text\">{label}</span>\n </MenuItem>\n )\n}\n\nconst RecentColorMenuItem: React.FC<{\n colorObj: RecentColor\n}> = ({ colorObj }) => {\n const colorSet = colorObj.type === \"text\" ? TEXT_COLORS : HIGHLIGHT_COLORS\n const color = getColorByValue(colorObj.value, colorSet)\n\n const ColorComponent =\n colorObj.type === \"text\" ? TextColorMenuItem : HighlightColorMenuItem\n\n return <ColorComponent color={color} />\n}\n\nexport interface ColorMenuProps {\n editor?: Editor | null\n /**\n * Custom trigger component. If not provided, uses default paint bucket button.\n */\n trigger?: React.ReactNode\n /**\n * Label for the color menu trigger\n * @default \"Color\"\n */\n label?: string\n /**\n * Menu placement relative to trigger\n * @default \"right\"\n */\n placement?: React.ComponentProps<typeof Menu>[\"placement\"]\n}\n\n/**\n * Reusable color menu component that provides text and highlight color options.\n * Includes recent colors, text colors, and highlight colors sections.\n */\nexport const ColorMenu: React.FC<ColorMenuProps> = ({\n editor: providedEditor,\n trigger,\n label = \"Color\",\n placement = \"right\",\n}) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { recentColors, isInitialized } = useRecentColors()\n\n const hasColorActions: boolean =\n !!editor?.can().setMark(\"textStyle\") ||\n !!editor?.can().setMark(\"highlight\") ||\n !!editor?.can().toggleNodeBackgroundColor(\"yellow\") ||\n false\n\n if (!editor || !hasColorActions) {\n return null\n }\n\n const defaultTrigger = (\n <MenuItem\n render={\n <MenuButton\n render={\n <Button variant=\"ghost\">\n <PaintBucketIcon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n <Spacer />\n <ChevronRightIcon className=\"tiptap-button-icon\" />\n </Button>\n }\n />\n }\n />\n )\n\n return (\n <Menu placement={placement} trigger={trigger || defaultTrigger}>\n <MenuContent portal>\n <ComboboxList>\n {/* Recent Colors */}\n {isInitialized && recentColors.length > 0 && (\n <MenuGroup>\n <MenuGroupLabel>最近使用</MenuGroupLabel>\n {recentColors.map((colorObj) => (\n <RecentColorMenuItem key={colorObj.value} colorObj={colorObj} />\n ))}\n <Separator orientation=\"horizontal\" />\n </MenuGroup>\n )}\n\n {/* Text Colors */}\n <MenuGroup>\n <MenuGroupLabel>文字颜色</MenuGroupLabel>\n {TEXT_COLORS.map((textColor) => (\n <TextColorMenuItem key={textColor.value} color={textColor} />\n ))}\n </MenuGroup>\n\n <Separator orientation=\"horizontal\" />\n\n {/* Background Colors */}\n <MenuGroup>\n <MenuGroupLabel>背景颜色</MenuGroupLabel>\n {HIGHLIGHT_COLORS.map((highlightColor) => (\n <HighlightColorMenuItem\n key={highlightColor.value}\n color={highlightColor}\n />\n ))}\n </MenuGroup>\n </ComboboxList>\n </MenuContent>\n </Menu>\n )\n}\n\nexport { TextColorMenuItem, HighlightColorMenuItem, RecentColorMenuItem }\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 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 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 { 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 AlignBottomIcon = 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=\"M11 11.5858L9.70711 10.2929C9.31658 9.90237 8.68342 9.90237 8.29289 10.2929C7.90237 10.6834 7.90237 11.3166 8.29289 11.7071L11.2929 14.7071C11.6834 15.0976 12.3166 15.0976 12.7071 14.7071L15.7071 11.7071C16.0976 11.3166 16.0976 10.6834 15.7071 10.2929C15.3166 9.90237 14.6834 9.90237 14.2929 10.2929L13 11.5858V4C13 3.44771 12.5523 3 12 3C11.4477 3 11 3.44771 11 4V11.5858Z\"\n fill=\"currentColor\"\n />\n <path\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\nAlignBottomIcon.displayName = \"AlignBottomIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignTopIcon = 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=\"M2 4C2 3.44772 2.44772 3 3 3H21C21.5523 3 22 3.44772 22 4C22 4.55228 21.5523 5 21 5H3C2.44772 5 2 4.55228 2 4Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 10.4142L14.2929 11.7071C14.6834 12.0976 15.3166 12.0976 15.7071 11.7071C16.0976 11.3166 16.0976 10.6834 15.7071 10.2929L12.7071 7.29289C12.3166 6.90237 11.6834 6.90237 11.2929 7.29289L8.29289 10.2929C7.90237 10.6834 7.90237 11.3166 8.29289 11.7071C8.68342 12.0976 9.31658 12.0976 9.70711 11.7071L11 10.4142L11 20C11 20.5523 11.4477 21 12 21C12.5523 21 13 20.5523 13 20L13 10.4142Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignTopIcon.displayName = \"AlignTopIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignMiddleIcon = 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=\"M3 12H21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 22V16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 2L12 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 19L12 16L9 19\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 5L12 8L15 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n})\n\nAlignMiddleIcon.displayName = \"AlignMiddleIcon\"\n","\"use client\"\n\nimport { useCallback, useMemo } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { Node as PMNode } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n getTable,\n getRowOrColumnCells,\n} from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { AlignLeftIcon } from \"../../../../tiptap-icons/align-left-icon\"\nimport { AlignCenterIcon } from \"../../../../tiptap-icons/align-center-icon\"\nimport { AlignRightIcon } from \"../../../../tiptap-icons/align-right-icon\"\nimport { AlignJustifyIcon } from \"../../../../tiptap-icons/align-justify-icon\"\nimport { AlignBottomIcon } from \"../../../../tiptap-icons/align-bottom-icon\"\nimport { AlignTopIcon } from \"../../../../tiptap-icons/align-top-icon\"\nimport { AlignMiddleIcon } from \"../../../../tiptap-icons/align-middle-icon\"\n\nexport type TextAlignment = \"left\" | \"center\" | \"right\" | \"justify\"\nexport type VerticalAlignment = \"top\" | \"middle\" | \"bottom\"\nexport type AlignmentType = \"text\" | \"vertical\"\n\nexport interface UseTableAlignCellConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The type of alignment to apply.\n */\n alignmentType: AlignmentType\n /**\n * The alignment value to set.\n */\n alignment: TextAlignment | VerticalAlignment\n /**\n * Optional index of the row or column to align.\n * If provided along with orientation, aligns all cells in that row/column.\n * If not provided, aligns the currently selected cell(s).\n */\n index?: number\n /**\n * Optional orientation when using index.\n * Determines whether to align a row or column.\n */\n orientation?: Orientation\n /**\n * Hide the button when alignment isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after successful alignment change.\n */\n onAligned?: (alignment: TextAlignment | VerticalAlignment) => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableAlignCellLabels = {\n text: {\n left: \"左对齐\",\n center: \"居中对齐\",\n right: \"右对齐\",\n justify: \"两端对齐\",\n } as Record<TextAlignment, string>,\n vertical: {\n top: \"顶部对齐\",\n middle: \"垂直居中\",\n bottom: \"底部对齐\",\n } as Record<VerticalAlignment, string>,\n}\n\nexport const tableAlignCellIcons = {\n text: {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon,\n } as Record<TextAlignment, React.ComponentType<{ className?: string }>>,\n vertical: {\n top: AlignTopIcon,\n middle: AlignMiddleIcon,\n bottom: AlignBottomIcon,\n } as Record<VerticalAlignment, React.ComponentType<{ className?: string }>>,\n}\n\n/**\n * Checks if table cell alignment can be performed\n * in the current editor state.\n */\nfunction canAlignCell(editor: Editor | null): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n return editor.isActive(\"tableCell\") || editor.isActive(\"tableHeader\")\n } catch {\n return false\n }\n}\n\n/**\n * Checks if row/column-wide alignment can be performed\n * in the current editor state.\n */\nfunction canAlignRowColumn({\n editor,\n index,\n orientation,\n}: {\n editor: Editor | null\n index?: number\n orientation?: Orientation\n}): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n const table = getTable(editor)\n if (!table) return false\n\n const cellData = getRowOrColumnCells(editor, index, orientation)\n\n if (cellData.cells.length === 0) return false\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Gets the current alignment value for the active cell.\n */\nfunction getCurrentAlignment(\n editor: Editor | null,\n alignmentType: AlignmentType\n): TextAlignment | VerticalAlignment | null {\n if (!canAlignCell(editor) || !editor) return null\n\n try {\n const { selection } = editor.state\n const $anchor = selection.$anchor\n\n let cellNode: PMNode | null = null\n for (let depth = $anchor.depth; depth >= 0; depth--) {\n const node = $anchor.node(depth)\n if (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\") {\n cellNode = node\n break\n }\n }\n\n if (!cellNode) return null\n\n const attrs = cellNode.attrs || {}\n\n if (alignmentType === \"text\") {\n return (attrs.nodeTextAlign as TextAlignment) || \"left\"\n } else {\n return (attrs.nodeVerticalAlign as VerticalAlignment) || \"top\"\n }\n } catch {\n return null\n }\n}\n\n/**\n * Gets the current alignment for a specific row or column.\n */\nfunction getCurrentRowColumnAlignment(\n editor: Editor | null,\n alignmentType: AlignmentType,\n index?: number,\n orientation?: Orientation\n): TextAlignment | VerticalAlignment | null {\n if (!editor) return null\n\n try {\n const cellData = getRowOrColumnCells(editor, index, orientation)\n\n if (cellData.cells.length === 0) return null\n\n const firstCell = cellData.cells[0]\n if (!firstCell?.node) return null\n\n const attrs = firstCell.node.attrs || {}\n\n if (alignmentType === \"text\") {\n return (attrs.nodeTextAlign as TextAlignment) || \"left\"\n } else {\n return (attrs.nodeVerticalAlign as VerticalAlignment) || \"top\"\n }\n } catch {\n return null\n }\n}\n\n/**\n * Sets the alignment attribute on the current table cell.\n */\nfunction setTableCellAlignment(\n editor: Editor | null,\n alignmentType: AlignmentType,\n alignment: TextAlignment | VerticalAlignment\n): boolean {\n if (!canAlignCell(editor) || !editor) return false\n\n try {\n if (alignmentType === \"text\") {\n return editor.commands.setCellAttribute(\"nodeTextAlign\", alignment)\n } else {\n return editor.commands.setCellAttribute(\"nodeVerticalAlign\", alignment)\n }\n } catch (error) {\n console.error(\"Error setting table cell alignment:\", error)\n return false\n }\n}\n\n/**\n * Sets alignment for all cells in a specific row or column.\n */\nfunction setRowColumnAlignment({\n editor,\n alignmentType,\n alignment,\n index,\n orientation,\n}: {\n editor: Editor | null\n alignmentType: AlignmentType\n alignment: TextAlignment | VerticalAlignment\n index?: number\n orientation?: Orientation\n}): boolean {\n if (!canAlignRowColumn({ editor, index, orientation }) || !editor) {\n return false\n }\n\n try {\n const { state, view } = editor\n const tr = state.tr\n\n const cellData = getRowOrColumnCells(editor, index, orientation)\n\n if (cellData.cells.length === 0) {\n return false\n }\n\n // Track unique cells to avoid aligning the same merged cell multiple times\n const uniqueCells = new Map<number, (typeof cellData.cells)[0]>()\n\n cellData.cells.forEach((cellInfo) => {\n if (cellInfo.node && cellInfo.pos !== undefined) {\n uniqueCells.set(cellInfo.pos, cellInfo)\n }\n })\n\n if (uniqueCells.size === 0) {\n return false\n }\n\n // Convert to array and sort by position in reverse order\n // This ensures we replace cells from end to beginning to maintain correct positions\n const cellsToProcess = Array.from(uniqueCells.values()).sort(\n (a, b) => b.pos - a.pos\n )\n\n const attributeName =\n alignmentType === \"text\" ? \"nodeTextAlign\" : \"nodeVerticalAlign\"\n\n cellsToProcess.forEach((cellInfo) => {\n if (cellInfo.node && cellInfo.pos !== undefined) {\n const cellType = cellInfo.node.type\n\n const newCellNode = cellType.create(\n {\n ...cellInfo.node.attrs,\n [attributeName]: alignment,\n },\n cellInfo.node.content,\n cellInfo.node.marks\n )\n\n const cellEnd = cellInfo.pos + cellInfo.node.nodeSize\n tr.replaceWith(cellInfo.pos, cellEnd, newCellNode)\n }\n })\n\n if (tr.docChanged) {\n view.dispatch(tr)\n return true\n }\n\n return false\n } catch (error) {\n console.error(`Error aligning table ${orientation}:`, error)\n return false\n }\n}\n\n/**\n * Executes the cell alignment in the editor.\n */\nfunction tableAlignCell({\n editor,\n alignmentType,\n alignment,\n index,\n orientation,\n}: {\n editor: Editor | null\n alignmentType: AlignmentType\n alignment: TextAlignment | VerticalAlignment\n index?: number\n orientation?: Orientation\n}): boolean {\n if (!editor) return false\n\n try {\n if (typeof index === \"number\" && orientation) {\n return setRowColumnAlignment({\n editor,\n alignmentType,\n alignment,\n index,\n orientation,\n })\n } else {\n return setTableCellAlignment(editor, alignmentType, alignment)\n }\n } catch (error) {\n console.error(\"Error aligning table cell:\", error)\n return false\n }\n}\n\n/**\n * Determines if the align cell button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n hideWhenUnavailable,\n index,\n orientation,\n}: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n index?: number\n orientation?: Orientation\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n if (hideWhenUnavailable) {\n if (typeof index === \"number\" && orientation) {\n return canAlignRowColumn({ editor, index, orientation })\n }\n\n return canAlignCell(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides **table cell alignment**\n * functionality for the Tiptap editor.\n *\n * @example\n * ```tsx\n * // Simple text alignment button\n * function AlignLeftButton() {\n * const { isVisible, handleAlign, canAlignCell, isActive, label, Icon } = useTableAlignCell({\n * alignmentType: \"text\",\n * alignment: \"left\",\n * hideWhenUnavailable: true,\n * onAligned: (alignment) => console.log(`Aligned to: ${alignment}`),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleAlign}\n * disabled={!canAlignCell}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * // Align entire row vertically\n * function AlignRowTopButton({ rowIndex }: { rowIndex: number }) {\n * const { isVisible, handleAlign, label, Icon } = useTableAlignCell({\n * alignmentType: \"vertical\",\n * alignment: \"top\",\n * index: rowIndex,\n * orientation: \"row\",\n * hideWhenUnavailable: true,\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button onClick={handleAlign} aria-label={label}>\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * // Alignment toolbar for selected cell\n * function CellAlignmentToolbar() {\n * const alignments: TextAlignment[] = [\"left\", \"center\", \"right\", \"justify\"]\n *\n * return (\n * <div role=\"toolbar\" aria-label=\"Text alignment\">\n * {alignments.map((alignment) => {\n * const { isVisible, handleAlign, canAlignCell, isActive, Icon } = useTableAlignCell({\n * alignmentType: \"text\",\n * alignment,\n * hideWhenUnavailable: true,\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * key={alignment}\n * onClick={handleAlign}\n * disabled={!canAlignCell}\n * aria-pressed={isActive}\n * title={`Align ${alignment}`}\n * >\n * <Icon />\n * </button>\n * )\n * })}\n * </div>\n * )\n * }\n * ```\n */\nexport function useTableAlignCell(config: UseTableAlignCellConfig) {\n const {\n editor: providedEditor,\n alignmentType,\n alignment,\n index,\n orientation,\n hideWhenUnavailable = false,\n onAligned,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const isVisible = shouldShowButton({\n editor,\n hideWhenUnavailable,\n index,\n orientation,\n })\n\n const canPerformAlign = () => {\n if (typeof index === \"number\" && orientation) {\n return canAlignRowColumn({ editor, index, orientation })\n }\n return canAlignCell(editor)\n }\n\n const currentAlignment = () => {\n if (typeof index === \"number\" && orientation) {\n return getCurrentRowColumnAlignment(\n editor,\n alignmentType,\n index,\n orientation\n )\n }\n return getCurrentAlignment(editor, alignmentType)\n }\n\n const isActive = currentAlignment() === alignment\n\n const handleAlign = useCallback(() => {\n const success = tableAlignCell({\n editor,\n alignmentType,\n alignment,\n index,\n orientation,\n })\n\n if (success) {\n onAligned?.(alignment)\n }\n return success\n }, [editor, alignmentType, alignment, index, orientation, onAligned])\n\n const label = useMemo(() => {\n if (alignmentType === \"text\") {\n return tableAlignCellLabels.text[alignment as TextAlignment]\n } else {\n return tableAlignCellLabels.vertical[alignment as VerticalAlignment]\n }\n }, [alignmentType, alignment])\n\n const Icon = useMemo(() => {\n if (alignmentType === \"text\") {\n return tableAlignCellIcons.text[alignment as TextAlignment]\n } else {\n return tableAlignCellIcons.vertical[alignment as VerticalAlignment]\n }\n }, [alignmentType, alignment])\n\n return {\n isVisible,\n canAlignCell: canPerformAlign,\n handleAlign,\n label,\n Icon,\n isActive,\n currentAlignment,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignmentIcon = 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=\"M3 16C3.55228 16 4 16.4477 4 17V19L4.00488 19.0986C4.02757 19.3276 4.12883 19.5429 4.29297 19.707C4.48051 19.8946 4.73478 20 5 20H7C7.55228 20 8 20.4477 8 21C8 21.5523 7.55228 22 7 22H5C4.20435 22 3.44151 21.6837 2.87891 21.1211C2.3163 20.5585 2 19.7957 2 19V17C2 16.4477 2.44772 16 3 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21 16C21.5523 16 22 16.4477 22 17V19C22 19.7957 21.6837 20.5585 21.1211 21.1211C20.5585 21.6837 19.7957 22 19 22H17C16.4477 22 16 21.5523 16 21C16 20.4477 16.4477 20 17 20H19C19.2652 20 19.5195 19.8946 19.707 19.707C19.8946 19.5195 20 19.2652 20 19V17C20 16.4477 20.4477 16 21 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7 16C7.55228 16 8 16.4477 8 17C8 17.5523 7.55228 18 7 18C6.44772 18 6 17.5523 6 17C6 16.4477 6.44772 16 7 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 16C12.5523 16 13 16.4477 13 17C13 17.5523 12.5523 18 12 18C11.4477 18 11 17.5523 11 17C11 16.4477 11.4477 16 12 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 16C17.5523 16 18 16.4477 18 17C18 17.5523 17.5523 18 17 18C16.4477 18 16 17.5523 16 17C16 16.4477 16.4477 16 17 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7 11C7.55228 11 8 11.4477 8 12C8 12.5523 7.55228 13 7 13C6.44772 13 6 12.5523 6 12C6 11.4477 6.44772 11 7 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 11C12.5523 11 13 11.4477 13 12C13 12.5523 12.5523 13 12 13C11.4477 13 11 12.5523 11 12C11 11.4477 11.4477 11 12 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 11C17.5523 11 18 11.4477 18 12C18 12.5523 17.5523 13 17 13C16.4477 13 16 12.5523 16 12C16 11.4477 16.4477 11 17 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7 2C7.55228 2 8 2.44772 8 3C8 3.55228 7.55228 4 7 4H5C4.73478 4 4.4805 4.10543 4.29297 4.29297C4.10543 4.4805 4 4.73478 4 5V7C4 7.55228 3.55228 8 3 8C2.44772 8 2 7.55228 2 7V5C2 4.20435 2.3163 3.44152 2.87891 2.87891C3.44152 2.3163 4.20435 2 5 2H7Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7 6C7.55228 6 8 6.44772 8 7C8 7.55228 7.55228 8 7 8C6.44772 8 6 7.55228 6 7C6 6.44772 6.44772 6 7 6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 6C12.5523 6 13 6.44772 13 7C13 7.55228 12.5523 8 12 8C11.4477 8 11 7.55228 11 7C11 6.44772 11.4477 6 12 6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 6C17.5523 6 18 6.44772 18 7C18 7.55228 17.5523 8 17 8C16.4477 8 16 7.55228 16 7C16 6.44772 16.4477 6 17 6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M19 2C19.7957 2 20.5585 2.3163 21.1211 2.87891C21.6837 3.44151 22 4.20435 22 5V7C22 7.55228 21.5523 8 21 8C20.4477 8 20 7.55228 20 7V5C20 4.73478 19.8946 4.48051 19.707 4.29297C19.5429 4.12883 19.3276 4.02757 19.0986 4.00488L19 4H17C16.4477 4 16 3.55228 16 3C16 2.44772 16.4477 2 17 2H19Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignmentIcon.displayName = \"AlignmentIcon\"\n","import type { Orientation } from \"../../lib/tiptap-table-utils\"\n\n// --- UI ---\nimport { useTableAlignCell } from \"../table-align-cell-button\"\n\n// --- Icons ---\nimport { AlignmentIcon } from \"../../../../tiptap-icons/alignment-icon\"\nimport { ChevronRightIcon } from \"../../../../tiptap-icons/chevron-right-icon\"\n\n// --- UI Primitives ---\nimport {\n Menu,\n MenuButton,\n MenuButtonArrow,\n MenuContent,\n MenuGroup,\n MenuItem,\n} from \"../../../../tiptap-ui-primitive/menu\"\nimport { Button } from \"../../../../tiptap-ui-primitive/button\"\nimport { ComboboxList } from \"../../../../tiptap-ui-primitive/combobox\"\nimport { Separator } from \"../../../../tiptap-ui-primitive/separator\"\n\nexport interface ActionItemProps {\n icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }>\n label: string\n onClick: () => void\n disabled?: boolean\n isActive?: boolean\n shortcutBadge?: React.ReactNode\n}\n\nexport const TableAlignMenu = ({\n index,\n orientation,\n}: {\n index?: number\n orientation?: Orientation\n}) => {\n const textAlign = {\n left: useTableAlignCell({\n alignmentType: \"text\",\n alignment: \"left\",\n index,\n orientation,\n }),\n center: useTableAlignCell({\n alignmentType: \"text\",\n alignment: \"center\",\n index,\n orientation,\n }),\n right: useTableAlignCell({\n alignmentType: \"text\",\n alignment: \"right\",\n index,\n orientation,\n }),\n }\n\n const verticalAlign = {\n top: useTableAlignCell({\n alignmentType: \"vertical\",\n alignment: \"top\",\n index,\n orientation,\n }),\n middle: useTableAlignCell({\n alignmentType: \"vertical\",\n alignment: \"middle\",\n index,\n orientation,\n }),\n bottom: useTableAlignCell({\n alignmentType: \"vertical\",\n alignment: \"bottom\",\n index,\n orientation,\n }),\n }\n\n if (!textAlign.left.canAlignCell()) {\n return null\n }\n\n return (\n <Menu\n placement=\"right\"\n trigger={\n <MenuButton\n render={\n <MenuItem\n render={\n <Button variant=\"ghost\">\n <AlignmentIcon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">对齐</span>\n <MenuButtonArrow render={<ChevronRightIcon />} />\n </Button>\n }\n />\n }\n />\n }\n >\n <MenuContent>\n <ComboboxList>\n <MenuGroup>\n {Object.values(textAlign).map((align, i) => (\n <ActionItem\n key={`text-${i}`}\n icon={align.Icon}\n label={align.label}\n disabled={!align.canAlignCell}\n isActive={align.isActive}\n onClick={align.handleAlign}\n />\n ))}\n <Separator orientation=\"horizontal\" />\n {Object.values(verticalAlign).map((align, i) => (\n <ActionItem\n key={`vertical-${i}`}\n icon={align.Icon}\n label={align.label}\n disabled={!align.canAlignCell}\n isActive={align.isActive}\n onClick={align.handleAlign}\n />\n ))}\n </MenuGroup>\n </ComboboxList>\n </MenuContent>\n </Menu>\n )\n}\n\nconst ActionItem = ({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n isActive = false,\n shortcutBadge,\n}: ActionItemProps) => (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={onClick}\n disabled={disabled}\n >\n <Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n {shortcutBadge}\n </MenuItem>\n)\n\nActionItem.displayName = \"ActionItem\"\n","import {\n useCallback,\n useMemo,\n useState,\n createContext,\n useContext,\n} from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { TableMap } from \"@tiptap/pm/tables\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\nimport { cn, isValidPosition, SR_ONLY } from \"../../../../../lib/tiptap-utils\"\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport { selectCellsByCoords } from \"../../lib/tiptap-table-utils\"\n\n// --- Icons ---\nimport { MoreVerticalIcon } from \"../../../../tiptap-icons/more-vertical-icon\"\n\n// --- UI Primitives ---\nimport { Button } from \"../../../../tiptap-ui-primitive/button\"\nimport { Combobox, ComboboxList } from \"../../../../tiptap-ui-primitive/combobox\"\nimport {\n Menu,\n MenuButton,\n MenuContent,\n MenuGroup,\n MenuItem,\n} from \"../../../../tiptap-ui-primitive/menu\"\nimport { Separator } from \"../../../../tiptap-ui-primitive/separator\"\n\n// --- Tiptap UI ---\nimport { useTableDuplicateRowColumn } from \"../table-duplicate-row-column-button\"\nimport { useTableMoveRowColumn } from \"../table-move-row-column-button\"\nimport { useTableClearRowColumnContent } from \"../table-clear-row-column-content-button\"\nimport { useTableHeaderRowColumn } from \"../table-header-row-column-button\"\nimport { useTableAddRowColumn } from \"../table-add-row-column-button\"\nimport { useTableDeleteRowColumn } from \"../table-delete-row-column-button\"\nimport { useTableSortRowColumn } from \"../table-sort-row-column-button\"\nimport { ColorMenu } from \"../../../../tiptap-ui/color-menu\"\nimport { TableAlignMenu } from \"../table-alignment-menu\"\n\nimport { dragEnd } from \"../../extensions/table-handle\"\n\nimport \"./table-handle-menu.scss\"\n\n/* -------------------------------------------------------------------------------------------------\n * Types & Interfaces\n * ----------------------------------------------------------------------------------------------- */\n\ninterface BaseProps {\n editor?: Editor | null\n orientation: Orientation\n index?: number\n tableNode?: Node\n tablePos?: number\n}\n\ninterface TableHandleMenuProps extends BaseProps {\n onToggleOtherHandle?: (visible: boolean) => void\n onOpenChange?: (open: boolean) => void\n dragStart?: (e: React.DragEvent) => void\n}\n\ntype TableHandleContextValue = BaseProps\n\ninterface TableActionItemProps {\n icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }>\n label: string\n onClick: () => void\n disabled?: boolean\n isActive?: boolean\n shortcutBadge?: React.ReactNode\n}\n\nconst MENU_PLACEMENT_MAP: Record<\n Orientation,\n React.ComponentProps<typeof Menu>[\"placement\"]\n> = {\n row: \"top-start\",\n column: \"bottom-start\",\n}\n\nconst ARIA_LABELS: Record<Orientation, string> = {\n row: \"行操作\",\n column: \"列操作\",\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * ----------------------------------------------------------------------------------------------- */\n\nconst TableHandleContext = createContext<TableHandleContextValue | null>(null)\n\nfunction useTableHandleContext() {\n const context = useContext(TableHandleContext)\n if (!context) {\n throw new Error(\n \"useTableHandleContext must be used within TableHandleProvider\"\n )\n }\n return context\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * ----------------------------------------------------------------------------------------------- */\n\n/**\n * Hook to manage table handle menu state and interactions\n */\nfunction useTableHandleMenu(\n onToggleOtherHandle?: (visible: boolean) => void,\n onOpenChange?: (open: boolean) => void\n) {\n const { editor, orientation, index, tableNode, tablePos } =\n useTableHandleContext()\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [isDragging, setIsDragging] = useState(false)\n\n const menuPlacement = useMemo(\n () => MENU_PLACEMENT_MAP[orientation],\n [orientation]\n )\n\n const selectRowOrColumn = useCallback(() => {\n if (\n !editor ||\n !tableNode ||\n !isValidPosition(tablePos) ||\n !isValidPosition(index)\n )\n return\n\n try {\n const { width, height } = TableMap.get(tableNode)\n const start =\n orientation === \"row\" ? { row: index, col: 0 } : { row: 0, col: index }\n const end =\n orientation === \"row\"\n ? { row: index, col: width - 1 }\n : { row: height - 1, col: index }\n\n selectCellsByCoords(editor, tablePos, [start, end], {\n mode: \"dispatch\",\n dispatch: editor.view.dispatch.bind(editor.view),\n })\n } catch (error) {\n console.warn(\"Failed to select row/column:\", error)\n }\n }, [editor, tableNode, tablePos, orientation, index])\n\n const handleMenuToggle = useCallback(\n (isOpen: boolean) => {\n if (!editor) return\n\n setIsMenuOpen(isOpen)\n onOpenChange?.(isOpen)\n\n if (isOpen) {\n editor.commands.freezeHandles()\n selectRowOrColumn()\n onToggleOtherHandle?.(false)\n } else {\n editor.commands.unfreezeHandles()\n onToggleOtherHandle?.(true)\n }\n },\n [editor, onOpenChange, onToggleOtherHandle, selectRowOrColumn]\n )\n\n const resetMenu = useCallback(() => {\n if (!editor) return\n\n setIsMenuOpen(false)\n onOpenChange?.(false)\n editor.commands.unfreezeHandles()\n onToggleOtherHandle?.(true)\n }, [editor, onOpenChange, onToggleOtherHandle])\n\n return {\n isMenuOpen,\n isDragging,\n setIsDragging,\n menuPlacement,\n handleMenuToggle,\n resetMenu,\n }\n}\n\n/**\n * Hook to get filtered action items based on orientation\n */\nfunction useTableActionItems() {\n const { editor, index, orientation, tablePos } = useTableHandleContext()\n\n const deleteAction = useTableDeleteRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n const duplicateAction = useTableDuplicateRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n })\n\n // Sort actions\n const sortAscAction = useTableSortRowColumn({\n editor,\n tablePos,\n index,\n orientation,\n direction: \"asc\",\n hideWhenUnavailable: true,\n })\n\n const sortDescAction = useTableSortRowColumn({\n editor,\n tablePos,\n index,\n orientation,\n direction: \"desc\",\n hideWhenUnavailable: true,\n })\n\n const clearContentAction = useTableClearRowColumnContent({\n editor,\n index,\n orientation,\n tablePos,\n resetAttrs: true,\n hideWhenUnavailable: true,\n })\n\n const headerAction = useTableHeaderRowColumn({\n editor,\n index,\n orientation,\n tablePos,\n hideWhenUnavailable: true,\n })\n\n const moveUpAction = useTableMoveRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"row\",\n direction: \"up\",\n hideWhenUnavailable: true,\n })\n\n const moveDownAction = useTableMoveRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"row\",\n direction: \"down\",\n hideWhenUnavailable: true,\n })\n\n const moveLeftAction = useTableMoveRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"column\",\n direction: \"left\",\n hideWhenUnavailable: true,\n })\n\n const moveRightAction = useTableMoveRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"column\",\n direction: \"right\",\n hideWhenUnavailable: true,\n })\n\n const addAbove = useTableAddRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"row\",\n side: \"above\",\n hideWhenUnavailable: true,\n })\n\n const addBelow = useTableAddRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"row\",\n side: \"below\",\n hideWhenUnavailable: true,\n })\n\n const addLeft = useTableAddRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"column\",\n side: \"left\",\n hideWhenUnavailable: true,\n })\n\n const addRight = useTableAddRowColumn({\n editor,\n index,\n tablePos,\n orientation: \"column\",\n side: \"right\",\n hideWhenUnavailable: true,\n })\n\n const moveActions = useMemo(\n () => ({\n moveUp: moveUpAction,\n moveDown: moveDownAction,\n moveLeft: moveLeftAction,\n moveRight: moveRightAction,\n }),\n [moveUpAction, moveDownAction, moveLeftAction, moveRightAction]\n )\n\n const addActions = useMemo(\n () => ({\n addAbove,\n addBelow,\n addLeft,\n addRight,\n }),\n [addAbove, addBelow, addLeft, addRight]\n )\n\n const sortActions = useMemo(\n () => ({\n sortAsc: sortAscAction,\n sortDesc: sortDescAction,\n }),\n [sortAscAction, sortDescAction]\n )\n\n const getSortItems = useCallback(() => {\n const items: TableActionItemProps[] = []\n\n if (sortActions.sortAsc.isVisible) {\n items.push({\n icon: sortActions.sortAsc.Icon,\n label: sortActions.sortAsc.label,\n disabled: !sortActions.sortAsc.canSortRowColumn,\n onClick: sortActions.sortAsc.handleSort,\n })\n }\n\n if (sortActions.sortDesc.isVisible) {\n items.push({\n icon: sortActions.sortDesc.Icon,\n label: sortActions.sortDesc.label,\n disabled: !sortActions.sortDesc.canSortRowColumn,\n onClick: sortActions.sortDesc.handleSort,\n })\n }\n\n return items\n }, [sortActions])\n\n const getActionItems = useCallback(() => {\n const items: TableActionItemProps[] = []\n\n if (orientation === \"row\") {\n if (addActions.addAbove.isVisible) {\n items.push({\n icon: addActions.addAbove.Icon,\n label: addActions.addAbove.label,\n disabled: !addActions.addAbove.canAddRowColumn,\n onClick: addActions.addAbove.handleAdd,\n })\n }\n if (addActions.addBelow.isVisible) {\n items.push({\n icon: addActions.addBelow.Icon,\n label: addActions.addBelow.label,\n disabled: !addActions.addBelow.canAddRowColumn,\n onClick: addActions.addBelow.handleAdd,\n })\n }\n } else {\n if (addActions.addLeft.isVisible) {\n items.push({\n icon: addActions.addLeft.Icon,\n label: addActions.addLeft.label,\n disabled: !addActions.addLeft.canAddRowColumn,\n onClick: addActions.addLeft.handleAdd,\n })\n }\n if (addActions.addRight.isVisible) {\n items.push({\n icon: addActions.addRight.Icon,\n label: addActions.addRight.label,\n disabled: !addActions.addRight.canAddRowColumn,\n onClick: addActions.addRight.handleAdd,\n })\n }\n }\n\n return items\n }, [orientation, addActions])\n\n const getMoveItems = useCallback(() => {\n const items: TableActionItemProps[] = []\n\n if (orientation === \"row\") {\n if (moveActions.moveUp.isVisible) {\n items.push({\n icon: moveActions.moveUp.Icon,\n label: moveActions.moveUp.label,\n disabled: !moveActions.moveUp.canMoveRowColumn,\n onClick: moveActions.moveUp.handleMove,\n })\n }\n if (moveActions.moveDown.isVisible) {\n items.push({\n icon: moveActions.moveDown.Icon,\n label: moveActions.moveDown.label,\n disabled: !moveActions.moveDown.canMoveRowColumn,\n onClick: moveActions.moveDown.handleMove,\n })\n }\n } else {\n if (moveActions.moveLeft.isVisible) {\n items.push({\n icon: moveActions.moveLeft.Icon,\n label: moveActions.moveLeft.label,\n disabled: !moveActions.moveLeft.canMoveRowColumn,\n onClick: moveActions.moveLeft.handleMove,\n })\n }\n if (moveActions.moveRight.isVisible) {\n items.push({\n icon: moveActions.moveRight.Icon,\n label: moveActions.moveRight.label,\n disabled: !moveActions.moveRight.canMoveRowColumn,\n onClick: moveActions.moveRight.handleMove,\n })\n }\n }\n\n return items\n }, [orientation, moveActions])\n\n return {\n deleteAction,\n duplicateAction,\n clearContentAction,\n headerAction,\n addItems: getActionItems(),\n moveItems: getMoveItems(),\n sortItems: getSortItems(),\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * ----------------------------------------------------------------------------------------------- */\n\n/**\n * Individual action item component\n */\nconst TableActionItem = ({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n isActive = false,\n shortcutBadge,\n}: TableActionItemProps) => (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={onClick}\n disabled={disabled}\n >\n <Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n {shortcutBadge}\n </MenuItem>\n)\n\n/**\n * Action group component containing add and delete actions\n */\nconst TableActionGroup = () => {\n const { index, orientation } = useTableHandleContext()\n const {\n deleteAction,\n duplicateAction,\n clearContentAction,\n headerAction,\n addItems,\n moveItems,\n sortItems,\n } = useTableActionItems()\n\n const hasActions =\n deleteAction.isVisible ||\n duplicateAction.isVisible ||\n clearContentAction.isVisible\n const hasAddItems = addItems.length > 0\n const hasMoveItems = moveItems.length > 0\n const hasSortItems = sortItems.length > 0\n const hasHeaderAction = headerAction.isVisible && index === 0\n\n if (\n !hasActions &&\n !hasAddItems &&\n !hasMoveItems &&\n !hasSortItems &&\n !hasHeaderAction\n ) {\n return null\n }\n\n return (\n <>\n {/* Header Toggle Action - Only for first row/column */}\n {hasHeaderAction && (\n <>\n <MenuGroup>\n <TableActionItem\n icon={headerAction.Icon}\n label={headerAction.label}\n disabled={!headerAction.canToggleHeader}\n isActive={headerAction.isActive}\n onClick={headerAction.handleToggle}\n />\n </MenuGroup>\n <Separator orientation=\"horizontal\" />\n </>\n )}\n\n {/* Move Actions */}\n {hasMoveItems && (\n <>\n <MenuGroup>\n {moveItems.map((item, i) => (\n <TableActionItem key={`move-${i}`} {...item} />\n ))}\n </MenuGroup>\n <Separator orientation=\"horizontal\" />\n </>\n )}\n\n {/* Add Actions */}\n {hasAddItems && (\n <>\n <MenuGroup>\n {addItems.map((item, i) => (\n <TableActionItem key={`add-${i}`} {...item} />\n ))}\n </MenuGroup>\n <Separator orientation=\"horizontal\" />\n </>\n )}\n\n {/* Sort Actions */}\n {hasSortItems && (\n <>\n <MenuGroup>\n {sortItems.map((item, i) => (\n <TableActionItem key={`sort-${i}`} {...item} />\n ))}\n </MenuGroup>\n <Separator orientation=\"horizontal\" />\n </>\n )}\n\n {/* Actions */}\n <>\n <MenuGroup>\n <ColorMenu />\n <TableAlignMenu index={index} orientation={orientation} />\n {clearContentAction.isVisible && (\n <TableActionItem\n icon={clearContentAction.Icon}\n label={clearContentAction.label}\n disabled={!clearContentAction.canClearRowColumnContent}\n onClick={clearContentAction.handleClear}\n />\n )}\n </MenuGroup>\n <Separator orientation=\"horizontal\" />\n </>\n\n {hasActions && (\n <MenuGroup>\n {duplicateAction.isVisible && (\n <TableActionItem\n icon={duplicateAction.Icon}\n label={duplicateAction.label}\n disabled={!duplicateAction.canDuplicateRowColumn}\n onClick={duplicateAction.handleDuplicate}\n />\n )}\n\n {deleteAction.isVisible && (\n <TableActionItem\n icon={deleteAction.Icon}\n label={deleteAction.label}\n disabled={!deleteAction.canDeleteRowColumn}\n onClick={deleteAction.handleDelete}\n />\n )}\n </MenuGroup>\n )}\n </>\n )\n}\n\n/**\n * Menu content component\n */\nconst TableActionMenu = () => {\n const { resetMenu } = useTableHandleMenu()\n\n return (\n <MenuContent\n autoFocusOnShow\n autoFocusOnHide={false}\n modal\n onClose={resetMenu}\n >\n <Combobox style={SR_ONLY} />\n <ComboboxList style={{ minWidth: \"15rem\" }}>\n <TableActionGroup />\n </ComboboxList>\n </MenuContent>\n )\n}\n\n/**\n * Main table handle menu component\n */\nexport const TableHandleMenu = ({\n editor: providedEditor,\n orientation,\n index,\n tableNode,\n tablePos,\n onToggleOtherHandle,\n onOpenChange,\n dragStart,\n}: TableHandleMenuProps) => {\n const { editor } = useTiptapEditor(providedEditor)\n\n const contextValue = useMemo<TableHandleContextValue>(\n () => ({\n editor,\n orientation,\n index,\n tableNode,\n tablePos,\n }),\n [editor, orientation, index, tableNode, tablePos]\n )\n\n return (\n <TableHandleContext.Provider value={contextValue}>\n <TableHandleMenuContent\n onToggleOtherHandle={onToggleOtherHandle}\n onOpenChange={onOpenChange}\n dragStart={dragStart}\n />\n </TableHandleContext.Provider>\n )\n}\n\n/**\n * Internal menu content component\n */\nconst TableHandleMenuContent = ({\n onToggleOtherHandle,\n onOpenChange,\n dragStart,\n}: Pick<\n TableHandleMenuProps,\n \"onToggleOtherHandle\" | \"onOpenChange\" | \"dragStart\"\n>) => {\n const { orientation } = useTableHandleContext()\n const {\n isMenuOpen,\n isDragging,\n setIsDragging,\n menuPlacement,\n handleMenuToggle,\n } = useTableHandleMenu(onToggleOtherHandle, onOpenChange)\n\n const ariaLabel = ARIA_LABELS[orientation]\n\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n setIsDragging(true)\n dragStart?.(e)\n },\n [dragStart, setIsDragging]\n )\n\n const handleDragEnd = useCallback(() => {\n setIsDragging(false)\n dragEnd()\n }, [setIsDragging])\n\n return (\n <Menu\n open={isMenuOpen}\n onOpenChange={handleMenuToggle}\n placement={menuPlacement}\n trigger={\n <MenuButton\n className={cn(\n \"tiptap-table-handle-menu\",\n isMenuOpen && \"menu-opened\",\n isDragging && \"is-dragging\",\n orientation\n )}\n draggable={true}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <MoreVerticalIcon className=\"tiptap-button-icon\" />\n </MenuButton>\n }\n >\n <TableActionMenu />\n </Menu>\n )\n}\n\nexport { TableActionMenu }\n","\"use client\"\n\nimport { useCallback, useMemo, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { ComponentType } from \"react\"\nimport { FloatingPortal } from \"@floating-ui/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\nimport {\n colDragStart,\n rowDragStart,\n} from \"../../extensions/table-handle\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\nimport { useTableHandlePositioning } from \"./use-table-handle-positioning\"\nimport { useTableHandleState } from \"../../hooks/use-table-handle-state\"\nimport { type Orientation } from \"../../lib/tiptap-table-utils\"\n\n// --- Components ---\nimport { TableHandleMenu } from \"../table-handle-menu\"\n\nexport interface TableHandleButtonProps {\n editor: Editor\n orientation: Orientation\n index?: number\n tablePos?: number\n tableNode?: Node\n onToggleOtherHandle?: (visible: boolean) => void\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface TableHandleRenderProps {\n editor: Editor\n state: ReturnType<typeof useTableHandleState>\n rowHandle: ReturnType<typeof useTableHandlePositioning>[\"rowHandle\"]\n colHandle: ReturnType<typeof useTableHandlePositioning>[\"colHandle\"]\n toggleRowVisibility: (visible: boolean) => void\n toggleColumnVisibility: (visible: boolean) => void\n}\n\nexport interface TableHandleProps {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n\n /**\n * Custom component to render for row handles.\n * If not provided, uses the default TableHandleMenu.\n */\n rowButton?: ComponentType<TableHandleButtonProps>\n\n /**\n * Custom component to render for column handles.\n * If not provided, uses the default TableHandleMenu.\n */\n columnButton?: ComponentType<TableHandleButtonProps>\n}\n\n/**\n * Main table handle component that manages the positioning and rendering\n * of table row/column handles, extend buttons, and context menus.\n *\n * This component can be extended with custom row and column buttons,\n * or completely customized using the render prop pattern.\n */\nexport function TableHandle({\n editor: providedEditor,\n rowButton: CustomRowButton,\n columnButton: CustomColumnButton,\n}: TableHandleProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const state = useTableHandleState({ editor })\n\n const [isRowVisible, setIsRowVisible] = useState(true)\n const [isColumnVisible, setIsColumnVisible] = useState(true)\n const [menuOpen, setMenuOpen] = useState<null | \"row\" | \"column\">(null)\n\n const draggingState = useMemo(() => {\n if (!state?.draggingState) return undefined\n\n return {\n draggedCellOrientation: state.draggingState.draggedCellOrientation,\n mousePos: state.draggingState.mousePos,\n initialOffset: state.draggingState.initialOffset,\n }\n }, [state?.draggingState])\n\n const { rowHandle, colHandle } = useTableHandlePositioning(\n state?.show || false,\n state?.referencePosCell || null,\n state?.referencePosTable || null,\n draggingState\n )\n\n const toggleRowVisibility = useCallback((visible: boolean) => {\n setIsRowVisible(visible)\n }, [])\n\n const toggleColumnVisibility = useCallback((visible: boolean) => {\n setIsColumnVisible(visible)\n }, [])\n\n const handleMenuOpenChange = useCallback(\n (type: \"row\" | \"column\", open: boolean) => {\n setMenuOpen(open ? type : null)\n },\n []\n )\n\n if (!editor || !state) return null\n\n const hasValidRowIndex = typeof state.rowIndex === \"number\"\n const hasValidColIndex = typeof state.colIndex === \"number\"\n\n const shouldShowRow =\n (isRowVisible && rowHandle.isMounted && hasValidRowIndex) ||\n menuOpen === \"row\"\n\n const shouldShowColumn =\n (isColumnVisible && colHandle.isMounted && hasValidColIndex) ||\n menuOpen === \"column\"\n\n const RowButton = CustomRowButton || TableHandleMenu\n const ColumnButton = CustomColumnButton || TableHandleMenu\n\n return (\n <FloatingPortal root={state.widgetContainer}>\n {shouldShowRow && (\n <div ref={rowHandle.ref} style={rowHandle.style}>\n <RowButton\n editor={editor}\n orientation=\"row\"\n index={state.rowIndex}\n tablePos={state.blockPos}\n tableNode={state.block}\n onToggleOtherHandle={toggleColumnVisibility}\n dragStart={rowDragStart}\n onOpenChange={(open) => handleMenuOpenChange(\"row\", open)}\n />\n </div>\n )}\n\n {shouldShowColumn && (\n <div ref={colHandle.ref} style={colHandle.style}>\n <ColumnButton\n editor={editor}\n orientation=\"column\"\n index={state.colIndex}\n tablePos={state.blockPos}\n tableNode={state.block}\n onToggleOtherHandle={toggleRowVisibility}\n dragStart={colDragStart}\n onOpenChange={(open) => handleMenuOpenChange(\"column\", open)}\n />\n </div>\n )}\n </FloatingPortal>\n )\n}\n\nTableHandle.displayName = \"TableHandle\"\n","import { useEffect, useCallback, useRef } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { columnResizingPluginKey } from \"@tiptap/pm/tables\"\nimport type { Transaction } from \"@tiptap/pm/state\"\n\nexport function useResizeOverlay(\n editor: Editor | null,\n updateSelectionRect: () => void\n) {\n const rafId = useRef<number | null>(null)\n\n const stopLoop = useCallback(() => {\n if (rafId.current != null) {\n cancelAnimationFrame(rafId.current)\n rafId.current = null\n }\n }, [])\n\n const startLoop = useCallback(() => {\n if (rafId.current != null) return\n const tick = () => {\n const st = columnResizingPluginKey.getState(editor!.state)\n const dragging = !!st?.dragging\n updateSelectionRect() // mutate overlay styles; avoid setState if possible\n if (dragging) {\n rafId.current = requestAnimationFrame(tick)\n } else {\n stopLoop()\n // one final sync after mouseup\n updateSelectionRect()\n }\n }\n rafId.current = requestAnimationFrame(tick)\n }, [editor, updateSelectionRect, stopLoop])\n\n useEffect(() => {\n if (!editor) return\n\n const onTx = ({ transaction }: { transaction: Transaction }) => {\n // this is for non-resize txs that may affect selection\n updateSelectionRect()\n\n const meta = transaction.getMeta(columnResizingPluginKey)\n if (!meta) return\n\n // drag start\n if (\n Object.prototype.hasOwnProperty.call(meta, \"setDragging\") &&\n meta.setDragging\n ) {\n startLoop()\n }\n\n // drag end is also a tx with setDragging: null — rAF loop will notice and stop itself\n if (\n Object.prototype.hasOwnProperty.call(meta, \"setDragging\") &&\n meta.setDragging == null\n ) {\n // if loop missed it for any reason, force a stop + final sync\n stopLoop()\n updateSelectionRect()\n }\n\n // handle-only hover (optional): update once for cursor changes, etc.\n if (Object.prototype.hasOwnProperty.call(meta, \"setHandle\")) {\n updateSelectionRect()\n }\n }\n\n editor.on(\"transaction\", onTx)\n return () => {\n editor.off(\"transaction\", onTx)\n stopLoop()\n }\n }, [editor, startLoop, stopLoop, updateSelectionRect])\n}\n","\"use client\"\n\nimport { useEffect, useState, useCallback, useRef } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { CellSelection, cellAround } from \"@tiptap/pm/tables\"\nimport type { EditorState, Selection } from \"@tiptap/pm/state\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport type { EditorView } from \"@tiptap/pm/view\"\nimport { FloatingPortal, useFloating } from \"@floating-ui/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\nimport { useResizeOverlay } from \"./use-resize-overlay\"\n\n// --- Lib ---\nimport {\n domCellAround,\n getTable,\n rectEq,\n} from \"../../lib/tiptap-table-utils\"\n\nexport interface TableSelectionOverlayProps {\n editor?: Editor | null\n cellMenu?: React.ComponentType<{\n onOpenChange?: (isOpen: boolean) => void\n editor?: Editor | null\n onResizeStart?: (handle: ResizeHandle) => (event: React.MouseEvent) => void\n }>\n showResizeHandles?: boolean\n onMenuOpenChange?: (isOpen: boolean) => void\n}\n\n// tl = top-left\n// tr = top-right\n// bl = bottom-left\n// br = bottom-right\ntype ResizeHandle = \"tl\" | \"tr\" | \"bl\" | \"br\" | null\n\n// if an element’s edge is within 5px of the selection edge,\n// it is treated as aligned.\nconst CORNER_DETECTION_TOLERANCE = 5\n\nconst getCellAtCoordinates = (\n state: EditorState,\n view: EditorView,\n x: number,\n y: number\n) => {\n const pos = view.posAtCoords({ left: x, top: y })?.pos\n if (pos == null) return null\n\n const $pos = state.doc.resolve(pos)\n return cellAround($pos)\n}\n\nconst getSelectionBoundingRect = (\n view: EditorView,\n selection: Selection\n): DOMRect | null => {\n if (!(selection instanceof CellSelection)) return null\n\n const cells: Element[] = []\n selection.forEachCell((_node: Node, pos: number) => {\n const dom = view.nodeDOM(pos) as Element | null\n if (dom) cells.push(dom)\n })\n\n if (cells.length === 0) return null\n\n const bounds = {\n left: Infinity,\n top: Infinity,\n right: -Infinity,\n bottom: -Infinity,\n }\n\n cells.forEach((cell) => {\n const rect = cell.getBoundingClientRect()\n bounds.left = Math.min(bounds.left, rect.left)\n bounds.top = Math.min(bounds.top, rect.top)\n bounds.right = Math.max(bounds.right, rect.right)\n bounds.bottom = Math.max(bounds.bottom, rect.bottom)\n })\n\n return new DOMRect(\n bounds.left,\n bounds.top,\n bounds.right - bounds.left,\n bounds.bottom - bounds.top\n )\n}\n\nconst getSingleCellBoundingRect = (\n view: EditorView,\n cellPos: number\n): DOMRect | null => {\n const cellDom = view.nodeDOM(cellPos) as Element | null\n if (!cellDom) return null\n\n const rect = cellDom.getBoundingClientRect()\n return new DOMRect(rect.left, rect.top, rect.width, rect.height)\n}\n\nconst createVirtualReference = (rect: DOMRect) => ({\n getBoundingClientRect: () => rect,\n})\n\ninterface CornerPositions {\n topLeft: number | null\n topRight: number | null\n bottomLeft: number | null\n bottomRight: number | null\n}\n\nconst findCornerCells = (\n view: EditorView,\n selection: CellSelection,\n selectionRect: DOMRect\n): CornerPositions => {\n const corners: CornerPositions = {\n topLeft: null,\n topRight: null,\n bottomLeft: null,\n bottomRight: null,\n }\n\n // It takes two numbers: value1 and value2.\n // It calculates the absolute difference between them: Math.abs(value1 - value2).\n // It checks whether that difference is less than 5 (CORNER_DETECTION_TOLERANCE).\n // It returns a boolean:\n // true → if value1 and value2 are within 5 (CORNER_DETECTION_TOLERANCE) of each other.\n // false → if they are 5 or more units apart.\n const isNearEdge = (value1: number, value2: number) =>\n Math.abs(value1 - value2) < CORNER_DETECTION_TOLERANCE\n\n selection.forEachCell((_node: Node, pos: number) => {\n const dom = view.nodeDOM(pos) as Element | null\n if (!dom) return\n\n const cellRect = dom.getBoundingClientRect()\n\n // Top-left corner\n if (\n isNearEdge(cellRect.left, selectionRect.left) &&\n isNearEdge(cellRect.top, selectionRect.top)\n ) {\n corners.topLeft = pos\n }\n\n // Top-right corner\n if (\n isNearEdge(cellRect.right, selectionRect.right) &&\n isNearEdge(cellRect.top, selectionRect.top)\n ) {\n corners.topRight = pos\n }\n\n // Bottom-left corner\n if (\n isNearEdge(cellRect.left, selectionRect.left) &&\n isNearEdge(cellRect.bottom, selectionRect.bottom)\n ) {\n corners.bottomLeft = pos\n }\n\n // Bottom-right corner\n if (\n isNearEdge(cellRect.right, selectionRect.right) &&\n isNearEdge(cellRect.bottom, selectionRect.bottom)\n ) {\n corners.bottomRight = pos\n }\n })\n\n return corners\n}\n\nconst getAnchorCellForHandle = (\n view: EditorView,\n selection: CellSelection,\n selectionRect: DOMRect,\n handle: ResizeHandle\n): { pos: number } | null => {\n if (!handle) return null\n\n const corners = findCornerCells(view, selection, selectionRect)\n\n const anchorMap: Record<NonNullable<ResizeHandle>, keyof CornerPositions> = {\n tl: \"bottomRight\",\n tr: \"bottomLeft\",\n bl: \"topRight\",\n br: \"topLeft\",\n }\n\n const anchorPos = corners[anchorMap[handle]]\n return anchorPos ? { pos: anchorPos } : null\n}\n\nconst createHandleStyles = (): React.CSSProperties => ({\n position: \"absolute\",\n width: 15,\n height: 15,\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"transparent\",\n pointerEvents: \"auto\",\n zIndex: 10,\n})\n\nconst createCornerHandleStyles = (\n position: \"tl\" | \"tr\" | \"bl\" | \"br\",\n isActiveHandle: boolean,\n isDisabled: boolean = false\n): React.CSSProperties => {\n const baseStyles = createHandleStyles()\n\n const positionStyles: Record<typeof position, React.CSSProperties> = {\n tl: {\n top: -7.5,\n left: -7.5,\n cursor: isDisabled ? \"default\" : \"nwse-resize\",\n },\n tr: {\n top: -7.5,\n right: -7.5,\n cursor: isDisabled ? \"default\" : \"nesw-resize\",\n },\n bl: {\n bottom: -7.5,\n left: -7.5,\n cursor: isDisabled ? \"default\" : \"nesw-resize\",\n },\n br: {\n bottom: -7.5,\n right: -7.5,\n cursor: isDisabled ? \"default\" : \"nwse-resize\",\n },\n }\n\n return {\n ...baseStyles,\n ...positionStyles[position],\n opacity: isDisabled ? 0.3 : isActiveHandle ? 1 : 0.5,\n pointerEvents: isDisabled ? \"none\" : \"auto\",\n }\n}\n\nexport const TableSelectionOverlay: React.FC<TableSelectionOverlayProps> = ({\n editor: providedEditor,\n cellMenu: CellMenu,\n showResizeHandles = true,\n onMenuOpenChange,\n}) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n const [selectionRect, setSelectionRect] = useState<DOMRect | null>(null)\n const [activeHandle, setActiveHandle] = useState<ResizeHandle>(null)\n const [tableDom, setTableDom] = useState<HTMLElement | null>(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const anchorCellRef = useRef<number | null>(null)\n const activeHandleRef = useRef<ResizeHandle>(null)\n const containerRef = useRef<HTMLElement | null>(null)\n\n const { refs, floatingStyles, update } = useFloating({\n placement: \"top-start\",\n })\n\n useEffect(() => {\n if (selectionRect) {\n const virtualReference = createVirtualReference(selectionRect)\n refs.setPositionReference(virtualReference)\n }\n }, [selectionRect, refs])\n\n const updateSelectionRect = useCallback(() => {\n if (!editor) return\n\n const { selection } = editor.state\n\n if (selection instanceof CellSelection) {\n const rect = getSelectionBoundingRect(editor.view, selection)\n\n if (!rect) {\n setIsVisible(false)\n setSelectionRect((prev) => (prev ? null : prev))\n return\n }\n\n setSelectionRect((prev) => (rectEq(prev, rect) ? prev : rect))\n setIsVisible(true)\n return\n }\n\n // single cell handling\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n const rect = getSingleCellBoundingRect(editor.view, cell.pos)\n\n if (rect) {\n setSelectionRect((prev) => (rectEq(prev, rect) ? prev : rect))\n setIsVisible(true)\n return\n }\n }\n\n setIsVisible(false)\n setSelectionRect((prev) => (prev ? null : prev))\n }, [editor])\n\n useResizeOverlay(editor, updateSelectionRect)\n\n useEffect(() => {\n if (update && selectionRect) {\n update()\n }\n }, [update, selectionRect])\n\n const createResizeHandler = useCallback(\n (handle: ResizeHandle) => (event: React.MouseEvent) => {\n if (\n !editor ||\n !handle ||\n !selectionRect ||\n isMenuOpen ||\n !showResizeHandles\n )\n return\n\n event.preventDefault()\n event.stopPropagation()\n\n const { selection } = editor.state\n let cellSelection: CellSelection | null = null\n\n if (selection instanceof CellSelection) {\n cellSelection = selection\n } else {\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n try {\n cellSelection = CellSelection.create(\n editor.state.doc,\n cell.pos,\n cell.pos\n )\n } catch (error) {\n console.warn(\n \"Could not create single cell selection for resize:\",\n error\n )\n return\n }\n }\n }\n\n if (!cellSelection) return\n\n const anchorCell = getAnchorCellForHandle(\n editor.view,\n cellSelection,\n selectionRect,\n handle\n )\n if (!anchorCell) return\n\n setActiveHandle(handle)\n activeHandleRef.current = handle\n anchorCellRef.current = anchorCell.pos\n\n const handleMouseMove = (mouseEvent: MouseEvent) => {\n if (!editor || anchorCellRef.current == null) return\n\n const target = domCellAround(mouseEvent.target as Element)\n if (!target || target.type !== \"cell\") return\n\n const targetCell = getCellAtCoordinates(\n editor.state,\n editor.view,\n mouseEvent.clientX,\n mouseEvent.clientY\n )\n if (!targetCell) return\n\n try {\n const newSelection = CellSelection.create(\n editor.state.doc,\n anchorCellRef.current,\n targetCell.pos\n )\n\n const transaction = editor.state.tr.setSelection(newSelection)\n editor.view.dispatch(transaction)\n } catch (error) {\n console.debug(\"Invalid cell selection during resize:\", error)\n }\n }\n\n const handleMouseUp = () => {\n setActiveHandle(null)\n activeHandleRef.current = null\n anchorCellRef.current = null\n\n window.removeEventListener(\"mousemove\", handleMouseMove)\n window.removeEventListener(\"mouseup\", handleMouseUp)\n }\n\n window.addEventListener(\"mousemove\", handleMouseMove)\n window.addEventListener(\"mouseup\", handleMouseUp)\n },\n [editor, selectionRect, isMenuOpen, showResizeHandles]\n )\n\n const updateTableDom = useCallback(() => {\n if (!editor) {\n setTableDom(null)\n return\n }\n\n const table = getTable(editor)\n if (!table) {\n setTableDom(null)\n return\n }\n\n setTableDom((prev) => {\n const currentDom = prev\n const newDom = editor.view.nodeDOM(table.pos) as HTMLElement | null\n return currentDom === newDom ? currentDom : newDom\n })\n }, [editor])\n\n const handleMenuOpenChange = useCallback(\n (isOpen: boolean) => {\n setIsMenuOpen(isOpen)\n onMenuOpenChange?.(isOpen)\n },\n [onMenuOpenChange]\n )\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n updateSelectionRect()\n updateTableDom()\n }\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n updateSelectionRect()\n updateTableDom()\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, updateSelectionRect, updateTableDom])\n\n useEffect(() => {\n const c = tableDom?.querySelector(\n \".table-selection-overlay-container\"\n ) as HTMLElement | null\n containerRef.current = c ?? null\n }, [tableDom])\n\n if (!isVisible || !selectionRect) {\n return null\n }\n\n if (!editor) return null\n\n const renderCellMenu = () => {\n if (!CellMenu) return null\n\n return (\n <span\n onMouseDown={(e) => e.stopPropagation()}\n style={{ pointerEvents: \"auto\" }}\n >\n <CellMenu\n onOpenChange={handleMenuOpenChange}\n editor={editor}\n onResizeStart={createResizeHandler}\n />\n </span>\n )\n }\n\n return (\n <FloatingPortal root={containerRef.current}>\n <div\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n pointerEvents: \"none\",\n zIndex: 10,\n }}\n >\n <div className=\"tiptap-table-selection-overlay\">\n <div\n style={{\n position: \"absolute\",\n width: selectionRect.width,\n height: selectionRect.height,\n zIndex: 2,\n borderRadius: 2,\n top: 0,\n left: 0,\n }}\n />\n\n <div\n style={{\n position: \"absolute\",\n width: selectionRect.width,\n height: selectionRect.height,\n border: `2px solid var(--tt-brand-color-400)`,\n borderRadius: 2,\n zIndex: 3,\n top: 0,\n left: 0,\n }}\n >\n {/* Menu Component */}\n {renderCellMenu()}\n\n {/* Corner resize handles */}\n {showResizeHandles && (\n <>\n <div\n style={createCornerHandleStyles(\n \"tl\",\n !activeHandle || activeHandle === \"tl\",\n isMenuOpen\n )}\n onMouseDown={createResizeHandler(\"tl\")}\n />\n <div\n style={createCornerHandleStyles(\n \"tr\",\n !activeHandle || activeHandle === \"tr\",\n isMenuOpen\n )}\n onMouseDown={createResizeHandler(\"tr\")}\n />\n <div\n style={createCornerHandleStyles(\n \"bl\",\n !activeHandle || activeHandle === \"bl\",\n isMenuOpen\n )}\n onMouseDown={createResizeHandler(\"bl\")}\n />\n <div\n style={createCornerHandleStyles(\n \"br\",\n !activeHandle || activeHandle === \"br\",\n isMenuOpen\n )}\n onMouseDown={createResizeHandler(\"br\")}\n />\n </>\n )}\n </div>\n </div>\n </div>\n </FloatingPortal>\n )\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TableCellMergeIcon = 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=\"M10 16C10.5177 16 10.9438 16.3933 10.9951 16.8975L11 17V19C11 20.6569 9.65685 22 8 22H4C2.34315 22 1 20.6569 1 19V17C1 16.4477 1.44772 16 2 16C2.55228 16 3 16.4477 3 17V19C3 19.5523 3.44772 20 4 20H8C8.55228 20 9 19.5523 9 19V17L9.00488 16.8975C9.05621 16.3933 9.48232 16 10 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22 16C22.5177 16 22.9438 16.3933 22.9951 16.8975L23 17V19C23 20.6569 21.6569 22 20 22H16C14.3431 22 13 20.6569 13 19V17C13 16.4477 13.4477 16 14 16C14.5523 16 15 16.4477 15 17V19C15 19.5523 15.4477 20 16 20H20C20.5523 20 21 19.5523 21 19V17L21.0049 16.8975C21.0562 16.3933 21.4823 16 22 16Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.29297 8.29297C5.68349 7.90244 6.31651 7.90244 6.70703 8.29297L9.70703 11.293L9.77539 11.3691C10.0957 11.7619 10.0731 12.3409 9.70703 12.707L6.70703 15.707C6.31651 16.0975 5.68349 16.0975 5.29297 15.707C4.90245 15.3165 4.90245 14.6835 5.29297 14.293L6.58594 13H3C2.44772 13 2 12.5523 2 12C2 11.4477 2.44772 11 3 11H6.58594L5.29297 9.70703C4.90245 9.31651 4.90245 8.68349 5.29297 8.29297Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17.293 8.29297C17.6835 7.90245 18.3165 7.90246 18.707 8.29297C19.0976 8.68349 19.0976 9.31651 18.707 9.70703L17.4141 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H17.4141L18.707 14.293C19.0976 14.6835 19.0976 15.3165 18.707 15.707C18.3165 16.0976 17.6835 16.0976 17.293 15.707L14.293 12.707L14.2246 12.6309C13.9043 12.2381 13.9269 11.6591 14.293 11.293L17.293 8.29297Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8 2C9.65685 2 11 3.34315 11 5V7C11 7.55228 10.5523 8 10 8C9.44771 8 9 7.55228 9 7V5C9 4.44772 8.55228 4 8 4H4C3.44772 4 3 4.44772 3 5V7C3 7.55228 2.55228 8 2 8C1.44772 8 1 7.55228 1 7V5C1 3.34315 2.34315 2 4 2H8Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20 2C21.6569 2 23 3.34315 23 5V7C23 7.55228 22.5523 8 22 8C21.4477 8 21 7.55228 21 7V5C21 4.44772 20.5523 4 20 4H16C15.4477 4 15 4.44772 15 5V7C15 7.55228 14.5523 8 14 8C13.4477 8 13 7.55228 13 7V5C13 3.34315 14.3431 2 16 2H20Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTableCellMergeIcon.displayName = \"TableCellMergeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TableCellSplitIcon = 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 2C2.34315 2 1 3.34315 1 5V7C1 7.55228 1.44772 8 2 8C2.55228 8 3 7.55228 3 7V5C3 4.44772 3.44772 4 4 4H8C8.55228 4 9 4.44772 9 5V7C9 7.55228 9.44772 8 10 8C10.5523 8 11 7.55228 11 7V5C11 3.34315 9.65685 2 8 2H4Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20 22C21.6569 22 23 20.6569 23 19V17C23 16.4477 22.5523 16 22 16C21.4477 16 21 16.4477 21 17V19C21 19.5523 20.5523 20 20 20H16C15.4477 20 15 19.5523 15 19V17C15 16.4477 14.5523 16 14 16C13.4477 16 13 16.4477 13 17V19C13 20.6569 14.3431 22 16 22H20Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 5C13 3.34315 14.3431 2 16 2H20C21.6569 2 23 3.34315 23 5V7C23 7.55228 22.5523 8 22 8C21.4477 8 21 7.55228 21 7V5C21 4.44772 20.5523 4 20 4H16C15.4477 4 15 4.44772 15 5V7C15 7.55228 14.5523 8 14 8C13.4477 8 13 7.55228 13 7V5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8 22C9.65685 22 11 20.6569 11 19V17C11 16.4477 10.5523 16 10 16C9.44772 16 9 16.4477 9 17V19C9 19.5523 8.55229 20 8 20H4C3.44772 20 3 19.5523 3 19L3 17C3 16.4477 2.55229 16 2 16C1.44772 16 1 16.4477 1 17V19C1 20.6569 2.34315 22 4 22H8Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18.7071 15.7071L21.7061 12.7081C21.8877 12.527 22 12.2766 22 12L22 11.997C21.9992 11.7421 21.9016 11.4874 21.7071 11.2929L18.7071 8.29289C18.3166 7.90237 17.6834 7.90237 17.2929 8.29289C16.9024 8.68342 16.9024 9.31658 17.2929 9.70711L18.5858 11H15C14.4477 11 14 11.4477 14 12C14 12.5523 14.4477 13 15 13H18.5858L17.2929 14.2929C16.9024 14.6834 16.9024 15.3166 17.2929 15.7071C17.6834 16.0976 18.3166 16.0976 18.7071 15.7071Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M2.07588 11.6172C2.02699 11.7351 2 11.8644 2 12C2 12.2728 2.10925 12.5201 2.2864 12.7005C2.28879 12.703 2.2912 12.7054 2.29362 12.7078L5.29289 15.7071C5.68342 16.0976 6.31658 16.0976 6.70711 15.7071C7.09763 15.3166 7.09763 14.6834 6.70711 14.2929L5.41421 13L9 13C9.55228 13 10 12.5523 10 12C10 11.4477 9.55229 11 9 11L5.41421 11L6.70711 9.70711C7.09763 9.31658 7.09763 8.68342 6.70711 8.29289C6.31658 7.90237 5.68342 7.90237 5.29289 8.29289L2.29366 11.2921C2.29122 11.2946 2.2888 11.297 2.2864 11.2995C2.19374 11.3938 2.12357 11.502 2.07588 11.6172Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTableCellSplitIcon.displayName = \"TableCellSplitIcon\"\n","import { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { mergeCells, splitCell } from \"@tiptap/pm/tables\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { TableCellMergeIcon } from \"../../../../tiptap-icons/table-cell-merge-icon\"\nimport { TableCellSplitIcon } from \"../../../../tiptap-icons/table-cell-split-icon\"\n\nexport type MergeSplitAction = \"merge\" | \"split\"\n\nexport interface UseTableMergeSplitCellConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the context/editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * The action to perform - merge or split cells.\n */\n action: MergeSplitAction\n /**\n * Hide the button when the action isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful merge or split.\n */\n onExecuted?: (action: MergeSplitAction) => void\n}\n\nconst REQUIRED_EXTENSIONS = [\"table\"]\n\nexport const tableMergeSplitCellLabels: Record<MergeSplitAction, string> = {\n merge: \"合并单元格\",\n split: \"拆分单元格\",\n}\n\nexport const tableMergeSplitCellIcons = {\n merge: TableCellMergeIcon,\n split: TableCellSplitIcon,\n}\n\n/**\n * Checks if a table cell merge can be performed\n * in the current editor state.\n */\nfunction canMergeCells(editor: Editor | null): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n return mergeCells(editor.state, undefined)\n } catch {\n return false\n }\n}\n\n/**\n * Checks if a table cell split can be performed\n * in the current editor state.\n */\nfunction canSplitCell(editor: Editor | null): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n return splitCell(editor.state, undefined)\n } catch {\n return false\n }\n}\n\n/**\n * Executes the cell merge operation in the editor.\n */\nfunction tableMergeCells(editor: Editor | null): boolean {\n if (!canMergeCells(editor) || !editor) return false\n\n try {\n const { state, view } = editor\n return mergeCells(state, view.dispatch.bind(view))\n } catch (error) {\n console.error(\"Error merging table cells:\", error)\n return false\n }\n}\n\n/**\n * Executes the cell split operation in the editor.\n */\nfunction tableSplitCell(editor: Editor | null): boolean {\n if (!canSplitCell(editor) || !editor) return false\n\n try {\n const { state, view } = editor\n return splitCell(state, view.dispatch.bind(view))\n } catch (error) {\n console.error(\"Error splitting table cell:\", error)\n return false\n }\n}\n\n/**\n * Executes the merge/split operation in the editor.\n */\nfunction tableMergeSplitCell({\n editor,\n action,\n}: {\n editor: Editor | null\n action: MergeSplitAction\n}): boolean {\n if (!editor) return false\n\n try {\n return action === \"merge\" ? tableMergeCells(editor) : tableSplitCell(editor)\n } catch (error) {\n console.error(`Error ${action}ing table cell:`, error)\n return false\n }\n}\n\n/**\n * Determines if the merge/split button should be shown\n * based on editor state and config.\n */\nfunction shouldShowButton({\n editor,\n action,\n hideWhenUnavailable,\n}: {\n editor: Editor | null\n action: MergeSplitAction\n hideWhenUnavailable: boolean\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n if (hideWhenUnavailable) {\n return action === \"merge\" ? canMergeCells(editor) : canSplitCell(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides **table cell merge/split**\n * functionality for the Tiptap editor.\n *\n * @example\n * ```tsx\n * // Simple merge button\n * function MergeCellsButton() {\n * const { isVisible, handleExecute, canExecute, label, Icon } = useTableMergeSplitCell({\n * action: \"merge\",\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleExecute}\n * disabled={!canExecute}\n * aria-label={label}\n * >\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * // Split cell button with callback\n * function SplitCellButton({ editor }: { editor: Editor }) {\n * const { isVisible, handleExecute, label, canExecute, Icon } = useTableMergeSplitCell({\n * editor,\n * action: \"split\",\n * hideWhenUnavailable: true,\n * onExecuted: (action) => console.log(`${action} completed!`),\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleExecute}\n * disabled={!canExecute}\n * aria-label={label}\n * >\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * // Dynamic merge/split button based on context\n * function MergeSplitButton() {\n * const mergeAction = useTableMergeSplitCell({\n * action: \"merge\",\n * hideWhenUnavailable: true,\n * })\n *\n * const splitAction = useTableMergeSplitCell({\n * action: \"split\",\n * hideWhenUnavailable: true,\n * })\n *\n * if (mergeAction.isVisible) {\n * return (\n * <button\n * onClick={mergeAction.handleExecute}\n * disabled={!mergeAction.canExecute}\n * >\n * {mergeAction.label}\n * </button>\n * )\n * }\n *\n * if (splitAction.isVisible) {\n * return (\n * <button\n * onClick={splitAction.handleExecute}\n * disabled={!splitAction.canExecute}\n * >\n * {splitAction.label}\n * </button>\n * )\n * }\n *\n * return null\n * }\n * ```\n */\nexport function useTableMergeSplitCell(config: UseTableMergeSplitCellConfig) {\n const {\n editor: providedEditor,\n action,\n hideWhenUnavailable = false,\n onExecuted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const isVisible = shouldShowButton({\n editor,\n action,\n hideWhenUnavailable,\n })\n\n const canPerformAction =\n action === \"merge\" ? canMergeCells(editor) : canSplitCell(editor)\n\n const handleExecute = useCallback(() => {\n const success = tableMergeSplitCell({\n editor,\n action,\n })\n\n if (success) {\n onExecuted?.(action)\n }\n return success\n }, [editor, action, onExecuted])\n\n return {\n isVisible,\n canExecute: canPerformAction,\n handleExecute,\n label: tableMergeSplitCellLabels[action],\n Icon: tableMergeSplitCellIcons[action],\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Grip4Icon = 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=\"M8 14C9.10457 14 10 14.8954 10 16C10 17.1046 9.10457 18 8 18C6.89543 18 6 17.1046 6 16C6 14.8954 6.89543 14 8 14ZM16 14C17.1046 14 18 14.8954 18 16C18 17.1046 17.1046 18 16 18C14.8954 18 14 17.1046 14 16C14 14.8954 14.8954 14 16 14ZM8 6C9.10457 6 10 6.89543 10 8C10 9.10457 9.10457 10 8 10C6.89543 10 6 9.10457 6 8C6 6.89543 6.89543 6 8 6ZM16 6C17.1046 6 18 6.89543 18 8C18 9.10457 17.1046 10 16 10C14.8954 10 14 9.10457 14 8C14 6.89543 14.8954 6 16 6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nGrip4Icon.displayName = \"Grip4Icon\"\n","\"use client\"\n\nimport { forwardRef, 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 { cn, SR_ONLY } from \"../../../../../lib/tiptap-utils\"\n\n// --- UI ---\nimport { ColorMenu } from \"../../../../tiptap-ui/color-menu\"\nimport { TableAlignMenu } from \"../table-alignment-menu\"\nimport { useTableClearRowColumnContent } from \"../table-clear-row-column-content-button\"\nimport { useTableMergeSplitCell } from \"../table-merge-split-cell-button\"\n\n// --- UI Primitives ---\nimport { Button } from \"../../../../tiptap-ui-primitive/button\"\nimport { Combobox, ComboboxList } from \"../../../../tiptap-ui-primitive/combobox\"\nimport {\n Menu,\n MenuButton,\n MenuContent,\n MenuGroup,\n MenuItem,\n} from \"../../../../tiptap-ui-primitive/menu\"\nimport { Separator } from \"../../../../tiptap-ui-primitive/separator\"\n\n// --- Icons ---\nimport { Grip4Icon } from \"../../../../tiptap-icons/grip-4-icon\"\n\nimport \"./table-cell-handle-menu.scss\"\n\ninterface TableAction {\n icon: React.ComponentType<{ className?: string; style?: React.CSSProperties }>\n label: string\n onClick: () => void\n isAvailable: boolean\n isActive?: boolean\n shortcutBadge?: React.ReactNode\n}\n\n/**\n * Hook to manage all table actions and their availability\n */\nfunction useTableActions() {\n const mergeCellAction = useTableMergeSplitCell({ action: \"merge\" })\n const splitCellAction = useTableMergeSplitCell({ action: \"split\" })\n const clearContentAction = useTableClearRowColumnContent({ resetAttrs: true })\n\n const mergeAction: TableAction = {\n icon: mergeCellAction.Icon,\n label: mergeCellAction.label,\n onClick: mergeCellAction.handleExecute,\n isAvailable: mergeCellAction.canExecute,\n }\n\n const splitAction: TableAction = {\n icon: splitCellAction.Icon,\n label: splitCellAction.label,\n onClick: splitCellAction.handleExecute,\n isAvailable: splitCellAction.canExecute,\n }\n\n const clearAction: TableAction = {\n icon: clearContentAction.Icon,\n label: clearContentAction.label,\n onClick: clearContentAction.handleClear,\n isAvailable: clearContentAction.canClearRowColumnContent,\n }\n\n return {\n mergeAction,\n splitAction,\n clearAction,\n }\n}\n\n/**\n * Hook to manage table handle menu state and interactions\n */\nfunction useTableCellHandleMenu({ editor }: { editor: Editor | null }) {\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false)\n editor?.commands.unfreezeHandles()\n }, [editor])\n\n const handleMenuToggle = useCallback(\n (isOpen: boolean) => {\n setIsMenuOpen(isOpen)\n\n if (!editor) return\n\n if (isOpen) {\n editor.commands.freezeHandles()\n } else {\n editor.commands.unfreezeHandles()\n }\n },\n [editor]\n )\n\n return {\n isMenuOpen,\n handleMenuToggle,\n closeMenu,\n }\n}\n\nconst TableActionItem = ({ action }: { action: TableAction }) => {\n const { icon: Icon, label, onClick, isActive = false, shortcutBadge } = action\n\n return (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={onClick}\n >\n <Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n {shortcutBadge}\n </MenuItem>\n )\n}\n\nconst TableActionMenu = ({ onClose }: { onClose: () => void }) => {\n const { mergeAction, splitAction, clearAction } = useTableActions()\n\n const hasMergeOrSplit = mergeAction.isAvailable || splitAction.isAvailable\n\n return (\n <MenuContent autoFocusOnShow modal onClose={onClose}>\n <Combobox style={SR_ONLY} />\n <ComboboxList style={{ minWidth: \"15rem\" }}>\n {hasMergeOrSplit && (\n <MenuGroup>\n {mergeAction.isAvailable && (\n <TableActionItem action={mergeAction} />\n )}\n {splitAction.isAvailable && (\n <TableActionItem action={splitAction} />\n )}\n <Separator orientation=\"horizontal\" />\n </MenuGroup>\n )}\n\n <MenuGroup>\n <ColorMenu />\n <TableAlignMenu />\n {clearAction.isAvailable && <TableActionItem action={clearAction} />}\n </MenuGroup>\n </ComboboxList>\n </MenuContent>\n )\n}\n\ninterface TableCellHandleMenuProps extends React.ComponentPropsWithoutRef<\"button\"> {\n editor?: Editor | null\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport const TableCellHandleMenu = forwardRef<\n HTMLButtonElement,\n TableCellHandleMenuProps\n>(({ editor: providedEditor, onOpenChange, className, ...props }, ref) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isMenuOpen, handleMenuToggle, closeMenu } = useTableCellHandleMenu({\n editor,\n })\n\n useEffect(() => {\n onOpenChange?.(isMenuOpen)\n }, [isMenuOpen, onOpenChange])\n\n return (\n <Menu\n open={isMenuOpen}\n onOpenChange={handleMenuToggle}\n placement=\"bottom-start\"\n trigger={\n <MenuButton\n ref={ref}\n className={cn(\n \"expandable-menu-button\",\n isMenuOpen && \"menu-opened\",\n className\n )}\n aria-label=\"单元格选项\"\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n {...props}\n >\n <Grip4Icon className=\"tiptap-button-icon\" />\n </MenuButton>\n }\n >\n <TableActionMenu onClose={closeMenu} />\n </Menu>\n )\n})\n\nTableCellHandleMenu.displayName = \"TableCellHandleMenu\"\n\nexport { TableActionMenu }\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const PlusSmallIcon = 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=\"M13.5 8C13.5 7.17157 12.8284 6.5 12 6.5C11.1716 6.5 10.5 7.17157 10.5 8V10.5H8C7.17157 10.5 6.5 11.1716 6.5 12C6.5 12.8284 7.17157 13.5 8 13.5H10.5V16C10.5 16.8284 11.1716 17.5 12 17.5C12.8284 17.5 13.5 16.8284 13.5 16V13.5H16C16.8284 13.5 17.5 12.8284 17.5 12C17.5 11.1716 16.8284 10.5 16 10.5H13.5V8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nPlusSmallIcon.displayName = \"PlusSmallIcon\"\n","import type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n offset,\n size,\n useFloating,\n useTransitionStyles,\n type Placement,\n} from \"@floating-ui/react\"\nimport { useEffect, useMemo, useCallback } from \"react\"\n\ninterface TableExtendRowColumnButtonPositionResult {\n isMounted: boolean\n ref: (node: HTMLElement | null) => void\n style: React.CSSProperties\n}\n\ninterface TableExtendRowColumnButtonsPositioningResult {\n rowButton: TableExtendRowColumnButtonPositionResult\n columnButton: TableExtendRowColumnButtonPositionResult\n}\n\nconst ORIENTATION_CONFIG = {\n row: {\n placement: \"bottom\" as Placement,\n sizeProperty: \"width\",\n },\n column: {\n placement: \"right\" as Placement,\n sizeProperty: \"height\",\n },\n} as const\n\n/**\n * Custom hook for positioning extend buttons using Floating UI\n */\nfunction useTableExtendRowColumnButtonPosition(\n orientation: Orientation,\n show: boolean,\n referencePosTable: DOMRect | null\n): TableExtendRowColumnButtonPositionResult {\n const config = ORIENTATION_CONFIG[orientation]\n\n const { refs, update, context, floatingStyles } = useFloating({\n open: show,\n placement: config.placement,\n middleware: [\n offset(4),\n size({\n apply({ rects, elements }) {\n const floating = elements.floating\n if (!floating) return\n\n // Apply size based on orientation\n const sizeValue = `${rects.reference[config.sizeProperty]}px`\n floating.style[config.sizeProperty] = sizeValue\n },\n }),\n ],\n })\n\n const { isMounted, styles } = useTransitionStyles(context)\n\n const createVirtualReference = useCallback(\n (rect: DOMRect) => ({\n getBoundingClientRect: () => rect,\n }),\n []\n )\n\n useEffect(() => {\n if (!referencePosTable) return\n\n refs.setReference(createVirtualReference(referencePosTable))\n update()\n }, [referencePosTable, refs, update, createVirtualReference])\n\n return useMemo(\n () => ({\n isMounted,\n ref: refs.setFloating,\n style: {\n display: \"flex\",\n ...styles,\n ...floatingStyles,\n } as React.CSSProperties,\n }),\n [floatingStyles, isMounted, refs.setFloating, styles]\n )\n}\n\n/**\n * Hook for managing positioning of both row and column extend buttons\n */\nexport function useTableExtendRowColumnButtonsPositioning(\n showAddOrRemoveColumnsButton: boolean,\n showAddOrRemoveRowsButton: boolean,\n referencePosTable: DOMRect | null\n): TableExtendRowColumnButtonsPositioningResult {\n const rowButton = useTableExtendRowColumnButtonPosition(\n \"row\",\n showAddOrRemoveRowsButton,\n referencePosTable\n )\n\n const columnButton = useTableExtendRowColumnButtonPosition(\n \"column\",\n showAddOrRemoveColumnsButton,\n referencePosTable\n )\n\n return useMemo(\n () => ({\n rowButton,\n columnButton,\n }),\n [rowButton, columnButton]\n )\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\nimport { TableMap } from \"@tiptap/pm/tables\"\nimport { FloatingPortal } from \"@floating-ui/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\nimport { useTableHandleState } from \"../../hooks/use-table-handle-state\"\n\n// --- Lib ---\nimport type { Orientation } from \"../../lib/tiptap-table-utils\"\nimport {\n EMPTY_CELL_HEIGHT,\n EMPTY_CELL_WIDTH,\n countEmptyRowsFromEnd,\n countEmptyColumnsFromEnd,\n marginRound,\n selectLastCell,\n runPreservingCursor,\n} from \"../../lib/tiptap-table-utils\"\nimport { cn } from \"../../../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { PlusSmallIcon } from \"../../../../tiptap-icons/plus-small-icon\"\n\n// --- Internal ---\nimport { useTableExtendRowColumnButtonsPositioning } from \"./use-table-extend-row-column\"\nimport \"./table-extend-row-column-button.scss\"\n\ninterface TableExtendRowColumnButtonProps {\n editor?: Editor | null\n block: Node\n onMouseDown: () => void\n onMouseUp: () => void\n orientation: Orientation\n children?: React.ReactNode\n}\n\n/**\n * Simplified button component for extending/reducing table dimensions\n */\nexport const TableExtendRowColumnButton: React.FC<\n TableExtendRowColumnButtonProps\n> = ({\n editor: providedEditor,\n onMouseDown,\n onMouseUp,\n orientation,\n children,\n}) => {\n const { editor } = useTiptapEditor(providedEditor)\n const state = useTableHandleState({ editor })\n const isRowOrientation = orientation === \"row\"\n\n const movedRef = useRef(false)\n const [dragState, setDragState] = useState<{\n startPos: number\n originalHeight: number\n originalWidth: number\n } | null>(null)\n\n const startDrag = useCallback(\n (ev: React.MouseEvent) => {\n if (!state) return\n\n const dims = TableMap.get(state.block)\n movedRef.current = false\n\n setDragState({\n startPos: isRowOrientation ? ev.clientY : ev.clientX,\n originalHeight: dims.height,\n originalWidth: dims.width,\n })\n\n onMouseDown()\n ev.preventDefault()\n },\n [state, isRowOrientation, onMouseDown]\n )\n\n const handleClick = useCallback(() => {\n if (movedRef.current || !editor || !state) return\n\n runPreservingCursor(editor, () => {\n selectLastCell(editor, state.block, state.blockPos, orientation)\n\n if (isRowOrientation) {\n editor.commands.addRowAfter()\n } else {\n editor.commands.addColumnAfter()\n }\n })\n }, [editor, isRowOrientation, orientation, state])\n\n useEffect(() => {\n if (!dragState || !editor || !state) return\n\n const handleMove = (ev: MouseEvent) => {\n movedRef.current = true\n\n const currentPos = isRowOrientation ? ev.clientY : ev.clientX\n const diff = currentPos - dragState.startPos\n const cellSize = isRowOrientation ? EMPTY_CELL_HEIGHT : EMPTY_CELL_WIDTH\n\n const currentDims = TableMap.get(state.block)\n const currentCount = isRowOrientation\n ? currentDims.height\n : currentDims.width\n const originalCount = isRowOrientation\n ? dragState.originalHeight\n : dragState.originalWidth\n\n const newCount = Math.max(\n 1,\n originalCount + marginRound(diff / cellSize, 0.3)\n )\n const delta = newCount - currentCount\n\n if (delta === 0) return\n\n // Add rows/columns\n if (delta > 0) {\n runPreservingCursor(editor, () => {\n selectLastCell(editor, state.block, state.blockPos, orientation)\n\n for (let i = 0; i < delta; i++) {\n if (isRowOrientation) {\n editor.commands.addRowAfter()\n } else {\n editor.commands.addColumnAfter()\n }\n }\n })\n }\n // Remove rows/columns - but only if they're empty\n else {\n runPreservingCursor(editor, () => {\n const absDelta = Math.abs(delta)\n\n const emptyCount = isRowOrientation\n ? countEmptyRowsFromEnd(editor, state.blockPos)\n : countEmptyColumnsFromEnd(editor, state.blockPos)\n\n // Only remove up to the number of empty cells, and keep at least 1\n const safeToRemove = Math.min(absDelta, emptyCount, currentCount - 1)\n\n selectLastCell(editor, state.block, state.blockPos, orientation)\n\n for (let i = 0; i < safeToRemove; i++) {\n if (isRowOrientation) {\n editor.commands.deleteRow()\n } else {\n editor.commands.deleteColumn()\n }\n }\n })\n }\n }\n\n const handleUp = () => {\n setDragState(null)\n onMouseUp()\n }\n\n window.addEventListener(\"mousemove\", handleMove)\n window.addEventListener(\"mouseup\", handleUp)\n\n return () => {\n window.removeEventListener(\"mousemove\", handleMove)\n window.removeEventListener(\"mouseup\", handleUp)\n }\n }, [dragState, editor, isRowOrientation, orientation, onMouseUp, state])\n\n if (!editor?.isEditable) return null\n\n return (\n <button\n className={cn(\n \"tiptap-table-extend-row-column-button\",\n isRowOrientation\n ? \"tiptap-table-row-end-add-remove\"\n : \"tiptap-table-column-end-add-remove\",\n dragState && \"editing\"\n )}\n onClick={handleClick}\n onMouseDown={startDrag}\n type=\"button\"\n aria-label={\n isRowOrientation ? \"添加或删除行\" : \"添加或删除列\"\n }\n >\n {children ?? <PlusSmallIcon className=\"tiptap-button-icon\" />}\n </button>\n )\n}\n\nexport interface TableExtendRowColumnButtonsProps {\n editor?: Editor | null\n onMouseDown?: () => void\n onMouseUp?: () => void\n}\n\nexport const TableExtendRowColumnButtons: React.FC<\n TableExtendRowColumnButtonsProps\n> = ({ editor: providedEditor, onMouseDown, onMouseUp }) => {\n const { editor } = useTiptapEditor(providedEditor)\n const state = useTableHandleState({ editor })\n const { columnButton, rowButton } = useTableExtendRowColumnButtonsPositioning(\n state?.showAddOrRemoveColumnsButton ?? false,\n state?.showAddOrRemoveRowsButton ?? false,\n state?.referencePosTable ?? null\n )\n\n const handleDown = useCallback(() => {\n if (!editor) return\n editor.commands.freezeHandles()\n onMouseDown?.()\n }, [editor, onMouseDown])\n\n const handleUp = useCallback(() => {\n if (!editor) return\n editor.commands.unfreezeHandles()\n onMouseUp?.()\n }, [editor, onMouseUp])\n\n if (!state) return null\n\n return (\n <FloatingPortal root={state.widgetContainer}>\n <div ref={rowButton.ref} style={rowButton.style}>\n <TableExtendRowColumnButton\n editor={editor}\n orientation=\"row\"\n block={state.block}\n onMouseDown={handleDown}\n onMouseUp={handleUp}\n />\n </div>\n\n <div ref={columnButton.ref} style={columnButton.style}>\n <TableExtendRowColumnButton\n editor={editor}\n orientation=\"column\"\n block={state.block}\n onMouseDown={handleDown}\n onMouseUp={handleUp}\n />\n </div>\n </FloatingPortal>\n )\n}\n","import type { Node } from \"@tiptap/pm/model\"\nimport type { SuggestionItem } from \"./suggestion-menu-types\"\n\n/**\n * Calculates the start position of a suggestion command in the text.\n *\n * @param cursorPosition Current cursor position\n * @param previousNode Node before the cursor\n * @param triggerChar Character that triggers the suggestion\n * @returns The position where the command starts\n */\nexport function calculateStartPosition(\n cursorPosition: number,\n previousNode: Node | null,\n triggerChar?: string\n): number {\n if (!previousNode?.text || !triggerChar) {\n return cursorPosition\n }\n\n const commandText = previousNode.text\n const triggerCharIndex = commandText.lastIndexOf(triggerChar)\n\n if (triggerCharIndex === -1) {\n return cursorPosition\n }\n\n const textLength = commandText.substring(triggerCharIndex).length\n\n return cursorPosition - textLength\n}\n\n/**\n * Filters and sorts suggestion items based on a search query.\n *\n * @param items List of suggestion items to filter\n * @param query Search query string\n * @returns Filtered and sorted list of suggestions\n */\nexport function filterSuggestionItems(items: SuggestionItem[], query: string) {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return items\n }\n\n return items\n .filter((item) => {\n if (item.title.toLowerCase().includes(normalizedQuery)) {\n return true\n }\n\n if (item.subtext?.toLowerCase().includes(normalizedQuery)) {\n return true\n }\n\n if (\n item.keywords?.some((keyword) =>\n keyword.toLowerCase().includes(normalizedQuery)\n )\n ) {\n return true\n }\n\n return false\n })\n .sort((a, b) => {\n // Prioritize exact matches and \"starts with\" matches\n const aTitle = a.title.toLowerCase()\n const bTitle = b.title.toLowerCase()\n\n if (aTitle === normalizedQuery && bTitle !== normalizedQuery) return -1\n if (bTitle === normalizedQuery && aTitle !== normalizedQuery) return 1\n if (\n aTitle.startsWith(normalizedQuery) &&\n !bTitle.startsWith(normalizedQuery)\n )\n return -1\n if (\n bTitle.startsWith(normalizedQuery) &&\n !aTitle.startsWith(normalizedQuery)\n )\n return 1\n\n return 0\n })\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { flip, offset, shift, size } from \"@floating-ui/react\"\nimport { PluginKey } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useFloatingElement } from \"../../../hooks/use-floating-element\"\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap Editor ---\nimport type { Range } from \"@tiptap/react\"\n\n// --- Tiptap UI ---\nimport { Suggestion } from \"@tiptap/suggestion\"\n\n// --- UI Primitives ---\nimport {\n SuggestionPluginKey,\n type SuggestionKeyDownProps,\n type SuggestionProps,\n} from \"@tiptap/suggestion\"\n\nimport { calculateStartPosition } from \"./suggestion-menu-utils\"\nimport type {\n SuggestionItem,\n SuggestionMenuProps,\n} from \"./suggestion-menu-types\"\n\n/**\n * A component that renders a suggestion menu for Tiptap editors.\n * Displays a floating menu when a trigger character is typed.\n */\nexport const SuggestionMenu = ({\n editor: providedEditor,\n floatingOptions,\n selector = \"tiptap-suggestion-menu\",\n children,\n maxHeight = 384,\n pluginKey = SuggestionPluginKey,\n ...internalSuggestionProps\n}: SuggestionMenuProps) => {\n const { editor } = useTiptapEditor(providedEditor)\n\n const [show, setShow] = useState<boolean>(false)\n\n // If later we want the floating stick to the position while browser is scrolling,\n // we can uncomment this part and pass the getBoundingClientRect prop to FloatingElement instead of referenceElement.\n // const [internalClientRect, setInternalClientRect] = useState<DOMRect | null>(\n // null\n // )\n const [internalDecorationNode, setInternalDecorationNode] =\n useState<HTMLElement | null>(null)\n const [internalCommand, setInternalCommand] = useState<\n ((item: SuggestionItem) => void) | null\n >(null)\n const [internalItems, setInternalItems] = useState<SuggestionItem[]>([])\n const [internalQuery, setInternalQuery] = useState<string>(\"\")\n const [, setInternalRange] = useState<Range | null>(null)\n\n const { ref, style, getFloatingProps, isMounted } = useFloatingElement(\n show,\n internalDecorationNode,\n 1000,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(10),\n flip({\n mainAxis: true,\n crossAxis: false,\n }),\n shift(),\n size({\n apply({ availableHeight, elements }) {\n if (elements.floating) {\n const maxHeightValue = maxHeight\n ? Math.min(maxHeight, availableHeight)\n : availableHeight\n\n elements.floating.style.setProperty(\n \"--suggestion-menu-max-height\",\n `${maxHeightValue}px`\n )\n }\n },\n }),\n ],\n onOpenChange(open) {\n if (!open) {\n setShow(false)\n }\n },\n ...floatingOptions,\n }\n )\n\n const internalSuggestionPropsRef = useRef(internalSuggestionProps)\n\n useEffect(() => {\n internalSuggestionPropsRef.current = internalSuggestionProps\n }, [internalSuggestionProps])\n\n const closePopup = useCallback(() => {\n setShow(false)\n }, [])\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) {\n return\n }\n\n const existingPlugin = editor.state.plugins.find(\n (plugin) => plugin.spec.key === pluginKey\n )\n if (existingPlugin) {\n editor.unregisterPlugin(pluginKey)\n }\n\n // Find the Mention extension that matches our trigger character (e.g. \"@\") so we can\n // pull suggestion configuration from it (e.g. allowSpaces, allowedPrefixes, startOfLine).\n const ourChar = internalSuggestionPropsRef.current.char ?? \"@\"\n\n const mentionExtension = editor.extensionManager.extensions.find((ext) => {\n if (ext.name !== \"mention\") return false\n\n const suggestions = ext.options?.suggestions\n if (suggestions?.length) {\n return suggestions.some(\n (s: Record<string, unknown>) => (s.char ?? \"@\") === ourChar\n )\n }\n\n return (ext.options?.suggestion?.char ?? \"@\") === ourChar\n })\n\n // We want to allow passing mention suggestion configuration either\n // via the main suggestion prop or via the suggestions array (for multiple trigger characters).\n // To support both, we pull out any relevant config from the Mention extension and pass it to the Suggestion plugin.\n // We also make sure to not override any props that are already passed directly to the SuggestionMenu component.\n const mentionSuggestionDefaults: Record<string, unknown> = {}\n\n if (mentionExtension) {\n let matchingConfig: Record<string, unknown> | null = null\n\n const suggestions = mentionExtension.options?.suggestions\n if (suggestions?.length) {\n matchingConfig = suggestions.find(\n (s: Record<string, unknown>) => (s.char ?? \"@\") === ourChar\n )\n } else if (mentionExtension.options?.suggestion) {\n matchingConfig = mentionExtension.options.suggestion\n }\n\n if (matchingConfig) {\n const managedKeys = new Set([\n \"pluginKey\",\n \"editor\",\n \"render\",\n \"command\",\n \"items\",\n \"allow\",\n \"char\",\n ])\n\n for (const key of Object.keys(matchingConfig)) {\n if (!managedKeys.has(key)) {\n mentionSuggestionDefaults[key] = matchingConfig[key]\n }\n }\n }\n }\n\n const suggestion = Suggestion({\n ...mentionSuggestionDefaults,\n pluginKey:\n pluginKey instanceof PluginKey ? pluginKey : new PluginKey(pluginKey),\n editor,\n\n allow(props) {\n const $from = editor.state.doc.resolve(props.range.from)\n\n // Check if we're inside an image node\n for (let depth = $from.depth; depth > 0; depth--) {\n if ($from.node(depth).type.name === \"image\") {\n return false // Don't allow slash command inside image (since we support captions)\n }\n }\n\n return true\n },\n\n command({ editor, range, props }) {\n if (!range) {\n return\n }\n\n const { view, state } = editor\n const { selection } = state\n\n const isMention = editor.extensionManager.extensions.some(\n (extension) => {\n if (extension.name !== \"mention\") return false\n\n const mentionSuggestions = extension.options?.suggestions\n if (mentionSuggestions?.length) {\n return mentionSuggestions.some(\n (s: Record<string, unknown>) =>\n (s.char ?? \"@\") === internalSuggestionPropsRef.current.char\n )\n }\n\n return (\n (extension.options?.suggestion?.char ?? \"@\") ===\n internalSuggestionPropsRef.current.char\n )\n }\n )\n\n if (!isMention) {\n const cursorPosition = selection.$from.pos\n const previousNode = selection.$head?.nodeBefore\n\n const startPosition = previousNode\n ? calculateStartPosition(\n cursorPosition,\n previousNode,\n internalSuggestionPropsRef.current.char\n )\n : selection.$from.start()\n\n const transaction = state.tr.deleteRange(\n startPosition,\n cursorPosition\n )\n view.dispatch(transaction)\n }\n\n const rangeToUse = { ...range }\n\n const nodeAfter = view.state.selection.$to.nodeAfter\n const overrideSpace = nodeAfter?.text?.startsWith(\" \")\n\n if (overrideSpace) {\n rangeToUse.to += 1\n }\n\n props.onSelect({ editor, range: rangeToUse, context: props.context })\n },\n\n render: () => {\n return {\n onStart: (props: SuggestionProps<SuggestionItem>) => {\n setInternalDecorationNode(\n (props.decorationNode as HTMLElement) ?? null\n )\n setInternalCommand(() => props.command)\n setInternalItems(props.items)\n setInternalQuery(props.query)\n setInternalRange(props.range)\n // setInternalClientRect(props.clientRect?.() ?? null)\n setShow(true)\n },\n\n onUpdate: (props: SuggestionProps<SuggestionItem>) => {\n setInternalDecorationNode(\n (props.decorationNode as HTMLElement) ?? null\n )\n setInternalCommand(() => props.command)\n setInternalItems(props.items)\n setInternalQuery(props.query)\n setInternalRange(props.range)\n // setInternalClientRect(props.clientRect?.() ?? null)\n },\n\n onKeyDown: (props: SuggestionKeyDownProps) => {\n if (props.event.key === \"Escape\") {\n closePopup()\n return true\n }\n return false\n },\n\n onExit: () => {\n setInternalDecorationNode(null)\n setInternalCommand(null)\n setInternalItems([])\n setInternalQuery(\"\")\n setInternalRange(null)\n // setInternalClientRect(null)\n setShow(false)\n },\n }\n },\n ...internalSuggestionPropsRef.current,\n })\n\n editor.registerPlugin(suggestion)\n\n return () => {\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey)\n }\n }\n }, [editor, pluginKey, closePopup])\n\n const onSelect = useCallback(\n (item: SuggestionItem) => {\n closePopup()\n\n if (internalCommand) {\n internalCommand(item)\n }\n },\n [closePopup, internalCommand]\n )\n\n const { selectedIndex } = useMenuNavigation({\n editor: editor,\n query: internalQuery,\n items: internalItems,\n onSelect,\n })\n\n if (!isMounted || !show || !editor) {\n return null\n }\n\n return (\n <div\n ref={ref}\n style={style}\n {...getFloatingProps()}\n data-selector={selector}\n className=\"tiptap-suggestion-menu\"\n role=\"listbox\"\n aria-label=\"建议\"\n onPointerDown={(e) => e.preventDefault()}\n >\n {children({\n items: internalItems,\n selectedIndex,\n onSelect,\n })}\n </div>\n )\n}\n","import type { EmojiItem } from \"@tiptap/extension-emoji\"\n\nconst MAX_SUGGESTIONS = 100\nconst SORT_EMOJIS = <T extends EmojiItem>(a: T, b: T) =>\n a.name.localeCompare(b.name)\n\nexport const searchEmojiData = <T extends EmojiItem>(\n query: string,\n emojiData: T\n): boolean => {\n const lowercaseQuery = query.toLowerCase().trim()\n\n return (\n emojiData.name.toLowerCase().includes(lowercaseQuery) ||\n emojiData.shortcodes.some((shortName) =>\n shortName.toLowerCase().includes(lowercaseQuery)\n ) ||\n emojiData.tags.some((tag) => tag.toLowerCase().includes(lowercaseQuery))\n )\n}\n\nexport const getFilteredEmojis = <T extends EmojiItem>(props: {\n query: string\n emojis: T[]\n}) => {\n const { query, emojis } = props\n const trimmedQuery = query.trim()\n\n const filteredEmojis = !trimmedQuery\n ? emojis.slice(0, MAX_SUGGESTIONS)\n : emojis\n .filter((emoji) => searchEmojiData(trimmedQuery, emoji))\n .slice(0, MAX_SUGGESTIONS)\n\n return filteredEmojis.sort(SORT_EMOJIS)\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\"\nimport type { EmojiItem } from \"@tiptap/extension-emoji\"\n\n// --- Hooks ---\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation\"\n\n// --- Lib ---\nimport { getElementOverflowPosition } from \"../../../lib/tiptap-collab-utils\"\n\n// --- UI Primitives ---\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Input } from \"../../tiptap-ui-primitive/input\"\nimport {\n Card,\n CardBody,\n CardHeader,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\nimport { getFilteredEmojis } from \"./emoji-menu-utils\"\n\n// --- Styles ---\nimport \"./emoji-menu.scss\"\n\nexport interface EmojiMenuItemProps<T extends EmojiItem> {\n emoji: T\n index: number\n isSelected: boolean\n onSelect: (emoji: T) => void\n selector: string\n}\n\nexport const EmojiMenuItem = <T extends EmojiItem>(\n props: EmojiMenuItemProps<T>\n) => {\n const { emoji, isSelected, onSelect, selector } = props\n const itemRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n const menuElement = document.querySelector(selector) as HTMLElement\n if (!itemRef.current || !isSelected || !menuElement) return\n\n const overflow = getElementOverflowPosition(itemRef.current, menuElement)\n if (overflow === \"top\") {\n itemRef.current.scrollIntoView(true)\n } else if (overflow === \"bottom\") {\n itemRef.current.scrollIntoView(false)\n }\n }, [isSelected, selector])\n\n if (!emoji) return null\n\n return (\n <Button\n ref={itemRef}\n variant=\"ghost\"\n data-active-state={isSelected ? \"on\" : \"off\"}\n onClick={() => onSelect(emoji)}\n >\n {emoji.fallbackImage ? (\n <img\n className=\"tiptap-button-emoji\"\n src={emoji.fallbackImage}\n alt={emoji.name}\n />\n ) : (\n <span className=\"tiptap-button-emoji\">{emoji.emoji}</span>\n )}\n <span className=\"tiptap-button-text\">:{emoji.name}:</span>\n </Button>\n )\n}\n\nexport interface EmojiMenuProps<T extends EmojiItem> {\n emojis: T[]\n onSelect: (emoji: T) => void\n onClose?: () => void\n showSearch?: boolean\n selector?: string\n}\n\nexport const EmojiMenu = <T extends EmojiItem>(props: EmojiMenuProps<T>) => {\n const {\n emojis,\n onSelect,\n onClose,\n showSearch = false,\n selector = \".emoji-menu-list\",\n } = props\n\n const containerRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const [searchQuery, setSearchQuery] = useState<string>(\"\")\n\n const filteredEmojis = useMemo(() => {\n const filtered = getFilteredEmojis({ query: searchQuery, emojis })\n return filtered\n }, [emojis, searchQuery])\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n query: searchQuery,\n items: filteredEmojis,\n onSelect,\n onClose,\n })\n\n const renderedItems = useMemo(() => {\n return filteredEmojis.map((emoji, index) => (\n <EmojiMenuItem\n key={emoji.name}\n emoji={emoji}\n index={index}\n isSelected={index === selectedIndex}\n onSelect={() => onSelect(emoji)}\n selector={selector}\n />\n ))\n }, [filteredEmojis, selectedIndex, onSelect, selector])\n\n return (\n <Card ref={containerRef}>\n {showSearch && (\n <CardHeader>\n <Input\n ref={searchRef}\n type=\"text\"\n placeholder=\"添加表情回应...\"\n value={searchQuery}\n autoFocus\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"emoji-menu-search-input\"\n />\n </CardHeader>\n )}\n\n {renderedItems.length && (\n <CardBody className=\"emoji-menu-list\">\n <CardItemGroup>{renderedItems}</CardItemGroup>\n </CardBody>\n )}\n </Card>\n )\n}\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport type { Editor, Range } from \"@tiptap/react\"\nimport type { EmojiItem } from \"@tiptap/extension-emoji\"\n\n// --- Tiptap UI ---\nimport type {\n SuggestionItem,\n SuggestionMenuProps,\n SuggestionMenuRenderProps,\n} from \"../../tiptap-ui-utils/suggestion-menu\"\nimport { SuggestionMenu } from \"../../tiptap-ui-utils/suggestion-menu\"\nimport {\n EmojiMenuItem,\n getFilteredEmojis,\n} from \"../emoji-menu\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\nexport type EmojiDropdownMenuProps = Omit<\n SuggestionMenuProps,\n \"items\" | \"children\"\n>\n\nexport const EmojiDropdownMenu = (props: EmojiDropdownMenuProps) => {\n return (\n <SuggestionMenu\n char=\":\"\n pluginKey=\"emojiDropdownMenu\"\n decorationClass=\"tiptap-emoji-decoration\"\n selector=\"tiptap-emoji-dropdown-menu\"\n items={getSuggestionItems}\n {...props}\n >\n {(props) => <EmojiList {...props} />}\n </SuggestionMenu>\n )\n}\n\nconst getSuggestionItems = async (props: { query: string; editor: Editor }) => {\n const emojis: EmojiItem[] = props.editor.extensionStorage.emoji.emojis || []\n const filteredEmojis = getFilteredEmojis({ query: props.query, emojis })\n\n return filteredEmojis.map(\n (emoji): SuggestionItem => ({\n title: emoji.name,\n subtext: emoji.shortcodes.join(\", \"),\n context: emoji,\n onSelect: (props: {\n editor: Editor\n range: Range\n context?: EmojiItem\n }) => {\n if (!props.editor || !props.range || !props.context) return\n props.editor.chain().focus().setEmoji(props.context.name).run()\n },\n })\n )\n}\n\nconst EmojiList = ({\n items,\n selectedIndex,\n onSelect,\n}: SuggestionMenuRenderProps<EmojiItem>) => {\n const renderedItems = useMemo(() => {\n const rendered: React.ReactElement[] = []\n\n items.forEach((item, index) => {\n if (!item.context) return\n\n rendered.push(\n <EmojiMenuItem\n key={item.title}\n emoji={item.context}\n index={index}\n isSelected={index === selectedIndex}\n onSelect={() => onSelect(item)}\n selector=\"[data-selector='tiptap-emoji-dropdown-menu']\"\n />\n )\n })\n\n return rendered\n }, [items, selectedIndex, onSelect])\n\n if (!renderedItems.length) {\n return null\n }\n\n return (\n <Card\n style={{\n maxHeight: \"var(--suggestion-menu-max-height)\",\n }}\n >\n <CardBody>\n <CardItemGroup>{renderedItems}</CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n","\"use client\"\n\nimport {\n Children,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from \"react\"\nimport \"./avatar.scss\"\n\ntype ImageLoadingStatus = \"idle\" | \"loading\" | \"loaded\" | \"error\"\ntype Size = \"default\" | \"sm\" | \"lg\" | \"xl\"\n\ninterface AvatarContextValue {\n imageLoadingStatus: ImageLoadingStatus\n onImageLoadingStatusChange: (status: ImageLoadingStatus) => void\n size: Size\n}\n\ninterface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: Size\n userColor?: string\n}\n\ninterface AvatarImageProps extends Omit<\n React.ImgHTMLAttributes<HTMLImageElement>,\n \"onLoadingStatusChange\" | \"src\"\n> {\n src?: string\n onLoadingStatusChange?: (status: ImageLoadingStatus) => void\n}\n\ninterface AvatarFallbackProps extends React.HTMLAttributes<HTMLSpanElement> {\n delayMs?: number\n}\n\ninterface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n maxVisible?: number\n children: React.ReactNode\n}\n\nconst AvatarContext = createContext<AvatarContextValue | undefined>(undefined)\n\nconst useAvatarContext = () => {\n const context = useContext(AvatarContext)\n if (!context) {\n throw new Error(\"Avatar components must be used within an Avatar.Root\")\n }\n return context\n}\n\nconst useImageLoadingStatus = (\n src?: string,\n referrerPolicy?: React.HTMLAttributeReferrerPolicy\n): ImageLoadingStatus => {\n const initialStatus = !src ? \"error\" : \"loading\"\n const [loadingStatus, setLoadingStatus] =\n useState<ImageLoadingStatus>(initialStatus)\n\n useLayoutEffect(() => {\n if (!src) {\n return\n }\n\n let isMounted = true\n const image = new window.Image()\n\n const updateStatus = (status: ImageLoadingStatus) => () => {\n if (!isMounted) return\n setLoadingStatus(status)\n }\n\n image.onload = updateStatus(\"loaded\")\n image.onerror = updateStatus(\"error\")\n image.src = src\n if (referrerPolicy) image.referrerPolicy = referrerPolicy\n\n return () => {\n isMounted = false\n }\n }, [src, referrerPolicy])\n\n return loadingStatus\n}\n\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n (\n { children, className = \"\", size = \"default\", userColor, ...props },\n ref\n ) => {\n const [imageLoadingStatus, setImageLoadingStatus] =\n useState<ImageLoadingStatus>(\"idle\")\n\n const onImageLoadingStatusChange = useCallback(\n (status: ImageLoadingStatus) => {\n setImageLoadingStatus(status)\n },\n []\n )\n\n const contextValue = useMemo(\n () => ({\n imageLoadingStatus,\n onImageLoadingStatusChange,\n size,\n }),\n [imageLoadingStatus, onImageLoadingStatusChange, size]\n )\n\n const style = userColor\n ? ({ \"--dynamic-user-color\": userColor } as React.CSSProperties)\n : undefined\n\n return (\n <AvatarContext.Provider value={contextValue}>\n <span\n {...props}\n ref={ref}\n className={`tiptap-avatar ${className}`}\n style={style}\n data-size={size}\n >\n <span className=\"tiptap-avatar-item\">{children}</span>\n </span>\n </AvatarContext.Provider>\n )\n }\n)\n\nAvatar.displayName = \"Avatar\"\n\nexport const AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ onLoadingStatusChange, src, className = \"\", ...props }, ref) => {\n const { onImageLoadingStatusChange } = useAvatarContext()\n const imageLoadingStatus = useImageLoadingStatus(src, props.referrerPolicy)\n\n useLayoutEffect(() => {\n if (imageLoadingStatus !== \"idle\") {\n onLoadingStatusChange?.(imageLoadingStatus)\n onImageLoadingStatusChange(imageLoadingStatus)\n }\n }, [imageLoadingStatus, onLoadingStatusChange, onImageLoadingStatusChange])\n\n if (imageLoadingStatus !== \"loaded\") return null\n\n return (\n <img\n alt=\"\"\n {...props}\n ref={ref}\n src={src}\n className={`tiptap-avatar-image ${className}`}\n />\n )\n }\n)\n\nAvatarImage.displayName = \"AvatarImage\"\n\nexport const AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>(\n ({ delayMs, className = \"\", children, ...props }, ref) => {\n const context = useAvatarContext()\n const [canRender, setCanRender] = useState(delayMs === undefined)\n\n useEffect(() => {\n if (delayMs !== undefined) {\n const timerId = window.setTimeout(() => setCanRender(true), delayMs)\n return () => window.clearTimeout(timerId)\n }\n }, [delayMs])\n\n if (!canRender || context.imageLoadingStatus === \"loaded\") return null\n\n return (\n <>\n <span className={`tiptap-avatar-bg ${className}`} />\n <span\n {...props}\n ref={ref}\n className={`tiptap-avatar-fallback ${className}`}\n >\n {children}\n </span>\n </>\n )\n }\n)\n\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport const AvatarGroup: React.FC<AvatarGroupProps> = ({\n maxVisible,\n children,\n className = \"\",\n ...props\n}) => {\n const childrenArray = Children.toArray(children)\n const visibleAvatars = maxVisible\n ? childrenArray.slice(0, maxVisible)\n : childrenArray\n const remainingCount = childrenArray.length - visibleAvatars.length\n\n let avatarProps: AvatarProps = {}\n\n Children.forEach(children, (child) => {\n if (\n isValidElement(child) &&\n child.type &&\n typeof child.type !== \"string\" &&\n (child.type as { displayName?: string }).displayName === \"Avatar\"\n ) {\n avatarProps = { ...avatarProps, ...(child.props as AvatarProps) }\n return\n }\n })\n\n return (\n <div\n {...props}\n className={`tiptap-avatar-group ${className}`}\n data-max-user-visible={maxVisible}\n >\n {visibleAvatars}\n {remainingCount > 0 && (\n <Avatar {...avatarProps}>\n <AvatarFallback>+{remainingCount}</AvatarFallback>\n </Avatar>\n )}\n </div>\n )\n}\n\nAvatarGroup.displayName = \"AvatarGroup\"\n","import { useEffect, useMemo, useRef } from \"react\"\nimport type { Editor, Range } from \"@tiptap/react\"\n\n// --- Lib ---\nimport { getElementOverflowPosition } from \"../../../lib/tiptap-collab-utils\"\n\n// --- Tiptap UI ---\nimport type {\n SuggestionItem,\n SuggestionMenuProps,\n SuggestionMenuRenderProps,\n} from \"../../tiptap-ui-utils/suggestion-menu\"\nimport { SuggestionMenu } from \"../../tiptap-ui-utils/suggestion-menu\"\n\n// --- UI Primitives ---\nimport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n} from \"../../tiptap-ui-primitive/avatar\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\ninterface User {\n id: number\n name: string\n position: string\n avatarUrl: string\n}\n\ntype MentionDropdownMenuProps = Omit<SuggestionMenuProps, \"items\" | \"children\">\n\ninterface MentionItemProps {\n item: SuggestionItem<User>\n isSelected: boolean\n onSelect: () => void\n}\n\nconst fetchUsers = async (query: string): Promise<User[]> => {\n const employeeData = [\n [\"Emily Johnson\", \"Marketing Manager\"],\n [\"Michael Thompson\", \"Sales Manager\"],\n [\"Sophia Lee\", \"Product Designer\"],\n [\"William Davis\", \"IT Project Manager\"],\n [\"Olivia Wilson\", \"HR Specialist\"],\n [\"Daniel Taylor\", \"Financial Controller\"],\n [\"Isabella Anderson\", \"Graphic Designer\"],\n [\"Jacob Martinez\", \"Sales Representative\"],\n [\"Ava Hernandez\", \"Marketing Assistant\"],\n [\"Alexander Diaz\", \"IT Support\"],\n [\"Emma Ramirez\", \"HR Specialist\"],\n [\"Ethan Flores\", \"Product Manager\"],\n [\"Mia Morales\", \"Graphic Designer\"],\n [\"Noah Reyes\", \"Sales Manager\"],\n [\"Isabella Castillo\", \"Marketing Manager\"],\n [\"Liam Gutierrez\", \"IT Project Manager\"],\n [\"Avery Jimenez\", \"HR Specialist\"],\n [\"Lucas Vargas\", \"Product Designer\"],\n [\"Chloe Rojas\", \"Graphic Designer\"],\n [\"Kai Zhang\", \"Sales Representative\"],\n ] as const\n\n const userData = {\n users: employeeData.map(([name, position], index) => {\n const id = index + 1\n const avatarNumber = id < 10 ? `0${id}` : `${id}`\n\n return {\n id,\n name,\n position,\n avatarUrl: `/avatars/memoji_${avatarNumber}.png`,\n }\n }),\n }\n\n if (!query) return userData.users\n\n return userData.users.filter(\n (user) =>\n user.name.toLowerCase().includes(query.toLowerCase()) ||\n user.position.toLowerCase().includes(query.toLowerCase())\n )\n}\n\nexport const MentionDropdownMenu = (props: MentionDropdownMenuProps) => {\n const handleItemSelect = (props: {\n editor: Editor\n range: Range\n context?: User\n }) => {\n if (!props.editor || !props.range || !props.context) return\n\n props.editor\n .chain()\n .focus()\n .insertContentAt(props.range, [\n {\n type: \"mention\",\n attrs: {\n id: props.context.id.toString(),\n label: props.context.name,\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n ])\n .run()\n }\n\n const getSuggestionItems = async (props: { query: string }) => {\n const users = await fetchUsers(props.query)\n\n return users.map((user) => ({\n title: user.name,\n subtext: user.name,\n context: user,\n onSelect: handleItemSelect,\n }))\n }\n\n return (\n <SuggestionMenu\n char=\"@\"\n pluginKey=\"mentionDropdownMenu\"\n decorationClass=\"tiptap-mention-decoration\"\n selector=\"tiptap-mention-dropdown-menu\"\n items={getSuggestionItems}\n {...props}\n >\n {(props) => <MentionList {...props} />}\n </SuggestionMenu>\n )\n}\n\nconst MentionItem = ({ item, isSelected, onSelect }: MentionItemProps) => {\n const itemRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n const menuElement = document.querySelector(\n '[data-selector=\"tiptap-mention-dropdown-menu\"]'\n ) as HTMLElement\n if (!itemRef.current || !isSelected || !menuElement) return\n\n const overflow = getElementOverflowPosition(itemRef.current, menuElement)\n if (overflow === \"top\") {\n itemRef.current.scrollIntoView(true)\n } else if (overflow === \"bottom\") {\n itemRef.current.scrollIntoView(false)\n }\n }, [isSelected])\n\n return (\n <Button\n ref={itemRef}\n variant=\"ghost\"\n data-active-state={isSelected ? \"on\" : \"off\"}\n onClick={onSelect}\n data-user-id={item.context?.id}\n >\n <Avatar>\n <AvatarImage src={item.context?.avatarUrl} alt={item.title} />\n <AvatarFallback>{item.title[0]?.toUpperCase()}</AvatarFallback>\n </Avatar>\n\n <span className=\"tiptap-button-text\">{item.title}</span>\n </Button>\n )\n}\n\nconst MentionList = ({\n items,\n selectedIndex,\n onSelect,\n}: SuggestionMenuRenderProps<User>) => {\n const renderedItems = useMemo(() => {\n const rendered: React.ReactElement[] = []\n\n items.forEach((item, index) => {\n rendered.push(\n <MentionItem\n key={item.context?.id || item.title}\n item={item}\n isSelected={index === selectedIndex}\n onSelect={() => onSelect(item)}\n />\n )\n })\n\n return rendered\n }, [items, selectedIndex, onSelect])\n\n if (!renderedItems.length) {\n return null\n }\n\n return (\n <Card\n style={{\n maxHeight: \"var(--suggestion-menu-max-height)\",\n }}\n >\n <CardBody>\n <CardItemGroup>{renderedItems}</CardItemGroup>\n </CardBody>\n </Card>\n )\n}\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","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 ImageIcon = 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 4C4.44772 4 4 4.44772 4 5V19C4 19.5523 4.44772 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.5858V5C20 4.44772 19.5523 4 19 4H5ZM22 14.998V5C22 3.34315 20.6569 2 19 2H5C3.34315 2 2 3.34315 2 5V19C2 20.6569 3.34315 22 5 22H5.99781C5.99927 22 6.00073 22 6.00219 22H19C20.6569 22 22 20.6569 22 19V15.002C22 15.0007 22 14.9994 22 14.998ZM20 15.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 20H19C19.5523 20 20 19.5523 20 19V15.4142ZM9 8C8.44772 8 8 8.44772 8 9C8 9.55228 8.44772 10 9 10C9.55228 10 10 9.55228 10 9C10 8.44772 9.55228 8 9 8ZM6 9C6 7.34315 7.34315 6 9 6C10.6569 6 12 7.34315 12 9C12 10.6569 10.6569 12 9 12C7.34315 12 6 10.6569 6 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nImageIcon.displayName = \"ImageIcon\"\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 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","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","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const MinusIcon = 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 12C4 11.4477 4.44772 11 5 11H19C19.5523 11 20 11.4477 20 12C20 12.5523 19.5523 13 19 13H5C4.44772 13 4 12.5523 4 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nMinusIcon.displayName = \"MinusIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TypeIcon = 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=\"M3 4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V7C21 7.55228 20.5523 8 20 8C19.4477 8 19 7.55228 19 7V5H13V19H15C15.5523 19 16 19.4477 16 20C16 20.5523 15.5523 21 15 21H9C8.44772 21 8 20.5523 8 20C8 19.4477 8.44772 19 9 19H11V5H5V7C5 7.55228 4.55228 8 4 8C3.44772 8 3 7.55228 3 7V4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTypeIcon.displayName = \"TypeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AtSignIcon = 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.5273 1.29427C12.1156 0.724951 9.58234 0.986597 7.33794 2.03682C5.09354 3.08704 3.26948 4.8643 2.1613 7.08066C1.05312 9.29702 0.725742 11.8226 1.23221 14.2483C1.73868 16.6739 3.04931 18.8575 4.95178 20.4453C6.85424 22.033 9.23706 22.9319 11.7142 22.9963C14.1913 23.0607 16.6176 22.2868 18.6 20.8C19.0418 20.4686 19.1314 19.8418 18.8 19.4C18.4686 18.9582 17.8418 18.8686 17.4 19.2C15.7781 20.4165 13.7929 21.0496 11.7662 20.997C9.73942 20.9443 7.78983 20.2088 6.23327 18.9098C4.67671 17.6107 3.60437 15.8241 3.18999 13.8395C2.77561 11.8549 3.04346 9.78847 3.95015 7.97509C4.85685 6.1617 6.34926 4.70758 8.18559 3.84831C10.0219 2.98904 12.0946 2.77496 14.0678 3.24077C16.041 3.70658 17.7991 4.82497 19.0573 6.41476C20.3155 8.00455 21 9.97258 21 12V13C21 13.5304 20.7893 14.0392 20.4142 14.4142C20.0391 14.7893 19.5304 15 19 15C18.4696 15 17.9609 14.7893 17.5858 14.4142C17.2107 14.0392 17 13.5304 17 13V8.00001C17 7.44772 16.5523 7.00001 16 7.00001C15.4478 7.00001 15.0002 7.44752 15 7.99964C14.1643 7.37195 13.1256 7 12 7C9.23858 7 7 9.23858 7 12C7 14.7614 9.23858 17 12 17C13.4881 17 14.8243 16.3499 15.7403 15.3183C15.8687 15.4989 16.0128 15.6696 16.1716 15.8284C16.9217 16.5786 17.9391 17 19 17C20.0609 17 21.0783 16.5786 21.8284 15.8284C22.5786 15.0783 23 14.0609 23 13V12C23 9.52205 22.1633 7.11667 20.6255 5.17359C19.0878 3.23052 16.939 1.86359 14.5273 1.29427ZM15 11.9958V12.0042C14.9977 13.6591 13.6555 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C13.6555 9 14.9977 10.3409 15 11.9958Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAtSignIcon.displayName = \"AtSignIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SmilePlusIcon = 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.67909 4.05505C9.27254 3.18292 11.0926 2.81337 12.9 2.995C13.4495 3.05022 13.9398 2.64952 13.995 2.1C14.0502 1.55048 13.6495 1.06024 13.1 1.00502C10.8909 0.783033 8.66641 1.2347 6.71886 2.30064C4.7713 3.36659 3.19189 4.99691 2.18824 6.97729C1.1846 8.95767 0.803706 11.1954 1.09564 13.3963C1.38758 15.5972 2.33867 17.6583 3.8239 19.3085C5.30912 20.9588 7.25894 22.121 9.41704 22.6423C11.5751 23.1637 13.8405 23.0198 15.9153 22.2296C17.9901 21.4394 19.7772 20.0398 21.0417 18.2149C22.3062 16.39 22.9889 14.2252 23 12.005L23 12V11C23 10.4477 22.5523 10 22 10C21.4477 10 21 10.4477 21 11V11.9976C20.9904 13.8132 20.4319 15.5834 19.3978 17.0758C18.3632 18.5689 16.901 19.714 15.2034 20.3605C13.5059 21.0071 11.6524 21.1248 9.8867 20.6982C8.12098 20.2717 6.52567 19.3208 5.31048 17.9706C4.0953 16.6204 3.31713 14.9341 3.07828 13.1333C2.83942 11.3326 3.15106 9.50171 3.97222 7.8814C4.79339 6.26109 6.08564 4.92719 7.67909 4.05505ZM7.4 13.2C7.84043 12.8697 8.46468 12.9576 8.79686 13.3958L8.8015 13.4018C8.80745 13.4093 8.81876 13.4234 8.83531 13.4431C8.86846 13.4826 8.92219 13.5442 8.99542 13.6206C9.14272 13.7743 9.36407 13.9828 9.65067 14.1913C10.2277 14.6109 11.0255 15 12 15C12.9745 15 13.7723 14.6109 14.3493 14.1913C14.6359 13.9828 14.8573 13.7743 15.0046 13.6206C15.0778 13.5442 15.1315 13.4826 15.1647 13.4431C15.1812 13.4234 15.1925 13.4093 15.1985 13.4018L15.2031 13.3958C15.5353 12.9576 16.1596 12.8697 16.6 13.2C17.0418 13.5314 17.1314 14.1582 16.8 14.6L16 14C16.8 14.6 16.7998 14.6003 16.7995 14.6006L16.799 14.6013L16.7978 14.6029L16.7951 14.6065L16.7879 14.6159L16.7666 14.6432C16.7493 14.6649 16.726 14.6938 16.6966 14.7288C16.638 14.7987 16.555 14.8933 16.4485 15.0044C16.2365 15.2257 15.9266 15.5172 15.5257 15.8087C14.7277 16.3891 13.5255 17 12 17C10.4745 17 9.27227 16.3891 8.47433 15.8087C8.07343 15.5172 7.76352 15.2257 7.55145 15.0044C7.445 14.8933 7.362 14.7987 7.30336 14.7288C7.274 14.6938 7.25065 14.6649 7.23341 14.6432L7.21211 14.6159L7.2049 14.6065L7.20216 14.6029L7.20101 14.6013L7.20048 14.6006C7.20024 14.6003 7.2 14.6 8 14L7.2 14.6C6.86863 14.1582 6.95817 13.5314 7.4 13.2ZM8 9C8 8.44772 8.44772 8 9 8H9.01C9.56229 8 10.01 8.44772 10.01 9C10.01 9.55229 9.56229 10 9.01 10H9C8.44772 10 8 9.55229 8 9ZM15 8C14.4477 8 14 8.44772 14 9C14 9.55229 14.4477 10 15 10H15.01C15.5623 10 16.01 9.55229 16.01 9C16.01 8.44772 15.5623 8 15.01 8H15ZM15 5C15 4.44772 15.4477 4 16 4H18V2C18 1.44772 18.4477 1 19 1C19.5523 1 20 1.44772 20 2V4H22C22.5523 4 23 4.44772 23 5C23 5.55228 22.5523 6 22 6H20V8C20 8.55228 19.5523 9 19 9C18.4477 9 18 8.55228 18 8V6H16C15.4477 6 15 5.55228 15 5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSmilePlusIcon.displayName = \"SmilePlusIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TableIcon = 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 5C2 3.34315 3.34315 2 5 2H19C20.6569 2 22 3.34315 22 5V19C22 20.6569 20.6569 22 19 22H5C3.34315 22 2 20.6569 2 19V5ZM4 5C4 4.44772 4.44772 4 5 4H11V8H4V5ZM4 10H11V14H4V10ZM20 14V10H13V14H20ZM13 16H20V19C20 19.5523 19.5523 20 19 20H13V16ZM11 16V20H5C4.44772 20 4 19.5523 4 19V16H11ZM13 8H20V5C20 4.44772 19.5523 4 19 4H13V8Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTableIcon.displayName = \"TableIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListIndentedIcon = 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 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H9C8.44772 7 8 6.55228 8 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M11 12C11 11.4477 11.4477 11 12 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H12C11.4477 13 11 12.5523 11 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 18C8 17.4477 8.44772 17 9 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H9C8.44772 19 8 18.5523 8 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.5 16.5C3.22386 16.5 3 16.7239 3 17V19C3 19.2761 3.22386 19.5 3.5 19.5H5.5C5.77614 19.5 6 19.2761 6 19V17C6 16.7239 5.77614 16.5 5.5 16.5H3.5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.5 10.5C6.22386 10.5 6 10.7239 6 11V13C6 13.2761 6.22386 13.5 6.5 13.5H8.5C8.77614 13.5 9 13.2761 9 13V11C9 10.7239 8.77614 10.5 8.5 10.5H6.5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.5 4.5C3.22386 4.5 3 4.72386 3 5V7C3 7.27614 3.22386 7.5 3.5 7.5H5.5C5.77614 7.5 6 7.27614 6 7V5C6 4.72386 5.77614 4.5 5.5 4.5H3.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListIndentedIcon.displayName = \"ListIndentedIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeTypeSelected,\n isValidPosition,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { SmilePlusIcon } from \"../../tiptap-icons/smile-plus-icon\"\n\nexport const EMOJI_TRIGGER_SHORTCUT_KEY = \"mod+shift+e\"\n\n/**\n * Configuration for the emoji trigger functionality\n */\nexport interface UseEmojiTriggerConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional node to insert trigger after.\n */\n node?: Node | null\n /**\n * Optional position of the node to insert trigger after.\n */\n nodePos?: number | null\n /**\n * The trigger text to insert.\n * @default \":\"\n */\n trigger?: string\n /**\n * Whether the button should hide when trigger insertion is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful trigger insertion.\n */\n onTriggerApplied?: (trigger: string) => void\n}\n\n/**\n * Checks if emoji trigger can be added in the current editor state\n */\nexport function canAddEmojiTrigger(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n return true\n}\n\n/**\n * Inserts a trigger in a block node at a specified position or after the current selection\n */\nfunction insertTriggerInBlockNode(\n editor: Editor,\n trigger: string,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if ((node !== undefined && node !== null) || isValidPosition(nodePos)) {\n const foundPos = findNodePosition({\n editor,\n node: node || undefined,\n nodePos: nodePos || undefined,\n })\n\n if (!foundPos) {\n return false\n }\n\n const isEmpty =\n foundPos.node.type.name === \"paragraph\" &&\n foundPos.node.content.size === 0\n const posAndNodeSize = foundPos.pos + foundPos.node.nodeSize\n\n return editor\n .chain()\n .insertContentAt(isEmpty ? foundPos.pos : posAndNodeSize, {\n type: \"paragraph\",\n content: [{ type: \"text\", text: trigger }],\n })\n .focus(isEmpty ? foundPos.pos + 2 : posAndNodeSize + trigger.length + 1)\n .run()\n }\n\n const { $from } = editor.state.selection\n\n return editor\n .chain()\n .insertContentAt($from.after(), {\n type: \"paragraph\",\n content: [{ type: \"text\", text: trigger }],\n })\n .focus()\n .run()\n}\n\n/**\n * Inserts a trigger in a text node at the current selection\n */\nfunction insertTriggerInTextNode(\n editor: Editor,\n trigger: string,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if ((node !== undefined && node !== null) || isValidPosition(nodePos)) {\n const foundPos = findNodePosition({\n editor,\n node: node || undefined,\n nodePos: nodePos || undefined,\n })\n\n if (!foundPos) {\n return false\n }\n\n const isEmpty =\n foundPos.node.type.name === \"paragraph\" &&\n foundPos.node.content.size === 0\n const posAndNodeSize = foundPos.pos + foundPos.node.nodeSize\n\n editor.view.dispatch(\n editor.view.state.tr\n .scrollIntoView()\n .insertText(\n trigger,\n isEmpty ? foundPos.pos : posAndNodeSize,\n isEmpty ? foundPos.pos : posAndNodeSize\n )\n )\n\n editor.commands.focus(\n isEmpty ? foundPos.pos + 2 : posAndNodeSize + trigger.length + 1\n )\n\n return true\n }\n\n const { $from } = editor.state.selection\n const currentNode = $from.node()\n const hasContentBefore =\n $from.parentOffset > 0 &&\n currentNode.textContent[$from.parentOffset - 1] !== \" \"\n\n return editor\n .chain()\n .insertContent({\n type: \"text\",\n text: hasContentBefore ? ` ${trigger}` : trigger,\n })\n .focus()\n .run()\n}\n\n/**\n * Adds an emoji trigger at the current selection or specified node position\n */\nexport function addEmojiTrigger(\n editor: Editor | null,\n trigger: string = \":\",\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canAddEmojiTrigger(editor)) return false\n\n try {\n const { $from } = editor.state.selection\n const currentNode = $from.node()\n const isBlockNode = currentNode.isBlock && !currentNode.isTextblock\n\n if (isBlockNode) {\n return insertTriggerInBlockNode(editor, trigger, node, nodePos)\n }\n\n return insertTriggerInTextNode(editor, trigger, node, nodePos)\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the emoji trigger 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canAddEmojiTrigger(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides emoji trigger functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleEmojiTriggerButton() {\n * const { isVisible, handleAddTrigger } = useEmojiTrigger()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleAddTrigger}>Add Emoji</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedEmojiTriggerButton() {\n * const { isVisible, handleAddTrigger, label } = useEmojiTrigger({\n * editor: myEditor,\n * trigger: \"::\",\n * hideWhenUnavailable: true,\n * onTriggerApplied: (trigger) => console.log('Trigger added:', trigger)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleAddTrigger}\n * aria-label={label}\n * >\n * Add Emoji Trigger\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useEmojiTrigger(config?: UseEmojiTriggerConfig) {\n const {\n editor: providedEditor,\n node,\n nodePos,\n trigger = \":\",\n hideWhenUnavailable = false,\n onTriggerApplied,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canAddTrigger = canAddEmojiTrigger(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 handleAddTrigger = useCallback(() => {\n if (!editor) return false\n\n const success = addEmojiTrigger(editor, trigger, node, nodePos)\n if (success) {\n onTriggerApplied?.(trigger)\n }\n return success\n }, [editor, trigger, node, nodePos, onTriggerApplied])\n\n useHotkeys(\n EMOJI_TRIGGER_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleAddTrigger()\n },\n {\n enabled: isVisible && canAddTrigger,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleAddTrigger,\n canAddTrigger,\n label: \"添加表情\",\n shortcutKeys: EMOJI_TRIGGER_SHORTCUT_KEY,\n trigger,\n Icon: SmilePlusIcon,\n }\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeTypeSelected,\n isValidPosition,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { AtSignIcon } from \"../../tiptap-icons/at-sign-icon\"\n\nexport const MENTION_TRIGGER_SHORTCUT_KEY = \"mod+shift+2\"\n\n/**\n * Configuration for the mention functionality\n */\nexport interface UseMentionTriggerConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The node to apply trigger to\n */\n node?: Node | null\n /**\n * The position of the node in the document\n */\n nodePos?: number | null\n /**\n * The trigger text to insert\n * @default \"@\"\n */\n trigger?: string\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 trigger insertion.\n */\n onTriggered?: (trigger: string) => void\n}\n\n/**\n * Checks if a mention can be inserted in the current editor state\n */\nexport function canInsertMention(\n editor: Editor | null,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n if (node || isValidPosition(nodePos)) {\n if (isValidPosition(nodePos) && nodePos! >= 0) return true\n\n if (node) {\n const foundPos = findNodePosition({ editor, node })\n return foundPos !== null\n }\n }\n\n return true\n}\n\n/**\n * Inserts a trigger in a block node at a specified position or after the current selection\n */\nfunction insertTriggerInBlockNode(\n editor: Editor,\n trigger: string,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if ((node !== undefined && node !== null) || isValidPosition(nodePos)) {\n const foundPos = findNodePosition({\n editor,\n node: node || undefined,\n nodePos: nodePos || undefined,\n })\n\n if (!foundPos) {\n return false\n }\n\n const isEmpty =\n foundPos.node.type.name === \"paragraph\" &&\n foundPos.node.content.size === 0\n const insertPos = isEmpty\n ? foundPos.pos\n : foundPos.pos + foundPos.node.nodeSize\n\n const triggerLength = trigger.length + 1 // +1 for the space after the trigger\n const focusPos = isEmpty\n ? foundPos.pos + triggerLength\n : foundPos.pos + foundPos.node.nodeSize + triggerLength\n\n return editor\n .chain()\n .insertContentAt(isEmpty ? foundPos.pos : insertPos, {\n type: \"paragraph\",\n content: [{ type: \"text\", text: trigger }],\n })\n .focus(focusPos)\n .run()\n }\n\n const { $from } = editor.state.selection\n\n return editor\n .chain()\n .insertContentAt($from.after(), {\n type: \"paragraph\",\n content: [{ type: \"text\", text: trigger }],\n })\n .focus()\n .run()\n}\n\n/**\n * Inserts a trigger in a text node at the current selection\n */\nfunction insertTriggerInTextNode(\n editor: Editor,\n trigger: string,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if ((node !== undefined && node !== null) || isValidPosition(nodePos)) {\n const foundPos = findNodePosition({\n editor,\n node: node || undefined,\n nodePos: nodePos || undefined,\n })\n\n if (!foundPos) {\n return false\n }\n\n const isEmpty =\n foundPos.node.type.name === \"paragraph\" &&\n foundPos.node.content.size === 0\n const insertPos = isEmpty\n ? foundPos.pos\n : foundPos.pos + foundPos.node.nodeSize\n\n editor.view.dispatch(\n editor.view.state.tr\n .scrollIntoView()\n .insertText(trigger, insertPos, insertPos)\n )\n\n const triggerLength = trigger.length + 1 // +1 for the space after the trigger\n const focusPos = isEmpty\n ? foundPos.pos + triggerLength\n : foundPos.pos + foundPos.node.nodeSize + triggerLength\n editor.commands.focus(focusPos)\n\n return true\n }\n\n const { $from } = editor.state.selection\n const currentNode = $from.node()\n const hasContentBefore =\n $from.parentOffset > 0 &&\n currentNode.textContent[$from.parentOffset - 1] !== \" \"\n\n return editor\n .chain()\n .insertContent({\n type: \"text\",\n text: hasContentBefore ? ` ${trigger}` : trigger,\n })\n .focus()\n .run()\n}\n\n/**\n * Adds a mention trigger at the current selection or specified node position\n */\nexport function addMentionTrigger(\n editor: Editor | null,\n trigger: string = \"@\",\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canInsertMention(editor, node, nodePos)) return false\n\n try {\n const { $from } = editor.state.selection\n const currentNode = $from.node()\n const isBlockNode = currentNode.isBlock && !currentNode.isTextblock\n\n if (isBlockNode) {\n return insertTriggerInBlockNode(editor, trigger, node, nodePos)\n }\n\n return insertTriggerInTextNode(editor, trigger, node, nodePos)\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the mention button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n node?: Node | null\n nodePos?: number | null\n}): boolean {\n const { editor, hideWhenUnavailable, node, nodePos } = props\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canInsertMention(editor, node, nodePos)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides mention functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleMentionButton() {\n * const { isVisible, handleMention } = useMentionTrigger()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleMention}>Add Mention</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedMentionButton() {\n * const { isVisible, handleMention, label } = useMentionTrigger({\n * editor: myEditor,\n * trigger: \"@\",\n * hideWhenUnavailable: true,\n * onTriggered: (trigger) => console.log('Inserted:', trigger)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleMention}\n * aria-label={label}\n * >\n * Add Mention\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useMentionTrigger(config?: UseMentionTriggerConfig) {\n const {\n editor: providedEditor,\n node,\n nodePos,\n trigger = \"@\",\n hideWhenUnavailable = false,\n onTriggered,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canInsert = canInsertMention(editor, node, nodePos)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, node, nodePos })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, node, nodePos])\n\n const handleMention = useCallback(() => {\n if (!editor) return false\n\n const success = addMentionTrigger(editor, trigger, node, nodePos)\n if (success) {\n onTriggered?.(trigger)\n }\n return success\n }, [editor, trigger, node, nodePos, onTriggered])\n\n useHotkeys(\n MENTION_TRIGGER_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleMention()\n },\n {\n enabled: isVisible && canInsert,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleMention,\n canInsert,\n label: \"添加提及\",\n shortcutKeys: MENTION_TRIGGER_SHORTCUT_KEY,\n trigger,\n Icon: AtSignIcon,\n }\n}\n","import { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Icons ---\nimport { CodeBlockIcon } from \"../../tiptap-icons/code-block-icon\"\nimport { HeadingOneIcon } from \"../../tiptap-icons/heading-one-icon\"\nimport { HeadingTwoIcon } from \"../../tiptap-icons/heading-two-icon\"\nimport { HeadingThreeIcon } from \"../../tiptap-icons/heading-three-icon\"\nimport { ImageIcon } from \"../../tiptap-icons/image-icon\"\nimport { VideoIcon } from \"../../tiptap-icons/video-icon\"\nimport { AudioIcon } from \"../../tiptap-icons/audio-icon\"\nimport { FileIcon } from \"../../tiptap-icons/file-icon\"\nimport { ListIcon } from \"../../tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"../../tiptap-icons/list-ordered-icon\"\nimport { BlockquoteIcon } from \"../../tiptap-icons/blockquote-icon\"\nimport { ListTodoIcon } from \"../../tiptap-icons/list-todo-icon\"\nimport { MinusIcon } from \"../../tiptap-icons/minus-icon\"\nimport { TypeIcon } from \"../../tiptap-icons/type-icon\"\nimport { AtSignIcon } from \"../../tiptap-icons/at-sign-icon\"\nimport { SmilePlusIcon } from \"../../tiptap-icons/smile-plus-icon\"\nimport { TableIcon } from \"../../tiptap-icons/table-icon\"\nimport { ListIndentedIcon } from \"../../tiptap-icons/list-indented-icon\"\nimport { ColumnsTwoIcon } from \"../../tiptap-icons/columns-two-icon\"\nimport { ColumnsThreeIcon } from \"../../tiptap-icons/columns-three-icon\"\nimport { ColumnsLeftIcon } from \"../../tiptap-icons/columns-left-icon\"\nimport { ColumnsRightIcon } from \"../../tiptap-icons/columns-right-icon\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isNodeInSchema,\n} from \"../../../lib/tiptap-utils\"\nimport { pickFile } from \"../../../lib/file-picker\"\n\n// --- Tiptap UI ---\nimport type { SuggestionItem } from \"../../tiptap-ui-utils/suggestion-menu\"\nimport { addEmojiTrigger } from \"../emoji-trigger-button\"\nimport { addMentionTrigger } from \"../mention-trigger-button\"\n\nexport interface SlashMenuConfig {\n enabledItems?: SlashMenuItemType[]\n customItems?: SuggestionItem[]\n itemGroups?: {\n [key in SlashMenuItemType]?: string\n }\n showGroups?: boolean\n}\n\nconst texts = {\n // Style\n text: {\n title: \"正文\",\n subtext: \"普通文本段落\",\n keywords: [\"p\", \"paragraph\", \"text\", \"正文\", \"段落\"],\n badge: TypeIcon,\n group: \"样式\",\n },\n heading_1: {\n title: \"1 级标题\",\n subtext: \"顶级标题\",\n keywords: [\"h\", \"heading1\", \"h1\", \"标题\"],\n badge: HeadingOneIcon,\n group: \"样式\",\n },\n heading_2: {\n title: \"2 级标题\",\n subtext: \"主要章节标题\",\n keywords: [\"h2\", \"heading2\", \"subheading\", \"标题\"],\n badge: HeadingTwoIcon,\n group: \"样式\",\n },\n heading_3: {\n title: \"3 级标题\",\n subtext: \"次级或分组标题\",\n keywords: [\"h3\", \"heading3\", \"subheading\", \"标题\"],\n badge: HeadingThreeIcon,\n group: \"样式\",\n },\n bullet_list: {\n title: \"无序列表\",\n subtext: \"项目符号列表\",\n keywords: [\"ul\", \"li\", \"list\", \"bulletlist\", \"bullet list\", \"无序列表\"],\n badge: ListIcon,\n group: \"样式\",\n },\n ordered_list: {\n title: \"有序列表\",\n subtext: \"带序号的列表\",\n keywords: [\"ol\", \"li\", \"list\", \"numberedlist\", \"numbered list\", \"有序列表\"],\n badge: ListOrderedIcon,\n group: \"样式\",\n },\n task_list: {\n title: \"任务列表\",\n subtext: \"待办事项列表\",\n keywords: [\"tasklist\", \"task list\", \"todo\", \"checklist\", \"任务\", \"待办\"],\n badge: ListTodoIcon,\n group: \"样式\",\n },\n quote: {\n title: \"引用\",\n subtext: \"引用块\",\n keywords: [\"quote\", \"blockquote\", \"引用\"],\n badge: BlockquoteIcon,\n group: \"样式\",\n },\n code_block: {\n title: \"代码块\",\n subtext: \"带语法高亮的代码块\",\n keywords: [\"code\", \"pre\", \"代码\"],\n badge: CodeBlockIcon,\n group: \"样式\",\n },\n\n // Insert\n mention: {\n title: \"提及\",\n subtext: \"提及用户或条目\",\n keywords: [\"mention\", \"user\", \"item\", \"tag\", \"提及\", \"@\"],\n badge: AtSignIcon,\n group: \"插入\",\n },\n emoji: {\n title: \"表情\",\n subtext: \"插入表情\",\n keywords: [\"emoji\", \"emoticon\", \"smiley\", \"表情\"],\n badge: SmilePlusIcon,\n group: \"插入\",\n },\n table: {\n title: \"表格\",\n subtext: \"插入表格\",\n aliases: [\"table\", \"insertTable\", \"表格\"],\n badge: TableIcon,\n group: \"插入\",\n },\n divider: {\n title: \"分割线\",\n subtext: \"水平分割线\",\n keywords: [\"hr\", \"horizontalRule\", \"line\", \"separator\", \"分割线\", \"分隔线\"],\n badge: MinusIcon,\n group: \"插入\",\n },\n toc: {\n title: \"目录\",\n subtext: \"插入文档目录\",\n keywords: [\"toc\", \"tableofcontents\", \"table of contents\", \"目录\"],\n badge: ListIndentedIcon,\n group: \"插入\",\n },\n columns_two: {\n title: \"两栏\",\n subtext: \"等宽两栏布局\",\n keywords: [\"column\", \"columns\", \"分栏\", \"两栏\", \"2 栏\", \"col\"],\n badge: ColumnsTwoIcon,\n group: \"插入\",\n },\n columns_three: {\n title: \"三栏\",\n subtext: \"等宽三栏布局\",\n keywords: [\"column\", \"columns\", \"分栏\", \"三栏\", \"3 栏\", \"col\"],\n badge: ColumnsThreeIcon,\n group: \"插入\",\n },\n columns_left: {\n title: \"左边栏\",\n subtext: \"左窄右宽 40:60\",\n keywords: [\"column\", \"sidebar\", \"分栏\", \"左边栏\", \"侧栏\"],\n badge: ColumnsLeftIcon,\n group: \"插入\",\n },\n columns_right: {\n title: \"右边栏\",\n subtext: \"左宽右窄 60:40\",\n keywords: [\"column\", \"sidebar\", \"分栏\", \"右边栏\", \"侧栏\"],\n badge: ColumnsRightIcon,\n group: \"插入\",\n },\n\n // Upload\n image: {\n title: \"图片\",\n subtext: \"可调整大小、带标题的图片\",\n keywords: [\n \"image\",\n \"imageUpload\",\n \"upload\",\n \"img\",\n \"picture\",\n \"media\",\n \"url\",\n \"图片\",\n \"上传\",\n ],\n badge: ImageIcon,\n group: \"上传\",\n },\n video: {\n title: \"视频\",\n subtext: \"上传并插入视频(mp4 / webm 等)\",\n keywords: [\"video\", \"movie\", \"mp4\", \"webm\", \"视频\", \"影片\"],\n badge: VideoIcon,\n group: \"上传\",\n },\n audio: {\n title: \"音频\",\n subtext: \"上传并插入音频(mp3 / wav 等)\",\n keywords: [\"audio\", \"music\", \"sound\", \"mp3\", \"wav\", \"音频\", \"音乐\"],\n badge: AudioIcon,\n group: \"上传\",\n },\n file: {\n title: \"文件\",\n subtext: \"上传任意附件(pdf / doc / zip 等)\",\n keywords: [\"file\", \"attachment\", \"pdf\", \"zip\", \"文件\", \"附件\"],\n badge: FileIcon,\n group: \"上传\",\n },\n}\n\nexport type SlashMenuItemType = keyof typeof texts\n\nconst getItemImplementations = () => {\n return {\n // Style\n text: {\n check: (editor: Editor) => isNodeInSchema(\"paragraph\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setParagraph().run()\n },\n },\n heading_1: {\n check: (editor: Editor) => isNodeInSchema(\"heading\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n },\n },\n heading_2: {\n check: (editor: Editor) => isNodeInSchema(\"heading\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n },\n },\n heading_3: {\n check: (editor: Editor) => isNodeInSchema(\"heading\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n },\n },\n bullet_list: {\n check: (editor: Editor) => isNodeInSchema(\"bulletList\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleBulletList().run()\n },\n },\n ordered_list: {\n check: (editor: Editor) => isNodeInSchema(\"orderedList\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleOrderedList().run()\n },\n },\n task_list: {\n check: (editor: Editor) => isNodeInSchema(\"taskList\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleTaskList().run()\n },\n },\n quote: {\n check: (editor: Editor) => isNodeInSchema(\"blockquote\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleBlockquote().run()\n },\n },\n code_block: {\n check: (editor: Editor) => isNodeInSchema(\"codeBlock\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().toggleNode(\"codeBlock\", \"paragraph\").run()\n },\n },\n\n // Insert\n mention: {\n check: (editor: Editor) =>\n isExtensionAvailable(editor, [\"mention\", \"mentionAdvanced\"]),\n action: ({ editor }: { editor: Editor }) => addMentionTrigger(editor),\n },\n emoji: {\n check: (editor: Editor) =>\n isExtensionAvailable(editor, [\"emoji\", \"emojiPicker\"]),\n action: ({ editor }: { editor: Editor }) => addEmojiTrigger(editor),\n },\n divider: {\n check: (editor: Editor) => isNodeInSchema(\"horizontalRule\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setHorizontalRule().run()\n },\n },\n toc: {\n check: (editor: Editor) => isNodeInSchema(\"tocNode\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().insertTocNode().run()\n },\n },\n table: {\n check: (editor: Editor) => isNodeInSchema(\"table\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor\n .chain()\n .focus()\n .insertTable({\n rows: 3,\n cols: 3,\n withHeaderRow: false,\n })\n .run()\n },\n },\n\n columns_two: {\n check: (editor: Editor) =>\n isNodeInSchema(\"columns\", editor) && !editor.isActive(\"column\"),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setColumns(\"column\").run()\n },\n },\n columns_three: {\n check: (editor: Editor) =>\n isNodeInSchema(\"columns\", editor) && !editor.isActive(\"column\"),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setColumns(\"three-column\").run()\n },\n },\n columns_left: {\n check: (editor: Editor) =>\n isNodeInSchema(\"columns\", editor) && !editor.isActive(\"column\"),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setColumns(\"sidebar-left\").run()\n },\n },\n columns_right: {\n check: (editor: Editor) =>\n isNodeInSchema(\"columns\", editor) && !editor.isActive(\"column\"),\n action: ({ editor }: { editor: Editor }) => {\n editor.chain().focus().setColumns(\"sidebar-right\").run()\n },\n },\n\n // Upload\n image: {\n check: (editor: Editor) => isNodeInSchema(\"image\", editor),\n action: ({ editor }: { editor: Editor }) => {\n editor\n .chain()\n .focus()\n .insertContent({\n type: \"imageUpload\",\n })\n .run()\n },\n },\n video: {\n check: (editor: Editor) =>\n isNodeInSchema(\"video\", editor) &&\n isExtensionAvailable(editor, [\"pasteDropMedia\"]),\n action: async ({ editor }: { editor: Editor }) => {\n const files = await pickFile(\"video/*\", false)\n if (files.length === 0) return\n // 通过 pasteDropMedia 命令走完整上传流程(size 校验 / 乐观插入 / message.error)\n editor.commands.uploadMediaFile(files[0])\n },\n },\n audio: {\n check: (editor: Editor) =>\n isNodeInSchema(\"audio\", editor) &&\n isExtensionAvailable(editor, [\"pasteDropMedia\"]),\n action: async ({ editor }: { editor: Editor }) => {\n const files = await pickFile(\"audio/*\", false)\n if (files.length === 0) return\n editor.commands.uploadMediaFile(files[0])\n },\n },\n file: {\n check: (editor: Editor) =>\n isNodeInSchema(\"fileAttachment\", editor) &&\n isExtensionAvailable(editor, [\"pasteDropMedia\"]),\n action: async ({ editor }: { editor: Editor }) => {\n // 任意类型;后端 /assets/attachment 自己决定能不能收\n const files = await pickFile(\"*/*\", false)\n if (files.length === 0) return\n editor.commands.uploadMediaFile(files[0])\n },\n },\n }\n}\n\nfunction organizeItemsByGroups(\n items: SuggestionItem[],\n showGroups: boolean\n): SuggestionItem[] {\n if (!showGroups) {\n return items.map((item) => ({ ...item, group: \"\" }))\n }\n\n const groups: { [groupLabel: string]: SuggestionItem[] } = {}\n\n // Group items\n items.forEach((item) => {\n const groupLabel = item.group || \"\"\n if (!groups[groupLabel]) {\n groups[groupLabel] = []\n }\n groups[groupLabel].push(item)\n })\n\n // Flatten groups in order (this maintains the visual order for keyboard navigation)\n const organizedItems: SuggestionItem[] = []\n Object.entries(groups).forEach(([, groupItems]) => {\n organizedItems.push(...groupItems)\n })\n\n return organizedItems\n}\n\n/**\n * Custom hook for slash dropdown menu functionality\n */\nexport function useSlashDropdownMenu(config?: SlashMenuConfig) {\n const getSlashMenuItems = useCallback(\n (editor: Editor) => {\n const items: SuggestionItem[] = []\n\n const enabledItems =\n config?.enabledItems || (Object.keys(texts) as SlashMenuItemType[])\n const showGroups = config?.showGroups !== false\n\n const itemImplementations = getItemImplementations()\n\n enabledItems.forEach((itemType) => {\n const itemImpl = itemImplementations[itemType]\n const itemText = texts[itemType]\n\n if (itemImpl && itemText && itemImpl.check(editor)) {\n const item: SuggestionItem = {\n onSelect: ({ editor }) => itemImpl.action({ editor }),\n ...itemText,\n }\n\n if (config?.itemGroups?.[itemType]) {\n item.group = config.itemGroups[itemType]\n } else if (!showGroups) {\n item.group = \"\"\n }\n\n items.push(item)\n }\n })\n\n if (config?.customItems) {\n items.push(...config.customItems)\n }\n\n // Reorganize items by groups to ensure keyboard navigation works correctly\n return organizeItemsByGroups(items, showGroups)\n },\n [config]\n )\n\n return {\n getSlashMenuItems,\n config,\n }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useRef } from \"react\"\n\n// --- Lib ---\nimport { getElementOverflowPosition } from \"../../../lib/tiptap-collab-utils\"\n\n// --- Tiptap UI ---\nimport type {\n SuggestionMenuProps,\n SuggestionItem,\n SuggestionMenuRenderProps,\n} from \"../../tiptap-ui-utils/suggestion-menu\"\nimport { filterSuggestionItems } from \"../../tiptap-ui-utils/suggestion-menu\"\nimport { SuggestionMenu } from \"../../tiptap-ui-utils/suggestion-menu\"\n\n// --- Hooks ---\nimport type { SlashMenuConfig } from \"./use-slash-dropdown-menu\"\nimport { useSlashDropdownMenu } from \"./use-slash-dropdown-menu\"\n\n// --- UI Primitives ---\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardGroupLabel,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\nimport \"./slash-dropdown-menu.scss\"\n\ntype SlashDropdownMenuProps = Omit<\n SuggestionMenuProps,\n \"items\" | \"children\"\n> & {\n config?: SlashMenuConfig\n}\n\nexport const SlashDropdownMenu = (props: SlashDropdownMenuProps) => {\n const { config, ...restProps } = props\n const { getSlashMenuItems } = useSlashDropdownMenu(config)\n\n return (\n <SuggestionMenu\n char=\"/\"\n pluginKey=\"slashDropdownMenu\"\n decorationClass=\"tiptap-slash-decoration\"\n decorationContent=\"Filter...\"\n selector=\"tiptap-slash-dropdown-menu\"\n items={({ query, editor }) =>\n filterSuggestionItems(getSlashMenuItems(editor), query)\n }\n {...restProps}\n >\n {(props) => <List {...props} config={config} />}\n </SuggestionMenu>\n )\n}\n\nconst Item = (props: {\n item: SuggestionItem\n isSelected: boolean\n onSelect: () => void\n}) => {\n const { item, isSelected, onSelect } = props\n const itemRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n const selector = document.querySelector(\n '[data-selector=\"tiptap-slash-dropdown-menu\"]'\n ) as HTMLElement\n if (!itemRef.current || !isSelected || !selector) return\n\n const overflow = getElementOverflowPosition(itemRef.current, selector)\n\n if (overflow === \"top\") {\n itemRef.current.scrollIntoView(true)\n } else if (overflow === \"bottom\") {\n itemRef.current.scrollIntoView(false)\n }\n }, [isSelected])\n\n const BadgeIcon = item.badge\n\n return (\n <Button\n ref={itemRef}\n variant=\"ghost\"\n data-active-state={isSelected ? \"on\" : \"off\"}\n onClick={onSelect}\n >\n {BadgeIcon && <BadgeIcon className=\"tiptap-button-icon\" />}\n <div className=\"tiptap-button-text\">{item.title}</div>\n </Button>\n )\n}\n\nconst List = ({\n items,\n selectedIndex,\n onSelect,\n config,\n}: SuggestionMenuRenderProps & { config?: SlashMenuConfig }) => {\n const renderedItems = useMemo(() => {\n const rendered: React.ReactElement[] = []\n const showGroups = config?.showGroups !== false\n\n if (!showGroups) {\n items.forEach((item, index) => {\n rendered.push(\n <Item\n key={`item-${index}-${item.title}`}\n item={item}\n isSelected={index === selectedIndex}\n onSelect={() => onSelect(item)}\n />\n )\n })\n return rendered\n }\n\n const groups: {\n [groupLabel: string]: { items: SuggestionItem[]; indices: number[] }\n } = {}\n\n items.forEach((item, index) => {\n const groupLabel = item.group || \"\"\n if (!groups[groupLabel]) {\n groups[groupLabel] = { items: [], indices: [] }\n }\n groups[groupLabel].items.push(item)\n groups[groupLabel].indices.push(index)\n })\n\n Object.entries(groups).forEach(([groupLabel, groupData], groupIndex) => {\n if (groupIndex > 0) {\n rendered.push(\n <Separator key={`separator-${groupIndex}`} orientation=\"horizontal\" />\n )\n }\n\n const groupItems = groupData.items.map((item, itemIndex) => {\n const originalIndex = groupData.indices[itemIndex]\n return (\n <Item\n key={`item-${originalIndex}-${item.title}`}\n item={item}\n isSelected={originalIndex === selectedIndex}\n onSelect={() => onSelect(item)}\n />\n )\n })\n\n if (groupLabel) {\n rendered.push(\n <CardItemGroup key={`group-${groupIndex}-${groupLabel}`}>\n <CardGroupLabel>{groupLabel}</CardGroupLabel>\n {groupItems}\n </CardItemGroup>\n )\n } else {\n rendered.push(...groupItems)\n }\n })\n\n return rendered\n }, [items, selectedIndex, onSelect, config?.showGroups])\n\n if (!renderedItems.length) {\n return null\n }\n\n return (\n <Card\n className=\"tiptap-slash-card\"\n style={{\n maxHeight: \"var(--suggestion-menu-max-height)\",\n }}\n >\n <CardBody className=\"tiptap-slash-card-body\">{renderedItems}</CardBody>\n </Card>\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 { UseImageDownloadConfig } from \".\"\nimport {\n IMAGE_DOWNLOAD_SHORTCUT_KEY,\n useImageDownload,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface ImageDownloadButtonProps\n extends Omit<ButtonProps, \"type\">, UseImageDownloadConfig {\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 ImageDownloadShortcutBadge({\n shortcutKeys = IMAGE_DOWNLOAD_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for downloading images from a Tiptap editor.\n * Only appears when an image is selected in the editor.\n *\n * For custom button implementations, use the `useImageDownload` hook instead.\n */\nexport const ImageDownloadButton = forwardRef<\n HTMLButtonElement,\n ImageDownloadButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onDownloaded,\n resolveFileUrl,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canDownload,\n handleDownload,\n label,\n shortcutKeys,\n Icon,\n } = useImageDownload({\n editor,\n hideWhenUnavailable,\n onDownloaded,\n resolveFileUrl,\n })\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n await handleDownload()\n },\n [handleDownload, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n data-active-state=\"off\"\n role=\"button\"\n tabIndex={-1}\n disabled={!canDownload}\n data-disabled={!canDownload}\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 <ImageDownloadShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nImageDownloadButton.displayName = \"ImageDownloadButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowDownToLineIcon = 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=\"M12 2C12.5523 2 13 2.44772 13 3V14.5858L17.2929 10.2929C17.6834 9.90237 18.3166 9.90237 18.7071 10.2929C19.0976 10.6834 19.0976 11.3166 18.7071 11.7071L12.7071 17.7071C12.3166 18.0976 11.6834 18.0976 11.2929 17.7071L5.29289 11.7071C4.90237 11.3166 4.90237 10.6834 5.29289 10.2929C5.68342 9.90237 6.31658 9.90237 6.70711 10.2929L11 14.5858V3C11 2.44772 11.4477 2 12 2Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5 20C4.44772 20 4 20.4477 4 21C4 21.5523 4.44772 22 5 22H19C19.5523 22 20 21.5523 20 21C20 20.4477 19.5523 20 19 20H5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowDownToLineIcon.displayName = \"ArrowDownToLineIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isNodeTypeSelected,\n sanitizeUrl,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { ArrowDownToLineIcon } from \"../../tiptap-icons/arrow-down-to-line-icon\"\n\nexport const IMAGE_DOWNLOAD_SHORTCUT_KEY = \"mod+shift+d\"\n\n/**\n * Extracts file extension from URL or content type\n */\nfunction getFileExtension(url: string, contentType?: string): string {\n const urlMatch = url.match(/\\.([a-zA-Z0-9]+)(?:\\?|#|$)/)\n if (urlMatch && urlMatch[1]) {\n return `.${urlMatch[1].toLowerCase()}`\n }\n\n if (contentType) {\n const mimeMap: Record<string, string> = {\n \"image/jpeg\": \".jpg\",\n \"image/jpg\": \".jpg\",\n \"image/png\": \".png\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"image/bmp\": \".bmp\",\n }\n return mimeMap[contentType.toLowerCase()] || \".jpg\"\n }\n\n return \".jpg\"\n}\n\n/**\n * Configuration for the image download functionality\n */\nexport interface UseImageDownloadConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when download is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful image download.\n */\n onDownloaded?: (filename?: string) => void\n /**\n * Optional function to resolve file URLs before downloading.\n * Useful for handling relative paths or custom URL schemes.\n */\n resolveFileUrl?: (url: string) => Promise<string>\n /**\n * Download behavior: 'download' forces download, 'open' opens in new tab, 'auto' tries download with fallback\n * @default 'auto'\n */\n downloadMethod?: \"download\" | \"open\" | \"auto\"\n}\n\n/**\n * Checks if image can be downloaded in the current editor state\n */\nexport function canDownloadImage(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, [\"image\"])) return false\n\n return isNodeTypeSelected(editor, [\"image\"])\n}\n\n/**\n * Gets the currently selected image data\n */\nexport function getSelectedImageData(editor: Editor | null): {\n src?: string\n alt?: string\n title?: string\n} | null {\n if (!editor || !canDownloadImage(editor)) return null\n\n const { selection } = editor.state\n\n if (selection instanceof NodeSelection) {\n const node = selection.node\n\n if (node.type.name === \"image\") {\n return {\n src: node.attrs.src,\n alt: node.attrs.alt,\n title: node.attrs.title,\n }\n }\n }\n\n return null\n}\n\n/**\n * Attempts to download image via fetch (handles CORS)\n */\nasync function tryFetchDownload(\n url: string,\n filename: string\n): Promise<boolean> {\n try {\n const response = await fetch(url)\n if (!response.ok) return false\n\n const blob = await response.blob()\n const blobUrl = URL.createObjectURL(blob)\n\n const hasExtension = /\\.[a-zA-Z0-9]+$/.test(filename)\n const finalFilename = hasExtension\n ? filename\n : filename +\n getFileExtension(url, response.headers.get(\"content-type\") || undefined)\n\n const link = document.createElement(\"a\")\n link.href = blobUrl\n link.download = finalFilename\n link.style.display = \"none\"\n\n document.body.appendChild(link)\n link.click()\n link.remove()\n URL.revokeObjectURL(blobUrl)\n return true\n } catch (error) {\n console.warn(\"Fetch download failed:\", error)\n return false\n }\n}\n\n/**\n * Downloads image via direct link (for same-origin or data URLs)\n */\nfunction tryDirectDownload(url: string, filename: string): boolean {\n try {\n const hasExtension = /\\.[a-zA-Z0-9]+$/.test(filename)\n const finalFilename = hasExtension\n ? filename\n : filename + getFileExtension(url)\n\n const link = document.createElement(\"a\")\n link.href = url\n link.download = finalFilename\n link.style.display = \"none\"\n\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n return true\n } catch (error) {\n console.warn(\"Direct download failed:\", error)\n return false\n }\n}\n\n/**\n * Opens image in new tab\n */\nfunction openInNewTab(url: string): boolean {\n try {\n window.open(url, \"_blank\")\n return true\n } catch (error) {\n console.error(\"Failed to open image:\", error)\n return false\n }\n}\n\n/**\n * Downloads the currently selected image\n */\nexport async function downloadSelectedImage(\n editor: Editor | null,\n filename?: string,\n resolveFileUrl?: (url: string) => Promise<string>,\n downloadMethod: \"download\" | \"open\" | \"auto\" = \"auto\"\n): Promise<boolean> {\n if (!editor || !canDownloadImage(editor)) return false\n\n const imageData = getSelectedImageData(editor)\n if (!imageData?.src) return false\n\n try {\n let resolvedUrl = imageData.src\n if (resolveFileUrl) {\n resolvedUrl = await resolveFileUrl(imageData.src)\n }\n\n const baseUrl = window.location.href\n const sanitizedUrl = sanitizeUrl(resolvedUrl, baseUrl)\n\n if (sanitizedUrl === \"#\") {\n console.error(\"Invalid or unsafe URL after sanitization\")\n return false\n }\n\n const generatedFilename =\n filename || imageData.alt || imageData.title || `image-${Date.now()}`\n\n switch (downloadMethod) {\n case \"open\":\n return openInNewTab(sanitizedUrl)\n\n case \"download\":\n if (\n sanitizedUrl.startsWith(window.location.origin) ||\n sanitizedUrl.startsWith(\"data:\")\n ) {\n return tryDirectDownload(sanitizedUrl, generatedFilename)\n } else {\n const success = await tryFetchDownload(\n sanitizedUrl,\n generatedFilename\n )\n return success || openInNewTab(sanitizedUrl)\n }\n\n case \"auto\":\n default:\n if (\n sanitizedUrl.startsWith(\"data:\") ||\n sanitizedUrl.startsWith(window.location.origin)\n ) {\n return tryDirectDownload(sanitizedUrl, generatedFilename)\n } else {\n const fetchSuccess = await tryFetchDownload(\n sanitizedUrl,\n generatedFilename\n )\n if (fetchSuccess) return true\n\n return openInNewTab(sanitizedUrl)\n }\n }\n } catch (error) {\n console.error(\"Failed to download image:\", error)\n\n try {\n const baseUrl = window.location.href\n const sanitizedUrl = sanitizeUrl(imageData.src, baseUrl)\n if (sanitizedUrl !== \"#\") {\n return openInNewTab(sanitizedUrl)\n }\n } catch {\n // Silent fail\n }\n\n return false\n }\n}\n\n/**\n * Determines if the download button should be shown\n */\nexport function shouldShowDownloadButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isExtensionAvailable(editor, [\"image\", \"imageUpload\"])) return false\n\n return canDownloadImage(editor)\n}\n\n/**\n * Custom hook that provides image download functionality for Tiptap editor\n */\nexport function useImageDownload(config?: UseImageDownloadConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onDownloaded,\n resolveFileUrl,\n downloadMethod = \"auto\",\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canDownload = canDownloadImage(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowDownloadButton({ 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 handleDownload = useCallback(async () => {\n if (!editor) return false\n\n const imageData = getSelectedImageData(editor)\n const filename = imageData?.alt || imageData?.title\n\n const success = await downloadSelectedImage(\n editor,\n filename,\n resolveFileUrl,\n downloadMethod\n )\n if (success) {\n onDownloaded?.(filename)\n }\n return success\n }, [editor, onDownloaded, resolveFileUrl, downloadMethod])\n\n useHotkeys(\n IMAGE_DOWNLOAD_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleDownload()\n },\n {\n enabled: isVisible && canDownload,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n canDownload,\n handleDownload,\n label: \"下载图片\",\n shortcutKeys: IMAGE_DOWNLOAD_SHORTCUT_KEY,\n Icon: ArrowDownToLineIcon,\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 { UseDuplicateConfig } from \".\"\nimport {\n DUPLICATE_SHORTCUT_KEY,\n useDuplicate,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface DuplicateButtonProps\n extends Omit<ButtonProps, \"type\">, UseDuplicateConfig {\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 DuplicateShortcutBadge({\n shortcutKeys = DUPLICATE_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for duplicating a node in a Tiptap editor.\n *\n * For custom button implementations, use the `useDuplicate` hook instead.\n */\nexport const DuplicateButton = forwardRef<\n HTMLButtonElement,\n DuplicateButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onDuplicated,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleDuplicate, label, shortcutKeys, Icon } =\n useDuplicate({\n editor,\n hideWhenUnavailable,\n onDuplicated,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleDuplicate()\n },\n [handleDuplicate, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"复制\"\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 <DuplicateShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nDuplicateButton.displayName = \"DuplicateButton\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { CopyIcon } from \"../../tiptap-icons/copy-icon\"\n\nexport const DUPLICATE_SHORTCUT_KEY = \"mod+d\"\n\n/**\n * Configuration for the duplicate functionality\n */\nexport interface UseDuplicateConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when duplication is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful duplication.\n */\n onDuplicated?: () => void\n}\n\n/**\n * Checks if a node can be duplicated in the current editor state\n */\nexport function canDuplicateNode(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n try {\n const { state } = editor\n const { selection } = state\n\n if (selection instanceof NodeSelection) {\n return !!selection.node\n }\n\n const $anchor = selection.$anchor.node(1)\n\n return !!$anchor\n } catch {\n return false\n }\n}\n\n/**\n * Duplicates a node in the editor\n */\nexport function duplicateNode(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n try {\n const { state } = editor\n const { selection } = state\n const chain = editor.chain().focus()\n\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n const insertPos = selection.to\n\n chain.insertContentAt(insertPos, selectedNode.toJSON()).run()\n return true\n }\n\n // Handle text selection or cursor position\n // Find the appropriate parent node to duplicate\n const $anchor = selection.$anchor\n\n for (let depth = 1; depth <= $anchor.depth; depth++) {\n const node = $anchor.node(depth)\n\n // Skip document and other non-duplicatable nodes\n if (node.type.name === \"doc\" || !node.type.spec.group) {\n continue\n }\n\n const nodeStart = $anchor.start(depth)\n const insertPos = Math.min(\n nodeStart + node.nodeSize,\n state.doc.content.size\n )\n\n chain.insertContentAt(insertPos, node.toJSON()).run()\n return true\n }\n\n return false\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the duplicate 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canDuplicateNode(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides duplicate functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleDuplicateButton() {\n * const { isVisible, handleDuplicate } = useDuplicate()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleDuplicate}>Duplicate</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedDuplicateButton() {\n * const { isVisible, handleDuplicate, label } = useDuplicate({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onDuplicated: () => console.log('Node duplicated!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleDuplicate}\n * aria-label={label}\n * >\n * Duplicate Node\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useDuplicate(config?: UseDuplicateConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onDuplicated,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canDuplicate = canDuplicateNode(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 handleDuplicate = useCallback(() => {\n if (!editor) return false\n\n const success = duplicateNode(editor)\n if (success) {\n onDuplicated?.()\n }\n return success\n }, [editor, onDuplicated])\n\n useHotkeys(\n DUPLICATE_SHORTCUT_KEY,\n (event) => {\n event.preventDefault() // prevent browser default bookmarking\n handleDuplicate()\n },\n {\n enabled: isVisible && canDuplicate,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleDuplicate,\n canDuplicate,\n label: \"复制节点\",\n shortcutKeys: DUPLICATE_SHORTCUT_KEY,\n Icon: CopyIcon,\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 { UseCopyToClipboardConfig } from \".\"\nimport {\n COPY_TO_CLIPBOARD_SHORTCUT_KEY,\n useCopyToClipboard,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface CopyToClipboardButtonProps\n extends Omit<ButtonProps, \"type\">, UseCopyToClipboardConfig {\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 CopyToClipboardShortcutBadge({\n shortcutKeys = COPY_TO_CLIPBOARD_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for copying content to clipboard in a Tiptap editor.\n *\n * For custom button implementations, use the `useCopyToClipboard` hook instead.\n */\nexport const CopyToClipboardButton = forwardRef<\n HTMLButtonElement,\n CopyToClipboardButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n copyWithFormatting = true,\n hideWhenUnavailable = false,\n onCopied,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleCopyToClipboard, label, shortcutKeys, Icon } =\n useCopyToClipboard({\n editor,\n copyWithFormatting,\n hideWhenUnavailable,\n onCopied,\n })\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n await handleCopyToClipboard()\n },\n [handleCopyToClipboard, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"复制到剪贴板\"\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 <CopyToClipboardShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nCopyToClipboardButton.displayName = \"CopyToClipboardButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ClipboardIcon = 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 1C16.1046 1 17 1.89543 17 3H18C18.7956 3 19.5585 3.3163 20.1211 3.87891C20.6837 4.44151 21 5.20435 21 6V20C21 20.7957 20.6837 21.5585 20.1211 22.1211C19.5585 22.6837 18.7957 23 18 23H6C5.20435 23 4.44151 22.6837 3.87891 22.1211C3.3163 21.5585 3 20.7957 3 20V6C3 5.20435 3.3163 4.44152 3.87891 3.87891C4.44152 3.3163 5.20435 3 6 3H7C7 1.89543 7.89543 1 9 1H15ZM6 5C5.73478 5 5.4805 5.10543 5.29297 5.29297C5.10543 5.4805 5 5.73478 5 6V20L5.00488 20.0986C5.02757 20.3276 5.12883 20.5429 5.29297 20.707C5.48051 20.8946 5.73478 21 6 21H18C18.2652 21 18.5195 20.8946 18.707 20.707C18.8946 20.5195 19 20.2652 19 20V6C19 5.73478 18.8946 5.48051 18.707 5.29297C18.5429 5.12883 18.3276 5.02757 18.0986 5.00488L18 5H17C17 6.10457 16.1046 7 15 7H9C7.89543 7 7 6.10457 7 5H6ZM9 5H15V3H9V5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nClipboardIcon.displayName = \"ClipboardIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport { TextSelection } from \"@tiptap/pm/state\"\nimport { Fragment, Slice } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { ClipboardIcon } from \"../../tiptap-icons/clipboard-icon\"\n\nexport const COPY_TO_CLIPBOARD_SHORTCUT_KEY = \"mod+c\"\n\n/**\n * Configuration for the copy to clipboard functionality\n */\nexport interface UseCopyToClipboardConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to copy the text with formatting (default: true)\n * When true, attempts to copy HTML format to clipboard\n */\n copyWithFormatting?: boolean\n /**\n * Whether the button should hide when copying is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful copy operation.\n */\n onCopied?: () => void\n}\n\n/**\n * Writes text and optional HTML content to the clipboard\n * @param textContent The plain text content to write\n * @param htmlContent Optional HTML content to write\n * @returns Promise that resolves when the content is successfully written\n */\nexport async function writeToClipboard(\n textContent: string,\n htmlContent?: string\n): Promise<void> {\n try {\n if (htmlContent && navigator.clipboard && \"write\" in navigator.clipboard) {\n const blob = new Blob([htmlContent], { type: \"text/html\" })\n const clipboardItem = new ClipboardItem({ \"text/html\": blob })\n await navigator.clipboard.write([clipboardItem])\n }\n } catch {\n await navigator.clipboard.writeText(textContent)\n }\n}\n\n/**\n * Checks if content can be copied in the current editor state\n */\nexport function canCopyContent(tr: Transaction): boolean {\n const { selection } = tr\n const { empty } = selection\n\n if (empty) return false\n\n return true\n}\n\n/**\n * Checks if formatting can be reset for a node\n */\nexport function canCopyToClipboard(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n const tr = editor.state.tr\n return canCopyContent(tr)\n}\n\n/**\n * Helper function to extract content from selection or document\n */\nexport function extractContent(\n editor: Editor,\n copyWithFormatting: boolean = true\n): { textContent: string; htmlContent?: string } {\n const { selection } = editor.state\n const { $anchor } = selection\n\n let content = selection.content()\n\n if (selection.empty || selection instanceof TextSelection) {\n const node = $anchor.node(1)\n\n // We dont want to use node.content here because we dont want tiptap to split the node\n // We want the whole node as a slice\n content = new Slice(Fragment.from(node), 0, 0)\n }\n\n const textContent = content.content.textBetween(0, content.content.size, \"\\n\")\n const htmlContent = copyWithFormatting\n ? editor.view.serializeForClipboard(content).dom.innerHTML\n : undefined\n\n return { textContent, htmlContent }\n}\n\n/**\n * Copies content to clipboard\n */\nexport async function copyToClipboard(\n editor: Editor | null,\n copyWithFormatting: boolean = true\n): Promise<boolean> {\n if (!editor || !editor.isEditable) return false\n\n try {\n const { textContent, htmlContent } = extractContent(\n editor,\n copyWithFormatting\n )\n\n await writeToClipboard(textContent, htmlContent)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the copy to clipboard 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canCopyToClipboard(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides copy to clipboard functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleCopyButton() {\n * const { isVisible, handleCopyToClipboard } = useCopyToClipboard()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleCopyToClipboard}>Copy</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedCopyButton() {\n * const { isVisible, handleCopyToClipboard, label } = useCopyToClipboard({\n * editor: myEditor,\n * copyWithFormatting: false,\n * hideWhenUnavailable: true,\n * onCopied: () => console.log('Content copied!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleCopyToClipboard}\n * aria-label={label}\n * >\n * Copy Content\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useCopyToClipboard(config?: UseCopyToClipboardConfig) {\n const {\n editor: providedEditor,\n copyWithFormatting = true,\n hideWhenUnavailable = false,\n onCopied,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canCopyToClipboardState = canCopyToClipboard(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 handleCopyToClipboard = useCallback(async () => {\n if (!editor) return false\n\n const success = await copyToClipboard(editor, copyWithFormatting)\n\n if (success) {\n onCopied?.()\n }\n\n return success\n }, [editor, copyWithFormatting, onCopied])\n\n useHotkeys(\n COPY_TO_CLIPBOARD_SHORTCUT_KEY,\n (event) => {\n event.preventDefault() // prevent native copy behavior\n handleCopyToClipboard()\n },\n {\n enabled: isVisible && canCopyToClipboardState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleCopyToClipboard,\n canCopyToClipboard: canCopyToClipboardState,\n label: \"复制到剪贴板\",\n shortcutKeys: COPY_TO_CLIPBOARD_SHORTCUT_KEY,\n Icon: ClipboardIcon,\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 { UseDeleteNodeConfig } from \".\"\nimport {\n DELETE_NODE_SHORTCUT_KEY,\n useDeleteNode,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface DeleteNodeButtonProps\n extends Omit<ButtonProps, \"type\">, UseDeleteNodeConfig {\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 DeleteNodeShortcutBadge({\n shortcutKeys = DELETE_NODE_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for deleting a node in a Tiptap editor.\n *\n * For custom button implementations, use the `useDeleteNode` hook instead.\n */\nexport const DeleteNodeButton = forwardRef<\n HTMLButtonElement,\n DeleteNodeButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onDeleted,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleDeleteNode, label, shortcutKeys, Icon } =\n useDeleteNode({\n editor,\n hideWhenUnavailable,\n onDeleted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleDeleteNode()\n },\n [handleDeleteNode, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"删除\"\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 <DeleteNodeShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nDeleteNodeButton.displayName = \"DeleteNodeButton\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { TrashIcon } from \"../../tiptap-icons/trash-icon\"\n\nexport const DELETE_NODE_SHORTCUT_KEY = \"backspace\"\n\n/**\n * Configuration for the delete node functionality\n */\nexport interface UseDeleteNodeConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when node deletion is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful deletion.\n */\n onDeleted?: () => void\n}\n\n/**\n * Checks if a node can be deleted based on the current selection\n */\nexport function canDeleteNode(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n const { state } = editor\n const { selection } = state\n\n if (selection instanceof NodeSelection) {\n return true\n }\n\n const $pos = selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth--) {\n const node = $pos.node(depth)\n const pos = $pos.before(depth)\n\n // Check if we could delete the range from pos to pos + nodeSize\n const tr = state.tr.delete(pos, pos + node.nodeSize)\n if (tr.doc !== state.doc) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Helper function to delete a node with fallback strategy\n */\nexport function deleteNodeAtPosition(\n editor: Editor,\n pos: number,\n nodeSize: number\n): boolean {\n const chain = editor.chain().focus()\n const success = chain.deleteRange({ from: pos, to: pos + nodeSize }).run()\n\n if (success) return true\n\n // Fallback\n return chain.setNodeSelection(pos).deleteSelection().run()\n}\n\n/**\n * Deletes the selected node in the editor using current selection\n */\nexport function deleteNode(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n try {\n const { state } = editor\n const { selection } = state\n\n if (selection instanceof NodeSelection) {\n const pos = selection.from\n const selectedNode = selection.node\n\n if (!selectedNode) return false\n\n return deleteNodeAtPosition(editor, pos, selectedNode.nodeSize)\n }\n\n const $pos = selection.$from\n\n for (let depth = $pos.depth; depth > 0; depth--) {\n const node = selection.$from.node(depth)\n const pos = selection.$from.before(depth)\n\n if (\n node &&\n node.isBlock &&\n node.type.name !== \"tableRow\" &&\n node.type.name !== \"tableHeader\" &&\n node.type.name !== \"tableCell\"\n ) {\n return deleteNodeAtPosition(editor, pos, node.nodeSize)\n }\n }\n\n return false\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the delete node 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canDeleteNode(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides delete node functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleDeleteButton() {\n * const { isVisible, handleDeleteNode } = useDeleteNode()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleDeleteNode}>Delete</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedDeleteButton() {\n * const { isVisible, handleDeleteNode, label } = useDeleteNode({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onDeleted: () => console.log('Node deleted!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleDeleteNode}\n * aria-label={label}\n * >\n * Delete Node\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useDeleteNode(config?: UseDeleteNodeConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onDeleted,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canDeleteNodeState = canDeleteNode(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 handleDeleteNode = useCallback(() => {\n if (!editor) return false\n\n const success = deleteNode(editor)\n if (success) {\n onDeleted?.()\n }\n return success\n }, [editor, onDeleted])\n\n useHotkeys(\n DELETE_NODE_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleDeleteNode()\n },\n {\n enabled: isVisible && canDeleteNodeState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleDeleteNode,\n canDeleteNode: canDeleteNodeState,\n label: \"删除\",\n shortcutKeys: DELETE_NODE_SHORTCUT_KEY,\n Icon: TrashIcon,\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 { UseCopyAnchorLinkConfig } from \".\"\nimport {\n COPY_ANCHOR_LINK_SHORTCUT_KEY,\n useCopyAnchorLink,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface CopyAnchorLinkButtonProps\n extends Omit<ButtonProps, \"type\">, UseCopyAnchorLinkConfig {\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 CopyAnchorLinkShortcutBadge({\n shortcutKeys = COPY_ANCHOR_LINK_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for copying anchor links in a Tiptap editor.\n *\n * For custom button implementations, use the `useCopyAnchorLink` hook instead.\n */\nexport const CopyAnchorLinkButton = forwardRef<\n HTMLButtonElement,\n CopyAnchorLinkButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onNodeIdNotFound,\n onExtractedNodeId,\n onCopied,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleCopyAnchorLink, label, shortcutKeys, Icon } =\n useCopyAnchorLink({\n editor,\n hideWhenUnavailable,\n onNodeIdNotFound,\n onExtractedNodeId,\n onCopied,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleCopyAnchorLink()\n },\n [handleCopyAnchorLink, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"复制锚点链接\"\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 <CopyAnchorLinkShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nCopyAnchorLinkButton.displayName = \"CopyAnchorLinkButton\"\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 { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Utils ---\nimport {\n getAnchorNodeAndPos,\n getEditorExtension,\n} from \"../../../lib/tiptap-advanced-utils\"\n\n// --- Icons ---\nimport { LinkIcon } from \"../../tiptap-icons/link-icon\"\n\nexport const COPY_ANCHOR_LINK_SHORTCUT_KEY = \"mod+ctrl+l\"\n\n/**\n * Configuration for the copy anchor link functionality\n */\nexport interface UseCopyAnchorLinkConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when no node ID is available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Called when the copy operation finishes.\n * Provides a boolean indicating whether a node ID was found.\n */\n onNodeIdNotFound?: (found: boolean) => void\n /**\n * Called after the node ID is extracted.\n * Provides the extracted node ID, or null if none found.\n */\n onExtractedNodeId?: (nodeId: string | null) => void\n /**\n * Callback function called after a successful copy operation.\n */\n onCopied?: () => void\n}\n\n/**\n * Validates if editor is ready for operations\n */\nfunction isEditorReady(editor: Editor | null): boolean {\n return !!(editor && editor.isEditable)\n}\n\n/**\n * Gets the attribute name for unique IDs from the editor extension\n */\nfunction getAttributeName(editor: Editor): string {\n const ext = getEditorExtension(editor, \"uniqueID\")\n return ext?.options?.attributeName || \"data-id\"\n}\n\n/**\n * Comprehensive node info retrieval with validation\n */\nfunction getNodeWithId(editor: Editor | null): {\n node: Node\n nodeId: string | null\n hasNodeId: boolean\n} | null {\n if (!isEditorReady(editor)) return null\n\n const nodeInfo = getAnchorNodeAndPos(editor!)\n if (!nodeInfo) return null\n\n const attributeName = getAttributeName(editor!)\n const nodeId = extractNodeId(nodeInfo.node, attributeName)\n\n return {\n node: nodeInfo.node,\n nodeId,\n hasNodeId: nodeId !== null,\n }\n}\n\n/**\n * Extracts the data-id from a node\n */\nexport function extractNodeId(\n node: Node | null,\n attributeName: string\n): string | null {\n if (!node?.attrs?.[attributeName]) return null\n\n try {\n return node.attrs[attributeName]\n } catch {\n return null\n }\n}\n\n/**\n * Checks if a node has a data-id that can be copied\n */\nexport function canCopyAnchorLink(editor: Editor | null): boolean {\n const nodeWithId = getNodeWithId(editor)\n return nodeWithId?.hasNodeId ?? false\n}\n\n/**\n * Extracts and copies the node ID to clipboard with full URL like Notion\n */\nexport async function copyNodeId(\n editor: Editor | null,\n onExtractedNodeId?: (nodeId: string | null) => void,\n onNodeIdNotFound?: (found: boolean) => void\n): Promise<boolean> {\n const nodeWithId = getNodeWithId(editor)\n\n if (!nodeWithId) return false\n\n const { nodeId, hasNodeId } = nodeWithId\n\n onExtractedNodeId?.(nodeId)\n onNodeIdNotFound?.(!hasNodeId)\n\n if (!hasNodeId || !nodeId) return false\n\n try {\n const currentUrl = new URL(window.location.href)\n\n currentUrl.searchParams.set(\"source\", \"copy_link\")\n currentUrl.hash = nodeId\n\n await navigator.clipboard.writeText(currentUrl.toString())\n return true\n } catch (err) {\n console.error(\"Failed to copy node ID to clipboard:\", err)\n return false\n }\n}\n\n/**\n * Determines if the copy anchor link 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 (!isEditorReady(editor)) return false\n\n const hasNode = !!getAnchorNodeAndPos(editor!)\n\n if (!hideWhenUnavailable) return hasNode\n\n return canCopyAnchorLink(editor)\n}\n\n/**\n * Custom hook that provides copy anchor link functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MyCopyAnchorLinkButton() {\n * const { isVisible, handleCopyAnchorLink } = useCopyAnchorLink()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleCopyAnchorLink}>Copy Link</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedCopyAnchorLinkButton() {\n * const { isVisible, handleCopyAnchorLink, label } = useCopyAnchorLink({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onCopied: () => console.log('Link copied!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleCopyAnchorLink}\n * aria-label={label}\n * >\n * Copy Anchor Link\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useCopyAnchorLink(config?: UseCopyAnchorLinkConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onNodeIdNotFound,\n onExtractedNodeId,\n onCopied,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canCopyAnchor = canCopyAnchorLink(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 handleCopyAnchorLink = useCallback(async () => {\n const success = await copyNodeId(\n editor,\n onExtractedNodeId,\n onNodeIdNotFound\n )\n\n if (success) {\n onCopied?.()\n }\n\n return success\n }, [editor, onExtractedNodeId, onNodeIdNotFound, onCopied])\n\n useHotkeys(\n COPY_ANCHOR_LINK_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleCopyAnchorLink()\n },\n {\n enabled: isVisible && canCopyAnchor,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleCopyAnchorLink,\n canCopyAnchorLink: canCopyAnchor,\n label: \"复制锚点链接\",\n shortcutKeys: COPY_ANCHOR_LINK_SHORTCUT_KEY,\n Icon: LinkIcon,\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 { UseResetAllFormattingConfig } from \".\"\nimport {\n RESET_ALL_FORMATTING_SHORTCUT_KEY,\n useResetAllFormatting,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface ResetAllFormattingButtonProps\n extends Omit<ButtonProps, \"type\">, UseResetAllFormattingConfig {\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 ResetAllFormattingShortcutBadge({\n shortcutKeys = RESET_ALL_FORMATTING_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for resetting formatting of a node in a Tiptap editor.\n * Removes all marks and converts non-paragraph nodes to paragraphs.\n *\n * For custom button implementations, use the `useResetAllFormatting` hook instead.\n */\nexport const ResetAllFormattingButton = forwardRef<\n HTMLButtonElement,\n ResetAllFormattingButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n preserveMarks = [\"inlineThread\"],\n onResetAllFormatting,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canReset,\n handleResetFormatting,\n label,\n shortcutKeys,\n Icon,\n } = useResetAllFormatting({\n editor,\n preserveMarks,\n hideWhenUnavailable,\n onResetAllFormatting,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleResetFormatting()\n },\n [handleResetFormatting, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={!canReset}\n data-disabled={!canReset}\n data-active-state=\"off\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"清除格式\"\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 <ResetAllFormattingShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nResetAllFormattingButton.displayName = \"ResetAllFormattingButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const RotateCcwIcon = 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=\"M12 2L11.9962 2.00001C9.22213 2.01045 6.55946 3.0929 4.56496 5.02104L4.55289 5.0329L4 5.58579V3C4 2.44772 3.55228 2 3 2C2.44772 2 2 2.44772 2 3V8C2 8.55228 2.44772 9 3 9H8C8.55228 9 9 8.55228 9 8C9 7.44772 8.55228 7 8 7H5.41422L5.96097 6.45325C7.58329 4.88786 9.7473 4.00897 12.0019 4.00001C13.5835 4.00038 15.1295 4.46955 16.4446 5.34825C17.7602 6.2273 18.7855 7.47673 19.391 8.93854C19.9965 10.4003 20.155 12.0089 19.8463 13.5607C19.5376 15.1126 18.7757 16.538 17.6569 17.6569C16.538 18.7757 15.1126 19.5376 13.5607 19.8463C12.0089 20.155 10.4003 19.9965 8.93853 19.391C7.47672 18.7855 6.22729 17.7602 5.34824 16.4446C4.46919 15.129 4 13.5823 4 12C4 11.4477 3.55228 11 3 11C2.44772 11 2 11.4477 2 12C2 13.9778 2.58649 15.9112 3.6853 17.5557C4.78412 19.2002 6.3459 20.4819 8.17317 21.2388C10.0004 21.9957 12.0111 22.1937 13.9509 21.8079C15.8907 21.422 17.6725 20.4696 19.0711 19.0711C20.4696 17.6726 21.422 15.8907 21.8079 13.9509C22.1937 12.0111 21.9957 10.0004 21.2388 8.17317C20.4819 6.34591 19.2002 4.78412 17.5557 3.68531C15.9112 2.5865 13.9778 2.00001 12 2Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRotateCcwIcon.displayName = \"RotateCcwIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Transaction } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { RotateCcwIcon } from \"../../tiptap-icons/rotate-ccw-icon\"\n\nexport const RESET_ALL_FORMATTING_SHORTCUT_KEY = \"mod+r\"\n\n/**\n * Configuration for the reset formatting functionality\n */\nexport interface UseResetAllFormattingConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when resetting is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Marks to preserve when resetting formatting.\n */\n preserveMarks?: string[]\n /**\n * Callback function called after formatting is successfully reset.\n */\n onResetAllFormatting?: () => void\n}\n\n/**\n * Removes all marks from the transaction except those specified in the skip array\n * @param tr The Tiptap transaction to modify\n * @param skip Array of mark names to skip when removing marks\n * @returns The modified transaction with specified marks removed\n */\nexport function removeAllMarksExcept(tr: Transaction, skip: string[] = []) {\n const { selection } = tr\n const { empty, ranges } = selection\n\n if (empty) return tr\n\n ranges.forEach((range) => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isInline) return true\n\n node.marks.forEach((mark) => {\n if (!skip.includes(mark.type.name)) {\n tr.removeMark(pos, pos + node.nodeSize, mark.type)\n }\n })\n\n return true\n })\n })\n\n return tr\n}\n\n/**\n * Checks whether the current selection has marks that can be reset (removed)\n * @param tr The Tiptap transaction to check\n * @param skip Array of mark names to skip when checking for removable marks\n * @returns True if there are marks that can be removed, false otherwise\n */\nexport function canResetMarks(tr: Transaction, skip: string[] = []): boolean {\n const { selection } = tr\n const { empty, ranges } = selection\n\n if (empty) return false\n\n for (const range of ranges) {\n const from = range.$from.pos\n const to = range.$to.pos\n\n let hasRemovableMarks = false\n\n tr.doc.nodesBetween(from, to, (node) => {\n if (!node.isInline) return true\n\n for (const mark of node.marks) {\n if (!skip.includes(mark.type.name)) {\n hasRemovableMarks = true\n return false\n }\n }\n\n return true\n })\n\n if (hasRemovableMarks) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Checks if formatting can be reset for a node\n */\nexport function canResetFormatting(\n editor: Editor | null,\n preserveMarks?: string[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n const tr = editor.state.tr\n return canResetMarks(tr, preserveMarks)\n}\n\n/**\n * Resets formatting for a node or selection\n */\nexport function resetFormatting(\n editor: Editor | null,\n preserveMarks?: string[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n try {\n const { view, state } = editor\n const { tr } = state\n const transaction = removeAllMarksExcept(tr, preserveMarks)\n\n view.dispatch(transaction)\n editor.commands.focus()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the reset formatting button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n preserveMarks?: string[]\n}): boolean {\n const { editor, hideWhenUnavailable, preserveMarks } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canResetFormatting(editor, preserveMarks)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides reset formatting functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleResetButton() {\n * const { isVisible, handleResetFormatting } = useResetAllFormatting()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleResetFormatting}>Reset</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedResetButton() {\n * const { isVisible, handleResetFormatting, label } = useResetAllFormatting({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onResetAllFormatting: () => console.log('Formatting reset!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleResetFormatting}\n * aria-label={label}\n * >\n * Reset Formatting\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useResetAllFormatting(config?: UseResetAllFormattingConfig) {\n const {\n editor: providedEditor,\n preserveMarks,\n hideWhenUnavailable = false,\n onResetAllFormatting,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canReset = canResetFormatting(editor, preserveMarks)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, preserveMarks })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, preserveMarks])\n\n const handleResetFormatting = useCallback(() => {\n if (!editor) return false\n\n const success = resetFormatting(editor, preserveMarks)\n if (success) {\n onResetAllFormatting?.()\n }\n return success\n }, [editor, onResetAllFormatting, preserveMarks])\n\n useHotkeys(\n RESET_ALL_FORMATTING_SHORTCUT_KEY,\n (event) => {\n event.preventDefault() // prevent browser default refresh\n handleResetFormatting()\n },\n {\n enabled: isVisible && canReset,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n handleResetFormatting,\n canReset,\n label: \"清除格式\",\n shortcutKeys: RESET_ALL_FORMATTING_SHORTCUT_KEY,\n Icon: RotateCcwIcon,\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 { UseTextConfig } from \".\"\nimport { TEXT_SHORTCUT_KEY, useText } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface TextButtonProps\n extends Omit<ButtonProps, \"type\">, UseTextConfig {\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 TextShortcutBadge({\n shortcutKeys = TEXT_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for converting to text/paragraph in a Tiptap editor.\n *\n * For custom button implementations, use the `useText` hook instead.\n */\nexport const TextButton = forwardRef<HTMLButtonElement, TextButtonProps>(\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 } = useText({\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 variant=\"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=\"正文\"\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 && <TextShortcutBadge shortcutKeys={shortcutKeys} />}\n </>\n )}\n </Button>\n )\n }\n)\n\nTextButton.displayName = \"TextButton\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { TypeIcon } from \"../../tiptap-icons/type-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n getSelectedBlockNodes,\n isNodeInSchema,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\nexport const TEXT_SHORTCUT_KEY = \"mod+alt+0\"\n\n/**\n * Configuration for the text/paragraph functionality\n */\nexport interface UseTextConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when text conversion is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful conversion.\n */\n onToggled?: () => void\n}\n\n/**\n * Returns whether we can toggle/turn the current selection into a paragraph.\n * - When `turnInto === false`, it just checks the direct ability to set paragraph on the selection.\n * - When `turnInto === true`, it additionally requires the selection to be within convertible types.\n */\nexport function canToggleText(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor) return false\n if (!editor.schema.nodes.paragraph) return false\n\n if (!turnInto) {\n return editor.can().setNode(\"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 set paragraph directly on the selection,\n // or we can clear formatting/nodes to arrive at a paragraph.\n return editor.can().setNode(\"paragraph\") || editor.can().clearNodes()\n}\n\n/**\n * Checks if paragraph is currently active\n */\nexport function isParagraphActive(editor: Editor | null): boolean {\n if (!editor) return false\n return editor.isActive(\"paragraph\")\n}\n\n/**\n * Converts the current selection or node to paragraph\n */\nexport function toggleParagraph(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleText(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n const blocks = getSelectedBlockNodes(editor)\n\n // In case a selection contains multiple blocks, we only allow\n // toggling to nide if there's exactly one block selected\n // we also dont block the canToggle since it will fall back to the bottom logic\n const isPossibleToTurnInto =\n selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ]) && blocks.length === 1\n\n // No selection, find the the cursor position\n if (\n (state.selection.empty || state.selection instanceof TextSelection) &&\n isPossibleToTurnInto\n ) {\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 if (!editor.isActive(\"paragraph\")) {\n chain.setNode(\"paragraph\").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 text 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isNodeInSchema(\"paragraph\", editor)) return false\n\n if (!editor.isActive(\"code\")) {\n return canToggleText(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides text/paragraph functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleTextButton() {\n * const { isVisible, handleToggle, isActive } = useText()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Text</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedTextButton() {\n * const { isVisible, handleToggle, label, isActive } = useText({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Text converted!')\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 * Convert to Text\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useText(config?: UseTextConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleText(editor)\n const isActive = isParagraphActive(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 handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleParagraph(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n useHotkeys(\n TEXT_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleToggle()\n },\n {\n enabled: isVisible && canToggle,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: \"正文\",\n shortcutKeys: TEXT_SHORTCUT_KEY,\n Icon: TypeIcon,\n }\n}\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 \".\"\nimport {\n HEADING_SHORTCUT_KEYS,\n useHeading,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\nexport interface HeadingButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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 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 getSelectedBlockNodes,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HeadingOneIcon } from \"../../tiptap-icons/heading-one-icon\"\nimport { HeadingTwoIcon } from \"../../tiptap-icons/heading-two-icon\"\nimport { HeadingThreeIcon } from \"../../tiptap-icons/heading-three-icon\"\nimport { HeadingFourIcon } from \"../../tiptap-icons/heading-four-icon\"\nimport { HeadingFiveIcon } from \"../../tiptap-icons/heading-five-icon\"\nimport { HeadingSixIcon } from \"../../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 const blocks = getSelectedBlockNodes(editor)\n\n // In case a selection contains multiple blocks, we only allow\n // toggling to nide if there's exactly one block selected\n // we also dont block the canToggle since it will fall back to the bottom logic\n const isPossibleToTurnInto =\n selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ]) && blocks.length === 1\n\n // No selection, find the the cursor position\n if (\n (state.selection.empty || state.selection instanceof TextSelection) &&\n isPossibleToTurnInto\n ) {\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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isNodeInSchema(\"heading\", editor)) return false\n\n if (!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: `${level} 级标题`,\n shortcutKeys: HEADING_SHORTCUT_KEYS[level],\n Icon: headingIcons[level],\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 \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\n// --- Tiptap UI ---\nimport type { ListType, UseListConfig } from \".\"\nimport { LIST_SHORTCUT_KEYS, useList } from \".\"\n\nexport interface ListButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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","\"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 \"../../tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"../../tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"../../tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n getSelectedBlockNodes,\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: \"无序列表\",\n orderedList: \"有序列表\",\n taskList: \"任务列表\",\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 const blocks = getSelectedBlockNodes(editor)\n\n // In case a selection contains multiple blocks, we only allow\n // toggling to nide if there's exactly one block selected\n // we also dont block the canToggle since it will fall back to the bottom logic\n const isPossibleToTurnInto =\n selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ]) && blocks.length === 1\n\n // No selection, find the the cursor position\n if (\n (state.selection.empty || state.selection instanceof TextSelection) &&\n isPossibleToTurnInto\n ) {\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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isNodeInSchema(type, editor)) return false\n\n if (!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","import { forwardRef, useCallback } from \"react\"\n\n// --- Tiptap UI ---\nimport type { UseBlockquoteConfig } from \".\"\nimport {\n BLOCKQUOTE_SHORTCUT_KEY,\n useBlockquote,\n} from \".\"\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 \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface BlockquoteButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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=\"引用\"\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","\"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 \"../../tiptap-icons/blockquote-icon\"\n\n// --- UI Utils ---\nimport {\n findNodePosition,\n getSelectedBlockNodes,\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 const blocks = getSelectedBlockNodes(editor)\n\n // In case a selection contains multiple blocks, we only allow\n // toggling to nide if there's exactly one block selected\n // we also dont block the canToggle since it will fall back to the bottom logic\n const isPossibleToTurnInto =\n selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ]) && blocks.length === 1\n\n // No selection, find the the cursor position\n if (\n (state.selection.empty || state.selection instanceof TextSelection) &&\n isPossibleToTurnInto\n ) {\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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isNodeInSchema(\"blockquote\", editor)) return false\n\n if (!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: \"引用\",\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 \".\"\nimport {\n CODE_BLOCK_SHORTCUT_KEY,\n useCodeBlock,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface CodeBlockButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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=\"代码块\"\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","\"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 getSelectedBlockNodes,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { CodeBlockIcon } from \"../../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 const blocks = getSelectedBlockNodes(editor)\n\n // In case a selection contains multiple blocks, we only allow\n // toggling to nide if there's exactly one block selected\n // we also dont block the canToggle since it will fall back to the bottom logic\n const isPossibleToTurnInto =\n selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ]) && blocks.length === 1\n\n // No selection, find the the cursor position\n if (\n (state.selection.empty || state.selection instanceof TextSelection) &&\n isPossibleToTurnInto\n ) {\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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isNodeInSchema(\"codeBlock\", editor)) return false\n\n if (!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: \"代码块\",\n shortcutKeys: CODE_BLOCK_SHORTCUT_KEY,\n Icon: CodeBlockIcon,\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 { UseSlashCommandTriggerConfig } from \".\"\nimport {\n SLASH_COMMAND_TRIGGER_SHORTCUT_KEY,\n useSlashCommandTrigger,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface SlashCommandTriggerButtonProps\n extends Omit<ButtonProps, \"type\">, UseSlashCommandTriggerConfig {\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 SlashCommandShortcutBadge({\n shortcutKeys = SLASH_COMMAND_TRIGGER_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for inserting slash commands in a Tiptap editor.\n *\n * For custom button implementations, use the `useSlashCommand` hook instead.\n */\nexport const SlashCommandTriggerButton = forwardRef<\n HTMLButtonElement,\n SlashCommandTriggerButtonProps\n>(\n (\n {\n editor: providedEditor,\n node,\n nodePos,\n text,\n trigger = \"/\",\n hideWhenUnavailable = false,\n onTriggered,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canInsert,\n handleSlashCommand,\n label,\n shortcutKeys,\n Icon,\n } = useSlashCommandTrigger({\n editor,\n node,\n nodePos,\n trigger,\n hideWhenUnavailable,\n onTriggered,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleSlashCommand()\n },\n [handleSlashCommand, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n disabled={!canInsert}\n data-disabled={!canInsert}\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 <SlashCommandShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nSlashCommandTriggerButton.displayName = \"SlashCommandTriggerButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const PlusIcon = 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=\"M13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5V11H5C4.44772 11 4 11.4477 4 12C4 12.5523 4.44772 13 5 13H11V19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19V13H19C19.5523 13 20 12.5523 20 12C20 11.4477 19.5523 11 19 11H13V5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nPlusIcon.displayName = \"PlusIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport type { Node } from \"@tiptap/pm/model\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Icons ---\nimport { PlusIcon } from \"../../tiptap-icons/plus-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeTypeSelected,\n isValidPosition,\n} from \"../../../lib/tiptap-utils\"\n\nexport const SLASH_COMMAND_TRIGGER_SHORTCUT_KEY = \"mod+/\"\n\n/**\n * Configuration for the slash command functionality\n */\nexport interface UseSlashCommandTriggerConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The node to apply trigger to\n */\n node?: Node | null\n /**\n * The position of the node in the document\n */\n nodePos?: number | null\n /**\n * The trigger text to insert\n * @default \"/\"\n */\n trigger?: string\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 trigger insertion.\n */\n onTriggered?: (trigger: string) => void\n}\n\n/**\n * Checks if a slash command can be inserted in the current editor state\n */\nexport function canInsertSlashCommand(\n editor: Editor | null,\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n if (node || isValidPosition(nodePos)) {\n if (isValidPosition(nodePos) && nodePos! >= 0) return true\n\n if (node) {\n const foundPos = findNodePosition({ editor, node })\n return foundPos !== null\n }\n }\n\n return true\n}\n\n/**\n * Inserts a slash command at a specified node position or after the current selection\n */\nexport function insertSlashCommand(\n editor: Editor | null,\n trigger: string = \"/\",\n node?: Node | null,\n nodePos?: number | null\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canInsertSlashCommand(editor, node, nodePos)) return false\n\n try {\n if ((node !== undefined && node !== null) || isValidPosition(nodePos)) {\n const foundPos = findNodePosition({\n editor,\n node: node || undefined,\n nodePos: nodePos || undefined,\n })\n\n if (!foundPos) {\n return false\n }\n\n const isEmpty =\n foundPos.node.type.name === \"paragraph\" &&\n foundPos.node.content.size === 0\n const insertPos = isEmpty\n ? foundPos.pos\n : foundPos.pos + foundPos.node.nodeSize\n\n editor.view.dispatch(\n editor.view.state.tr\n .scrollIntoView()\n .insertText(trigger, insertPos, insertPos)\n )\n\n const triggerLength = trigger.length + 1 // +1 for the space after the trigger\n const focusPos = isEmpty\n ? foundPos.pos + triggerLength\n : foundPos.pos + foundPos.node.nodeSize + triggerLength\n editor.commands.focus(focusPos)\n\n return true\n }\n\n const { $from } = editor.state.selection\n const currentNode = $from.node()\n const isEmpty = currentNode.textContent.length === 0\n const isStartOfBlock = $from.parentOffset === 0\n\n // Check if we're at the document node level\n // This is important if we dont have focus on the editor\n // and we want to insert the slash at the end of the document\n const isTopLevel = $from.depth === 0\n\n if (!isEmpty || !isStartOfBlock) {\n const insertPosition = isTopLevel\n ? editor.state.doc.content.size\n : $from.after()\n\n return editor\n .chain()\n .insertContentAt(insertPosition, {\n type: \"paragraph\",\n content: [{ type: \"text\", text: trigger }],\n })\n .focus()\n .run()\n }\n\n return editor\n .chain()\n .insertContent({ type: \"text\", text: trigger })\n .focus()\n .run()\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the slash command button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n node?: Node | null\n nodePos?: number | null\n}): boolean {\n const { editor, hideWhenUnavailable, node, nodePos } = props\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canInsertSlashCommand(editor, node, nodePos)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides slash command functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleSlashButton() {\n * const { isVisible, handleSlashCommand } = useSlashCommandTrigger()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleSlashCommand}>Insert Block</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedSlashButton() {\n * const { isVisible, handleSlashCommand, label } = useSlashCommandTrigger({\n * editor: myEditor,\n * trigger: \"/\",\n * hideWhenUnavailable: true,\n * onTriggered: (trigger) => console.log('Inserted:', trigger)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleSlashCommand}\n * aria-label={label}\n * >\n * Insert Block\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useSlashCommandTrigger(config?: UseSlashCommandTriggerConfig) {\n const {\n editor: providedEditor,\n node,\n nodePos,\n trigger = \"/\",\n hideWhenUnavailable = false,\n onTriggered,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canInsert = canInsertSlashCommand(editor, node, nodePos)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, node, nodePos })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, node, nodePos])\n\n const handleSlashCommand = useCallback(() => {\n if (!editor) return false\n\n const success = insertSlashCommand(editor, trigger, node, nodePos)\n if (success) {\n onTriggered?.(trigger)\n }\n return success\n }, [editor, trigger, node, nodePos, onTriggered])\n\n useHotkeys(\n SLASH_COMMAND_TRIGGER_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleSlashCommand()\n },\n {\n enabled: isVisible && canInsert,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n },\n [isVisible, canInsert, handleSlashCommand]\n )\n\n return {\n isVisible,\n handleSlashCommand,\n canInsert,\n label: \"插入块\",\n shortcutKeys: SLASH_COMMAND_TRIGGER_SHORTCUT_KEY,\n trigger,\n Icon: PlusIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const MoveHorizontalIcon = 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=\"M17.293 7.29303C17.6835 6.90251 18.3165 6.90251 18.707 7.29303L22.707 11.293C22.7548 11.3408 22.7976 11.3936 22.835 11.4503C22.8597 11.4877 22.8812 11.5267 22.9004 11.5665C22.9222 11.6117 22.9412 11.6584 22.9561 11.7071C22.9622 11.7274 22.9668 11.748 22.9717 11.7686C22.9893 11.843 23 11.9203 23 12.0001C23 12.0831 22.9878 12.1632 22.9688 12.2403C22.9646 12.2572 22.9611 12.2743 22.9561 12.2911C22.9421 12.337 22.9244 12.3811 22.9043 12.4239C22.8833 12.4686 22.859 12.5119 22.8311 12.5538C22.8185 12.5726 22.8048 12.5905 22.791 12.6085C22.7649 12.6423 22.738 12.6761 22.707 12.7071L18.707 16.7071C18.3165 17.0976 17.6835 17.0975 17.293 16.7071C16.9024 16.3166 16.9025 15.6836 17.293 15.293L19.5859 13.0001H4.41406L6.70703 15.293C7.09747 15.6836 7.09753 16.3166 6.70703 16.7071C6.31654 17.0976 5.6835 17.0975 5.29297 16.7071L1.29297 12.7071C1.26185 12.676 1.23417 12.6424 1.20801 12.6085C1.19423 12.5906 1.18053 12.5726 1.16797 12.5538C1.14006 12.5119 1.11566 12.4686 1.09473 12.4239C1.07465 12.3811 1.0569 12.3369 1.04297 12.2911C1.0379 12.2743 1.03445 12.2572 1.03027 12.2403C1.01124 12.1633 1.00001 12.083 1 12.0001C1 11.9204 1.00974 11.8429 1.02734 11.7686C1.03221 11.7481 1.03678 11.7274 1.04297 11.7071C1.05787 11.6583 1.07777 11.6117 1.09961 11.5665C1.11877 11.5267 1.1403 11.4877 1.16504 11.4503C1.20242 11.3936 1.24516 11.3408 1.29297 11.293L5.29297 7.29303C5.68349 6.90251 6.31651 6.90251 6.70703 7.29303C7.09747 7.68356 7.09753 8.3166 6.70703 8.70709L4.41406 11.0001H19.5859L17.293 8.70709C16.9024 8.31657 16.9025 7.68356 17.293 7.29303Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nMoveHorizontalIcon.displayName = \"MoveHorizontalIcon\"\n","import { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --Hooks ---\nimport { useTiptapEditor } from \"../../../../../hooks/use-tiptap-editor\"\n\n// --Lib ---\nimport { isExtensionAvailable } from \"../../../../../lib/tiptap-utils\"\nimport {\n getTable,\n RESIZE_MIN_WIDTH,\n} from \"../../lib/tiptap-table-utils\"\n\n// --Icons ---\nimport { MoveHorizontalIcon } from \"../../../../tiptap-icons/move-horizontal-icon\"\n\nexport interface UseTableFitToWidthConfig {\n /**\n * The Tiptap editor instance. If omitted, the hook will use\n * the editor from `useTiptapEditor`.\n */\n editor?: Editor | null\n /**\n * Hide the button when the action isn't currently possible.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Called after the table width is successfully adjusted.\n */\n onWidthAdjusted?: () => void\n}\n\n/**\n * Required Tiptap extensions for this feature to work.\n * - `table` to target the node and update attributes\n * - `tableHandleExtension` (or your table controls) to ensure table tooling is enabled\n */\nconst REQUIRED_EXTENSIONS = [\"table\", \"tableHandleExtension\"]\n\n/**\n * Returns whether a \"fit to width\" action can run in the current state.\n * Checks: editor presence, editability, required extensions,\n * and that the selection is somewhere inside a table.\n */\nfunction canFitTableToWidth(editor: Editor | null): boolean {\n if (\n !editor ||\n !editor.isEditable ||\n !isExtensionAvailable(editor, REQUIRED_EXTENSIONS)\n ) {\n return false\n }\n\n try {\n return (\n editor.isActive(\"table\") ||\n editor.isActive(\"tableCell\") ||\n editor.isActive(\"tableHeader\")\n )\n } catch {\n return false\n }\n}\n\n/**\n * Automatically adjusts table column widths to fit the editor's available width.\n *\n * This function finds the table containing the current selection and distributes\n * the available editor width equally across all columns, accounting for padding\n * and respecting any user-configured minimum cell width settings.\n *\n * @param editor - The ProseMirror editor instance, or null\n * @returns true if the table width was successfully set, false otherwise\n */\nfunction setTableAutoWidth(editor: Editor | null): boolean {\n if (!canFitTableToWidth(editor) || !editor) return false\n\n try {\n const table = getTable(editor)\n if (!table) return false\n\n // Calculate the editor width available for the table\n const editorElement = editor.view.dom as HTMLElement\n const style = getComputedStyle(editorElement)\n\n const paddingLeft = parseFloat(style.paddingLeft) || 0\n const paddingRight = parseFloat(style.paddingRight) || 0\n\n const editorWidth = editorElement.clientWidth - paddingLeft - paddingRight\n\n const columnCount = table.map.width\n if (columnCount === 0) return false\n\n let colWidth = 0\n const availableWidth = editorWidth - columnCount - 8\n colWidth = Math.floor(availableWidth / columnCount)\n\n // We are not using what what user set cellMinWidth\n // Instead, we use a reasonable minimum width for usability.\n const finalColWidth = Math.max(colWidth, RESIZE_MIN_WIDTH)\n\n const tr = editor.state.tr\n table.node.descendants((child, childPos) => {\n if (\n child.type.name === \"tableCell\" ||\n child.type.name === \"tableHeader\"\n ) {\n const absolutePos = table.start + childPos\n const colspan = child.attrs.colspan || 1\n\n const colwidthArray = Array(colspan).fill(finalColWidth)\n tr.setNodeMarkup(absolutePos, undefined, {\n ...child.attrs,\n colwidth: colwidthArray,\n })\n }\n })\n\n if (tr.docChanged) {\n editor.view.dispatch(tr)\n }\n\n return true\n } catch (error) {\n console.error(\"Error setting table auto width:\", error)\n return false\n }\n}\n\n/**\n * Executes the \"fit to width\" operation. Safely no-ops if unavailable.\n * Returns `true` on success, `false` otherwise.\n */\nfunction tableFitToWidth({ editor }: { editor: Editor | null }) {\n if (!canFitTableToWidth(editor) || !editor) {\n return false\n }\n\n try {\n return setTableAutoWidth(editor)\n } catch (error) {\n console.error(\"Error adjusting table width:\", error)\n return false\n }\n}\n\n/**\n * Determines whether a UI control should be visible based on the editor\n * state and `hideWhenUnavailable` setting.\n */\nfunction shouldShowButton({\n editor,\n hideWhenUnavailable,\n}: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, REQUIRED_EXTENSIONS)) return false\n\n return hideWhenUnavailable ? canFitTableToWidth(editor) : true\n}\n\n/**\n * React hook that provides a **Fit table to container width** action for Tiptap.\n *\n * What it does:\n * - Sets the current table's `width` to `\"100%\"`\n * - Clears cell-level `colwidth` so the table can expand fluidly\n *\n * Returned API:\n * - `isVisible`: whether a button should be shown\n * - `canFitToWidth`: whether the action can execute now\n * - `handleFitToWidth()`: runs the action; returns `true` on success\n * - `label`: UI label, e.g. \"Fit to width\"\n * - `Icon`: a presentational icon component\n *\n * @example\n * // Minimal button\n * function FitToWidthButton() {\n * const { isVisible, canFitToWidth, handleFitToWidth, label, Icon } =\n * useTableFitToWidth({ hideWhenUnavailable: true })\n *\n * if (!isVisible) return null\n * return (\n * <button onClick={handleFitToWidth} disabled={!canFitToWidth} aria-label={label}>\n * <Icon /> {label}\n * </button>\n * )\n * }\n *\n * @example\n * // Using a provided editor instance and a success callback\n * function FitToWidthWithCallback({ editor }: { editor: Editor }) {\n * const { handleFitToWidth, canFitToWidth } = useTableFitToWidth({\n * editor,\n * hideWhenUnavailable: true,\n * onWidthAdjusted: () => console.log(\"Table set to auto width\"),\n * })\n * return (\n * <button onClick={handleFitToWidth} disabled={!canFitToWidth}>\n * Fit to container\n * </button>\n * )\n * }\n */\nexport function useTableFitToWidth(config: UseTableFitToWidthConfig = {}) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onWidthAdjusted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const isVisible = shouldShowButton({\n editor,\n hideWhenUnavailable,\n })\n\n const canPerformAction = canFitTableToWidth(editor)\n\n const handleFitToWidth = useCallback(() => {\n const success = tableFitToWidth({ editor })\n if (success) onWidthAdjusted?.()\n return success\n }, [editor, onWidthAdjusted])\n\n const label = \"适应宽度\"\n const Icon = MoveHorizontalIcon\n\n return {\n isVisible,\n canFitToWidth: canPerformAction,\n handleFitToWidth,\n label,\n Icon,\n }\n}\n","import { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\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 { ListIndentedIcon } from \"../../../../tiptap-icons/list-indented-icon\"\n\n/**\n * Configuration for the TOC show title functionality\n */\nexport interface UseTocShowTitleConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when title toggle is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful title toggle.\n */\n onToggle?: () => void\n}\n\n/**\n * Checks if TOC title can be toggled in the current editor state\n */\nexport function canToggleTocTitle(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, [\"tocNode\"])) return false\n\n return isNodeTypeSelected(editor, [\"tocNode\"])\n}\n\n/**\n * Checks if the currently selected TOC node has title enabled\n */\nexport function isTocTitleActive(editor: Editor | null): boolean {\n if (!editor) return false\n\n try {\n const { selection } = editor.state\n\n const isTocSelected =\n selection instanceof NodeSelection &&\n selection.node.type.name === \"tocNode\"\n\n if (!isTocSelected) {\n return false\n }\n\n const tocNode = selection.node\n return tocNode.attrs.showTitle === true\n } catch {\n return false\n }\n}\n\n/**\n * Toggles the TOC title in the editor\n */\nexport function toggleTocTitle(editor: Editor | null): boolean {\n if (!editor?.isEditable || !canToggleTocTitle(editor)) {\n return false\n }\n\n try {\n const { selection } = editor.state\n\n const isTocSelected =\n selection instanceof NodeSelection &&\n selection.node.type.name === \"tocNode\"\n\n if (!isTocSelected) {\n return false\n }\n\n const tocNode = selection.node\n const currentShowTitle = tocNode.attrs.showTitle === true\n\n return editor\n .chain()\n .focus()\n .updateAttributes(\"tocNode\", { showTitle: !currentShowTitle })\n .run()\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the TOC show title button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (!isExtensionAvailable(editor, [\"tocNode\"])) return false\n\n if (hideWhenUnavailable) {\n return canToggleTocTitle(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides TOC show title functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyTocShowTitleButton() {\n * const { isVisible, handleToggle } = useTocShowTitle()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Toggle Title</button>\n * }\n *\n * // Advanced usage\n * function MyAdvancedTocShowTitleButton() {\n * const { isVisible, handleToggle, label, canToggle, isActive } = useTocShowTitle({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggle: () => console.log('Title toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * disabled={!canToggle}\n * aria-label={label}\n * data-active={isActive}\n * >\n * Toggle Title\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useTocShowTitle(config?: UseTocShowTitleConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggle,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const [isActive, setIsActive] = useState<boolean>(false)\n const canToggle = canToggleTocTitle(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n setIsActive(isTocTitleActive(editor))\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 = toggleTocTitle(editor)\n\n if (success) {\n onToggle?.()\n }\n\n return success\n }, [editor, onToggle])\n\n return {\n isVisible,\n isActive,\n canToggle,\n handleToggle,\n label: \"显示标题\",\n Icon: ListIndentedIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const GripVerticalIcon = 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 3C7.89543 3 7 3.89543 7 5C7 6.10457 7.89543 7 9 7C10.1046 7 11 6.10457 11 5C11 3.89543 10.1046 3 9 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M9 10C7.89543 10 7 10.8954 7 12C7 13.1046 7.89543 14 9 14C10.1046 14 11 13.1046 11 12C11 10.8954 10.1046 10 9 10Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7 19C7 17.8954 7.89543 17 9 17C10.1046 17 11 17.8954 11 19C11 20.1046 10.1046 21 9 21C7.89543 21 7 20.1046 7 19Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M15 10C13.8954 10 13 10.8954 13 12C13 13.1046 13.8954 14 15 14C16.1046 14 17 13.1046 17 12C17 10.8954 16.1046 10 15 10Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 5C13 3.89543 13.8954 3 15 3C16.1046 3 17 3.89543 17 5C17 6.10457 16.1046 7 15 7C13.8954 7 13 6.10457 13 5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M15 17C13.8954 17 13 17.8954 13 19C13 20.1046 13.8954 21 15 21C16.1046 21 17 20.1046 17 19C17 17.8954 16.1046 17 15 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nGripVerticalIcon.displayName = \"GripVerticalIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Repeat2Icon = 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.70711 5.29289C5.31658 4.90237 4.68342 4.90237 4.29289 5.29289L1.29289 8.29289C0.902369 8.68342 0.902369 9.31658 1.29289 9.70711C1.68342 10.0976 2.31658 10.0976 2.70711 9.70711L4 8.41421V16C4 16.7956 4.31607 17.5587 4.87868 18.1213C5.44129 18.6839 6.20435 19 7 19H13C13.5523 19 14 18.5523 14 18C14 17.4477 13.5523 17 13 17H7C6.73478 17 6.48043 16.8946 6.29289 16.7071C6.10536 16.5196 6 16.2652 6 16V8.41421L7.29289 9.70711C7.68342 10.0976 8.31658 10.0976 8.70711 9.70711C9.09763 9.31658 9.09763 8.68342 8.70711 8.29289L5.70711 5.29289ZM15.2929 14.2929C15.6834 13.9024 16.3166 13.9024 16.7071 14.2929L18 15.5858V8C18 7.73478 17.8946 7.48043 17.7071 7.29289C17.5196 7.10536 17.2652 7 17 7H11C10.4477 7 10 6.55228 10 6C10 5.44772 10.4477 5 11 5H17C17.7957 5 18.5587 5.31607 19.1213 5.87868C19.6839 6.44129 20 7.20435 20 8V15.5858L21.2929 14.2929C21.6834 13.9024 22.3166 13.9024 22.7071 14.2929C23.0976 14.6834 23.0976 15.3166 22.7071 15.7071L19.7071 18.7071C19.3166 19.0976 18.6834 19.0976 18.2929 18.7071L15.2929 15.7071C14.9024 15.3166 14.9024 14.6834 15.2929 14.2929Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRepeat2Icon.displayName = \"Repeat2Icon\"\n","\"use client\"\n\n// ─── React & External Libraries ──────────────────────────────────────────────\nimport { useCallback, useEffect, useMemo, useState } from \"react\"\nimport type { Node as TiptapNode } from \"@tiptap/pm/model\"\nimport { offset } from \"@floating-ui/react\"\nimport { DragHandle } from \"@tiptap/extension-drag-handle-react\"\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nimport type {\n DragContextMenuProps,\n MenuItemProps,\n NodeChangeData,\n} from \"./drag-context-menu-types\"\n\n// ─── Hooks ────────────────────────────────────────────────────────────────────\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\nimport { useUiEditorState } from \"../../../hooks/use-ui-editor-state\"\nimport { selectNodeAndHideFloating } from \"../../../hooks/use-floating-toolbar-visibility\"\n\n// ─── Primitive UI Components ──────────────────────────────────────────────────\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Spacer } from \"../../tiptap-ui-primitive/spacer\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Menu,\n MenuContent,\n MenuItem,\n MenuGroup,\n MenuGroupLabel,\n MenuButton,\n} from \"../../tiptap-ui-primitive/menu\"\nimport { Combobox, ComboboxList } from \"../../tiptap-ui-primitive/combobox\"\n\n// ─── Tiptap UI — Hooks ────────────────────────────────────────────────────────\nimport { useImageDownload } from \"../image-download-button\"\nimport {\n useDuplicate,\n DuplicateShortcutBadge,\n} from \"../duplicate-button\"\nimport {\n useCopyToClipboard,\n CopyToClipboardShortcutBadge,\n} from \"../copy-to-clipboard-button\"\nimport {\n useDeleteNode,\n DeleteNodeShortcutBadge,\n} from \"../delete-node-button\"\nimport {\n useCopyAnchorLink,\n CopyAnchorLinkShortcutBadge,\n} from \"../copy-anchor-link-button\"\nimport { useResetAllFormatting } from \"../reset-all-formatting-button\"\nimport { useText } from \"../text-button\"\nimport { useHeading } from \"../heading-button\"\nimport { useList } from \"../list-button\"\nimport { useBlockquote } from \"../blockquote-button\"\nimport { useCodeBlock } from \"../code-block-button\"\n\n// ─── Tiptap UI — Components ───────────────────────────────────────────────────\nimport { SlashCommandTriggerButton } from \"../slash-command-trigger-button\"\nimport { ColorMenu } from \"../color-menu\"\n\n// ─── Tiptap Node Extensions ───────────────────────────────────────────────────\nimport { TableAlignMenu } from \"../../tiptap-node/table-node/ui/table-alignment-menu\"\nimport { useTableFitToWidth } from \"../../tiptap-node/table-node/ui/table-fit-to-width-button\"\nimport { useTableClearRowColumnContent } from \"../../tiptap-node/table-node/ui/table-clear-row-column-content-button\"\nimport { useTocShowTitle } from \"../../tiptap-node/toc-node/ui/toc-show-title-button\"\n\n// ─── Utils ────────────────────────────────────────────────────────────────────\nimport {\n getNodeDisplayName,\n isTextSelectionValid,\n} from \"../../../lib/tiptap-collab-utils\"\nimport { SR_ONLY } from \"../../../lib/tiptap-utils\"\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\nimport { GripVerticalIcon } from \"../../tiptap-icons/grip-vertical-icon\"\nimport { ChevronRightIcon } from \"../../tiptap-icons/chevron-right-icon\"\nimport { Repeat2Icon } from \"../../tiptap-icons/repeat-2-icon\"\n\n// ─── Styles ───────────────────────────────────────────────────────────────────\nimport \"./drag-context-menu.scss\"\n\nconst useNodeTransformActions = () => {\n const text = useText()\n const heading1 = useHeading({ level: 1 })\n const heading2 = useHeading({ level: 2 })\n const heading3 = useHeading({ level: 3 })\n const bulletList = useList({ type: \"bulletList\" })\n const orderedList = useList({ type: \"orderedList\" })\n const taskList = useList({ type: \"taskList\" })\n const blockquote = useBlockquote()\n const codeBlock = useCodeBlock()\n\n const mapper = (\n action: ReturnType<\n | typeof useText\n | typeof useHeading\n | typeof useList\n | typeof useBlockquote\n | typeof useCodeBlock\n >\n ) => ({\n icon: action.Icon,\n label: action.label,\n onClick: action.handleToggle,\n disabled: !action.canToggle,\n isActive: action.isActive,\n })\n\n const actions = [\n mapper(text),\n ...[heading1, heading2, heading3].map(mapper),\n mapper(bulletList),\n mapper(orderedList),\n mapper(taskList),\n mapper(blockquote),\n mapper(codeBlock),\n ]\n\n const allDisabled = actions.every((a) => a.disabled)\n\n return allDisabled ? null : actions\n}\n\nconst BaseMenuItem: React.FC<MenuItemProps> = ({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n isActive = false,\n shortcutBadge,\n}) => (\n <MenuItem\n render={\n <Button variant=\"ghost\" data-active-state={isActive ? \"on\" : \"off\"} />\n }\n onClick={onClick}\n disabled={disabled}\n >\n <Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n {shortcutBadge}\n </MenuItem>\n)\n\nconst SubMenuTrigger: React.FC<{\n icon: React.ComponentType<{ className?: string }>\n label: string\n children: React.ReactNode\n}> = ({ icon: Icon, label, children }) => (\n <Menu\n placement=\"right\"\n trigger={\n <MenuItem\n render={\n <MenuButton\n render={\n <Button variant=\"ghost\">\n <Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">{label}</span>\n <Spacer />\n <ChevronRightIcon className=\"tiptap-button-icon\" />\n </Button>\n }\n />\n }\n />\n }\n >\n <MenuContent portal>\n <ComboboxList>{children}</ComboboxList>\n </MenuContent>\n </Menu>\n)\n\nconst TransformActionGroup: React.FC = () => {\n const actions = useNodeTransformActions()\n const { canReset, handleResetFormatting, label, Icon } =\n useResetAllFormatting({\n hideWhenUnavailable: true,\n preserveMarks: [\"inlineThread\"],\n })\n\n if (!actions && !canReset) return null\n\n return (\n <>\n {actions && (\n <SubMenuTrigger icon={Repeat2Icon} label=\"转换为\">\n <MenuGroup>\n <MenuGroupLabel>转换为</MenuGroupLabel>\n {actions.map((action) => (\n <BaseMenuItem key={action.label} {...action} />\n ))}\n </MenuGroup>\n </SubMenuTrigger>\n )}\n\n {canReset && (\n <BaseMenuItem\n icon={Icon}\n label={label}\n disabled={!canReset}\n onClick={handleResetFormatting}\n />\n )}\n </>\n )\n}\n\nconst TableFitToWidth: React.FC = () => {\n const { canFitToWidth, handleFitToWidth, label, Icon } = useTableFitToWidth({\n hideWhenUnavailable: true,\n })\n const clearAllContents = useTableClearRowColumnContent({ resetAttrs: true })\n\n return (\n <>\n {canFitToWidth && (\n <BaseMenuItem\n icon={Icon}\n label={label}\n disabled={!canFitToWidth}\n onClick={handleFitToWidth}\n />\n )}\n\n {clearAllContents.canClearRowColumnContent && (\n <BaseMenuItem\n icon={clearAllContents.Icon}\n label={\"清空所有内容\"}\n disabled={!clearAllContents.canClearRowColumnContent}\n onClick={clearAllContents.handleClear}\n />\n )}\n </>\n )\n}\n\nconst TocShowTitle: React.FC = () => {\n const { canToggle, handleToggle, label, Icon } = useTocShowTitle({\n hideWhenUnavailable: true,\n })\n\n if (!canToggle) return null\n\n return (\n <BaseMenuItem\n icon={Icon}\n label={label}\n disabled={!canToggle}\n onClick={handleToggle}\n />\n )\n}\n\nconst ImageActionGroup: React.FC = () => {\n const { canDownload, handleDownload, label, Icon } = useImageDownload({\n hideWhenUnavailable: true,\n })\n\n if (!canDownload) return null\n\n return (\n <BaseMenuItem\n icon={Icon}\n label={label}\n disabled={!canDownload}\n onClick={handleDownload}\n />\n )\n}\n\nconst CoreActionGroup: React.FC = () => {\n const {\n handleDuplicate,\n canDuplicate,\n label,\n Icon: DuplicateIcon,\n } = useDuplicate()\n const {\n handleCopyToClipboard,\n canCopyToClipboard,\n label: copyLabel,\n Icon: CopyIcon,\n } = useCopyToClipboard()\n const {\n handleCopyAnchorLink,\n canCopyAnchorLink,\n label: copyAnchorLinkLabel,\n Icon: CopyAnchorLinkIcon,\n } = useCopyAnchorLink()\n\n return (\n <>\n <Separator orientation=\"horizontal\" />\n\n <MenuGroup>\n <BaseMenuItem\n icon={DuplicateIcon}\n label={label}\n onClick={handleDuplicate}\n disabled={!canDuplicate}\n shortcutBadge={<DuplicateShortcutBadge />}\n />\n <BaseMenuItem\n icon={CopyIcon}\n label={copyLabel}\n onClick={handleCopyToClipboard}\n disabled={!canCopyToClipboard}\n shortcutBadge={<CopyToClipboardShortcutBadge />}\n />\n <BaseMenuItem\n icon={CopyAnchorLinkIcon}\n label={copyAnchorLinkLabel}\n onClick={handleCopyAnchorLink}\n disabled={!canCopyAnchorLink}\n shortcutBadge={<CopyAnchorLinkShortcutBadge />}\n />\n </MenuGroup>\n\n <Separator orientation=\"horizontal\" />\n </>\n )\n}\n\nconst DeleteActionGroup: React.FC = () => {\n const { handleDeleteNode, canDeleteNode, label, Icon } = useDeleteNode()\n\n return (\n <MenuGroup>\n <BaseMenuItem\n icon={Icon}\n label={label}\n onClick={handleDeleteNode}\n disabled={!canDeleteNode}\n shortcutBadge={<DeleteNodeShortcutBadge />}\n />\n </MenuGroup>\n )\n}\n\nexport const DragContextMenu: React.FC<DragContextMenuProps> = ({\n editor: providedEditor,\n withSlashCommandTrigger = true,\n mobileBreakpoint = 768,\n ...props\n}) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isDragging } = useUiEditorState(editor)\n const isMobile = useIsBreakpoint(\"max\", mobileBreakpoint)\n const [open, setOpen] = useState(false)\n const [node, setNode] = useState<TiptapNode | null>(null)\n const [nodePos, setNodePos] = useState<number>(-1)\n\n const handleNodeChange = useCallback((data: NodeChangeData) => {\n if (data.node) setNode(data.node)\n setNodePos(data.pos)\n }, [])\n\n useEffect(() => {\n if (!editor) return\n editor.commands.setLockDragHandle(open)\n editor.commands.setMeta(\"lockDragHandle\", open)\n }, [editor, open])\n\n const mainAxisOffset = 16\n\n const dynamicPositions = useMemo(() => {\n return {\n middleware: [\n offset((props) => {\n const { rects } = props\n const nodeHeight = rects.reference.height\n const dragHandleHeight = rects.floating.height\n\n const crossAxis = nodeHeight / 2 - dragHandleHeight / 2\n\n return {\n mainAxis: mainAxisOffset,\n // if height is more than 40px, then it's likely a block node\n crossAxis: nodeHeight > 40 ? 0 : crossAxis,\n }\n }),\n ],\n }\n }, [])\n\n const handleOnMenuClose = useCallback(() => {\n if (editor) {\n editor.commands.setMeta(\"hideDragHandle\", true)\n }\n }, [editor])\n\n const onElementDragStart = useCallback(() => {\n if (!editor) return\n editor.commands.setIsDragging(true)\n }, [editor])\n\n const onElementDragEnd = useCallback(() => {\n if (!editor) return\n editor.commands.setIsDragging(false)\n\n setTimeout(() => {\n editor.view.dom.blur()\n editor.view.focus()\n }, 0)\n }, [editor])\n\n if (!editor) return null\n\n const nodeName = getNodeDisplayName(editor)\n\n return (\n <div\n style={\n {\n \"--drag-handle-main-axis-offset\": `${mainAxisOffset}px`,\n } as React.CSSProperties\n }\n >\n <DragHandle\n editor={editor}\n onNodeChange={handleNodeChange}\n computePositionConfig={dynamicPositions}\n onElementDragStart={onElementDragStart}\n onElementDragEnd={onElementDragEnd}\n {...props}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n ...(isMobile || isTextSelectionValid(editor)\n ? { opacity: 0, pointerEvents: \"none\" }\n : {}),\n ...(isDragging ? { opacity: 0 } : {}),\n }}\n >\n {withSlashCommandTrigger && (\n <SlashCommandTriggerButton\n node={node}\n nodePos={nodePos}\n data-weight=\"small\"\n />\n )}\n\n <Menu\n open={open}\n onOpenChange={setOpen}\n placement=\"left\"\n trigger={\n <MenuButton\n render={\n <Button\n variant=\"ghost\"\n tabIndex={-1}\n tooltip={\n <>\n <div>点击查看选项</div>\n <div>按住可拖动</div>\n </>\n }\n data-weight=\"small\"\n style={{\n cursor: \"grab\",\n ...(open ? { pointerEvents: \"none\" } : {}),\n }}\n onMouseDown={() =>\n selectNodeAndHideFloating(editor, nodePos)\n }\n >\n <GripVerticalIcon className=\"tiptap-button-icon\" />\n </Button>\n }\n />\n }\n >\n <MenuContent\n onClose={handleOnMenuClose}\n autoFocusOnHide={false}\n preventBodyScroll={true}\n portal\n >\n <Combobox style={SR_ONLY} />\n <ComboboxList style={{ minWidth: \"15rem\" }}>\n <MenuGroupLabel>{nodeName}</MenuGroupLabel>\n\n <MenuGroup>\n <TocShowTitle />\n <ColorMenu />\n <TableAlignMenu />\n <TableFitToWidth />\n <TransformActionGroup />\n <ImageActionGroup />\n </MenuGroup>\n\n <CoreActionGroup />\n\n <DeleteActionGroup />\n </ComboboxList>\n </MenuContent>\n </Menu>\n </div>\n </DragHandle>\n </div>\n )\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SunIcon = 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=\"M12 1C12.5523 1 13 1.44772 13 2V4C13 4.55228 12.5523 5 12 5C11.4477 5 11 4.55228 11 4V2C11 1.44772 11.4477 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 12C7 9.23858 9.23858 7 12 7C14.7614 7 17 9.23858 17 12C17 14.7614 14.7614 17 12 17C9.23858 17 7 14.7614 7 12ZM12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20V22C11 22.5523 11.4477 23 12 23C12.5523 23 13 22.5523 13 22V20Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.22282 4.22289C4.61335 3.83236 5.24651 3.83236 5.63704 4.22289L7.04704 5.63289C7.43756 6.02341 7.43756 6.65658 7.04704 7.0471C6.65651 7.43762 6.02335 7.43762 5.63283 7.0471L4.22282 5.6371C3.8323 5.24658 3.8323 4.61341 4.22282 4.22289Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18.367 16.9529C17.9765 16.5623 17.3433 16.5623 16.9528 16.9529C16.5623 17.3434 16.5623 17.9766 16.9528 18.3671L18.3628 19.7771C18.7533 20.1676 19.3865 20.1676 19.777 19.7771C20.1675 19.3866 20.1675 18.7534 19.777 18.3629L18.367 16.9529Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1 12C1 11.4477 1.44772 11 2 11H4C4.55228 11 5 11.4477 5 12C5 12.5523 4.55228 13 4 13H2C1.44772 13 1 12.5523 1 12Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20 11C19.4477 11 19 11.4477 19 12C19 12.5523 19.4477 13 20 13H22C22.5523 13 23 12.5523 23 12C23 11.4477 22.5523 11 22 11H20Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.04704 16.9529C7.43756 17.3434 7.43756 17.9766 7.04704 18.3671L5.63704 19.7771C5.24651 20.1676 4.61335 20.1676 4.22282 19.7771C3.8323 19.3866 3.8323 18.7534 4.22283 18.3629L5.63283 16.9529C6.02335 16.5623 6.65651 16.5623 7.04704 16.9529Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M19.777 5.6371C20.1675 5.24657 20.1675 4.61341 19.777 4.22289C19.3865 3.83236 18.7533 3.83236 18.3628 4.22289L16.9528 5.63289C16.5623 6.02341 16.5623 6.65658 16.9528 7.0471C17.3433 7.43762 17.9765 7.43762 18.367 7.0471L19.777 5.6371Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSunIcon.displayName = \"SunIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const MoonStarIcon = 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 2C10.0222 2 8.08879 2.58649 6.4443 3.6853C4.79981 4.78412 3.51809 6.3459 2.76121 8.17317C2.00433 10.0004 1.8063 12.0111 2.19215 13.9509C2.578 15.8907 3.53041 17.6725 4.92894 19.0711C6.32746 20.4696 8.10929 21.422 10.0491 21.8079C11.9889 22.1937 13.9996 21.9957 15.8268 21.2388C17.6541 20.4819 19.2159 19.2002 20.3147 17.5557C21.4135 15.9112 22 13.9778 22 12C22 11.5955 21.7564 11.2309 21.3827 11.0761C21.009 10.9213 20.5789 11.0069 20.2929 11.2929C19.287 12.2988 17.9226 12.864 16.5 12.864C15.0774 12.864 13.713 12.2988 12.7071 11.2929C11.7012 10.287 11.136 8.92261 11.136 7.5C11.136 6.07739 11.7012 4.71304 12.7071 3.70711C12.9931 3.42111 13.0787 2.99099 12.9239 2.61732C12.7691 2.24364 12.4045 2 12 2ZM7.55544 5.34824C8.27036 4.87055 9.05353 4.51389 9.87357 4.28778C9.39271 5.27979 9.13604 6.37666 9.13604 7.5C9.13604 9.45304 9.91189 11.3261 11.2929 12.7071C12.6739 14.0881 14.547 14.864 16.5 14.864C17.6233 14.864 18.7202 14.6073 19.7122 14.1264C19.4861 14.9465 19.1295 15.7296 18.6518 16.4446C17.7727 17.7602 16.5233 18.7855 15.0615 19.391C13.5997 19.9965 11.9911 20.155 10.4393 19.8463C8.88743 19.5376 7.46197 18.7757 6.34315 17.6569C5.22433 16.538 4.4624 15.1126 4.15372 13.5607C3.84504 12.0089 4.00347 10.4003 4.60897 8.93853C5.21447 7.47672 6.23985 6.22729 7.55544 5.34824Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M19 2C19.5523 2 20 2.44772 20 3V4H21C21.5523 4 22 4.44772 22 5C22 5.55228 21.5523 6 21 6H20V7C20 7.55228 19.5523 8 19 8C18.4477 8 18 7.55228 18 7V6H17C16.4477 6 16 5.55228 16 5C16 4.44772 16.4477 4 17 4H18V3C18 2.44772 18.4477 2 19 2Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nMoonStarIcon.displayName = \"MoonStarIcon\"\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\n// --- UI Primitives ---\nimport { Button } from \"../../tiptap-ui-primitive/button\"\n\n// --- Icons ---\nimport { SunIcon } from \"../../tiptap-icons/sun-icon\"\nimport { MoonStarIcon } from \"../../tiptap-icons/moon-star-icon\"\n\nexport function ThemeToggle() {\n const [isDarkMode, setIsDarkMode] = useState<boolean>(false)\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n const handleChange = () => setIsDarkMode(mediaQuery.matches)\n mediaQuery.addEventListener(\"change\", handleChange)\n return () => mediaQuery.removeEventListener(\"change\", handleChange)\n }, [])\n\n useEffect(() => {\n const initialDarkMode =\n !!document.querySelector('meta[name=\"color-scheme\"][content=\"dark\"]') ||\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n setIsDarkMode(initialDarkMode)\n }, [])\n\n useEffect(() => {\n document.documentElement.classList.toggle(\"dark\", isDarkMode)\n }, [isDarkMode])\n\n const toggleDarkMode = () => setIsDarkMode((isDark) => !isDark)\n\n return (\n <Button\n onClick={toggleDarkMode}\n aria-label={`Switch to ${isDarkMode ? \"light\" : \"dark\"} mode`}\n variant=\"ghost\"\n >\n {isDarkMode ? (\n <MoonStarIcon className=\"tiptap-button-icon\" />\n ) : (\n <SunIcon className=\"tiptap-button-icon\" />\n )}\n </Button>\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 {\n UndoRedoAction,\n UseUndoRedoConfig,\n} from \".\"\nimport {\n UNDO_REDO_SHORTCUT_KEYS,\n useUndoRedo,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface UndoRedoButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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","\"use client\"\n\nimport { 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 \"../../tiptap-icons/redo2-icon\"\nimport { Undo2Icon } from \"../../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: \"撤销\",\n 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!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 { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { getAvatar } from \"../../../lib/tiptap-collab-utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"../../tiptap-ui-primitive/avatar\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../../tiptap-ui-primitive/dropdown-menu\"\n\ntype User = { clientId: number; id: string; name: string; color: string }\n\nexport function CollaborationUsers() {\n const { editor } = useTiptapEditor()\n\n if (!editor || !editor.storage.collaborationCaret) {\n return null\n }\n\n const collaborationUsers: User[] =\n editor.storage.collaborationCaret.users.map((user) => ({\n clientId: user.clientId,\n id: String(user.clientId),\n name: user.name || \"Anonymous\",\n color: user.color || \"#000000\",\n }))\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n data-appearence=\"subdued\"\n style={{ padding: \"0.25rem\" }}\n >\n <AvatarGroup maxVisible={3}>\n {collaborationUsers.map((user) => (\n <Avatar key={user.id} userColor={user.color}>\n <AvatarImage src={getAvatar(user.name)} />\n <AvatarFallback>{user.name?.toUpperCase()[0]}</AvatarFallback>\n </Avatar>\n ))}\n </AvatarGroup>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuGroup>\n {collaborationUsers.map((user) => (\n <DropdownMenuItem key={user.id} asChild>\n <Button variant=\"ghost\">\n <Avatar userColor={user.color}>\n <AvatarImage src={getAvatar(user.name)} />\n <AvatarFallback>{user.name?.toUpperCase()[0]}</AvatarFallback>\n </Avatar>\n <span className=\"tiptap-button-text\">{user.name}</span>\n </Button>\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport { ThemeToggle } from \"./notion-like-editor-theme-toggle\"\n\n// --- Tiptap UI ---\nimport { UndoRedoButton } from \"../../tiptap-ui/undo-redo-button\"\n\n// --- UI Primitives ---\nimport { Spacer } from \"../../tiptap-ui-primitive/spacer\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport { ButtonGroup } from \"../../tiptap-ui-primitive/button-group\"\n\n// --- Styles ---\nimport \"./notion-like-editor-header.scss\"\n\nimport { CollaborationUsers } from \"./notion-like-editor-collaboration-users\"\n\nexport function NotionEditorHeader() {\n return (\n <header className=\"notion-like-editor-header\">\n <Spacer />\n <div className=\"notion-like-editor-header-actions\">\n <ButtonGroup>\n <ButtonGroup>\n <UndoRedoButton action=\"undo\" />\n </ButtonGroup>\n <ButtonGroup>\n <UndoRedoButton action=\"redo\" />\n </ButtonGroup>\n </ButtonGroup>\n\n <Separator />\n\n <ThemeToggle />\n\n <Separator />\n\n <CollaborationUsers />\n </div>\n </header>\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 { 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 \"../../tiptap-icons/ban-icon\"\nimport { HighlighterIcon } from \"../../tiptap-icons/highlighter-icon\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../../tiptap-ui-primitive/popover\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\n// --- Tiptap UI ---\nimport type {\n HighlightColor,\n UseColorHighlightConfig,\n} from \"../color-highlight-button\"\nimport {\n ColorHighlightButton,\n pickHighlightColorsByValue,\n useColorHighlight,\n} from \"../color-highlight-button\"\nimport { ButtonGroup } from \"../../tiptap-ui-primitive/button-group\"\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 * When true, uses the actual color value (colorValue) instead of CSS variable (value).\n * @default false\n */\n useColorValue?: boolean\n}\n\nexport interface ColorHighlightPopoverProps\n extends\n 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 * When true, uses the actual color value (colorValue) instead of CSS variable (value).\n * @default false\n */\n useColorValue?: boolean\n}\n\nexport const ColorHighlightPopoverButton = forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n variant=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"高亮文字\"\n tooltip=\"高亮\"\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 useColorValue = false,\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: \"移除高亮\", value: \"none\" }],\n [colors]\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>\n {colors.map((color, index) => (\n <ButtonGroup key={color.value}>\n <ColorHighlightButton\n editor={editor}\n highlightColor={\n useColorValue ? color.colorValue : color.value\n }\n tooltip={color.label}\n aria-label={`${color.label}高亮颜色`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n useColorValue={useColorValue}\n />\n </ButtonGroup>\n ))}\n </ButtonGroup>\n <Separator />\n <ButtonGroup>\n <Button\n onClick={handleRemoveHighlight}\n aria-label=\"移除高亮\"\n tooltip=\"移除高亮\"\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n variant=\"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 useColorValue = false,\n onApplied,\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=\"高亮颜色\">\n <ColorHighlightPopoverContent\n editor={editor}\n colors={colors}\n useColorValue={useColorValue}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default ColorHighlightPopover\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 \".\"\nimport {\n IMAGE_UPLOAD_SHORTCUT_KEY,\n useImageUpload,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../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\">, 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 variant=\"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 { 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 \"../../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\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!isExtensionAvailable(editor, \"imageUpload\")) return false\n\n if (!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: \"添加图片\",\n shortcutKeys: IMAGE_UPLOAD_SHORTCUT_KEY,\n Icon: ImagePlusIcon,\n }\n}\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","\"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 \"../../tiptap-icons/corner-down-left-icon\"\nimport { ExternalLinkIcon } from \"../../tiptap-icons/external-link-icon\"\nimport { LinkIcon } from \"../../tiptap-icons/link-icon\"\nimport { TrashIcon } from \"../../tiptap-icons/trash-icon\"\n\n// --- Tiptap UI ---\nimport type { UseLinkPopoverConfig } from \".\"\nimport { useLinkPopover } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../tiptap-ui-primitive/popover\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\nimport { Input } from \"../../tiptap-ui-primitive/input\"\nimport { ButtonGroup } from \"../../tiptap-ui-primitive/button-group\"\n\nimport \"./link-popover.scss\"\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\nexport interface LinkPopoverProps\n extends Omit<ButtonProps, \"type\">, 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\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 variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"链接\"\n tooltip=\"链接\"\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}) => {\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 <Input\n type=\"url\"\n 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 className=\"tiptap-link-input\"\n />\n\n <ButtonGroup>\n <Button\n type=\"button\"\n onClick={setLink}\n title=\"应用链接\"\n disabled={!url && !isActive}\n variant=\"ghost\"\n >\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n\n <Separator />\n\n <ButtonGroup>\n <ButtonGroup>\n <Button\n type=\"button\"\n onClick={openLink}\n title=\"在新窗口打开\"\n disabled={!url && !isActive}\n variant=\"ghost\"\n >\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n\n <ButtonGroup>\n <Button\n type=\"button\"\n onClick={removeLink}\n title=\"移除链接\"\n disabled={!url && !isActive}\n variant=\"ghost\"\n >\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\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 ...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 />\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 \"../../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 try {\n return editor.can().setMark(\"link\")\n } catch {\n return false\n }\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 if (!editor || !editor.isEditable) return false\n\n const linkInSchema = isMarkInSchema(\"link\", editor)\n\n // If hideWhenUnavailable is false, always show the button (even if disabled)\n if (!hideWhenUnavailable) {\n return true\n }\n\n // hideWhenUnavailable is true: hide if link is not in schema\n if (!linkInSchema) {\n return false\n }\n\n // hideWhenUnavailable is true: hide if we can't set a link (unless in code block)\n if (!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: \"链接\",\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 \".\"\nimport { MARK_SHORTCUT_KEYS, useMark } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface MarkButtonProps\n extends Omit<ButtonProps, \"type\">, 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 variant=\"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 \"../../tiptap-icons/bold-icon\"\nimport { Code2Icon } from \"../../tiptap-icons/code2-icon\"\nimport { ItalicIcon } from \"../../tiptap-icons/italic-icon\"\nimport { StrikeIcon } from \"../../tiptap-icons/strike-icon\"\nimport { SubscriptIcon } from \"../../tiptap-icons/subscript-icon\"\nimport { SuperscriptIcon } from \"../../tiptap-icons/superscript-icon\"\nimport { UnderlineIcon } from \"../../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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isMarkInSchema(type, editor)) return false\n\n if (!editor.isActive(\"code\")) {\n return canToggleMark(editor, type)\n }\n\n return true\n}\n\n/**\n * Gets the formatted mark name\n */\nconst MARK_NAME_MAP: Record<Mark, string> = {\n bold: \"加粗\",\n italic: \"斜体\",\n strike: \"删除线\",\n code: \"行内代码\",\n underline: \"下划线\",\n superscript: \"上标\",\n subscript: \"下标\",\n}\n\nexport function getFormattedMarkName(type: Mark): string {\n return MARK_NAME_MAP[type] ?? type\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 \".\"\nimport {\n TEXT_ALIGN_SHORTCUT_KEYS,\n useTextAlign,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../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\">, 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 variant=\"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 { 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 \"../../tiptap-icons/align-center-icon\"\nimport { AlignJustifyIcon } from \"../../tiptap-icons/align-justify-icon\"\nimport { AlignLeftIcon } from \"../../tiptap-icons/align-left-icon\"\nimport { AlignRightIcon } from \"../../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: \"左对齐\",\n center: \"居中对齐\",\n right: \"右对齐\",\n 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isExtensionAvailable(editor, \"textAlign\")) return false\n\n if (!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 } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Tiptap UI ---\nimport type { UseTurnIntoDropdownConfig } from \".\"\nimport {\n useTurnIntoDropdown,\n getFilteredBlockTypeOptions,\n} from \".\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI Components ---\nimport { TextButton } from \"../text-button\"\nimport { HeadingButton } from \"../heading-button\"\nimport { ListButton } from \"../list-button\"\nimport { BlockquoteButton } from \"../blockquote-button\"\nimport { CodeBlockButton } from \"../code-block-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuGroup,\n DropdownMenuLabel,\n} from \"../../tiptap-ui-primitive/dropdown-menu\"\n\nexport interface TurnIntoDropdownContentProps {\n blockTypes?: string[]\n editor?: Editor | null\n}\n\nexport function TurnIntoDropdownContent({\n blockTypes,\n editor,\n}: TurnIntoDropdownContentProps) {\n const filteredOptions = getFilteredBlockTypeOptions(blockTypes)\n\n return (\n <DropdownMenuGroup>\n <DropdownMenuLabel>转换为</DropdownMenuLabel>\n {filteredOptions.map((option, index) =>\n renderBlockTypeButton(\n option,\n `${option.type}-${option.level ?? index}`,\n editor\n )\n )}\n </DropdownMenuGroup>\n )\n}\n\nfunction renderBlockTypeButton(\n option: ReturnType<typeof getFilteredBlockTypeOptions>[0],\n key: string,\n editor?: Editor | null\n) {\n switch (option.type) {\n case \"paragraph\":\n return (\n <DropdownMenuItem key={key} asChild>\n <TextButton editor={editor} showTooltip={false} text={option.label} />\n </DropdownMenuItem>\n )\n\n case \"heading\":\n if (!option.level) return null\n return (\n <DropdownMenuItem key={key} asChild>\n <HeadingButton\n editor={editor}\n level={option.level}\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n case \"bulletList\":\n return (\n <DropdownMenuItem key={key} asChild>\n <ListButton\n editor={editor}\n type=\"bulletList\"\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n case \"orderedList\":\n return (\n <DropdownMenuItem key={key} asChild>\n <ListButton\n editor={editor}\n type=\"orderedList\"\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n case \"taskList\":\n return (\n <DropdownMenuItem key={key} asChild>\n <ListButton\n editor={editor}\n type=\"taskList\"\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n case \"blockquote\":\n return (\n <DropdownMenuItem key={key} asChild>\n <BlockquoteButton\n editor={editor}\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n case \"codeBlock\":\n return (\n <DropdownMenuItem key={key} asChild>\n <CodeBlockButton\n editor={editor}\n showTooltip={false}\n text={option.label}\n />\n </DropdownMenuItem>\n )\n\n default:\n return null\n }\n}\n\nexport interface TurnIntoDropdownProps\n extends Omit<ButtonProps, \"type\">, UseTurnIntoDropdownConfig {\n modal?: boolean\n}\n\n/**\n * Dropdown component for transforming block types in a Tiptap editor.\n * For custom dropdown implementations, use the `useTurnIntoDropdown` hook instead.\n */\nexport const TurnIntoDropdown = forwardRef<\n HTMLButtonElement,\n TurnIntoDropdownProps\n>(function TurnIntoDropdown(\n {\n editor: providedEditor,\n hideWhenUnavailable = false,\n blockTypes,\n onOpenChange,\n modal = true,\n children,\n ...buttonProps\n },\n ref\n) {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isOpen,\n activeBlockType,\n handleOpenChange,\n label,\n Icon,\n } = useTurnIntoDropdown({\n editor,\n hideWhenUnavailable,\n blockTypes,\n onOpenChange,\n })\n\n if (!isVisible) return null\n\n return (\n <DropdownMenu modal={modal} open={isOpen} onOpenChange={handleOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={!canToggle}\n data-disabled={!canToggle}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip=\"转换为\"\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <span className=\"tiptap-button-text\">\n {activeBlockType?.label || \"Text\"}\n </span>\n <Icon className=\"tiptap-button-dropdown-small\" />\n </>\n )}\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\">\n <TurnIntoDropdownContent blockTypes={blockTypes} editor={editor} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n})\n\nTurnIntoDropdown.displayName = \"TurnIntoDropdown\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"../../tiptap-icons/chevron-down-icon\"\n\n// --- Tiptap UI ---\nimport type { Level } from \"../heading-button\"\n\nexport const TURN_INTO_BLOCKS = [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n]\n\n/**\n * Configuration for the turn into dropdown functionality\n */\nexport interface UseTurnIntoDropdownConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the dropdown should hide when no options are available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Which block types to show in the dropdown\n * @default [\"paragraph\", \"heading\", \"bulletList\", \"orderedList\", \"taskList\", \"blockquote\", \"codeBlock\"]\n */\n blockTypes?: string[]\n /**\n * Callback function called when the dropdown state changes.\n */\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport const blockTypeOptions = [\n {\n type: \"paragraph\",\n label: \"正文\",\n isActive: (editor: Editor) =>\n editor.isActive(\"paragraph\") &&\n !editor.isActive(\"heading\") &&\n !editor.isActive(\"bulletList\") &&\n !editor.isActive(\"orderedList\") &&\n !editor.isActive(\"taskList\") &&\n !editor.isActive(\"blockquote\") &&\n !editor.isActive(\"codeBlock\"),\n },\n {\n type: \"heading\",\n label: \"1 级标题\",\n level: 1 as Level,\n isActive: (editor: Editor) => editor.isActive(\"heading\", { level: 1 }),\n },\n {\n type: \"heading\",\n label: \"2 级标题\",\n level: 2 as Level,\n isActive: (editor: Editor) => editor.isActive(\"heading\", { level: 2 }),\n },\n {\n type: \"heading\",\n label: \"3 级标题\",\n level: 3 as Level,\n isActive: (editor: Editor) => editor.isActive(\"heading\", { level: 3 }),\n },\n {\n type: \"bulletList\",\n label: \"无序列表\",\n isActive: (editor: Editor) => editor.isActive(\"bulletList\"),\n },\n {\n type: \"orderedList\",\n label: \"有序列表\",\n isActive: (editor: Editor) => editor.isActive(\"orderedList\"),\n },\n {\n type: \"taskList\",\n label: \"任务列表\",\n isActive: (editor: Editor) => editor.isActive(\"taskList\"),\n },\n {\n type: \"blockquote\",\n label: \"引用\",\n isActive: (editor: Editor) => editor.isActive(\"blockquote\"),\n },\n {\n type: \"codeBlock\",\n label: \"代码块\",\n isActive: (editor: Editor) => editor.isActive(\"codeBlock\"),\n },\n]\n\n/**\n * Checks if turn into functionality can be used in the current editor state\n */\nexport function canTurnInto(\n editor: Editor | null,\n allowedBlockTypes?: string[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n const blockTypes = allowedBlockTypes || TURN_INTO_BLOCKS\n const { selection } = editor.state\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node.type.name\n return blockTypes.includes(nodeType)\n }\n\n const { $anchor } = selection\n const nodeType = $anchor.parent.type.name\n return blockTypes.includes(nodeType)\n}\n\n/**\n * Gets filtered block type options based on available types\n */\nexport function getFilteredBlockTypeOptions(blockTypes?: string[]) {\n if (!blockTypes) return blockTypeOptions\n\n return blockTypeOptions.filter((option) => {\n return blockTypes.includes(option.type)\n })\n}\n\n/**\n * Gets the currently active block type from the available options\n */\nexport function getActiveBlockType(\n editor: Editor | null,\n blockTypes?: string[]\n) {\n if (!editor) return getFilteredBlockTypeOptions(blockTypes)[0]\n\n const filteredOptions = getFilteredBlockTypeOptions(blockTypes)\n const activeOption = filteredOptions.find((option) => option.isActive(editor))\n return activeOption || filteredOptions[0]\n}\n\n/**\n * Determines if the turn into dropdown should be visible\n */\nexport function shouldShowTurnInto(params: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n blockTypes?: string[]\n}): boolean {\n const { editor, hideWhenUnavailable, blockTypes } = params\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!editor.isActive(\"code\")) {\n return canTurnInto(editor, blockTypes)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides turn into dropdown functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyTurnIntoDropdown() {\n * const {\n * isVisible,\n * canToggle,\n * activeBlockType,\n * handleOpenChange,\n * label,\n * Icon,\n * } = useTurnIntoDropdown()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu onOpenChange={handleOpenChange}>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedTurnIntoDropdown() {\n * const {\n * isVisible,\n * activeBlockType,\n * } = useTurnIntoDropdown({\n * editor: myEditor,\n * blockTypes: [\"paragraph\", \"heading\", \"bulletList\"],\n * hideWhenUnavailable: true,\n * onOpenChange: (isOpen) => console.log(\"Dropdown toggled\", isOpen),\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useTurnIntoDropdown(config?: UseTurnIntoDropdownConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n blockTypes,\n onOpenChange,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n const [isVisible, setIsVisible] = useState(true)\n\n const canToggle = canTurnInto(editor, blockTypes)\n const activeBlockType = getActiveBlockType(editor, blockTypes)\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 useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowTurnInto({\n editor,\n hideWhenUnavailable,\n blockTypes,\n })\n )\n }\n\n handleSelectionUpdate()\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, blockTypes])\n\n return {\n isVisible,\n canToggle,\n isOpen,\n setIsOpen,\n activeBlockType,\n handleOpenChange,\n filteredOptions: getFilteredBlockTypeOptions(blockTypes),\n label: `转换为(当前:${activeBlockType?.label || \"正文\"})`,\n Icon: ChevronDownIcon,\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 IndentAction,\n UseIndentConfig,\n} from \".\"\nimport {\n INDENT_SHORTCUT_KEYS,\n useIndent,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface IndentButtonProps\n extends Omit<ButtonProps, \"type\">, UseIndentConfig {\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 IndentShortcutBadge({\n action,\n shortcutKeys = INDENT_SHORTCUT_KEYS[action],\n}: {\n action: IndentAction\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for controlling indentation in a Tiptap editor.\n *\n * For custom button implementations, use the `useIndent` hook instead.\n */\nexport const IndentButton = forwardRef<HTMLButtonElement, IndentButtonProps>(\n (\n {\n editor: providedEditor,\n action,\n text,\n hideWhenUnavailable = false,\n onIndented,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleIndent, label, canIndent, Icon, shortcutKeys } =\n useIndent({\n editor,\n action,\n hideWhenUnavailable,\n onIndented,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleIndent()\n },\n [handleIndent, 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={!canIndent}\n variant=\"ghost\"\n data-disabled={!canIndent}\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 <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <IndentShortcutBadge\n action={action}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nIndentButton.displayName = \"IndentButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const IndentIncreaseIcon = 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=\"M17.0002 18.5C17.5524 18.5 18.0002 18.9477 18.0002 19.5C18.0002 20.0523 17.5524 20.5 17.0002 20.5H11.0002C10.4479 20.5 10.0002 20.0523 10.0002 19.5C10.0002 18.9477 10.4479 18.5 11.0002 18.5H17.0002Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M2.29314 8.29297C2.68366 7.90248 3.31669 7.90246 3.7072 8.29297L6.7072 11.293L6.77556 11.3691C7.09586 11.7619 7.07327 12.3409 6.7072 12.707L3.7072 15.707C3.31669 16.0975 2.68367 16.0975 2.29314 15.707C1.90261 15.3165 1.90261 14.6835 2.29314 14.293L4.58611 12L2.29314 9.70703C1.90261 9.31651 1.90261 8.68349 2.29314 8.29297Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0002 13.5C21.5524 13.5 22.0002 13.9477 22.0002 14.5C22.0002 15.0523 21.5524 15.5 21.0002 15.5H11.0002C10.4479 15.5 10.0002 15.0523 10.0002 14.5C10.0002 13.9477 10.4479 13.5 11.0002 13.5H21.0002Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0002 8.5C21.5524 8.50004 22.0002 8.94774 22.0002 9.5C22.0002 10.0523 21.5524 10.5 21.0002 10.5H11.0002C10.4479 10.5 10.0002 10.0523 10.0002 9.5C10.0002 8.94772 10.4479 8.5 11.0002 8.5H21.0002Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0002 3.5C21.5524 3.50004 22.0002 3.94774 22.0002 4.5C22.0002 5.05226 21.5524 5.49996 21.0002 5.5H11.0002C10.4479 5.5 10.0002 5.05228 10.0002 4.5C10.0002 3.94772 10.4479 3.5 11.0002 3.5H21.0002Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nIndentIncreaseIcon.displayName = \"IndentIncreaseIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const IndentDecreaseIcon = 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 18.5C9.55228 18.5 10 18.9477 10 19.5C10 20.0523 9.55228 20.5 9 20.5H3C2.44772 20.5 2 20.0523 2 19.5C2 18.9477 2.44772 18.5 3 18.5H9Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M20.293 8.29297C20.6835 7.90244 21.3165 7.90244 21.707 8.29297C22.0976 8.68349 22.0976 9.31651 21.707 9.70703L19.4141 12L21.707 14.293C22.0976 14.6835 22.0976 15.3165 21.707 15.707C21.3165 16.0976 20.6835 16.0976 20.293 15.707L17.293 12.707L17.2246 12.6309C16.9043 12.2381 16.9269 11.6591 17.293 11.293L20.293 8.29297Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 13.5C13.5523 13.5 14 13.9477 14 14.5C14 15.0523 13.5523 15.5 13 15.5H3C2.44772 15.5 2 15.0523 2 14.5C2 13.9477 2.44772 13.5 3 13.5H13Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 8.5C13.5523 8.5 14 8.94772 14 9.5C14 10.0523 13.5523 10.5 13 10.5H3C2.44772 10.5 2 10.0523 2 9.5C2 8.94772 2.44772 8.5 3 8.5H13Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13 3.5C13.5523 3.5 14 3.94772 14 4.5C14 5.05228 13.5523 5.5 13 5.5H3C2.44772 5.5 2 5.05228 2 4.5C2 3.94772 2.44772 3.5 3 3.5H13Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nIndentDecreaseIcon.displayName = \"IndentDecreaseIcon\"\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 { isExtensionAvailable } from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { IndentIncreaseIcon } from \"../../tiptap-icons/indent-increase-icon\"\nimport { IndentDecreaseIcon } from \"../../tiptap-icons/indent-decrease-icon\"\n\nexport type IndentAction = \"indent\" | \"outdent\"\n\n/**\n * Configuration for the indent functionality\n */\nexport interface UseIndentConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The indent action to perform.\n */\n action: IndentAction\n /**\n * Whether the button should hide when indent is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful indent change.\n */\n onIndented?: () => void\n}\n\nexport const INDENT_SHORTCUT_KEYS: Record<IndentAction, string> = {\n indent: \"Tab\",\n outdent: \"Shift-Tab\",\n}\n\nexport const indentIcons = {\n indent: IndentIncreaseIcon,\n outdent: IndentDecreaseIcon,\n}\n\nexport const indentLabels: Record<IndentAction, string> = {\n indent: \"增加缩进\",\n outdent: \"减少缩进\",\n}\n\n/**\n * Checks if indent action can be performed in the current editor state\n */\nexport function canPerformIndent(\n editor: Editor | null,\n action: IndentAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"indent\")) return false\n\n if (action === \"indent\") {\n return editor.can().indent()\n }\n\n return editor.can().outdent()\n}\n\n/**\n * Performs the indent action in the editor\n */\nexport function performIndent(\n editor: Editor | null,\n action: IndentAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canPerformIndent(editor, action)) return false\n\n if (action === \"indent\") {\n return editor.chain().focus().indent().run()\n }\n\n return editor.chain().focus().outdent().run()\n}\n\n/**\n * Determines if the indent button should be shown\n */\nexport function shouldShowIndentButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n action: IndentAction\n}): boolean {\n const { editor, hideWhenUnavailable, action } = props\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isExtensionAvailable(editor, \"indent\")) return false\n\n return canPerformIndent(editor, action)\n}\n\n/**\n * Custom hook that provides indent functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyIndentButton() {\n * const { isVisible, handleIndent } = useIndent({ action: \"indent\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleIndent}>Indent</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyOutdentButton() {\n * const { isVisible, handleIndent, label, canIndent } = useIndent({\n * editor: myEditor,\n * action: \"outdent\",\n * hideWhenUnavailable: true,\n * onIndented: () => console.log('Outdented!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleIndent}\n * disabled={!canIndent}\n * aria-label={label}\n * >\n * Outdent\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useIndent(config: UseIndentConfig) {\n const {\n editor: providedEditor,\n action,\n hideWhenUnavailable = false,\n onIndented,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canIndent = canPerformIndent(editor, action)\n\n useEffect(() => {\n if (!editor) return\n\n const handleUpdate = () => {\n setIsVisible(\n shouldShowIndentButton({ editor, action, hideWhenUnavailable })\n )\n }\n\n handleUpdate()\n\n editor.on(\"selectionUpdate\", handleUpdate)\n editor.on(\"transaction\", handleUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleUpdate)\n editor.off(\"transaction\", handleUpdate)\n }\n }, [editor, hideWhenUnavailable, action])\n\n const handleIndent = useCallback(() => {\n if (!editor) return false\n\n const success = performIndent(editor, action)\n if (success) {\n onIndented?.()\n }\n return success\n }, [editor, action, onIndented])\n\n return {\n isVisible,\n canIndent,\n handleIndent,\n label: indentLabels[action],\n shortcutKeys: INDENT_SHORTCUT_KEYS[action],\n Icon: indentIcons[action],\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 { UseMoveNodeConfig } from \".\"\nimport { useMoveNode } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface MoveNodeButtonProps\n extends Omit<ButtonProps, \"type\">, UseMoveNodeConfig {\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 MoveNodeShortcutBadge({\n shortcutKeys,\n}: {\n shortcutKeys: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for moving a node up or down in a Tiptap editor.\n */\nexport const MoveNodeButton = forwardRef<\n HTMLButtonElement,\n MoveNodeButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n direction,\n hideWhenUnavailable = false,\n onMoved,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleMoveNode,\n canMoveNode,\n label,\n shortcutKeys,\n Icon,\n } = useMoveNode({\n editor,\n direction,\n hideWhenUnavailable,\n onMoved,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleMoveNode()\n },\n [handleMoveNode, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const tooltip = direction === \"up\" ? \"上移\" : \"下移\"\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip={tooltip}\n disabled={!canMoveNode}\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 <MoveNodeShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nMoveNodeButton.displayName = \"MoveNodeButton\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport { TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Utils ---\nimport { getAnchorNodeAndPos } from \"../../../lib/tiptap-advanced-utils\"\n\n// --- Icons ---\nimport { AlignTopIcon } from \"../../tiptap-icons/align-top-icon\"\nimport { AlignBottomIcon } from \"../../tiptap-icons/align-bottom-icon\"\n\nexport const MOVE_UP_SHORTCUT_KEY = \"mod+shift+ArrowUp\"\nexport const MOVE_DOWN_SHORTCUT_KEY = \"mod+shift+ArrowDown\"\n\n/**\n * Configuration for the move node functionality\n */\nexport interface UseMoveNodeConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when moving is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * The direction to move the node.\n */\n direction: \"up\" | \"down\"\n /**\n * Callback function called after a successful move.\n */\n onMoved?: (direction: \"up\" | \"down\") => void\n}\n\n/**\n * Checks if a node can be moved in the specified direction\n */\nexport function canMoveNode(\n editor: Editor | null,\n direction: \"up\" | \"down\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n const nodeInfo = getAnchorNodeAndPos(editor)\n if (!nodeInfo) return false\n\n try {\n const { pos } = nodeInfo\n const $pos = editor.state.doc.resolve(pos)\n const parent = $pos.parent\n const index = $pos.index()\n\n return direction === \"up\" ? index > 0 : index < parent.childCount - 1\n } catch {\n return false\n }\n}\n\n/**\n * Moves a node in the editor\n */\nexport function moveNode(\n editor: Editor | null,\n direction: \"up\" | \"down\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n const nodeInfo = getAnchorNodeAndPos(editor)\n if (!nodeInfo) return false\n\n try {\n const { pos, node } = nodeInfo\n const tr = editor.state.tr\n const $pos = tr.doc.resolve(pos)\n const parent = $pos.parent\n const index = $pos.index()\n\n if (index < 0 || index >= parent.childCount) {\n return false\n }\n\n if (direction === \"up\" && index > 0) {\n const prevNode = parent.child(index - 1)\n const prevSize = prevNode.nodeSize\n\n const movedNode = node.type.create(node.attrs, node.content, node.marks)\n tr.deleteRange(pos, pos + node.nodeSize)\n const insertPos = pos - prevSize\n tr.insert(insertPos, movedNode)\n tr.setSelection(TextSelection.near(tr.doc.resolve(insertPos)))\n } else if (direction === \"down\" && index < parent.childCount - 1) {\n const nextNode = parent.child(index + 1)\n const nextSize = nextNode.nodeSize\n\n const movedNode = node.type.create(node.attrs, node.content, node.marks)\n tr.deleteRange(pos, pos + node.nodeSize)\n const insertPos = pos + nextSize\n tr.insert(insertPos, movedNode)\n tr.setSelection(TextSelection.near(tr.doc.resolve(insertPos)))\n } else {\n return false\n }\n\n editor.view.dispatch(tr)\n return true\n } catch (err) {\n console.error(\"Error moving node:\", err)\n return false\n }\n}\n\n/**\n * Determines if the move button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n direction: \"up\" | \"down\"\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, direction, hideWhenUnavailable } = props\n\n if (!editor) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n const hasNode = !!getAnchorNodeAndPos(editor)\n const movable = canMoveNode(editor, direction)\n\n return hasNode && movable\n}\n\n/**\n * Custom hook that provides move node functionality for Tiptap editor\n */\nexport function useMoveNode(config: UseMoveNodeConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n direction,\n onMoved,\n } = config\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n\n const [isVisible, setIsVisible] = useState(true)\n const [canMoveNodeState, setCanMoveNodeState] = useState(false)\n\n const handleMoveNode = useCallback(() => {\n if (!canMoveNodeState) return false\n\n const success = moveNode(editor, direction)\n if (success) onMoved?.(direction)\n\n return success\n }, [editor, direction, onMoved, canMoveNodeState])\n\n useEffect(() => {\n if (!editor) return\n\n const update = () => {\n setIsVisible(shouldShowButton({ editor, direction, hideWhenUnavailable }))\n setCanMoveNodeState(canMoveNode(editor, direction))\n }\n\n update()\n\n editor.on(\"selectionUpdate\", update)\n return () => {\n editor.off(\"selectionUpdate\", update)\n }\n }, [editor, direction, hideWhenUnavailable])\n\n const shortcutKeys =\n direction === \"up\" ? MOVE_UP_SHORTCUT_KEY : MOVE_DOWN_SHORTCUT_KEY\n\n useHotkeys(\n shortcutKeys,\n (event) => {\n event.preventDefault()\n handleMoveNode()\n },\n {\n enabled: isVisible && canMoveNodeState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n },\n [handleMoveNode, isVisible, canMoveNodeState, isMobile]\n )\n\n const label = direction === \"up\" ? \"上移\" : \"下移\"\n const Icon = direction === \"up\" ? AlignTopIcon : AlignBottomIcon\n\n return {\n isVisible,\n handleMoveNode,\n canMoveNode: canMoveNodeState,\n label,\n shortcutKeys,\n Icon,\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 {\n ImageAlign,\n UseImageAlignConfig,\n} from \".\"\nimport {\n IMAGE_ALIGN_SHORTCUT_KEYS,\n useImageAlign,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface ImageAlignButtonProps\n extends Omit<ButtonProps, \"type\">, UseImageAlignConfig {\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 ImageAlignShortcutBadge({\n align,\n shortcutKeys = IMAGE_ALIGN_SHORTCUT_KEYS[align],\n}: {\n align: ImageAlign\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for setting image alignment in a Tiptap editor.\n *\n * For custom button implementations, use the `useImageAlign` hook instead.\n */\nexport const ImageAlignButton = forwardRef<\n HTMLButtonElement,\n ImageAlignButtonProps\n>(\n (\n {\n editor: providedEditor,\n align,\n text,\n extensionName,\n attributeName = \"data-align\",\n hideWhenUnavailable = false,\n onAligned,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleImageAlign,\n label,\n canAlign,\n isActive,\n Icon,\n shortcutKeys,\n } = useImageAlign({\n editor,\n align,\n extensionName,\n attributeName,\n hideWhenUnavailable,\n onAligned,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleImageAlign()\n },\n [handleImageAlign, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canAlign}\n variant=\"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 <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut ? (\n <ImageAlignShortcutBadge\n align={align}\n shortcutKeys={shortcutKeys}\n />\n ) : null}\n </>\n )}\n </Button>\n )\n }\n)\n\nImageAlignButton.displayName = \"ImageAlignButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignCenterVerticalIcon = memo(\n ({ 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=\"M12 1C12.5523 1 13 1.44772 13 2V22C13 22.5523 12.5523 23 12 23C11.4477 23 11 22.5523 11 22V2C11 1.44772 11.4477 1 12 1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M2 7C2 5.34315 3.34315 4 5 4H7C7.55228 4 8 4.44772 8 5C8 5.55228 7.55228 6 7 6H5C4.44772 6 4 6.44772 4 7V17C4 17.5523 4.44772 18 5 18H7C7.55228 18 8 18.4477 8 19C8 19.5523 7.55228 20 7 20H5C3.34315 20 2 18.6569 2 17V7Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M19 4C20.6569 4 22 5.34315 22 7V17C22 18.6569 20.6569 20 19 20H17C16.4477 20 16 19.5523 16 19C16 18.4477 16.4477 18 17 18H19C19.5523 18 20 17.5523 20 17V7C20 6.44772 19.5523 6 19 6H17C16.4477 6 16 5.55228 16 5C16 4.44772 16.4477 4 17 4H19Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n }\n)\n\nAlignCenterVerticalIcon.displayName = \"AlignCenterVerticalIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignEndVerticalIcon = memo(\n ({ 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 1C21.5523 1 22 1.44772 22 2V22C22 22.5523 21.5523 23 21 23C20.4477 23 20 22.5523 20 22V2C20 1.44772 20.4477 1 21 1Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 7C2 5.34315 3.34315 4 5 4H14C15.6569 4 17 5.34315 17 7V17C17 18.6569 15.6569 20 14 20H5C3.34315 20 2 18.6569 2 17V7ZM5 6C4.44772 6 4 6.44772 4 7V17C4 17.5523 4.44772 18 5 18H14C14.5523 18 15 17.5523 15 17V7C15 6.44772 14.5523 6 14 6H5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n }\n)\n\nAlignEndVerticalIcon.displayName = \"AlignEndVerticalIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignStartVerticalIcon = memo(\n ({ 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 2C4 1.44772 3.55228 1 3 1C2.44772 1 2 1.44772 2 2V22C2 22.5523 2.44772 23 3 23C3.55228 23 4 22.5523 4 22V2Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 4C8.34315 4 7 5.34315 7 7V17C7 18.6569 8.34315 20 10 20H19C20.6569 20 22 18.6569 22 17V7C22 5.34315 20.6569 4 19 4H10ZM9 7C9 6.44772 9.44772 6 10 6H19C19.5523 6 20 6.44772 20 7V17C20 17.5523 19.5523 18 19 18H10C9.44772 18 9 17.5523 9 17V7Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n }\n)\n\nAlignStartVerticalIcon.displayName = \"AlignStartVerticalIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\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 { AlignCenterVerticalIcon } from \"../../tiptap-icons/align-center-vertical-icon\"\nimport { AlignEndVerticalIcon } from \"../../tiptap-icons/align-end-vertical-icon\"\nimport { AlignStartVerticalIcon } from \"../../tiptap-icons/align-start-vertical-icon\"\n\nexport type ImageAlign = \"left\" | \"center\" | \"right\"\n\n/**\n * Configuration for the image align functionality\n */\nexport interface UseImageAlignConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The image alignment to apply.\n */\n align: ImageAlign\n /**\n * The name of the image extension to target.\n * @default \"image\"\n */\n extensionName?: string\n /**\n * The attribute name used for alignment.\n * @default \"data-align\"\n */\n attributeName?: string\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 IMAGE_ALIGN_SHORTCUT_KEYS: Record<ImageAlign, string> = {\n left: \"alt+shift+l\",\n center: \"alt+shift+e\",\n right: \"alt+shift+r\",\n}\n\nexport const imageAlignIcons = {\n left: AlignStartVerticalIcon,\n center: AlignCenterVerticalIcon,\n right: AlignEndVerticalIcon,\n}\n\nexport const imageAlignLabels: Record<ImageAlign, string> = {\n left: \"图片左对齐\",\n center: \"图片居中对齐\",\n right: \"图片右对齐\",\n}\n\n/**\n * Checks if image alignment can be performed in the current editor state\n */\nexport function canSetImageAlign(\n editor: Editor | null,\n align: ImageAlign,\n extensionName: string = \"image\",\n attributeName: string = \"data-align\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, [extensionName])) return false\n\n return editor\n .can()\n .updateAttributes(extensionName, { [attributeName]: align })\n}\n\n/**\n * Checks if the image alignment is currently active\n */\nexport function isImageAlignActive(\n editor: Editor | null,\n align: ImageAlign,\n extensionName: string = \"image\",\n attributeName: string = \"data-align\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, [extensionName])) return false\n\n const attributes = editor.getAttributes(extensionName)\n const currentAlign = attributes[attributeName] || \"left\"\n return currentAlign === align\n}\n\n/**\n * Sets image alignment in the editor\n */\nexport function setImageAlign(\n editor: Editor | null,\n align: ImageAlign,\n extensionName: string = \"image\",\n attributeName: string = \"data-align\"\n): boolean {\n if (!editor?.isEditable) {\n return false\n }\n\n if (!isExtensionAvailable(editor, [extensionName])) {\n return false\n }\n\n if (!canSetImageAlign(editor, align, extensionName, attributeName)) {\n return false\n }\n\n try {\n const { selection } = editor.state\n const isNodeSelection = selection instanceof NodeSelection\n const selectionPosition = isNodeSelection\n ? selection.from\n : selection.$anchor.pos\n\n const alignmentUpdated = editor\n .chain()\n .focus()\n .updateAttributes(extensionName, { [attributeName]: align })\n .run()\n\n // Restore node selection if it was originally selected\n // This is the temporary solution as image-node-extension.ts contain content: \"inline*\"\n if (alignmentUpdated && isNodeSelection) {\n editor.commands.setNodeSelection(selectionPosition)\n }\n\n return alignmentUpdated\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the image align button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n align: ImageAlign\n extensionName?: string\n attributeName?: string\n}): boolean {\n const {\n editor,\n hideWhenUnavailable,\n align,\n extensionName = \"image\",\n attributeName = \"data-align\",\n } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!isExtensionAvailable(editor, [extensionName])) return false\n\n return canSetImageAlign(editor, align, extensionName, attributeName)\n}\n\n/**\n * Custom hook that provides image align functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage with default \"image\" extension\n * function MySimpleImageAlignButton() {\n * const { isVisible, handleImageAlign } = useImageAlign({ align: \"center\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleImageAlign}>Align Center</button>\n * }\n *\n * // Advanced usage with custom extension name\n * function MyAdvancedImageAlignButton() {\n * const { isVisible, handleImageAlign, label, isActive } = useImageAlign({\n * editor: myEditor,\n * align: \"right\",\n * extensionName: \"myCustomImage\", // Use your custom extension name\n * hideWhenUnavailable: true,\n * onAligned: () => console.log('Image aligned!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleImageAlign}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Align Right\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useImageAlign(config: UseImageAlignConfig) {\n const {\n editor: providedEditor,\n align,\n extensionName = \"image\",\n attributeName = \"data-align\",\n hideWhenUnavailable = false,\n onAligned,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canAlign = canSetImageAlign(editor, align, extensionName, attributeName)\n const isActive = isImageAlignActive(\n editor,\n align,\n extensionName,\n attributeName\n )\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({\n editor,\n align,\n hideWhenUnavailable,\n extensionName,\n attributeName,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, align, extensionName, attributeName])\n\n const handleImageAlign = useCallback(() => {\n if (!editor) return false\n\n const success = setImageAlign(editor, align, extensionName, attributeName)\n if (success) {\n onAligned?.()\n }\n return success\n }, [editor, align, extensionName, attributeName, onAligned])\n\n useHotkeys(\n IMAGE_ALIGN_SHORTCUT_KEYS[align],\n (event) => {\n event.preventDefault()\n handleImageAlign()\n },\n {\n enabled: isVisible && canAlign,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleImageAlign,\n canAlign,\n label: imageAlignLabels[align],\n shortcutKeys: IMAGE_ALIGN_SHORTCUT_KEYS[align],\n Icon: imageAlignIcons[align],\n }\n}\n","import * as React from \"react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseImageCaptionConfig } from \".\"\nimport { useImageCaption } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\n\nexport interface ImageCaptionButtonProps\n extends Omit<ButtonProps, \"type\">, UseImageCaptionConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n}\n\n/**\n * Button component for toggling image captions in a Tiptap editor.\n * Only appears when an image is selected in the editor.\n *\n * For custom button implementations, use the `useImageCaption` hook instead.\n */\nexport const ImageCaptionButton = React.forwardRef<\n HTMLButtonElement,\n ImageCaptionButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onSet,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, isActive, canToggle, handleToggleCaption, label, Icon } =\n useImageCaption({\n editor,\n hideWhenUnavailable,\n onSet,\n })\n\n const handleClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggleCaption()\n },\n [handleToggleCaption, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"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 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 </>\n )}\n </Button>\n )\n }\n)\n\nImageCaptionButton.displayName = \"ImageCaptionButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ImageCaptionIcon = 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 22C7 21.4477 7.44772 21 8 21H16C16.5523 21 17 21.4477 17 22C17 22.5523 16.5523 23 16 23H8C7.44772 23 7 22.5523 7 22Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 18C3 17.4477 3.44772 17 4 17H20C20.5523 17 21 17.4477 21 18C21 18.5523 20.5523 19 20 19H4C3.44772 19 3 18.5523 3 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 5C3 3.34315 4.34315 2 6 2H18C19.6569 2 21 3.34315 21 5V11C21 12.6569 19.6569 14 18 14H6C4.34315 14 3 12.6569 3 11V5ZM6 4C5.44772 4 5 4.44772 5 5V11C5 11.5523 5.44772 12 6 12H18C18.5523 12 19 11.5523 19 11V5C19 4.44772 18.5523 4 18 4H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nImageCaptionIcon.displayName = \"ImageCaptionIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection } from \"@tiptap/pm/state\"\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 { ImageCaptionIcon } from \"../../tiptap-icons/image-caption-icon\"\n\n/**\n * Configuration for the image caption functionality\n */\nexport interface UseImageCaptionConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when caption toggle is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful caption set.\n */\n onSet?: () => void\n}\n\n/**\n * Checks if image caption can be toggled in the current editor state\n */\nexport function canToggleImageCaption(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, [\"image\"])) return false\n\n return isNodeTypeSelected(editor, [\"image\"])\n}\n\n/**\n * Checks if the currently selected image has caption enabled\n */\nexport function isImageCaptionActive(editor: Editor | null): boolean {\n if (!editor) return false\n\n try {\n const { selection } = editor.state\n const isImageSelected =\n selection instanceof NodeSelection && selection.node.type.name === \"image\"\n\n if (!isImageSelected) {\n return false\n }\n\n const imageNode = (selection as NodeSelection).node\n return imageNode.attrs.showCaption === true || imageNode.content.size > 0\n } catch {\n return false\n }\n}\n\n/**\n * Toggles the image caption in the editor\n */\nexport function setImageCaption(editor: Editor | null): boolean {\n if (!editor?.isEditable || !canToggleImageCaption(editor)) {\n return false\n }\n\n try {\n const { selection } = editor.state\n const isImageSelected =\n selection instanceof NodeSelection && selection.node.type.name === \"image\"\n\n if (!isImageSelected) {\n return false\n }\n\n const captionEnabled = editor\n .chain()\n .focus()\n .updateAttributes(\"image\", { showCaption: true })\n .run()\n\n if (!captionEnabled) {\n return false\n }\n\n const imagePosition = selection.from\n editor\n .chain()\n .focus(imagePosition + 1)\n .selectTextblockEnd()\n .run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the image caption 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) return false\n\n if (!hideWhenUnavailable) {\n return true\n }\n\n if (!editor.isEditable) return false\n\n if (!isExtensionAvailable(editor, [\"image\"])) return false\n\n return canToggleImageCaption(editor)\n}\n\n/**\n * Custom hook that provides image caption functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyImageCaptionButton() {\n * const { isVisible, handleToggleCaption } = useImageCaption()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggleCaption}>Toggle Caption</button>\n * }\n *\n * // Advanced usage\n * function MyAdvancedImageCaptionButton() {\n * const { isVisible, handleToggleCaption, label, canToggle } = useImageCaption({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onSet: () => console.log('Caption set!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggleCaption}\n * disabled={!canToggle}\n * aria-label={label}\n * >\n * Toggle Caption\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useImageCaption(config?: UseImageCaptionConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSet,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const [isActive, setIsActive] = useState<boolean>(false)\n const canToggle = canToggleImageCaption(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n setIsActive(isImageCaptionActive(editor))\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 handleToggleCaption = useCallback(() => {\n if (!editor) return false\n\n const success = setImageCaption(editor)\n if (success) {\n onSet?.()\n }\n return success\n }, [editor, onSet])\n\n return {\n isVisible,\n isActive,\n canToggle,\n handleToggleCaption,\n label: \"图片标题\",\n Icon: ImageCaptionIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const RefreshCcwIcon = 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 3C4 2.44772 3.55228 2 3 2C2.44772 2 2 2.44772 2 3V8C2 8.55228 2.44772 9 3 9H8C8.55228 9 9 8.55228 9 8C9 7.44772 8.55228 7 8 7H5.41416L5.96091 6.45325C7.58323 4.88786 9.74725 4.00897 12.0018 4.00001C14.1229 4.0005 16.1569 4.8433 17.6568 6.34315C19.1571 7.84344 19.9999 9.87827 19.9999 12C19.9999 12.5523 20.4477 13 20.9999 13C21.5522 13 21.9999 12.5523 21.9999 12C21.9999 9.34784 20.9464 6.8043 19.071 4.92894C17.1956 3.05358 14.6521 2.00001 11.9999 2L11.9962 2.00001C9.22207 2.01045 6.5594 3.0929 4.5649 5.02104L4.55283 5.0329L4 5.58573V3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M3 11C3.55228 11 4 11.4477 4 12C4 14.1217 4.84285 16.1566 6.34315 17.6569C7.84297 19.1567 9.87701 19.9995 11.998 20C14.2526 19.9911 16.4167 19.1122 18.039 17.5468L18.5858 17H16C15.4477 17 15 16.5523 15 16C15 15.4477 15.4477 15 16 15H21C21.5523 15 22 15.4477 22 16V21C22 21.5523 21.5523 22 21 22C20.4477 22 20 21.5523 20 21V18.4142L19.4471 18.9671L19.435 18.979C17.4405 20.9071 14.7779 21.9896 12.0038 22L12 22C9.34784 22 6.8043 20.9464 4.92893 19.0711C3.05357 17.1957 2 14.6522 2 12C2 11.4477 2.44772 11 3 11Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRefreshCcwIcon.displayName = \"RefreshCcwIcon\"\n","import 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// --- Tiptap UI ---\nimport { DeleteNodeButton } from \"../../tiptap-ui/delete-node-button\"\nimport { ImageDownloadButton } from \"../../tiptap-ui/image-download-button\"\nimport { ImageAlignButton } from \"../../tiptap-ui/image-align-button\"\n\n// --- UI Primitive ---\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport { ImageCaptionButton } from \"../../tiptap-ui/image-caption-button\"\nimport { ImageUploadButton } from \"../../tiptap-ui/image-upload-button\"\nimport { RefreshCcwIcon } from \"../../tiptap-icons/refresh-ccw-icon\"\n\nexport function ImageNodeFloating({\n editor: providedEditor,\n}: {\n editor?: Editor | null\n}) {\n const { editor } = useTiptapEditor(providedEditor)\n const visible = isNodeTypeSelected(editor, [\"image\"])\n\n if (!editor || !visible) {\n return null\n }\n\n return (\n <>\n <ImageAlignButton align=\"left\" />\n <ImageAlignButton align=\"center\" />\n <ImageAlignButton align=\"right\" />\n <Separator />\n <ImageCaptionButton />\n <Separator />\n <ImageDownloadButton />\n <ImageUploadButton icon={RefreshCcwIcon} tooltip=\"替换\" />\n <Separator />\n <DeleteNodeButton />\n </>\n )\n}\n","import { cloneElement, useEffect, useMemo, useRef, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\nimport { useWindowSize } from \"../../../hooks/use-window-size\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport {\n ColorHighlightPopover,\n ColorHighlightPopoverButton,\n ColorHighlightPopoverContent,\n} from \"../../tiptap-ui/color-highlight-popover\"\nimport { ImageUploadButton } from \"../../tiptap-ui/image-upload-button\"\nimport { MediaUploadButton } from \"../../tiptap-ui/media-upload-button\"\nimport {\n canSetLink,\n LinkButton,\n LinkContent,\n LinkPopover,\n} from \"../../tiptap-ui/link-popover\"\nimport { MarkButton } from \"../../tiptap-ui/mark-button\"\nimport { TextAlignButton } from \"../../tiptap-ui/text-align-button\"\nimport { SlashCommandTriggerButton } from \"../../tiptap-ui/slash-command-trigger-button\"\nimport { ResetAllFormattingButton } from \"../../tiptap-ui/reset-all-formatting-button\"\nimport { DeleteNodeButton } from \"../../tiptap-ui/delete-node-button\"\nimport { CopyAnchorLinkButton } from \"../../tiptap-ui/copy-anchor-link-button\"\nimport { TurnIntoDropdownContent } from \"../../tiptap-ui/turn-into-dropdown\"\nimport { useRecentColors } from \"../../tiptap-ui/color-text-popover\"\nimport {\n ColorTextButton,\n TEXT_COLORS,\n} from \"../../tiptap-ui/color-text-button\"\nimport {\n canColorHighlight,\n ColorHighlightButton,\n HIGHLIGHT_COLORS,\n} from \"../../tiptap-ui/color-highlight-button\"\nimport { DuplicateButton } from \"../../tiptap-ui/duplicate-button\"\nimport { CopyToClipboardButton } from \"../../tiptap-ui/copy-to-clipboard-button\"\nimport { IndentButton } from \"../../tiptap-ui/indent-button\"\n\n// --- Utils ---\nimport { getNodeDisplayName } from \"../../../lib/tiptap-collab-utils\"\n\n// --- Icons ---\nimport { PaintBucketIcon } from \"../../tiptap-icons/paint-bucket-icon\"\nimport { Repeat2Icon } from \"../../tiptap-icons/repeat-2-icon\"\n\n// --- UI Primitives ---\nimport { Spacer } from \"../../tiptap-ui-primitive/spacer\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"../../tiptap-ui-primitive/dropdown-menu\"\nimport { ArrowLeftIcon } from \"../../tiptap-icons/arrow-left-icon\"\nimport { ChevronRightIcon } from \"../../tiptap-icons/chevron-right-icon\"\nimport { HighlighterIcon } from \"../../tiptap-icons/highlighter-icon\"\nimport { LinkIcon } from \"../../tiptap-icons/link-icon\"\nimport { MoreVerticalIcon } from \"../../tiptap-icons/more-vertical-icon\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Toolbar,\n ToolbarGroup,\n ToolbarSeparator,\n} from \"../../tiptap-ui-primitive/toolbar\"\nimport { MoveNodeButton } from \"../../tiptap-ui/move-node-button\"\nimport { useCursorVisibility } from \"../../../hooks/use-cursor-visibility\"\nimport { ImageNodeFloating } from \"../../tiptap-node/image-node/image-node-floating\"\n\n// =============================================================================\n// Types & Constants\n// =============================================================================\n\nconst TOOLBAR_VIEWS = {\n MAIN: \"main\",\n HIGHLIGHTER: \"highlighter\",\n LINK: \"link\",\n} as const\n\ntype ToolbarViewId = (typeof TOOLBAR_VIEWS)[keyof typeof TOOLBAR_VIEWS]\n\nexport type ToolbarViewType = {\n id: string\n title: string\n icon: React.ReactNode\n content: React.ReactNode\n mobileButton?: (onClick: () => void) => React.ReactNode\n desktopComponent?: React.ReactNode\n shouldShow?: (editor: Editor | null) => boolean\n}\n\ntype ToolbarViewRegistry = Record<\n Exclude<ToolbarViewId, typeof TOOLBAR_VIEWS.MAIN>,\n ToolbarViewType\n>\n\ninterface ToolbarState {\n viewId: ToolbarViewId\n setViewId: (id: ToolbarViewId) => void\n isMainView: boolean\n showMainView: () => void\n showView: (id: ToolbarViewId) => void\n}\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nfunction useToolbarState(isMobile: boolean): ToolbarState {\n const [viewId, setViewId] = useState<ToolbarViewId>(TOOLBAR_VIEWS.MAIN)\n\n useEffect(() => {\n if (!isMobile && viewId !== TOOLBAR_VIEWS.MAIN) {\n setViewId(TOOLBAR_VIEWS.MAIN)\n }\n }, [isMobile, viewId])\n\n return {\n viewId,\n setViewId,\n isMainView: viewId === TOOLBAR_VIEWS.MAIN,\n showMainView: () => setViewId(TOOLBAR_VIEWS.MAIN),\n showView: (id: ToolbarViewId) => setViewId(id),\n }\n}\n\nfunction hasTextSelection(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n const { selection } = editor.state\n return !selection.empty\n}\n\n// =============================================================================\n// Toolbar View Registry\n// =============================================================================\n\nfunction createToolbarViewRegistry(): ToolbarViewRegistry {\n return {\n [TOOLBAR_VIEWS.HIGHLIGHTER]: {\n id: TOOLBAR_VIEWS.HIGHLIGHTER,\n title: \"Text Highlighter\",\n icon: <HighlighterIcon className=\"tiptap-button-icon\" />,\n content: <ColorHighlightPopoverContent />,\n mobileButton: (onClick: () => void) => (\n <ColorHighlightPopoverButton onClick={onClick} />\n ),\n desktopComponent: <ColorHighlightPopover />,\n shouldShow(editor) {\n return canColorHighlight(editor)\n },\n },\n [TOOLBAR_VIEWS.LINK]: {\n id: TOOLBAR_VIEWS.LINK,\n title: \"Link Editor\",\n icon: <LinkIcon className=\"tiptap-button-icon\" />,\n content: <LinkContent />,\n mobileButton: (onClick: () => void) => <LinkButton onClick={onClick} />,\n desktopComponent: <LinkPopover />,\n shouldShow(editor) {\n return canSetLink(editor)\n },\n },\n }\n}\n\n// =============================================================================\n// Sub-Components\n// =============================================================================\n\nfunction IndentGroup() {\n return (\n <>\n <ToolbarGroup>\n <IndentButton action=\"outdent\" hideWhenUnavailable />\n <IndentButton action=\"indent\" hideWhenUnavailable />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )\n}\n\nfunction AlignmentGroup() {\n return (\n <>\n <ToolbarGroup>\n <TextAlignButton align=\"left\" hideWhenUnavailable />\n <TextAlignButton align=\"center\" hideWhenUnavailable />\n <TextAlignButton align=\"right\" hideWhenUnavailable />\n <TextAlignButton align=\"justify\" hideWhenUnavailable />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )\n}\n\nfunction ScriptGroup() {\n return (\n <>\n <ToolbarGroup>\n <MarkButton type=\"superscript\" hideWhenUnavailable />\n <MarkButton type=\"subscript\" hideWhenUnavailable />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )\n}\n\nfunction FormattingGroup() {\n return (\n <>\n <ToolbarGroup>\n <MarkButton type=\"bold\" hideWhenUnavailable />\n <MarkButton type=\"italic\" hideWhenUnavailable />\n <MarkButton type=\"strike\" hideWhenUnavailable />\n <MarkButton type=\"code\" hideWhenUnavailable />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )\n}\n\nfunction ColorActionGroup() {\n const { recentColors, isInitialized, addRecentColor } = useRecentColors()\n\n const renderRecentColors = () => {\n if (!isInitialized || recentColors.length === 0) return null\n\n return (\n <>\n <DropdownMenuGroup>\n <DropdownMenuLabel>最近使用</DropdownMenuLabel>\n {recentColors.map((colorObj) => (\n <DropdownMenuItem\n key={`${colorObj.type}-${colorObj.value}`}\n asChild\n >\n {colorObj.type === \"text\" ? (\n <ColorTextButton\n textColor={colorObj.value}\n label={colorObj.label}\n text={colorObj.label}\n tooltip={colorObj.label}\n onApplied={({ color, label }) =>\n addRecentColor({\n type: \"text\",\n label,\n value: color,\n })\n }\n />\n ) : (\n <ColorHighlightButton\n highlightColor={colorObj.value}\n text={colorObj.label}\n tooltip={colorObj.label}\n onApplied={({ color, label }) =>\n addRecentColor({\n type: \"highlight\",\n label,\n value: color,\n })\n }\n />\n )}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n\n <Separator orientation=\"horizontal\" />\n </>\n )\n }\n\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger asChild>\n <Button variant=\"ghost\">\n <PaintBucketIcon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">颜色</span>\n <Spacer />\n <ChevronRightIcon className=\"tiptap-button-icon\" />\n </Button>\n </DropdownMenuSubTrigger>\n\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {renderRecentColors()}\n\n <DropdownMenuGroup>\n <DropdownMenuLabel>文字颜色</DropdownMenuLabel>\n\n {TEXT_COLORS.map((textColor) => (\n <DropdownMenuItem key={textColor.value} asChild>\n <ColorTextButton\n textColor={textColor.value}\n label={textColor.label}\n text={textColor.label}\n tooltip={textColor.label}\n onApplied={({ color, label }) =>\n addRecentColor({ type: \"text\", label, value: color })\n }\n />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n\n <Separator orientation=\"horizontal\" />\n\n <DropdownMenuGroup>\n <DropdownMenuLabel>高亮颜色</DropdownMenuLabel>\n\n {HIGHLIGHT_COLORS.map((highlightColor) => (\n <DropdownMenuItem key={highlightColor.value} asChild>\n <ColorHighlightButton\n highlightColor={highlightColor.value}\n text={highlightColor.label}\n tooltip={highlightColor.label}\n onApplied={({ color, label }) =>\n addRecentColor({\n type: \"highlight\",\n label,\n value: color,\n })\n }\n />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n}\n\nfunction TransformActionGroup() {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger asChild>\n <Button variant=\"ghost\">\n <Repeat2Icon className=\"tiptap-button-icon\" />\n <span className=\"tiptap-button-text\">转换为</span>\n <Spacer />\n <ChevronRightIcon className=\"tiptap-button-icon\" />\n </Button>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n <TurnIntoDropdownContent />\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n}\n\n// =============================================================================\n// Dropdown Menu Components\n// =============================================================================\n\ninterface DropdownMenuActionsProps {\n editor: Editor | null\n}\n\nfunction DropdownMenuActions({ editor }: DropdownMenuActionsProps) {\n const isMobile = useIsBreakpoint()\n\n return (\n <>\n <DropdownMenuGroup>\n <DropdownMenuLabel>{getNodeDisplayName(editor)}</DropdownMenuLabel>\n\n <ColorActionGroup />\n <TransformActionGroup />\n\n <DropdownMenuItem asChild>\n <ResetAllFormattingButton text=\"清除格式\" />\n </DropdownMenuItem>\n </DropdownMenuGroup>\n\n <Separator orientation=\"horizontal\" />\n\n <DropdownMenuGroup>\n <DropdownMenuItem asChild>\n <DuplicateButton text=\"复制节点\" showShortcut={!isMobile} />\n </DropdownMenuItem>\n <DropdownMenuItem asChild>\n <CopyToClipboardButton\n text=\"复制到剪贴板\"\n showShortcut={!isMobile}\n />\n </DropdownMenuItem>\n <DropdownMenuItem asChild>\n <CopyAnchorLinkButton\n text=\"复制锚点链接\"\n showShortcut={!isMobile}\n />\n </DropdownMenuItem>\n </DropdownMenuGroup>\n\n <Separator orientation=\"horizontal\" />\n\n <DropdownMenuGroup>\n <DropdownMenuItem asChild>\n <DeleteNodeButton text=\"删除\" showShortcut={!isMobile} />\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </>\n )\n}\n\nfunction MoreActionsDropdown({ editor }: DropdownMenuActionsProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" data-appearance=\"subdued\">\n <MoreVerticalIcon className=\"tiptap-button-icon\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuActions editor={editor} />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n// =============================================================================\n// Toolbar View Components\n// =============================================================================\n\ninterface ToolbarViewButtonProps {\n view: ToolbarViewType\n isMobile: boolean\n onViewChange: (viewId: ToolbarViewId) => void\n}\n\nfunction ToolbarViewButton({\n view,\n isMobile,\n onViewChange,\n}: ToolbarViewButtonProps) {\n const viewId = view.id as Exclude<ToolbarViewId, typeof TOOLBAR_VIEWS.MAIN>\n\n if (isMobile) {\n return view.mobileButton ? (\n cloneElement(\n view.mobileButton(() => onViewChange(viewId)) as React.ReactElement,\n { key: view.id }\n )\n ) : (\n <Button key={view.id} onClick={() => onViewChange(viewId)}>\n {view.icon}\n </Button>\n )\n }\n\n return view.desktopComponent\n ? cloneElement(view.desktopComponent as React.ReactElement, {\n key: view.id,\n })\n : null\n}\n\ninterface ToolbarViewsGroupProps {\n toolbarViews: ToolbarViewRegistry\n isMobile: boolean\n onViewChange: (viewId: ToolbarViewId) => void\n editor: Editor | null\n}\n\nfunction ToolbarViewsGroup({\n toolbarViews,\n isMobile,\n onViewChange,\n editor,\n}: ToolbarViewsGroupProps) {\n const visibleViews = Object.values(toolbarViews).filter((view) => {\n if (!view.shouldShow) return true\n return view.shouldShow(editor)\n })\n\n if (visibleViews.length === 0) return null\n\n return (\n <>\n {visibleViews.map((view) => (\n <ToolbarViewButton\n key={view.id}\n view={view}\n isMobile={isMobile}\n onViewChange={onViewChange}\n />\n ))}\n\n <ToolbarSeparator />\n </>\n )\n}\n\n// =============================================================================\n// Main Toolbar Content\n// =============================================================================\n\ninterface MainToolbarContentProps {\n editor: Editor | null\n isMobile: boolean\n toolbarViews: ToolbarViewRegistry\n onViewChange: (viewId: ToolbarViewId) => void\n}\n\nfunction MainToolbarContent({\n editor,\n isMobile,\n toolbarViews,\n onViewChange,\n}: MainToolbarContentProps) {\n const hasSelection = hasTextSelection(editor)\n const hasContent = (editor?.getText().length ?? 0) > 0\n\n return (\n <>\n <ToolbarGroup>\n <SlashCommandTriggerButton />\n <MoreActionsDropdown editor={editor} />\n\n <ToolbarSeparator />\n </ToolbarGroup>\n\n {(hasSelection || hasContent) && (\n <>\n <FormattingGroup />\n\n <ToolbarViewsGroup\n toolbarViews={toolbarViews}\n isMobile={isMobile}\n onViewChange={onViewChange}\n editor={editor}\n />\n\n <ImageNodeFloating />\n\n <ScriptGroup />\n\n <AlignmentGroup />\n\n <IndentGroup />\n\n <ToolbarGroup>\n <ImageUploadButton text=\"添加\" />\n <MediaUploadButton kind=\"video\" hideWhenUnavailable />\n <MediaUploadButton kind=\"audio\" hideWhenUnavailable />\n <MediaUploadButton kind=\"file\" hideWhenUnavailable />\n <ToolbarSeparator />\n </ToolbarGroup>\n </>\n )}\n\n <ToolbarGroup>\n <MoveNodeButton direction=\"down\" />\n <MoveNodeButton direction=\"up\" />\n </ToolbarGroup>\n </>\n )\n}\n\n// =============================================================================\n// Specialized Toolbar Content\n// =============================================================================\n\ninterface SpecializedToolbarContentProps {\n view: ToolbarViewType\n onBack: () => void\n}\n\nfunction SpecializedToolbarContent({\n view,\n onBack,\n}: SpecializedToolbarContentProps) {\n return (\n <>\n <ToolbarGroup>\n <Button variant=\"ghost\" onClick={onBack}>\n <ArrowLeftIcon className=\"tiptap-button-icon\" />\n {view.icon}\n </Button>\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n {view.content}\n </>\n )\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\nexport interface MobileToolbarProps {\n editor?: Editor | null\n}\n\nexport function MobileToolbar({ editor: providedEditor }: MobileToolbarProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint(\"max\", 480)\n const toolbarRef = useRef<HTMLDivElement>(null)\n const toolbarState = useToolbarState(isMobile)\n const toolbarViews = useMemo(() => createToolbarViewRegistry(), [])\n\n const currentView = toolbarState.isMainView\n ? null\n : toolbarViews[\n toolbarState.viewId as Exclude<ToolbarViewId, typeof TOOLBAR_VIEWS.MAIN>\n ]\n\n const { height } = useWindowSize()\n const rect = useCursorVisibility({\n editor,\n overlayHeight: toolbarRef.current?.getBoundingClientRect().height ?? 0,\n })\n\n if (!isMobile || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Toolbar\n ref={toolbarRef}\n style={{\n ...(isMobile\n ? {\n bottom: `calc(100% - ${height - rect.y}px)`,\n }\n : {}),\n }}\n >\n {toolbarState.isMainView ? (\n <MainToolbarContent\n editor={editor}\n isMobile={isMobile}\n toolbarViews={toolbarViews}\n onViewChange={toolbarState.showView}\n />\n ) : (\n currentView && (\n <SpecializedToolbarContent\n view={currentView}\n onBack={toolbarState.showMainView}\n />\n )\n )}\n </Toolbar>\n )\n}\n","import { useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useUiEditorState } from \"../../../hooks/use-ui-editor-state\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\nimport { useFloatingToolbarVisibility } from \"../../../hooks/use-floating-toolbar-visibility\"\n\n// --- Node ---\nimport { ImageNodeFloating } from \"../../tiptap-node/image-node/image-node-floating\"\n\n// --- Icons ---\nimport { MoreVerticalIcon } from \"../../tiptap-icons/more-vertical-icon\"\n\n// --- UI ---\nimport { ColorTextPopover } from \"../../tiptap-ui/color-text-popover\"\nimport { LinkPopover } from \"../../tiptap-ui/link-popover\"\nimport type { Mark } from \"../../tiptap-ui/mark-button\"\nimport { canToggleMark, MarkButton } from \"../../tiptap-ui/mark-button\"\nimport type { TextAlign } from \"../../tiptap-ui/text-align-button\"\nimport {\n canSetTextAlign,\n TextAlignButton,\n} from \"../../tiptap-ui/text-align-button\"\nimport { TurnIntoDropdown } from \"../../tiptap-ui/turn-into-dropdown\"\nimport { IndentButton } from \"../../tiptap-ui/indent-button\"\n\n// --- Utils ---\nimport { isSelectionValid } from \"../../../lib/tiptap-collab-utils\"\n\n// --- Primitive UI Components ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../tiptap-ui-primitive/popover\"\nimport {\n Toolbar,\n ToolbarGroup,\n ToolbarSeparator,\n} from \"../../tiptap-ui-primitive/toolbar\"\n\n// --- UI Utils ---\nimport { FloatingElement } from \"../../tiptap-ui-utils/floating-element\"\n\nexport function NotionToolbarFloating() {\n const { editor } = useTiptapEditor()\n const isMobile = useIsBreakpoint(\"max\", 480)\n const { lockDragHandle, commentInputVisible } = useUiEditorState(editor)\n\n const { shouldShow } = useFloatingToolbarVisibility({\n editor,\n isSelectionValid,\n extraHideWhen: Boolean(commentInputVisible),\n })\n\n if (lockDragHandle || isMobile) return null\n\n return (\n <FloatingElement shouldShow={shouldShow}>\n <Toolbar variant=\"floating\">\n <ToolbarGroup>\n <TurnIntoDropdown hideWhenUnavailable={true} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"bold\" hideWhenUnavailable={true} />\n <MarkButton type=\"italic\" hideWhenUnavailable={true} />\n <MarkButton type=\"underline\" hideWhenUnavailable={true} />\n <MarkButton type=\"strike\" hideWhenUnavailable={true} />\n <MarkButton type=\"code\" hideWhenUnavailable={true} />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <ImageNodeFloating />\n </ToolbarGroup>\n\n <ToolbarGroup>\n <LinkPopover\n autoOpenOnLinkActive={false}\n hideWhenUnavailable={true}\n />\n <ColorTextPopover hideWhenUnavailable={true} />\n </ToolbarGroup>\n\n <MoreOptions hideWhenUnavailable={true} />\n </Toolbar>\n </FloatingElement>\n )\n}\n\nfunction canMoreOptions(editor: Editor | null): boolean {\n if (!editor) {\n return false\n }\n\n const canTextAlignAny = [\"left\", \"center\", \"right\", \"justify\"].some((align) =>\n canSetTextAlign(editor, align as TextAlign)\n )\n\n const canMarkAny = [\"superscript\", \"subscript\"].some((type) =>\n canToggleMark(editor, type as Mark)\n )\n\n return canMarkAny || canTextAlignAny\n}\n\nfunction shouldShowMoreOptions(params: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = params\n\n if (!editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canMoreOptions(editor)\n }\n\n return Boolean(editor?.isEditable)\n}\n\nexport interface MoreOptionsProps extends Omit<ButtonProps, \"type\"> {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the dropdown when no options are available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport function MoreOptions({\n editor: providedEditor,\n hideWhenUnavailable = false,\n ...props\n}: MoreOptionsProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [show, setShow] = useState(false)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setShow(\n shouldShowMoreOptions({\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 if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <>\n <ToolbarSeparator />\n <ToolbarGroup>\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n tooltip=\"更多选项\"\n {...props}\n >\n <MoreVerticalIcon className=\"tiptap-button-icon\" />\n </Button>\n </PopoverTrigger>\n\n <PopoverContent\n side=\"top\"\n align=\"end\"\n alignOffset={4}\n sideOffset={4}\n asChild\n >\n <Toolbar variant=\"floating\" tabIndex={0}>\n <ToolbarGroup>\n <MarkButton type=\"superscript\" />\n <MarkButton type=\"subscript\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <TextAlignButton align=\"left\" />\n <TextAlignButton align=\"center\" />\n <TextAlignButton align=\"right\" />\n <TextAlignButton align=\"justify\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <IndentButton action=\"outdent\" />\n <IndentButton action=\"indent\" />\n </ToolbarGroup>\n </Toolbar>\n </PopoverContent>\n </Popover>\n </ToolbarGroup>\n </>\n )\n}\n","import \"./setup-error-message.scss\"\nimport { Button } from \"../../../tiptap-ui-primitive/button\"\nimport { ExternalLinkIcon } from \"../../../tiptap-icons/external-link-icon\"\n\nexport interface SetupErrorMessageProps {\n collabSetupError: boolean\n}\n\nexport function SetupErrorMessage({\n collabSetupError,\n}: SetupErrorMessageProps) {\n const guideUrl =\n \"https://tiptap.dev/docs/ui-components/templates/notion-like-editor\"\n\n const environmentVariables: Array<{\n name: string\n description: string\n }> = []\n\n if (collabSetupError) {\n environmentVariables.push(\n {\n name: \"TIPTAP_COLLAB_DOC_PREFIX\",\n description: \"用于标识协作文档的前缀\",\n },\n {\n name: \"TIPTAP_COLLAB_APP_ID\",\n description: \"你的文档服务 App ID\",\n },\n {\n name: \"TIPTAP_COLLAB_TOKEN\",\n description: \"用于访问协作服务的 JWT token(请勿在生产环境使用)\",\n }\n )\n }\n\n const handleOpenGuide = () => {\n window.open(guideUrl, \"_blank\")\n }\n\n return (\n <div className=\"tiptap-setup-error\" role=\"alert\" aria-live=\"assertive\">\n <div className=\"tiptap-setup-error__container\">\n <div className=\"tiptap-setup-error__content\">\n <h2 className=\"tiptap-setup-error__title\">\n 需要配置环境变量\n </h2>\n <p className=\"tiptap-setup-error__message\">\n 请配置环境变量以连接到 Tiptap Cloud。\n </p>\n\n <div className=\"tiptap-setup-error__variables\">\n <ul className=\"tiptap-setup-error__variables-list\">\n {environmentVariables.map((envVar) => (\n <li key={envVar.name} className=\"tiptap-setup-error__variable\">\n <code className=\"tiptap-setup-error__variable-name\">\n {envVar.name}\n </code>\n <span className=\"tiptap-setup-error__variable-description\">\n {envVar.description}\n </span>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"tiptap-setup-error__actions\">\n <Button\n data-style=\"primary\"\n className=\"tiptap-setup-error__button\"\n onClick={handleOpenGuide}\n >\n <span className=\"tiptap-button-text\">查看配置指南</span>\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useCallback, useMemo, useEffect, useRef, useState } from \"react\"\n\nimport { cn } from \"../../../../../lib/tiptap-utils\"\nimport {\n getScrollableAncestor,\n useToc,\n} from \"../../context/toc-context\"\nimport type {\n TableOfContentData,\n TableOfContentDataItem,\n} from \"@tiptap/extension-table-of-contents\"\n\nimport \"./toc-sidebar.scss\"\n\nexport interface TocSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The maximum number of headings to show in the TOC.\n * @default 20\n */\n maxShowCount?: number\n /**\n * Offset from the top of the editor container (in pixels).\n * @default 0\n */\n topOffset?: number\n}\n\nexport function TocSidebar({\n className,\n maxShowCount = 20,\n topOffset = 0,\n ...props\n}: TocSidebarProps) {\n const { tocContent, navigateToHeading, normalizeHeadingDepths } = useToc()\n const hasRestoredHashRef = useRef(false)\n\n // Track when a click happened so we can ignore scroll events\n // caused by our own programmatic scrolling for a short time.\n const lastClickTimeRef = useRef<number | null>(null)\n\n // Manual active id (from user clicks). This should override scroll-based\n // and selection-based active states while it's set.\n const [manualActiveId, setManualActiveId] = useState<string | null>(null)\n\n const headingList = useMemo<TableOfContentData>(\n () => tocContent ?? [],\n [tocContent]\n )\n\n const visibleHeadings = useMemo(\n () => headingList.slice(0, maxShowCount),\n [headingList, maxShowCount]\n )\n\n const normalizedDepths = useMemo(\n () => normalizeHeadingDepths(visibleHeadings),\n [visibleHeadings, normalizeHeadingDepths]\n )\n\n const depthById = useMemo(() => {\n const map = new Map<string, number>()\n visibleHeadings.forEach((h, index) => {\n map.set(h.id, normalizedDepths[index] ?? 1)\n })\n return map\n }, [visibleHeadings, normalizedDepths])\n\n // Scroll-based highlighted heading (using isActive)\n const highlightedHeading = useMemo<TableOfContentDataItem | null>(\n () => [...headingList].reverse().find((h) => h.isActive) ?? null,\n [headingList]\n )\n\n // Selection-based active heading (isActive)\n const selectionActiveId = useMemo(\n () => headingList.find((h) => h.isActive)?.id ?? null,\n [headingList]\n )\n\n // Decide which heading is \"active\" for UI purposes\n const activeContentId = useMemo(() => {\n // 1. User clicked something: manual always wins.\n if (manualActiveId) {\n return manualActiveId\n }\n\n // 2. Scroll-highlighted heading (extension scroll logic).\n if (highlightedHeading?.id) {\n return highlightedHeading.id\n }\n\n // 3. Selection-based active heading (cursor).\n if (selectionActiveId) {\n return selectionActiveId\n }\n\n // 4. Fallback to first heading.\n return headingList[0]?.id\n }, [manualActiveId, highlightedHeading, selectionActiveId, headingList])\n\n const handleContentClick = useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>, item: TableOfContentDataItem) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Mark this heading as manually active\n setManualActiveId(item.id)\n lastClickTimeRef.current = Date.now()\n\n navigateToHeading(item, { topOffset })\n },\n [navigateToHeading, topOffset]\n )\n\n /**\n * Highlight the correct TOC entry when the page loads with a hash.\n * Actual scrolling / selection is handled by useScrollToHash — we only\n * need to set the manual-active marker so the sidebar UI matches.\n */\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n hasRestoredHashRef.current ||\n !headingList.length\n ) {\n return\n }\n\n const hash = window.location.hash.replace(/^#/, \"\")\n if (!hash) return\n\n const target = headingList.find((h) => h.id === hash)\n if (target) {\n setManualActiveId(target.id)\n hasRestoredHashRef.current = true\n }\n }, [headingList])\n\n const sidebarRef = useRef<HTMLDivElement>(null)\n\n // Keep a ref in sync so the scroll handler can read the latest value\n // without being recreated on every manualActiveId change.\n const manualActiveIdRef = useRef(manualActiveId)\n manualActiveIdRef.current = manualActiveId\n\n /**\n * Clear manual active id when the user actually scrolls\n * (but ignore the scroll events that immediately follow our own\n * programmatic scroll from a click).\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return\n\n const handleScroll = () => {\n const now = Date.now()\n const lastClickTime = lastClickTimeRef.current\n\n // Ignore scroll events within 500ms of a click\n if (lastClickTime && now - lastClickTime < 500) {\n return\n }\n\n // User is scrolling manually now; go back to scroll-based logic.\n if (manualActiveIdRef.current !== null) {\n setManualActiveId(null)\n }\n }\n\n // Find the scrollable ancestor to also listen on it\n const scrollTarget = sidebarRef.current\n ? getScrollableAncestor(sidebarRef.current)\n : null\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true })\n\n // If the scrollable ancestor is not the window, listen on it too\n if (scrollTarget && !(scrollTarget instanceof Window)) {\n scrollTarget.addEventListener(\"scroll\", handleScroll, { passive: true })\n }\n\n return () => {\n window.removeEventListener(\"scroll\", handleScroll)\n if (scrollTarget && !(scrollTarget instanceof Window)) {\n scrollTarget.removeEventListener(\"scroll\", handleScroll)\n }\n }\n }, [])\n\n const hasHeadings = headingList.length > 0\n\n return (\n <div ref={sidebarRef} className={cn(\"toc-sidebar\", className)} {...props}>\n <div className=\"toc-sidebar-wrapper\">\n <div className=\"toc-sidebar-inner\">\n {/* Progress rail */}\n <div className=\"toc-sidebar-progress\">\n {visibleHeadings.map((item) => {\n const depth = depthById.get(item.id) ?? 1\n const isActive = activeContentId === item.id\n\n return (\n <div\n key={item.id}\n className={cn(\n \"toc-sidebar-progress-line\",\n isActive && \"toc-sidebar-progress-line--active\"\n )}\n data-depth={depth}\n style={{ \"--toc-depth\": depth } as React.CSSProperties}\n />\n )\n })}\n </div>\n\n {/* TOC nav */}\n <nav\n className={cn(\n \"toc-sidebar-nav\",\n !hasHeadings && \"toc-sidebar-nav--hidden\"\n )}\n aria-label=\"目录\"\n >\n <div className=\"toc-sidebar-popover\">\n {visibleHeadings.map((item) => {\n const depth = depthById.get(item.id) ?? 1\n const isActive = activeContentId === item.id\n\n return (\n <a\n key={item.id}\n href={`#${item.id}`}\n rel=\"noopener noreferrer\"\n className={cn(\n \"toc-sidebar-item notranslate\",\n isActive && \"toc-sidebar-item--active\"\n )}\n data-depth={depth}\n style={{ \"--toc-depth\": depth } as React.CSSProperties}\n onClick={(e) => handleContentClick(e, item)}\n aria-current={isActive ? \"location\" : undefined}\n >\n {item.textContent}\n </a>\n )\n })}\n </div>\n </nav>\n </div>\n </div>\n </div>\n )\n}\n","import type { Editor } from \"@tiptap/core\"\nimport { Extension } from \"@tiptap/core\"\nimport { canJoin } from \"@tiptap/pm/transform\"\nimport { TextSelection } from \"@tiptap/pm/state\"\n\n/**\n * ListNormalization Extension\n *\n * This extension solves the \"stuck vertical spacing\" problem that occurs when working\n * with lists in Tiptap editor.\n *\n * ## The Problem\n *\n * By default, Tiptap treats each list as a separate structural node. When a user\n * presses Enter twice at the end of a list item, they exit the list and a new\n * paragraph is created between two list blocks:\n *\n * ```html\n * <ul>\n * <li>Task A</li>\n * </ul>\n *\n * <p></p> <!-- Empty paragraph created on double-enter -->\n *\n * <ul>\n * <li>Task B</li>\n * </ul>\n * ```\n *\n * When the user tries to backspace this empty paragraph, Tiptap deletes the paragraph\n * but does NOT automatically merge the two <ul> blocks back into one list. This results\n * in visual \"stuck\" vertical spacing that users cannot remove, which feels broken.\n */\nexport const ListNormalizationExtension = Extension.create({\n name: \"listNormalization\",\n\n addKeyboardShortcuts() {\n const listTypes = [\"bulletList\", \"orderedList\", \"taskList\"]\n\n const handleBackspace = ({ editor }: { editor: Editor }) => {\n const { state, view } = editor\n const { selection } = state\n const { $from, empty } = selection\n\n if (!empty) return false\n if ($from.parentOffset !== 0) return false\n\n const currentNode = $from.parent\n\n if (\n currentNode.type.name !== \"paragraph\" ||\n currentNode.content.size > 0\n ) {\n return false\n }\n\n const parentDepth = $from.depth - 1\n if (parentDepth < 0) return false\n\n const parent = $from.node(parentDepth)\n const indexInParent = $from.index(parentDepth)\n\n if (indexInParent === 0 || indexInParent >= parent.childCount - 1) {\n return false\n }\n\n const nodeBefore = parent.child(indexInParent - 1)\n const nodeAfter = parent.child(indexInParent + 1)\n\n const isBeforeList = listTypes.includes(nodeBefore.type.name)\n const isAfterList = listTypes.includes(nodeAfter.type.name)\n\n if (!isBeforeList || !isAfterList) {\n return false\n }\n\n if (nodeBefore.type.name !== nodeAfter.type.name) {\n return false\n }\n\n const startOfPara = $from.before(parentDepth + 1)\n const endOfPara = $from.after(parentDepth + 1)\n\n const $insideFirstList = state.doc.resolve(startOfPara - 1)\n const targetSelection = TextSelection.findFrom($insideFirstList, -1, true)\n\n if (!targetSelection) {\n return false\n }\n\n const cursorTargetPos = targetSelection.from\n\n const tr = state.tr\n\n tr.delete(startOfPara, endOfPara)\n\n if (canJoin(tr.doc, startOfPara)) {\n tr.join(startOfPara)\n }\n\n const mappedPos = tr.mapping.map(cursorTargetPos)\n tr.setSelection(TextSelection.create(tr.doc, mappedPos))\n\n view.dispatch(tr)\n return true\n }\n\n return {\n Backspace: handleBackspace,\n }\n },\n})\n","import { Extension } from \"@tiptap/core\"\nimport {\n Plugin,\n PluginKey,\n type EditorState,\n type Transaction,\n} from \"@tiptap/pm/state\"\nimport {\n clamp,\n getSelectedNodesOfType,\n updateNodesAttr,\n} from \"../../lib/tiptap-utils\"\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n indent: {\n /**\n * Increase the indent level of the selected blocks by 1.\n * In lists, nests the list item under the previous sibling.\n */\n indent: () => ReturnType\n /**\n * Decrease the indent level of the selected blocks by 1.\n * In lists, lifts the list item out of its parent.\n */\n outdent: () => ReturnType\n /**\n * Set the indent level of the selected blocks to a specific value.\n */\n setIndent: (level: number) => ReturnType\n /**\n * Remove indentation from the selected blocks.\n */\n unsetIndent: () => ReturnType\n }\n }\n}\nexport interface IndentOptions {\n /**\n * Block node types that support indentation.\n * List items are handled separately via sinkListItem/liftListItem.\n * @default [\"paragraph\", \"heading\", \"blockquote\"]\n */\n types: string[]\n\n /**\n * Node types that are treated as list items.\n * When the cursor is inside one of these, indent/outdent delegates to\n * sinkListItem/liftListItem instead of applying block-level indent.\n * @default [\"listItem\", \"taskItem\"]\n */\n listItemTypes: string[]\n\n /**\n * Minimum indent level.\n * @default 0\n */\n minLevel: number\n\n /**\n * Maximum indent level.\n * @default 8\n */\n maxLevel: number\n\n /**\n * Use inline style instead of data attribute.\n * When false, only the `data-indent` attribute is set — use CSS to style indentation.\n * When true, adds `style=\"margin-left: {level * indentUnit}px\"` for immediate visual feedback.\n * @default false\n */\n useStyle?: boolean\n\n /**\n * Pixels per indent level when useStyle is enabled.\n * @default 24\n */\n indentUnit: number\n}\n\n/**\n * Parse an indent level from an HTML element by checking:\n * 1. Our own `data-indent` attribute (canonical source).\n * 2. Common CSS properties used by external editors like Google Docs and Word\n * (`margin-left`, `padding-left`, `text-indent`).\n *\n * Returns 0 when no indentation is detected.\n */\nexport function parseIndentLevel(\n element: HTMLElement,\n minLevel: number,\n maxLevel: number,\n indentUnit: number\n): number {\n // Our own attribute — check first\n const dataIndent = element.getAttribute(\"data-indent\")\n if (dataIndent) {\n const level = parseInt(dataIndent, 10)\n if (!isNaN(level)) {\n return clamp(level, minLevel, maxLevel)\n }\n }\n\n // Fallback: CSS properties that external editors use for indentation\n const cssProps = [\"marginLeft\", \"paddingLeft\", \"textIndent\"] as const\n for (const prop of cssProps) {\n const value = element.style?.[prop]\n if (value) {\n const px = parseFloat(value)\n if (!isNaN(px) && px > 0 && indentUnit > 0) {\n const level = Math.round(px / indentUnit)\n return clamp(level, minLevel, maxLevel)\n }\n }\n }\n\n return 0\n}\n\n/**\n * Walk up the document tree from the cursor and return the first list-item\n * node name found, or `null` if the cursor is not inside a list.\n */\nexport function getListItemName(\n state: EditorState,\n listItemTypes: Set<string>\n): string | null {\n const { $from } = state.selection\n for (let depth = $from.depth; depth > 0; depth--) {\n const name = $from.node(depth).type.name\n if (listItemTypes.has(name)) {\n return name\n }\n }\n return null\n}\n\n/**\n * Shared check for the Enter and Backspace shortcuts.\n *\n * Both keys should trigger an outdent when the cursor is:\n * - in a non-list block that supports indentation\n * - the block has indent > 0\n *\n * The difference:\n * - **Enter**: fires when the block is completely empty (user pressed Enter\n * on a blank indented line — behaves like Google Docs).\n * - **Backspace**: fires when the cursor is at the very start of the block\n * (the block can still have content).\n */\nfunction shouldOutdentAtCursor(\n state: EditorState,\n types: string[],\n listItemTypes: Set<string>,\n options: { onlyIfEmpty: boolean }\n): boolean {\n const { selection } = state\n const { $from } = selection\n\n // Only applies to collapsed cursors (no range selected)\n if (!selection.empty) return false\n\n // Lists have their own indent/outdent via sink/lift — skip\n if (getListItemName(state, listItemTypes) !== null) return false\n\n const parent = $from.parent\n\n // Must be one of the block types we handle\n if (!types.includes(parent.type.name)) return false\n\n // Must already be indented\n if ((parent.attrs.indent as number) <= 0) return false\n\n if (options.onlyIfEmpty) {\n // Enter: only outdent if the block has no content\n return parent.content.size === 0\n }\n\n // Backspace: only outdent if the cursor is at position 0 in the block\n return $from.parentOffset === 0\n}\n\nconst indentPluginKey = new PluginKey(\"indent\")\n\nexport const Indent = Extension.create<IndentOptions>({\n name: \"indent\",\n\n addOptions() {\n return {\n types: [\"paragraph\", \"heading\", \"blockquote\"],\n listItemTypes: [\"listItem\", \"taskItem\"],\n minLevel: 0,\n maxLevel: 8,\n useStyle: false,\n indentUnit: 24,\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: 0,\n\n parseHTML: (element) => {\n return parseIndentLevel(\n element,\n this.options.minLevel,\n this.options.maxLevel,\n this.options.indentUnit\n )\n },\n\n renderHTML: (attributes) => {\n const level = Number(attributes.indent) || 0\n if (level === 0) return {}\n\n const attrs: Record<string, string> = {\n \"data-indent\": String(level),\n style: `--tt-indent-level: ${level}`,\n }\n\n if (this.options.useStyle && this.options.indentUnit > 0) {\n attrs.style = `--tt-indent-level: ${level}; margin-left: ${level * this.options.indentUnit}px`\n }\n\n return attrs\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n const listItemTypesSet = new Set(this.options.listItemTypes)\n\n /**\n * Core helper — finds every selected block that supports indentation\n * and applies a `resolve` function to compute the new indent level.\n *\n * Examples:\n * applyIndent(props, (cur) => cur + 1) // indent\n * applyIndent(props, (cur) => cur - 1) // outdent\n * applyIndent(props, () => 3) // set to 3\n * applyIndent(props, () => 0) // reset\n */\n const applyIndent = (\n { state, tr }: { state: EditorState; tr: Transaction },\n resolve: (currentLevel: number) => number\n ) => {\n const targets = getSelectedNodesOfType(\n state.selection,\n this.options.types\n )\n if (targets.length === 0) return false\n\n return updateNodesAttr(tr, targets, \"indent\", (prev) => {\n return clamp(\n resolve(Number(prev) || 0),\n this.options.minLevel,\n this.options.maxLevel\n )\n })\n }\n\n return {\n indent: () => (props) => {\n // Lists use their own nesting mechanism (sink)\n const listItemName = getListItemName(props.state, listItemTypesSet)\n if (listItemName && \"sinkListItem\" in props.commands) {\n return props.commands.sinkListItem(listItemName)\n }\n\n return applyIndent(props, (current) => current + 1)\n },\n\n outdent: () => (props) => {\n // Lists use their own nesting mechanism (lift)\n const listItemName = getListItemName(props.state, listItemTypesSet)\n if (listItemName && \"liftListItem\" in props.commands) {\n return props.commands.liftListItem(listItemName)\n }\n\n return applyIndent(props, (current) => current - 1)\n },\n\n setIndent: (level: number) => (props) => {\n return applyIndent(props, () => level)\n },\n\n unsetIndent: () => (props) => {\n return applyIndent(props, () => 0)\n },\n }\n },\n\n addProseMirrorPlugins() {\n const types = this.options.types\n\n return [\n new Plugin({\n key: indentPluginKey,\n\n /**\n * After a drag-and-drop, adjust the indent of the dropped blocks so\n * they match their new neighbours. Without this, dragging an indented\n * paragraph to a non-indented area would keep the old indent level.\n */\n appendTransaction(\n transactions: readonly Transaction[],\n _oldState: EditorState,\n newState: EditorState\n ) {\n const isDrop = transactions.some(\n (tr) => tr.getMeta(\"uiEvent\") === \"drop\"\n )\n if (!isDrop) return null\n\n const { doc, selection } = newState\n const { $from, $to } = selection\n\n // --- Figure out what indent level the drop target has ---\n\n const depth = $from.depth > 0 ? $from.depth : 1\n const dropBlockStart = $from.before(depth)\n const $drop = doc.resolve(dropBlockStart)\n const parent = $drop.node($drop.depth)\n const index = $drop.index($drop.depth)\n\n let targetIndent = 0\n\n if (index > 0) {\n // Use the previous sibling's indent\n const prevSibling = parent.child(index - 1)\n targetIndent = (prevSibling.attrs.indent as number) || 0\n } else {\n // First child — look at the next sibling after the dropped content\n const endDepth = $to.depth > 0 ? $to.depth : 1\n const dropBlockEnd = $to.after(endDepth)\n const $afterDrop = doc.resolve(dropBlockEnd)\n const afterIndex = $afterDrop.indexAfter($afterDrop.depth)\n const afterParent = $afterDrop.node($afterDrop.depth)\n\n if (afterIndex < afterParent.childCount) {\n targetIndent =\n (afterParent.child(afterIndex).attrs.indent as number) || 0\n }\n }\n\n // --- Apply that indent to every dropped block ---\n\n const { tr } = newState\n let changed = false\n\n doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (!types.includes(node.type.name)) return false\n\n const currentIndent = (node.attrs.indent as number) || 0\n if (currentIndent === targetIndent) return false\n\n tr.setNodeMarkup(\n pos,\n undefined,\n { ...node.attrs, indent: targetIndent },\n node.marks\n )\n changed = true\n return false\n })\n\n return changed ? tr : null\n },\n }),\n ]\n },\n\n addKeyboardShortcuts() {\n const listItemTypesSet = new Set(this.options.listItemTypes)\n\n /**\n * Check whether the cursor is in a context where indent/outdent applies.\n * Returns `true` for indentable block types and list items, `false` for\n * nodes that handle Tab themselves (e.g. codeBlock).\n */\n const isIndentableContext = (): boolean => {\n const state = this.editor.state\n\n // List items use sink/lift — always an indentable context\n if (getListItemName(state, listItemTypesSet) !== null) return true\n\n // Check if the parent block is one of the configured types\n const { $from } = state.selection\n return this.options.types.includes($from.parent.type.name)\n }\n\n return {\n // Tab / Shift-Tab — only capture when in an indentable context,\n // otherwise let other extensions handle it (e.g. codeBlock inserts a tab)\n Tab: () => {\n if (!isIndentableContext()) return false\n this.editor.commands.indent()\n return true\n },\n \"Shift-Tab\": () => {\n if (!isIndentableContext()) return false\n this.editor.commands.outdent()\n return true\n },\n\n // Enter on an empty indented block → outdent\n Enter: ({ editor }) => {\n if (\n !shouldOutdentAtCursor(\n editor.state,\n this.options.types,\n listItemTypesSet,\n {\n onlyIfEmpty: true,\n }\n )\n ) {\n return false\n }\n return editor.commands.outdent()\n },\n\n // Backspace at the start of an indented block → outdent\n Backspace: ({ editor }) => {\n if (\n !shouldOutdentAtCursor(\n editor.state,\n this.options.types,\n listItemTypesSet,\n {\n onlyIfEmpty: false,\n }\n )\n ) {\n return false\n }\n return editor.commands.outdent()\n },\n }\n },\n})\n","import { useContext, useEffect, useMemo } from \"react\"\nimport {\n EditorContent,\n EditorContext,\n useEditor,\n type Editor,\n type JSONContent,\n} from \"@tiptap/react\"\nimport type { Extensions } from \"@tiptap/core\"\n// 运行时值导入(非 type-only):ArticleViewer 需要 new YDoc() 自建本地文档\nimport { Doc as YDoc } from \"yjs\"\nimport { createPortal } from \"react-dom\"\nimport type { CollabProviderLike } from \"../../../contexts/editor-config-context\"\n\n// --- Tiptap Core Extensions ---\nimport { StarterKit } from \"@tiptap/starter-kit\"\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\"\nimport { createLowlight, common } from \"lowlight\"\nimport { Mention } from \"@tiptap/extension-mention\"\nimport { TaskList, TaskItem } from \"@tiptap/extension-list\"\nimport { Color, TextStyle } from \"@tiptap/extension-text-style\"\nimport { Placeholder, Selection } from \"@tiptap/extensions\"\nimport { Collaboration, isChangeOrigin } from \"@tiptap/extension-collaboration\"\nimport { CollaborationCaret } from \"@tiptap/extension-collaboration-caret\"\nimport { Typography } from \"@tiptap/extension-typography\"\nimport { Highlight } from \"@tiptap/extension-highlight\"\nimport { Superscript } from \"@tiptap/extension-superscript\"\nimport { Subscript } from \"@tiptap/extension-subscript\"\nimport { TextAlign } from \"@tiptap/extension-text-align\"\nimport { Mathematics } from \"@tiptap/extension-mathematics\"\nimport { UniqueID } from \"@tiptap/extension-unique-id\"\nimport { Emoji, gitHubEmojis } from \"@tiptap/extension-emoji\"\nimport {\n getHierarchicalIndexes,\n TableOfContents,\n} from \"@tiptap/extension-table-of-contents\"\n\n// --- Hooks ---\nimport { useScrollToHash } from \"../../tiptap-ui/copy-anchor-link-button/use-scroll-to-hash\"\n\n// --- Custom Extensions ---\nimport { HorizontalRule } from \"../../tiptap-node/horizontal-rule-node/horizontal-rule-node-extension\"\nimport { UiState } from \"../../tiptap-extension/ui-state-extension\"\nimport { Image } from \"../../tiptap-node/image-node/image-node-extension\"\nimport { NodeBackground } from \"../../tiptap-extension/node-background-extension\"\nimport { NodeAlignment } from \"../../tiptap-extension/node-alignment-extension\"\nimport { TocNode } from \"../../tiptap-node/toc-node/extensions/toc-node-extension\"\n\n// --- Tiptap Node ---\nimport { ImageUploadNode } from \"../../tiptap-node/image-upload-node/image-upload-node-extension\"\nimport { Video } from \"../../tiptap-node/video-node/video-node-extension\"\nimport { Audio } from \"../../tiptap-node/audio-node/audio-node-extension\"\nimport { FileAttachment } from \"../../tiptap-node/file-attachment-node/file-attachment-node-extension\"\nimport { MediaUploadPlaceholder } from \"../../tiptap-node/media-upload-placeholder-node/media-upload-placeholder-node-extension\"\nimport { Columns, Column } from \"../../tiptap-node/column-node/column-node-extension\"\nimport { PasteDropMedia } from \"../../tiptap-extension/paste-drop-media-extension\"\n\n// --- Table Node ---\nimport { TableKit } from \"../../tiptap-node/table-node/extensions/table-node-extension\"\nimport { TableHandleExtension } from \"../../tiptap-node/table-node/extensions/table-handle\"\nimport { TableHandle } from \"../../tiptap-node/table-node/ui/table-handle/table-handle\"\nimport { TableSelectionOverlay } from \"../../tiptap-node/table-node/ui/table-selection-overlay\"\nimport { TableCellHandleMenu } from \"../../tiptap-node/table-node/ui/table-cell-handle-menu\"\nimport { TableExtendRowColumnButtons } from \"../../tiptap-node/table-node/ui/table-extend-row-column-button\"\nimport \"../../tiptap-node/table-node/styles/prosemirror-table.scss\"\nimport \"../../tiptap-node/table-node/styles/table-node.scss\"\n\nimport \"../../tiptap-node/blockquote-node/blockquote-node.scss\"\nimport \"../../tiptap-node/code-block-node/code-block-node.scss\"\nimport \"../../tiptap-node/horizontal-rule-node/horizontal-rule-node.scss\"\nimport \"../../tiptap-node/list-node/list-node.scss\"\nimport \"../../tiptap-node/image-node/image-node.scss\"\nimport \"../../tiptap-node/video-node/video-node.scss\"\nimport \"../../tiptap-node/audio-node/audio-node.scss\"\nimport \"../../tiptap-node/file-attachment-node/file-attachment-node.scss\"\nimport \"../../tiptap-node/media-upload-placeholder-node/media-upload-placeholder-node.scss\"\nimport \"../../tiptap-node/column-node/column-node.scss\"\nimport \"../../tiptap-node/heading-node/heading-node.scss\"\nimport \"../../tiptap-node/paragraph-node/paragraph-node.scss\"\n\n// --- Tiptap UI ---\nimport { EmojiDropdownMenu } from \"../../tiptap-ui/emoji-dropdown-menu\"\nimport { MentionDropdownMenu } from \"../../tiptap-ui/mention-dropdown-menu\"\nimport { SlashDropdownMenu } from \"../../tiptap-ui/slash-dropdown-menu\"\nimport { DragContextMenu } from \"../../tiptap-ui/drag-context-menu\"\n\n// --- Contexts ---\nimport { UserProvider, useUser } from \"../../../contexts/user-context\"\nimport { CollabProvider, useCollab } from \"../../../contexts/collab-context\"\nimport { useEditorConfig } from \"../../../contexts/editor-config-context\"\n\n// --- Lib ---\nimport { handleImageUpload } from \"../../../lib/tiptap-utils\"\nimport { resolveMaxSize } from \"../../../contexts/editor-config-context\"\n\n// --- Styles ---\nimport \"./notion-like-editor.scss\"\n\n// --- Content ---\nimport { NotionEditorHeader } from \"./notion-like-editor-header\"\nimport { MobileToolbar } from \"./notion-like-editor-mobile-toolbar\"\nimport { NotionToolbarFloating } from \"./notion-like-editor-toolbar-floating\"\nimport { SetupErrorMessage } from \"./setup-error-message\"\nimport { TocSidebar } from \"../../tiptap-node/toc-node\"\nimport {\n TocProvider,\n useToc,\n} from \"../../tiptap-node/toc-node/context/toc-context\"\nimport { ListNormalizationExtension } from \"../../tiptap-extension/list-normalization-extension\"\nimport { Indent } from \"../../tiptap-extension/indent-extension\"\n\n// 代码块语法高亮:lowlight + common 语言集(一次创建,编辑器/viewer 共用)\nconst lowlight = createLowlight(common)\n\nexport interface NotionEditorProps {\n room: string\n placeholder?: string\n /**\n * 初始内容(HTML 字符串或 tiptap JSONContent)。\n * 仅在**非协同模式**(无 provider)下生效——业务方通过 HTTP 拿到文档内容后传入。\n * 协同模式下 yjs Doc 接管内容,传入会被忽略以免跟 sync 冲突。\n */\n content?: string | JSONContent\n /**\n * 只读模式:用于展示文章内容。设为 true 时编辑器不可编辑(editable:false),\n * 且隐藏所有编辑态 UI(头部工具栏、浮动工具栏、拖拽手柄、slash/mention/emoji\n * 菜单、移动端工具栏、表格手柄),仅保留内容与目录侧栏。\n * 扩展集与编辑态完全一致,保证自定义节点(图片/视频/附件/分栏/表格等)渲染像素一致。\n */\n readOnly?: boolean\n /**\n * 隐藏包内置顶部工具条(undo/redo、主题切换、协同用户,含底部分隔线)。\n * 业务方页面自带头部(如 wiki 编辑页的面包屑 + 操作区)时开启,\n * 避免出现第二条贴在标题下方的工具条。undo/redo 快捷键不受影响。\n */\n hideHeader?: boolean\n /**\n * 编辑器实例就绪回调。包不感知业务 store —— 业务方拿到 editor 实例后自行接管\n * (如写进 zustand store,发布时用 editor.getHTML()/getJSON() 取正文)。\n * 每次 editor 重建(如 room 切换触发 remount)都会带新实例再次回调。\n */\n onEditorReady?: (editor: Editor) => void\n /**\n * 追加的 tiptap 扩展,挂在包内置扩展集之后。\n *\n * 用于接入包不感知的能力(如 docx 导入、自定义节点),业务方按需注入。\n * 注意:注入的扩展会改变 schema —— 协同场景下所有客户端必须注入同一组,\n * 否则各端 schema 不一致,yjs 同步会出现内容被判为非法而丢弃。\n */\n extensions?: Extensions\n}\n\nexport interface EditorProviderProps {\n /**\n * 协同 provider,可以为 null。null 时退化到本地编辑(不挂 CollaborationCaret,\n * 但仍挂 Collaboration extension 以操作本地 yjs 文档)。\n */\n provider: CollabProviderLike | null\n ydoc: YDoc\n placeholder?: string\n /** 本地编辑模式下的初始/同步内容,详见 NotionEditorProps.content */\n content?: string | JSONContent\n /** 只读模式,详见 NotionEditorProps.readOnly */\n readOnly?: boolean\n /** 隐藏包内置顶部工具条,详见 NotionEditorProps.hideHeader */\n hideHeader?: boolean\n /**\n * 内嵌模式:用于把正文嵌进业务页面(ArticleViewer 场景)。\n * 开启后去掉编辑器整页 chrome —— 不渲染 TocSidebar,布局退化为单列铺满\n * (去掉左右大边距列与 708px 内容上限),内边距交给外层容器控制。\n * 与 readOnly 正交:`<NotionEditor readOnly>`(编辑器内预览)仍保留整页布局 + TOC。\n */\n embedded?: boolean\n /** editor 实例就绪回调,详见 NotionEditorProps.onEditorReady */\n onEditorReady?: (editor: Editor) => void\n /**\n * 追加的 tiptap 扩展,挂在包内置扩展集之后。\n *\n * 用于接入包不感知的能力(如 docx 导入、自定义节点),业务方按需注入。\n * 注意:注入的扩展会改变 schema —— 协同场景下所有客户端必须注入同一组,\n * 否则各端 schema 不一致,yjs 同步会出现内容被判为非法而丢弃。\n */\n extensions?: Extensions\n}\n\n/**\n * Loading spinner component shown while connecting to the notion server\n */\nexport function LoadingSpinner({ text = \"Connecting...\" }: { text?: string }) {\n return (\n <div className=\"spinner-container\">\n <div className=\"spinner-content\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <path d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <div className=\"spinner-loading-text\">{text}</div>\n </div>\n </div>\n )\n}\n\n/**\n * EditorContent component that renders the actual editor\n */\nexport function EditorContentArea() {\n const { editor } = useContext(EditorContext)!\n\n useScrollToHash()\n\n if (!editor) {\n return null\n }\n\n const isDragging = editor.storage.uiState?.isDragging ?? false\n // 只读模式(editable:false)下不渲染任何编辑态浮层:拖拽手柄 / slash·mention·emoji\n // 菜单 / 选中浮动工具栏 / 移动端工具栏。否则只读视图会冒出一堆无用按钮。\n const isEditable = editor.isEditable\n\n return (\n <EditorContent\n editor={editor}\n role=\"presentation\"\n className=\"notion-like-editor-content\"\n style={{\n cursor: isDragging ? \"grabbing\" : \"auto\",\n }}\n >\n {isEditable && (\n <>\n <DragContextMenu />\n <EmojiDropdownMenu />\n <MentionDropdownMenu />\n <SlashDropdownMenu />\n <NotionToolbarFloating />\n {createPortal(<MobileToolbar />, document.body)}\n </>\n )}\n </EditorContent>\n )\n}\n\n/**\n * Component that creates and provides the editor instance\n */\nexport function EditorProvider(props: EditorProviderProps) {\n const {\n provider,\n ydoc,\n placeholder = \"开始书写...\",\n content,\n readOnly = false,\n hideHeader = false,\n embedded = false,\n onEditorReady,\n extensions: extraExtensions,\n } = props\n\n const { user } = useUser()\n const { setTocContent } = useToc()\n const editorConfig = useEditorConfig()\n const onUpload = editorConfig?.upload?.onUpload ?? handleImageUpload\n const onUploadError =\n editorConfig?.upload?.onError ??\n ((error: Error) => console.error(\"Upload failed:\", error))\n const onRehostProgress = editorConfig?.upload?.onRehostProgress\n // 按类型分别取上限:业务侧 maxFileSizes > 旧 maxFileSize(仅对 image)> 默认值\n const imageMaxSize = resolveMaxSize(\"image\", editorConfig?.upload)\n const videoMaxSize = resolveMaxSize(\"video\", editorConfig?.upload)\n const audioMaxSize = resolveMaxSize(\"audio\", editorConfig?.upload)\n const fileMaxSize = resolveMaxSize(\"file\", editorConfig?.upload)\n\n const editor = useEditor({\n immediatelyRender: false,\n // 只读模式:禁用编辑。扩展集保持不变,自定义节点仍走各自 NodeView 渲染\n editable: !readOnly,\n // 仅本地编辑模式(无 provider)下用 content 作初始值;协同模式让 yjs sync 接管\n content: provider ? undefined : content,\n editorProps: {\n attributes: {\n class: \"notion-like-editor\",\n },\n },\n extensions: [\n StarterKit.configure({\n undoRedo: false,\n horizontalRule: false,\n // 关掉 StarterKit 自带的纯 codeBlock,换成带 lowlight 语法高亮的版本\n codeBlock: false,\n dropcursor: {\n width: 2,\n },\n link: { openOnClick: false },\n }),\n CodeBlockLowlight.configure({ lowlight }),\n HorizontalRule,\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n // Collaboration 可以无 provider 运行(仅操作本地 yjs doc),CollaborationCaret\n // 强依赖 provider.awareness,没 provider 时不挂以避免 runtime 崩。\n Collaboration.configure({ document: ydoc }),\n ...(provider\n ? [\n CollaborationCaret.configure({\n provider: provider as never,\n user: { id: user.id, name: user.name, color: user.color },\n }),\n ]\n : []),\n Placeholder.configure({\n placeholder,\n emptyNodeClass: \"is-empty with-slash\",\n }),\n Mention,\n Emoji.configure({\n emojis: gitHubEmojis.filter(\n (emoji) => !emoji.name.includes(\"regional\")\n ),\n forceFallbackImages: true,\n }),\n TableKit.configure({\n table: {\n resizable: true,\n cellMinWidth: 120,\n },\n }),\n NodeBackground.configure({\n types: [\n \"paragraph\",\n \"heading\",\n \"blockquote\",\n \"taskList\",\n \"bulletList\",\n \"orderedList\",\n \"tableCell\",\n \"tableHeader\",\n \"tocNode\",\n ],\n }),\n NodeAlignment,\n TextStyle,\n Mathematics,\n Superscript,\n Subscript,\n Indent,\n Color,\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Selection,\n Image,\n TableOfContents.configure({\n getIndex: getHierarchicalIndexes,\n onUpdate(content) {\n setTocContent(content)\n },\n }),\n TableHandleExtension,\n ListNormalizationExtension,\n ImageUploadNode.configure({\n accept: \"image/*\",\n maxSize: imageMaxSize,\n limit: 3,\n upload: onUpload,\n onError: onUploadError,\n }),\n Video,\n Audio,\n FileAttachment,\n MediaUploadPlaceholder,\n Columns,\n Column,\n // 编辑器整面:粘贴/拖拽 文件 → 自动按 mime 分发到 image/video/audio/fileAttachment 节点;\n // 拖拽外链图片 → XHR rehost 到自家 CDN\n PasteDropMedia.configure({\n upload: onUpload,\n maxFileSizes: {\n image: imageMaxSize,\n video: videoMaxSize,\n audio: audioMaxSize,\n file: fileMaxSize,\n },\n rehostExternalUrls: true,\n onError: onUploadError,\n onRehostProgress,\n }),\n UniqueID.configure({\n types: [\n \"table\",\n \"paragraph\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"heading\",\n \"blockquote\",\n \"codeBlock\",\n \"tocNode\",\n ],\n filterTransaction: (transaction) => !isChangeOrigin(transaction),\n }),\n Typography,\n UiState,\n TocNode.configure({\n topOffset: 48,\n }),\n // 业务方注入的扩展放在最后,可覆盖同名配置\n ...(extraExtensions ?? []),\n ],\n })\n\n // 本地编辑模式:content prop 在 mount 后异步变化时(业务方 HTTP 拿到内容才设进 store)\n // 同步到 editor。协同模式(provider 存在)让 yjs sync 接管,跳过避免冲突。\n useEffect(() => {\n if (provider) return\n if (!editor) return\n if (content === undefined || content === null || content === \"\") return\n // 比较当前 doc JSON 跟传入 content,避免无变化时的多余 setContent(会移动光标)\n const currentJson = JSON.stringify(editor.getJSON())\n const nextJson =\n typeof content === \"string\" ? null : JSON.stringify(content)\n if (nextJson && nextJson === currentJson) return\n\n // 推到微任务里再改文档,不在 effect 内同步调用。\n // setContent 会派发 PM 事务,tiptap 的 React NodeView 渲染器内部用 flushSync 把\n // 各 NodeView 同步渲染出来;而此刻 React 还在这次更新的提交阶段,于是报\n // \"flushSync was called from inside a lifecycle method\" 并**放弃**这次同步刷新,\n // NodeView 要晚一帧才出来。微任务在当前同步任务(含整个提交阶段)结束后立刻执行,\n // 同一帧内完成,肉眼无差别,但 React 已经退出提交阶段。\n let cancelled = false\n queueMicrotask(() => {\n // content 再次变化或组件卸载时,上一发已经过期;editor 也可能已销毁\n if (cancelled || editor.isDestroyed) return\n editor.commands.setContent(content)\n })\n return () => {\n cancelled = true\n }\n }, [content, editor, provider])\n\n // editor 实例就绪后回调业务方(如写进 store,发布时取正文)。每次 editor 重建都会触发。\n useEffect(() => {\n if (!editor) return\n onEditorReady?.(editor)\n }, [editor, onEditorReady])\n\n if (!editor) {\n return <LoadingSpinner />\n }\n\n // 只读模式隐藏头部工具栏与表格交互手柄(增删行列 / 拖拽 / 选区缩放)\n const isEditable = editor.isEditable\n const wrapperClassName = [\n \"notion-like-editor-wrapper\",\n !isEditable && \"notion-like-editor-wrapper--readonly\",\n embedded && \"notion-like-editor-wrapper--embedded\",\n ]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <div className={wrapperClassName}>\n <EditorContext.Provider value={{ editor }}>\n {isEditable && !hideHeader && <NotionEditorHeader />}\n <div className=\"notion-like-editor-layout\">\n <EditorContentArea />\n {/* 内嵌模式不渲染目录侧栏:嵌入方通常自带 TOC,避免重复 + 悬浮 TOC 轨 */}\n {!embedded && <TocSidebar topOffset={48} />}\n </div>\n\n {isEditable && (\n <>\n <TableExtendRowColumnButtons />\n <TableHandle />\n <TableSelectionOverlay\n showResizeHandles={true}\n cellMenu={(props) => (\n <TableCellHandleMenu\n editor={props.editor}\n onMouseDown={(e) => props.onResizeStart?.(\"br\")(e)}\n />\n )}\n />\n </>\n )}\n </EditorContext.Provider>\n </div>\n )\n}\n\n/**\n * Full editor with all necessary providers, ready to use with just a room ID\n */\nexport function NotionEditor({\n room,\n placeholder = \"开始书写...\",\n content,\n readOnly = false,\n hideHeader = false,\n onEditorReady,\n extensions,\n}: NotionEditorProps) {\n return (\n <UserProvider>\n <CollabProvider room={room}>\n <TocProvider>\n <NotionEditorContent\n placeholder={placeholder}\n content={content}\n readOnly={readOnly}\n hideHeader={hideHeader}\n onEditorReady={onEditorReady}\n extensions={extensions}\n />\n </TocProvider>\n </CollabProvider>\n </UserProvider>\n )\n}\n\n/**\n * Internal component that handles the editor loading state\n */\nexport function NotionEditorContent({\n placeholder,\n content,\n readOnly = false,\n hideHeader = false,\n onEditorReady,\n extensions,\n}: {\n placeholder?: string\n content?: string | JSONContent\n readOnly?: boolean\n hideHeader?: boolean\n onEditorReady?: (editor: Editor) => void\n /**\n * 追加的 tiptap 扩展,挂在包内置扩展集之后。\n *\n * 用于接入包不感知的能力(如 docx 导入、自定义节点),业务方按需注入。\n * 注意:注入的扩展会改变 schema —— 协同场景下所有客户端必须注入同一组,\n * 否则各端 schema 不一致,yjs 同步会出现内容被判为非法而丢弃。\n */\n extensions?: Extensions\n}) {\n const { provider, ydoc, hasCollab, setupError: collabSetupError } = useCollab()\n\n if (collabSetupError) {\n return <SetupErrorMessage collabSetupError={collabSetupError} />\n }\n\n // 协同启用但 provider 还没就绪(fetchToken 进行中)→ 显示 loading\n // 否则(hasCollab=false 本地模式 / hasCollab=true 且 provider 已就绪)→ 渲染\n if (hasCollab && !provider) {\n return <LoadingSpinner />\n }\n\n return (\n <EditorProvider\n provider={provider}\n ydoc={ydoc}\n placeholder={placeholder}\n content={content}\n readOnly={readOnly}\n hideHeader={hideHeader}\n onEditorReady={onEditorReady}\n extensions={extensions}\n />\n )\n}\n\nexport interface ArticleViewerProps {\n /** 文章内容(HTML 字符串或 tiptap JSONContent),通常由 HTTP 接口拉取后传入 */\n content?: string | JSONContent\n /** 空内容时的占位文案,默认空(viewer 一般不显示占位) */\n placeholder?: string\n}\n\n/**\n * 文章只读展示组件。\n *\n * 与 <NotionEditor readOnly> 的区别:\n * - 不需要 room,也不接入任何协同——刻意绕过 CollabProvider、自建本地 yjs Doc,\n * 保证 viewer 不会建立 websocket 连接(即使业务侧注入了 collab 配置)。\n * - 复用 EditorProvider 的完整扩展集 + readOnly,渲染结果与编辑器像素一致。\n *\n * 用法:<ArticleViewer content={articleContent} />\n */\nexport function ArticleViewer({ content, placeholder = \"\" }: ArticleViewerProps) {\n // 本地只读文档:viewer 不连协同,content 经 EditorProvider 的本地路径注入\n const ydoc = useMemo(() => new YDoc(), [])\n\n return (\n <UserProvider>\n <TocProvider>\n <EditorProvider\n provider={null}\n ydoc={ydoc}\n placeholder={placeholder}\n content={content}\n readOnly\n embedded\n />\n </TocProvider>\n </UserProvider>\n )\n}\n"]}