@zero-library/common 2.1.11 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +840 -323
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.mts +1452 -200
- package/dist/index.d.ts +1452 -200
- package/dist/index.esm.js +792 -290
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/File/styles.module.less","../src/components/File/AudioPlayer.tsx","../src/components/File/FileIcon.tsx","../src/components/File/VideoPlayer.tsx","../src/components/LazyComponent/index.tsx","../src/components/RenderMarkdown/index.tsx","../src/components/File/MarkdownPreview.tsx","../src/hooks/iframe/iframeRelay.ts","../src/utils/is.ts","../src/hooks/iframe/useIframeRelayBridge.ts","../src/hooks/useCreateValtioContext.tsx","../src/hooks/useDebounce.ts","../src/utils/common.ts","../src/hooks/useDeepEffect.ts","../src/hooks/useRefState.ts","../src/hooks/useSyncInput.ts","../src/hooks/useThrottle.ts","../src/utils/date.ts","../src/utils/local.ts","../src/utils/math.ts","../src/utils/theme.ts","../src/utils/message.ts","../src/utils/session.ts","../src/utils/request.ts","../src/hooks/webSocket/useWebSocket.ts","../src/components/File/PdfPreview.tsx","../src/components/File/FilePreview.tsx","../src/components/File/FilePreviewDrawer.tsx","../src/components/Iframe/styles.module.less","../src/components/Iframe/index.tsx","../src/components/MarkdownEditor/components/tiptap-extension/link-extension.ts","../src/components/MarkdownEditor/components/tiptap-extension/selection-extension.ts","../src/components/MarkdownEditor/components/tiptap-extension/trailing-node-extension.ts","../src/components/MarkdownEditor/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/button/button.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/spacer/spacer.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/separator/separator.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/components/MarkdownEditor/hooks/use-tiptap-editor.ts","../src/components/MarkdownEditor/components/tiptap-icons/chevron-down-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-icon.tsx","../src/components/MarkdownEditor/lib/tiptap-utils.ts","../src/components/MarkdownEditor/components/tiptap-icons/heading-five-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-four-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-one-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-six-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-three-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-two-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-button/heading-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx","../src/components/MarkdownEditor/hooks/use-menu-navigation.ts","../src/components/MarkdownEditor/components/tiptap-icons/ban-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/highlighter-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/popover/popover.tsx","../src/components/MarkdownEditor/components/tiptap-ui/highlight-button/highlight-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui/highlight-popover/highlight-popover.tsx","../src/components/MarkdownEditor/components/tiptap-icons/corner-down-left-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/external-link-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/link-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/trash-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/link-popover/link-popover.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-ordered-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-todo-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/list-button/list-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/MarkdownEditor/components/tiptap-icons/bold-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/code2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/italic-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/strike-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/subscript-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/superscript-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/underline-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/mark-button/mark-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/block-quote-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/code-block-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/node-button/node-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/quote-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/quote-button/quote-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-center-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-justify-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-left-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-right-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/text-align-button/text-align-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/redo2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/undo2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/undo-redo-button/undo-redo-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/arrow-left-icon.tsx","../src/components/MarkdownEditor/hooks/use-window-size.ts","../src/components/MarkdownEditor/hooks/use-cursor-visibility.ts","../src/components/MarkdownEditor/hooks/use-mobile.ts","../src/components/MarkdownEditor/extensions/pageNoNode.ts","../src/components/MarkdownEditor/extensions/searchAndReplace.ts","../src/components/MarkdownEditor/index.tsx","../src/components/RenderWrapper/index.tsx","../src/components/UserAvatar/index.tsx"],"names":["nsPreviewImage","nsPreviewPdf","pdfToolbar","nsPreviewVideo","nsPreviewAudio","jsx","jsxs","useMemo","md","error","useEffect","useRef","useState","useCallback","message","token","password","Toolbar","pageNo","Result","Flex","styles_module_default","iframe","classNames","Plugin","Extension","PluginKey","React","TooltipTrigger","TooltipContent","React2","Button","React3","React4","React5","React6","React7","React8","React9","React10","React11","React12","React13","React14","isNodeSelection","React15","Fragment","useFloating","offset","flip","shift","autoUpdate","useInteractions","useRole","useDismiss","useMergeRefs","FloatingPortal","React17","React18","React19","React20","React21","useClick","PopoverTrigger","PopoverContent","FloatingFocusManager","React22","React23","isDisabled","React24","React25","React26","React27","React28","React29","React30","React31","React32","React33","React34","React35","React36","React37","React38","React39","React40","React41","React42","React43","React44","React45","React46","React47","React48","React49","React50","React51","React52","React53","React54","React55","React56","React57","React58","DecorationSet","Decoration","Image","downloadFile","forwardRef","RenderWrapper"],"mappings":"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","file":"index.esm.js","sourcesContent":[".nsPreviewImage {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.nsPreviewImage img {\n max-width: 100%;\n max-height: 100%;\n width: auto !important;\n}\n.nsPreviewPdf {\n width: 100%;\n height: 100%;\n overflow: auto;\n}\n.nsPreviewPdf .pdfToolbar {\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: #fff;\n padding: 8px 16px 6px;\n border-radius: 6px;\n box-shadow: 0 0 15px rgba(1, 1, 1, 0.1);\n}\n.nsPreviewPdf .pdfToolbar :global .rpv-core__tooltip-body {\n display: none;\n}\n.nsPreviewPdf :global .current-page-highlight::after {\n box-shadow: 0 0 10px var(--ant-color-primary);\n transition: box-shadow 0.3s;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n border-radius: 4px;\n transition: background-color 0.3s ease 0.3s;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar-track {\n background: transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages:hover {\n scrollbar-color: rgba(0, 0, 0, 0.3) transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages:hover::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.3);\n transition-delay: 0s;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n border-radius: 4px;\n transition: background-color 0.3s ease 0.3s;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar-track {\n background: transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list:hover {\n scrollbar-color: rgba(0, 0, 0, 0.3) transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list:hover::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.3);\n transition-delay: 0s;\n}\n.nsPreviewVideo {\n max-width: 100%;\n max-height: 100%;\n}\n.nsPreviewAudio {\n width: 100%;\n max-width: 400px;\n}\n","import styles from './styles.module.less'\n\n/**\n * 音频播放器组件属性接口\n */\nexport interface AudioPlayerProps {\n /** 音频文件URL地址 */\n fileUrl: string\n}\n\n/**\n * 音频播放器组件\n * 提供基本的音频播放功能\n * @param props - 组件属性\n */\nexport default ({ fileUrl }: AudioPlayerProps) => {\n return (\n <audio controls className={styles.nsPreviewAudio}>\n <source src={fileUrl} type=\"audio/mpeg\" />\n 您的浏览器不支持 audio 标签。\n </audio>\n )\n}\n","import {\n FileExcelOutlined,\n FileGifOutlined,\n FileImageOutlined,\n FileJpgOutlined,\n FileMarkdownOutlined,\n FilePdfOutlined,\n FilePptOutlined,\n FileTextOutlined,\n FileUnknownOutlined,\n FileWordOutlined,\n FileZipOutlined,\n NotificationOutlined,\n VideoCameraOutlined\n} from '@ant-design/icons'\nimport { useMemo } from 'react'\n\n/**\n * 文件图标组件属性接口\n */\nexport interface FileIconProps {\n /** 文件后缀名,不区分大小写 */\n suffix?: string\n /** 图标字体大小,默认为22px */\n fontSize?: number\n}\n/**\n * 文件图标组件\n * 根据文件后缀名显示对应的图标\n * 支持常见的文件类型:文档、图片、音视频、压缩包等\n *\n * 支持的文件类型:\n * - 文档:PDF, DOC/DOCX, XLS/XLSX, PPT, TXT, MD/MARKDOWN\n * - 图片:JPG, JPEG, PNG, GIF\n * - 音视频:MP3, MP4, MOV, AVI, FLV\n * - 压缩包:ZIP, RAR, 7Z\n * - 其他:显示为默认图标或文件夹图标\n *\n * @param props - 组件属性\n * @returns 对应文件类型的图标\n */\nexport default ({ suffix, fontSize = 22 }: FileIconProps) => {\n // 设置图标样式:使用主题色和指定字体大小\n const styles = { fontSize, color: 'var(--ant-color-primary)' }\n\n /**\n * 根据文件后缀名选择对应的图标\n * 使用 useMemo 优化性能,避免每次渲染都重新计算\n */\n const Icon = useMemo(() => {\n switch (suffix?.toUpperCase()) {\n case 'TXT':\n return <FileTextOutlined />\n case 'PDF':\n return <FilePdfOutlined />\n case 'DOC':\n case 'DOCX':\n return <FileWordOutlined />\n case 'XLS':\n case 'XLSX':\n return <FileExcelOutlined />\n case 'PPT':\n return <FilePptOutlined />\n case 'MP4':\n case 'MOV':\n case 'AVI':\n case 'FLV':\n return <VideoCameraOutlined />\n case 'MP3':\n return <NotificationOutlined />\n case 'JPG':\n case 'JPEG':\n return <FileJpgOutlined />\n case 'PNG':\n return <FileImageOutlined />\n case 'GIF':\n return <FileGifOutlined />\n case 'MD':\n case 'MARKDOWN':\n return <FileMarkdownOutlined />\n case 'ZIP':\n case 'RAR':\n case '7Z':\n return <FileZipOutlined />\n case 'CATALOG':\n return <i style={styles} className=\"iconfont icon-wenjianjia\" /> // 文件夹图标\n default:\n return <FileUnknownOutlined /> // 默认未知文件图标\n }\n }, [suffix]) // 仅在suffix变化时重新计算\n\n return <span style={styles}>{Icon}</span>\n}\n","// // components/VideoPlayer.tsx\n// import { useEffect, useRef } from 'react'\n// import videojs from 'video.js'\n// import Player from 'video.js/dist/types/player'\n// import 'video.js/dist/video-js.css'\n\n// interface VideoPlayerProps {\n// fileUrl: string // 视频地址\n// poster?: string // 可选封面图\n// }\n\n// export default ({ fileUrl, poster }: VideoPlayerProps) => {\n// const videoRef = useRef<HTMLVideoElement | null>(null)\n// const playerRef = useRef<Player | null>(null)\n\n// useEffect(() => {\n// if (videoRef.current && !playerRef.current) {\n// playerRef.current = videojs(videoRef.current, {\n// controls: true,\n// preload: 'auto',\n// autoplay: false,\n// playbackRates: [0.5, 1, 1.5, 2], // 倍速选项\n// fluid: true,\n// poster,\n// sources: [\n// {\n// src: fileUrl,\n// type: 'video/mp4'\n// }\n// ]\n// })\n// }\n\n// return () => {\n// if (playerRef.current) {\n// playerRef.current.dispose()\n// playerRef.current = null\n// }\n// }\n// }, [fileUrl, poster])\n\n// return (\n// <div data-vjs-player>\n// <video ref={videoRef} className=\"video-js vjs-default-skin\" />\n// </div>\n// )\n// }\n\nimport styles from './styles.module.less'\n\n/**\n * 视频播放器组件属性接口\n */\nexport interface VideoPlayerProps {\n /** 视频文件URL地址 */\n fileUrl: string\n}\n\n/**\n * 视频播放器组件\n * 提供基本的视频播放功能\n * @param props - 组件属性\n */\nexport default ({ fileUrl }: VideoPlayerProps) => {\n return (\n <video controls className={styles.nsPreviewVideo}>\n <source src={fileUrl} type=\"video/mp4\" />\n 您的浏览器不支持 video 标签。\n </video>\n )\n}\n","import { Suspense, lazy, useMemo } from 'react'\n\n/**\n * 组件映射类型,用于延时加载\n */\nexport type ComponentMapType = Record<\n string,\n () => Promise<{\n default: React.ComponentType<any>\n }>\n>\n\n/**\n * 基础组件映射表\n */\nconst baseComponentMap: ComponentMapType = {\n // renderMarkdown: () => import('@/components/RenderMarkdown')\n}\n\n/**\n * LazyComponent组件属性接口\n */\nexport interface LazyComponentProps {\n /** 组件类型名称 */\n type: string\n /** 自定义组件映射 */\n customComponents?: ComponentMapType\n /** 其他属性会透传给组件 */\n [key: string]: any\n}\n\n/**\n * 延时加载组件\n * 根据type动态加载对应的组件,支持自定义组件映射\n * 使用示例:<LazyComponent type=\"renderMarkdown\" data={{}} loading={true} />\n * @param props - 组件属性\n */\nexport default ({ type, customComponents, ...rest }: LazyComponentProps) => {\n const componentMap = useMemo(() => {\n return { ...baseComponentMap, ...customComponents }\n }, [customComponents])\n const LazyComponent = useMemo(() => {\n const loader = componentMap[type]\n return loader ? lazy(loader) : null\n }, [type, componentMap])\n\n // {type}-{JSON.stringify(rest.data)}-{String(rest.loading)}\n if (!LazyComponent) return <div>未知类型:{type}</div>\n\n return (\n <Suspense fallback={<div>加载中...</div>}>\n <LazyComponent {...rest} />\n </Suspense>\n )\n}\n","import parse, { Element } from 'html-react-parser'\nimport { jsonrepair } from 'jsonrepair'\nimport markdownit from 'markdown-it'\nimport { useMemo } from 'react'\nimport LazyComponent, { ComponentMapType } from '../LazyComponent'\nimport './markdown.less'\n\n/**\n * Markdown渲染组件属性接口\n */\nexport interface RenderMarkdownProps {\n /** Markdown内容 */\n content?: string\n /** 搜索关键字 */\n searchValue?: string\n /** 自定义组件映射 */\n customComponents?: ComponentMapType\n /** 内容变化回调 */\n onChange?: (value: string) => void\n /** 部分内容变化回调 */\n onPartialChange?: (oldValue: string, newValue: string) => void\n}\n\n// ========================\n// MarkdownIt 基础设置\n// ========================\nconst md = markdownit({ html: true, breaks: true })\n\n// 所有 link 默认打开新标签页\nmd.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n const token = tokens[idx]\n token.attrPush(['target', '_blank'])\n return self.renderToken(tokens, idx, options)\n}\n\n// ========================\n// 工具函数:安全解析 data JSON\n// ========================\nfunction parseData(raw: string) {\n let obj: any = {}\n try {\n // 尝试直接 JSON.parse\n obj = JSON.parse(raw)\n } catch {\n try {\n // JSON 修复后再解析\n obj = JSON.parse(jsonrepair(raw))\n } catch {\n // 解析失败就保留原文\n obj = { _raw: raw }\n }\n }\n return obj\n}\n\n// ========================\n// 关键词高亮\n// ========================\nfunction highlightKeywords(html: string, keywords: string[]) {\n const escaped = keywords.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n const regex = new RegExp(`(${escaped.join('|')})`, 'gi')\n return html.replace(regex, '<span class=\"cube-hl\">$1</span>')\n}\n\n// 占位符格式,例如 \"__ALERT_DATA_0__\"\nfunction makePlaceholder(id: number) {\n return `__ALERT_DATA_${id}__`\n}\n\n// ============================================================\n// 抽取 :::alert ... ::: 块,把 data={...} 替换成占位符\n// ============================================================\n//\n// 步骤:\n// 1. 找到所有 :::alert\n// 2. 从中提取 type 和 data 原文\n// 3. 用单行格式替换为 `:::alert type=xx data=\"__PH__\" :::`\n// 4. 返回替换后的字符串 + 占位符映射表\nfunction alertMarkClean(src: string) {\n let pos = 0\n let id = 0\n let out = ''\n const placeholders = new Map<string, string>()\n\n while (pos < src.length) {\n const start = src.indexOf(':::alert', pos)\n if (start === -1) {\n // 无更多 alert,直接收尾\n out += src.slice(pos)\n break\n }\n\n // 保留 alert 之前的部分\n out += src.slice(pos, start)\n\n // ========================\n // 定位结束 ::: 块\n // ========================\n\n const afterStart = src.slice(start)\n\n // 优先匹配 “换行开始的 :::” 作为块级结束符\n const relAfter = afterStart.slice(':::alert'.length)\n const matchLineEnd = relAfter.search(/\\s*:::\\s*/)\n let endIdx = -1\n // 判断是否结束\n let isNoEnd = 1\n\n if (matchLineEnd !== -1) {\n // 找到块级结束符\n endIdx = start + ':::alert'.length + matchLineEnd\n isNoEnd = 0\n } else {\n // 没找到闭合符,最后的内容都属于当前标记\n endIdx = src.length\n isNoEnd = 1\n }\n\n // ========================\n // 解析 inner(alert 内部内容)\n // ========================\n const inner = src.slice(start + ':::alert'.length, endIdx).trim()\n\n // 解析 type=xxxx\n const typeMatch = inner.match(/type\\s*=\\s*(?:(['\"])(.*?)\\1|(\\S+))/)\n const type = typeMatch ? (typeMatch[2] ?? typeMatch[3]) : undefined\n\n // data= 后面整个都是 data 内容\n const dataIdx = inner.search(/\\bdata\\s*=/)\n let rawData = ''\n if (dataIdx !== -1) {\n rawData = inner.slice(dataIdx + inner.slice(dataIdx).match(/\\bdata\\s*=/)![0].length).trim()\n }\n\n // 生成占位符\n const ph = makePlaceholder(id++)\n placeholders.set(ph, rawData)\n\n // 使用 单行 alert 重写,此格式能被 inline 插件识别\n const typeText = type ? `type=${JSON.stringify(type)}` : ''\n out += `:::alert ${typeText} data=\"${ph}\" loading=\"${isNoEnd}\" :::`\n\n // 跳到结束 ::: 后继续扫描\n const realClose = src.indexOf(':::', endIdx)\n pos = realClose === -1 ? endIdx : realClose + 3\n }\n\n return { text: out, placeholders }\n}\n\n// ============================================================\n// MarkdownIt inline 插件\n// 将单行 `:::alert ... :::` 转成 <lazy-component ... />\n// ============================================================\nfunction alertInlinePlugin(md: any) {\n md.inline.ruler.before('emphasis', 'alert_inline', function (state: any, silent: boolean) {\n const pos = state.pos\n const src = state.src\n if (src.slice(pos, pos + 3) !== ':::') return false\n\n // 匹配“同一行中的 :::alert ... :::”\n const m = src.slice(pos).match(/^:::alert\\b([^\\n\\r]*?):::/)\n if (!m) return false\n if (silent) return false\n\n // m[1] 是 type=xxx data=\"xxx\" ...\n const raw = m[1].trim()\n\n // 构造 HTML inline token\n const html = `<lazy-component ${raw}></lazy-component>`\n const token = state.push('html_inline', '', 0)\n token.content = html\n\n // 移动光标\n state.pos += m[0].length\n return true\n })\n}\n\n// 注册 inline 插件(适配 HMR)\ntry {\n md.use(alertInlinePlugin)\n} catch {}\n\n/**\n * Markdown渲染组件\n * 将Markdown文本转换为HTML并渲染为React组件\n * 支持自定义组件、搜索高亮、内容编辑等功能\n * @param RenderMarkdownProps - 组件属性\n */\nexport default ({ content = '', searchValue, customComponents, onChange, onPartialChange }: RenderMarkdownProps) => {\n // console.log('RenderMarkdown', content)\n const reactContent = useMemo(() => {\n if (!content) return null\n\n // 1) 抽取 data={...},替换为占位符\n const { text: preprocessed, placeholders } = alertMarkClean(content)\n\n // 2) Markdown 渲染\n let rawHtml = md.render(preprocessed)\n\n // 3) 关键词高亮\n rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml\n\n // ============================================================\n // 4) 把 <lazy-component> 转成真正的 React LazyComponent\n // ============================================================\n let lazyIndex = -1\n return parse(rawHtml, {\n replace: (domNode) => {\n if ((domNode as Element).name === 'lazy-component') {\n lazyIndex++\n\n const el = domNode as Element\n const type = el.attribs.type\n const loading = !!Number(el.attribs.loading)\n const dataAttr = el.attribs.data || ''\n let data: any = {}\n // console.log('el.attribs', placeholders)\n // 用占位符从 Map 中恢复原始 data 文本并解析成对象\n if (/^__ALERT_DATA_\\d+__$/.test(dataAttr)) {\n const raw = placeholders.get(dataAttr) ?? ''\n data = parseData(raw)\n // console.log('__ALERT_DATA_', raw, parseData(raw))\n }\n // console.log('lazyIndex', `${type}${lazyIndex}`)\n return (\n <LazyComponent\n key={`${type}${lazyIndex}`}\n type={type}\n data={data}\n loading={loading}\n customComponents={customComponents}\n onChange={onChange}\n onPartialChange={onPartialChange}\n />\n )\n }\n }\n })\n }, [content, searchValue])\n\n return <div className=\"ns-markdown\">{reactContent}</div>\n}\n\n// `:::alert type=info data={data:\"123\"} \\n::: \\n你好 \\n:::alert type=info data={data:234} \\n::: `\n// return <RenderMarkdown content={`<think> \\n ### 你好你好你好你好</think> `} />\n","import { Result } from 'antd'\nimport { useEffect, useState } from 'react'\nimport RenderMarkdown from '../RenderMarkdown'\n\n/**\n * Markdown预览组件属性接口\n */\nexport interface MarkdownPreviewProps {\n /** Markdown文件URL地址 */\n fileUrl: string\n /** 搜索关键字 */\n searchValue?: string\n}\n\n/**\n * Markdown预览组件\n * 从指定URL获取Markdown内容并渲染显示\n * @param props - 组件属性\n */\nexport default ({ fileUrl, searchValue }: MarkdownPreviewProps) => {\n const [content, setContent] = useState('')\n const [error, setError] = useState('')\n const fetchMarkdown = async () => {\n const res = await fetch(fileUrl)\n\n if (res.status !== 200) {\n throw new Error(`请求失败,状态码: ${res.status}`)\n }\n\n const markdownText = await res.text()\n\n if (!markdownText) {\n throw new Error('返回内容为空')\n }\n setContent(markdownText)\n }\n const init = async () => {\n setContent('')\n setError('')\n if (fileUrl) {\n try {\n await fetchMarkdown()\n } catch (error) {\n // console.error('加载或解析 Markdown 失败:', error)\n setError('加载或解析 Markdown 失败')\n }\n }\n }\n\n useEffect(() => {\n init()\n }, [fileUrl])\n return error ? (\n <Result status=\"error\" title={error} />\n ) : (\n <div className=\"height-full\">\n <RenderMarkdown content={content} searchValue={searchValue} />\n </div>\n )\n}\n","export type Params = Record<string, any>\ntype Payload<P = Params> = { type: string; data?: P; to?: 'parent' | 'top' | 'child' }\n/**\n * 通知当前页面的父页面或者顶级窗口\n */\nexport function emit(type: string, data?: Params, to: 'parent' | 'top' = 'top') {\n const payload: Payload = { type, data, to }\n try {\n window.parent.postMessage(payload, '*')\n } catch (err) {\n console.warn('emit parent failed', err)\n }\n}\n/**\n * 通知某个子 iframe 窗口(必须传入 iframe.contentWindow)\n */\nexport function emitToChild(iframeWindow: Window | null, type: string, data?: Params, origin: string = '*') {\n if (!iframeWindow) {\n console.warn('emitToChild failed: iframeWindow is null')\n return\n }\n const payload: Payload = { type, data, to: 'child' }\n try {\n iframeWindow.postMessage(payload, origin)\n } catch (err) {\n console.warn('emit to child failed', err)\n }\n}\n","const toString = Object.prototype.toString\n\n/**\n * 类型判断函数\n * @param val - 要判断的值\n * @param type - 目标类型名\n * @returns 是否为目标类型\n */\nexport function is(val: unknown, type: string) {\n return toString.call(val) === `[object ${type}]`\n}\n\n/**\n * 判断值是否为 undefined\n * @param val - 要判断的值\n * @returns 是否为 undefined\n */\nexport function isUnDef<T = unknown>(val?: T): val is T {\n return is(val, 'Undefined')\n}\n\n/**\n * 判断值是否已定义(非 undefined)\n * @param val - 要判断的值\n * @returns 是否已定义\n */\nexport function isDef<T = unknown>(val?: T): val is T {\n return !isUnDef(val)\n // return typeof val !== 'undefined'\n}\n/**\n * 判断值是否为对象(不包括 FormData 等)\n * @param val - 要判断的值\n * @returns 是否为对象\n */\nexport function isObject(val: any): val is Record<any, any> {\n return is(val, 'Object')\n}\n\n/**\n * 判断对象是否为空对象\n * @param val - 要判断的值\n * @returns 是否为空对象\n */\nexport function isEmptyObj<T = unknown>(val: T): boolean {\n if (isObject(val)) {\n return Object.keys(val).length === 0\n }\n return false\n}\n\n/**\n * 判断值是否为 Date 对象\n * @param val - 要判断的值\n * @returns 是否为 Date 对象\n */\nexport function isDate(val: unknown): val is Date {\n return is(val, 'Date')\n}\n\nexport function isNull(val: unknown): val is null {\n return is(val, 'Null')\n // return val === null\n}\n\nexport function isNullOrUnDef(val: unknown): val is null | undefined {\n return isUnDef(val) || isNull(val)\n}\n\nexport function isNumber(val: unknown): val is number {\n return is(val, 'Number')\n}\n\nexport function isNumberNoNaN(val: unknown): val is number {\n return is(val, 'Number') && !isNaN(val as number)\n}\n\nexport function isString(val: unknown): val is string {\n return is(val, 'String')\n}\n\nexport function isFunction(val: unknown) {\n return is(val, 'Function')\n // return typeof val === 'function'\n}\n\nexport function isPromise<T = any>(val: unknown): val is Promise<T> {\n return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch)\n}\n\nexport function isBoolean(val: unknown): val is boolean {\n return is(val, 'Boolean')\n}\n\nexport function isRegExp(val: unknown): val is RegExp {\n return is(val, 'RegExp')\n}\n\nexport function isArray(val: any): val is Array<any> {\n return Array.isArray(val)\n}\n\nexport function isEmpty<T = unknown>(val: T): val is T {\n if (isArray(val) || isString(val)) {\n return val.length === 0\n }\n\n if (isNullOrUnDef(val)) {\n return true\n }\n\n if (val instanceof Map || val instanceof Set) {\n return val.size === 0\n }\n\n // if (isObject(val)) {\n // return Object.keys(val).length === 0\n // }\n\n // return false\n return isEmptyObj(val)\n}\n\nexport function isWindow(val: any): val is Window {\n return typeof window !== 'undefined' && is(val, 'Window')\n}\n\nexport function isElement(val: unknown): val is Element {\n return isObject(val) && !!val.tagName\n}\n\nexport function isMap(val: unknown): val is Map<any, any> {\n return is(val, 'Map')\n}\n\n/** 判断是否为服务端环境(无 window 对象) */\nexport const isServer = typeof window === 'undefined'\n\n/** 判断是否为客户端环境(有 window 对象) */\nexport const isClient = !isServer\n\n/**\n * 判断是否是外链\n * @param {string} path\n * @returns {Boolean}\n * @author LiQingSong\n */\nexport const isExternal = (path: string): boolean => {\n return /^(https?:|mailto:|tel:)/.test(path)\n}\n\nexport const isBlob = (val: unknown) => {\n return is(val, 'Blob')\n}\n\nexport const isLocalhost = (host?: string): boolean => {\n return /^(localhost:)/.test(host || location.host)\n}\n","import { useEffect, useRef } from 'react'\nimport { isObject } from '../../utils/is'\nimport { Params } from './iframeRelay'\n\ntype Handler<P = Params> = (params: P, source?: MessageEventSource | null, origin?: string) => void\n\nexport function useIframeRelayBridge(allowedOrigins: string[] = ['*']) {\n const handlers = useRef<Record<string, Handler[]>>({})\n\n useEffect(() => {\n const onMessage = (evt: MessageEvent) => {\n const { data, source, origin } = evt\n if (!data || !isObject(data) || !data.type) return\n if (allowedOrigins[0] !== '*' && !allowedOrigins.includes(origin)) return\n\n const { type, data: params, to = 'parent' } = data\n // 如果目标是顶层 但当前不是顶层,则继续向父级转发\n const isTop = window.parent === window\n if (to === 'top' && !isTop) {\n window.parent.postMessage(data, allowedOrigins[0] === '*' ? '*' : origin)\n return\n }\n\n // 其余消息(包括 to: 'child' | 'parent'),触发本层 handler\n const fns = handlers.current[type] || []\n fns.forEach((fn) => fn(params, source, origin))\n }\n window.addEventListener('message', onMessage)\n return () => window.removeEventListener('message', onMessage)\n }, [allowedOrigins])\n\n function on(type: string, handler: Handler<Params>) {\n handlers.current[type] = handlers.current[type] || []\n handlers.current[type].push(handler)\n }\n\n function off(type: string, handler: Handler<Params>) {\n handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler)\n }\n\n return { on, off }\n}\n","import { createContext, ReactNode, useContext } from 'react'\n\n/**\n * 通用的 Valtio Context 创建工厂 Hook\n * 创建 Valtio 状态管理的 Context 和 Provider\n *\n * 支持的操作:\n * - ValtioProvider:包裹组件以提供 store 状态\n * - useValtioStore:在组件中获取 store 实例\n *\n * @template T - Store 对象类型\n * @returns Valtio Context 相关的工具函数\n */\nexport function useCreateValtioContext<T extends object>() {\n const Context = createContext<T | null>(null)\n\n /**\n * Valtio Provider 组件\n * @param props - 包含 store 和 children 的属性\n * @returns Provider 组件\n */\n const ValtioProvider = ({ store, children }: { store: T; children?: ReactNode }) => <Context.Provider value={store}>{children}</Context.Provider>\n\n /**\n * 获取 Valtio store 的 Hook\n * @returns store 实例\n * @throws 当在 Provider 外使用时抛出错误\n */\n const useValtioStore = (): T => {\n const store = useContext(Context)\n if (!store) throw new Error('useStore must be used within Provider')\n return store\n }\n\n return {\n ValtioProvider,\n useValtioStore,\n // 导出 Context 以便外部使用\n Context\n }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n/**\n * 防抖 Hook\n * 在指定时间内多次调用只执行最后一次,延迟指定时间后执行\n *\n * @param func - 需要防抖的函数\n * @param wait - 延迟时间(毫秒),默认为400ms\n * @returns 防抖处理后的函数,包含 flush 和 cancel 方法\n */\nexport function useDebounce<A extends Array<any>, R = void>(func: (..._args: A) => R, wait: number = 400) {\n /** 保存函数和定时器的引用 */\n const { current } = useRef({ func, timeOut: null } as { func: (..._args: A) => R; timeOut: null | NodeJS.Timeout })\n\n /** 更新最新的函数引用 */\n useEffect(() => {\n current.func = func\n }, [func])\n\n /** 保存最新的参数 */\n let args: A\n\n /**\n * 防抖处理函数\n * @param _args - 函数参数\n * @returns Promise 包装的结果\n */\n function debounce(..._args: A) {\n args = _args\n if (current.timeOut) {\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n return new Promise<R>((resolve, reject) => {\n current.timeOut = setTimeout(async () => {\n try {\n const result = await current.func.apply(null, args)\n resolve(result)\n } catch (e) {\n reject(e)\n }\n }, wait)\n })\n }\n\n /**\n * 取消防抖\n */\n function cancel() {\n if (!current.timeOut) return\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n\n /**\n * 立即执行防抖函数\n * @returns 函数执行结果\n */\n function flush() {\n cancel()\n return current.func.apply(null, args)\n }\n\n /** 添加额外方法到防抖函数 */\n debounce.flush = flush\n debounce.cancel = cancel\n\n return useCallback(debounce, [])\n}\n","import { message } from 'antd'\nimport { isArray, isExternal, isNullOrUnDef, isObject } from './is'\n\n/**\n * 深拷贝函数\n * @param obj - 要拷贝的对象\n * @param isJson - 是否使用 JSON 方式深拷贝,默认为 true\n * @returns 拷贝后的新对象\n */\nexport const deepCopy: <T>(arg: T, isJson?: boolean) => T = (obj, isJson = true) => {\n if (!isArray(obj) && !isObject(obj)) return obj\n if (isJson) return JSON.parse(JSON.stringify(obj))\n const result: any = isArray(obj) ? [] : {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = deepCopy((obj as any)[key], isJson) //递归复制\n }\n }\n return result\n}\n\n/**\n * 深度比较两个对象是否相等\n * 支持 Date、RegExp、Map、Set、Array、Function、Object 等类型\n * @param a - 第一个对象\n * @param b - 第二个对象\n * @returns 是否相等\n */\nexport function deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n // === 特殊类型处理 ===\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime()\n if (a instanceof RegExp && b instanceof RegExp) return a.toString() === b.toString()\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false\n for (const [key, val] of a.entries()) {\n if (!b.has(key) || !deepEqual(val, b.get(key))) return false\n }\n return true\n }\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false\n for (const val of a.values()) {\n if (!b.has(val)) return false\n }\n return true\n }\n\n // 数组\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((item, i) => deepEqual(item, b[i]))\n }\n\n // 函数(通过字符串比较)\n if (typeof a === 'function' && typeof b === 'function') return a.toString() === b.toString()\n\n // 对象递归\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (!deepEqual(a[key], b[key])) return false\n }\n return true\n }\n\n return false\n}\n/**\n * 深度合并两个对象,对于对象类型进行递归合并\n * @param base - 基础对象\n * @param override - 覆盖对象\n * @returns 合并后的新对象\n */\nexport const deepMerge = <T extends Record<string, any>>(base: T, override: Partial<T>): T => {\n const result = { ...base }\n\n Object.keys(override || {}).forEach((key: keyof T) => {\n const baseValue = base[key]\n const overrideValue = override[key]\n\n if (\n typeof baseValue === 'object' &&\n baseValue !== null &&\n !isArray(baseValue) &&\n typeof overrideValue === 'object' &&\n overrideValue !== null &&\n !isArray(overrideValue)\n ) {\n // 递归合并对象\n result[key] = deepMerge(baseValue, overrideValue)\n } else if (overrideValue !== undefined) {\n // 覆盖简单值\n result[key] = overrideValue as any\n }\n })\n\n return result\n}\n\n/**\n * 将键值对象转换为选项数组格式\n * @param obj - 键值对象\n * @returns 选项数组,包含 label 和 value 属性\n */\nexport const objToOptions = (obj: ObjectType<string>) => {\n return Object.keys(obj).map((key) => ({\n label: obj[key],\n value: Number(key)\n }))\n}\n\n/**\n * 将数组转换为以指定字段为键的对象\n * @param arr - 要转换的数组\n * @param key - 用作对象键的字段名\n * @returns 转换后的对象\n */\nexport const arrToObj = <T>(arr: T[] = [], key: string) => {\n const obj = {} as { [key: string]: T }\n arr?.forEach((item: any) => {\n obj[item[key]] = item\n })\n return obj\n}\n\nexport interface NsSetIntervalReturnType {\n /** 检查是否正在运行 */\n isRun: () => boolean\n /** 取消定时器 */\n cancel: () => void\n}\n/**\n * 使用 setTimeout 模拟 setInterval 的返回类型接口\n * 避免 setInterval 的内存泄漏问题\n * @param fn - 要重复执行的函数\n * @param t - 间隔时间(毫秒)\n * @returns 控制对象,包含 isRun 和 cancel 方法\n */\n\nexport const nsSetInterval = (fn: () => void, t: number): NsSetIntervalReturnType => {\n let timer: NodeJS.Timeout | null = null\n let isCancelled = false\n\n const interval = () => {\n timer = setTimeout(async () => {\n if (isCancelled) {\n return\n }\n\n await fn()\n\n if (!isCancelled) {\n interval()\n }\n }, t)\n }\n interval()\n return {\n isRun: () => !!timer,\n cancel: () => {\n isCancelled = true\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n }\n}\n\n/**\n * 生成不重复的唯一ID\n * @returns 唯一ID字符串\n */\nexport const genNonDuplicateID = () => {\n let idStr = Date.now().toString(36)\n idStr += Math.random().toString(36).substr(2)\n return idStr\n}\n\n/**\n * 复制文本到剪贴板\n * 优先使用 navigator.clipboard API,降级使用 execCommand\n * @param text - 要复制的文本\n * @param prompt - 提示语\n * @returns void\n */\nexport const copyText = (text: string, prompt = '复制成功') => {\n // navigator clipboard 需要https等安全上下文\n if (navigator.clipboard && window.isSecureContext) {\n // navigator clipboard 向剪贴板写文本\n navigator.clipboard.writeText(text).then(() => {\n if (prompt) {\n message.success(prompt)\n }\n })\n } else {\n // 创建text area\n const textArea = document.createElement('textarea')\n textArea.value = text\n // 使text area不在viewport,同时设置不可见\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n textArea.style.left = '-999999px'\n textArea.style.top = '-999999px'\n document.body.appendChild(textArea)\n textArea.focus()\n textArea.select()\n const bol = document.execCommand('copy')\n if (bol && prompt) {\n message.success(prompt)\n }\n textArea.remove()\n }\n}\n\n/**\n * 把后台接口字段,返回的关于金额的数字,转换为千分符号分隔的数字\n * return string\n */\nexport function formatNumberWithCommas(number: number | string) {\n // 将输入值转换为数字,以处理字符串数字的情况\n const numericValue = parseFloat(number as string)\n\n if (!isNaN(numericValue)) {\n return numericValue.toLocaleString()\n }\n return number\n}\n/**\n * 生成指定范围内的不重复随机数\n * @param min - 最小值\n * @param max - 最大值\n * @param count - 生成数量\n * @returns 不重复的随机数数组\n */\nexport const generateRandomNumbers = (min: number, max: number, count: number) => {\n const randomNumbers = new Set()\n while (randomNumbers.size < count) {\n const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min\n randomNumbers.add(randomNumber)\n }\n return Array.from(randomNumbers) as number[]\n}\n/**\n * 从文件路径中提取文件名\n * @param filePath - 文件路径\n * @returns 文件名\n */\nexport const getFileName = (filePath: string) => {\n return filePath.split('?')[0].split('/').pop() || ''\n}\n\n/**\n * 从文件名中获取文件扩展名\n * @param fileName - 文件名\n * @returns 文件扩展名\n */\nexport const getFileSuffixName = (fileName: string) => {\n return fileName.split('.').pop() || ''\n}\n/**\n * 将文本中的换行符转换为 HTML 换行标签\n * @param con - 要转换的文本\n * @returns 转换后的 HTML 字符串\n */\nexport const textAreaView = (con?: string) => {\n return con ? con.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '<br/>') : ''\n}\n\n/**\n * 将对象转换为 URL 查询参数字符串\n * @param obj - 要转换的对象\n * @param url - 要拼接的 URL,如果未提供,则返回查询参数字符串\n * @returns URL 查询参数字符串\n */\nexport const buildUrlParams = (obj: Record<string, any>, url?: string): string => {\n const params = Object.entries(obj)\n .filter(([, value]) => !isNullOrUnDef(value)) // 过滤掉 undefined 和 null\n .map(([key, value]) => {\n if (isArray(value)) {\n // 处理数组,例如 { ids: [1, 2] } => 'ids=1&ids=2'\n return value\n .filter((v) => !isNullOrUnDef(v)) // 过滤掉数组中的 undefined 和 null\n .map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`)\n .join('&')\n }\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n })\n .join('&')\n\n if (url) {\n const separator = url.includes('?') ? '&' : '?'\n return `${url}${separator}${params}`\n }\n\n return params\n}\n/**\n * 下载文件到本地\n * @param url - 文件下载地址\n * @param name - 下载文件名,默认为'图片下载'\n */\nexport const downloadFile = (url: string, name?: string) => {\n const a = document.createElement('a')\n a.download = name || '图片下载'\n a.href = url\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n window.URL.revokeObjectURL(url)\n}\n\n/**\n * 给URL路径最后添加斜杠\n * @param url - 要处理的URL,默认为空字符串\n * @returns 处理后的URL\n */\nexport const addUrlLastSlash = (url: string = '') => {\n // if (!url) return url\n // 尝试当成完整 URL 解析\n const u = new URL(url, 'https://logosdata.cn') // 如果是相对路径,用个基准域名\n let pathname = u.pathname\n\n if (!pathname.endsWith('/')) {\n pathname += '/'\n }\n\n // 替换 pathname\n u.pathname = pathname\n\n return `${isExternal(url) ? u.origin : ''}${u.pathname}${u.search}${u.hash}`\n}\n\n/**\n * 给URL增加mainSource参数\n * @param url - 目标URL\n * @param preHref - 参考URL,用于获取mainSource参数\n * @returns 处理后的URL\n */\nexport const getUrlMainSource = (url: string, preHref?: string) => {\n if (!preHref) return url\n let newUrl = ''\n const preHrefUrl = new URL(preHref)\n // 解析 url 中已有的参数\n const urlParts = url.split('?')\n const srcParams = new URLSearchParams(urlParts[1] || '')\n // 如果 src 中已经存在 mainSource 参数,则直接返回原始 src\n if (srcParams.has('mainSource')) {\n newUrl = url\n } else {\n const mainSource = preHrefUrl.searchParams.get('mainSource')\n if (mainSource) {\n newUrl = buildUrlParams({ mainSource }, url)\n } else {\n newUrl = url\n }\n }\n return newUrl\n}\n\n/**\n * 获取 WebSocket 连接地址\n * @param path - WebSocket 服务路径,比如 \"/ws\" 或 \"/socket\"\n * @param customHost - 可选,指定 host:port;默认取当前 window.location.host\n * @returns 完整的 WebSocket URL\n */\nexport const getWebSocketUrl = (path: string, customHost?: string) => {\n // 根据页面协议决定 ws / wss\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'\n const host = customHost || window.location.host\n\n // 统一拼接\n return `${protocol}//${host}${path}`\n}\n\n/**\n * 对象转换函数,将源对象转换为目标对象\n * @param source - 源对象\n * @param fieldMap - 字段映射配置\n * @returns 转换后的目标对象\n */\nexport function transform<T extends object, U extends object>(\n source: T,\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U {\n const result = {} as U\n for (const [targetKey, mapping] of Object.entries(fieldMap)) {\n const key = targetKey as keyof U\n if (typeof mapping === 'function') {\n result[key] = (mapping as (src: T) => U[typeof key])(source)\n } else if (typeof mapping === 'string' && source && mapping in source) {\n result[key] = source[mapping as keyof T] as unknown as U[typeof key]\n } else {\n result[key] = mapping as U[typeof key]\n }\n }\n return result\n}\n\n/**\n * 批量对象转换函数\n * @param sources - 源对象数组\n * @param fieldMap - 字段映射配置\n * @returns 转换后的目标对象数组\n */\nexport function transforms<T extends object, U extends object>(\n sources: T[],\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U[] {\n return sources?.map((source) => transform<T, U>(source, fieldMap)) || []\n}\n","import { useEffect, useRef } from 'react'\nimport { deepEqual } from '../utils/common'\n\n/**\n * 深度比较 useEffect Hook\n * 使用深度比较算法来检测依赖项变化,避免不必要的重新渲染\n *\n * @param effect - 要执行的副作用函数\n * @param deps - 依赖项数组\n */\nexport function useDeepEffect(effect: React.EffectCallback, deps: any[]) {\n /** 保存上一次的依赖项引用 */\n const prevDepsRef = useRef<any[]>()\n\n /** 检查依赖项是否发生变化(使用深度比较) */\n const depsChanged =\n !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current![i]))\n\n useEffect(() => {\n if (depsChanged) {\n prevDepsRef.current = deps\n return effect()\n }\n }, [depsChanged]) // 注意:这里用 depsChanged 控制触发\n}\n","import { useRef, useState } from 'react'\n\n/**\n * 创建同时具有 ref 和 state 特性的状态 Hook\n * 解决了 useState 在异步闭包中获取不到最新值的问题\n *\n * @param init - 初始值\n * @returns [state, setState, getState] 元组,包含状态值、设置函数和获取函数\n */\nexport function useRefState<T>(init: T) {\n const [state, setState] = useState(init)\n /** 保存状态值的 ref */\n const stateRef = useRef(init)\n\n /**\n * 同时更新 ref 和 state\n * @param newVal - 新值\n */\n const setProxy = (newVal: T) => {\n stateRef.current = newVal\n setState(newVal)\n }\n\n /**\n * 获取当前 ref 值(异步安全的)\n * @returns 当前状态值\n */\n const getState = () => stateRef.current\n\n return [state, setProxy, getState] as const\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * 同步输入框组件和外部状态的 Hook\n * 解决输入中文时因连续渲染关闭中文输入法的问题\n *\n * @template T - 值类型\n * @param storeValue - 外部存储的值\n * @param setStoreValue - 设置外部存储值的函数\n * @returns 包含 inputValue 和 setInputValue 的对象\n */\nexport const useSyncInput = <T>(storeValue: T, setStoreValue: (value: T) => void) => {\n /** 内部输入状态 */\n const [inputValue, setInputValue] = useState<T>(storeValue)\n\n /** 监听外部值变化并同步到内部状态 */\n useEffect(() => {\n if (storeValue !== inputValue) {\n setInputValue(storeValue)\n }\n }, [storeValue])\n\n /**\n * 处理输入值变化,同时更新外部存储和内部状态\n * @param value - 新的输入值\n */\n const handleValueChange = (value: T) => {\n setStoreValue(value)\n setInputValue(value)\n }\n\n return {\n inputValue,\n setInputValue: handleValueChange\n }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n/**\n * 节流 Hook\n * 在指定时间间隔内只执行一次函数,节流控制函数调用频率\n *\n * @template A - 函数参数类型\n * @template R - 返回值类型\n * @param func - 需要节流的函数\n * @param wait - 节流间隔时间(毫秒)\n * @returns 节流处理后的函数,包含 flush 和 cancel 方法\n */\nexport function useThrottle<A extends Array<any>, R = void>(func: (..._args: A) => R, wait: number) {\n /** 保存函数和定时器的引用 */\n const { current } = useRef({ func, timeOut: null } as { func: (..._args: A) => R; timeOut: null | NodeJS.Timeout })\n\n /** 更新最新的函数引用 */\n useEffect(() => {\n current.func = func\n }, [func])\n\n /** 保存最新的参数 */\n let args: A\n\n /**\n * 节流处理函数\n * @param _args - 函数参数\n * @returns Promise 包装的执行结果\n */\n function throttle(..._args: A) {\n args = _args\n return new Promise<R>((resolve, reject) => {\n if (!current.timeOut) {\n try {\n const result = current.func.apply(null, args) // 未来可能支持异步\n resolve(result)\n } catch (e) {\n reject(e)\n }\n /** 设置定时器,在指定时间后允许下次执行 */\n current.timeOut = setTimeout(() => {\n current.timeOut = null\n }, wait)\n }\n })\n }\n\n /**\n * 取消节流\n * 清除定时器,重置状态\n */\n function cancel() {\n if (!current.timeOut) return\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n\n /**\n * 立即执行节流函数\n * 取消当前节流并立即执行一次\n * @returns 函数执行结果\n */\n function flush() {\n cancel()\n return current.func.apply(null, args)\n }\n\n /** 添加额外方法到节流函数 */\n throttle.flush = flush\n throttle.cancel = cancel\n\n return useCallback(throttle, [])\n}\n","import dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\n\ndayjs.extend(relativeTime)\n\ntype DateType = string | number | Date | dayjs.Dayjs | null\n\n/** 默认日期时间格式:年-月-日 时:分:秒 */\nexport const DateFormatType = 'YYYY-MM-DD HH:mm:ss'\n/** 默认日期格式:年-月-日 */\nexport const DateFormatType2 = 'YYYY-MM-DD'\n\n/** 日期处理默认单位:天 */\nconst UNIT = 'date'\n\n/**\n * 获取一天的最早时间 '2023/10/17 00:00:00' 的时间戳\n */\nexport const getStartOfTimestamp = (date?: DateType, unit: dayjs.OpUnitType = UNIT) => {\n return dayjs(date).startOf(unit).valueOf()\n}\n\n/**\n * 获取一天的最晚时间 '2023/10/17 23:59:59' 的时间戳\n */\nexport const getEndOfTimestamp = (date?: DateType, unit: dayjs.OpUnitType = UNIT) => {\n return dayjs(date).endOf(unit).valueOf()\n}\n\n// 格式化时间对象为 YYYY-MM-DD HH:mm:ss 格式\nexport const formatDate = (date: Date | number | string, fmt: string = DateFormatType) => {\n if (date) {\n return dayjs(date).format(fmt)\n }\n return ''\n}\n\nexport const getTimestamp = (date?: DateType) => {\n return dayjs(date).valueOf()\n}\n\nexport const isExpire = (date?: DateType) => {\n return dayjs(date).isBefore(getStartOfTimestamp())\n}\n","import AES from 'crypto-js/aes'\nimport encUtf8 from 'crypto-js/enc-utf8'\nimport { genNonDuplicateID } from './common'\n// import { loginUserInfoT } from '@/services/signIn'\n\n/** 用户信息存储键名 */\nconst USER_KEY = 'NS-USER'\n\n/**\n * 设置当前用户信息到 sessionStorage(AES 加密存储)\n * @param userInfo - 用户信息对象\n */\nexport function setCurrentUser(userInfo: any) {\n const cipherText = AES.encrypt(JSON.stringify(userInfo), '((#II))').toString()\n sessionStorage.setItem(USER_KEY, cipherText)\n}\n\n/**\n * 从 sessionStorage 获取当前用户信息(AES 解密)\n * @returns 用户信息对象或 null\n */\nexport function getCurrentUser() {\n const userInfoJson = sessionStorage.getItem(USER_KEY)\n if (userInfoJson) {\n // 解密\n const bytes = AES.decrypt(userInfoJson, '((#II))')\n const originalText = bytes.toString(encUtf8)\n return JSON.parse(originalText)\n }\n return null\n}\n\n/**\n * 清除 sessionStorage 中的用户信息\n */\nexport function clearCurrentUser() {\n sessionStorage.removeItem(USER_KEY)\n}\n\n/** 设备ID存储键名 */\nconst DEVICEID_KEY = 'NS-DEVICE-ID'\n\n/**\n * 获取或生成设备唯一标识\n * @returns 设备ID字符串\n */\nexport function getDeviceId() {\n let deviceId = localStorage.getItem(DEVICEID_KEY)\n if (deviceId) {\n return deviceId\n }\n deviceId = genNonDuplicateID()\n localStorage.setItem(DEVICEID_KEY, deviceId)\n return deviceId\n}\n","import Decimal from 'decimal.js'\n/** Decimal.js 方法类型 */\ntype MethodType = 'plus' | 'minus' | 'times' | 'dividedBy'\n/** 数学运算符类型 */\ntype OperatorType = '+' | '-' | '*' | '/'\n/** 运算符到方法名的映射 */\nconst OperatorToMethodName: Record<OperatorType, MethodType> = {\n '+': 'plus',\n '-': 'minus',\n '*': 'times',\n '/': 'dividedBy'\n}\n\n/**\n * 通用数学计算函数\n * @param operator - 运算符:+、-、*、/\n * @param args - 要计算的数值数组\n * @returns 计算结果字符串\n */\nexport const calculate = (operator: OperatorType, ...args: Decimal.Value[]) => {\n if (args.length === 0) return '0'\n const [arg, ...newArgs] = args\n return newArgs.reduce((acc: Decimal, val) => acc[OperatorToMethodName[operator]](new Decimal(val)), new Decimal(arg)).toString()\n}\n/**\n * 精确加法运算\n * 调用:plus(arg1,arg2)\n * 返回值:arg1加arg2的精确结果\n */\nexport const plus = (...args: Decimal.Value[]) => calculate('+', ...args)\n\n/**\n * 精确减法运算\n * 调用:minus(arg1,arg2)\n * 返回值:arg1减arg2的精确结果\n */\nexport const minus = (...args: Decimal.Value[]) => calculate('-', ...args)\n\n/**\n * 精确乘法运算\n * 调用:times(arg1,arg2)\n * 返回值:arg1乘以arg2的精确结果\n */\nexport const times = (...args: Decimal.Value[]) => calculate('*', ...args)\n\n/**\n * 精确除法运算\n * 调用:dividedBy(arg1,arg2)\n * 返回值:arg1除以arg2的精确结果\n */\nexport const dividedBy = (...args: Decimal.Value[]) => calculate('/', ...args)\n\n/**\n * 查看小数位数(不计算小数点最后末尾的0)\n * @param arg1 - 要检查的数值\n * @returns 小数位数\n */\nexport const decimalPlaces = (arg1: Decimal.Value) => {\n return new Decimal(arg1).decimalPlaces()\n}\n\n/**\n * 查看数值总位数(包括整数和小数部分)\n * @param arg1 - 要检查的数值\n * @returns 总位数\n */\nexport const precision = (arg1: Decimal.Value) => {\n return new Decimal(arg1).precision(true)\n}\n\n/**\n * 取绝对值\n * @param arg1 - 要处理的数值\n * @returns 绝对值字符串\n */\nexport const absVal = (arg1: Decimal.Value) => new Decimal(arg1).abs().toString()\n\n/**\n * 数值比较函数\n * @param arg1 - 第一个数值\n * @param arg2 - 第二个数值\n * @param type - 比较类型:>、>=、<、<=、==\n * @returns 比较结果布尔值\n */\nexport const compareNum = (arg1: Decimal.Value, arg2: Decimal.Value, type: string) => {\n const x = new Decimal(arg1)\n const y = new Decimal(arg2)\n switch (type) {\n case '>':\n return x.greaterThan(y)\n case '>=':\n return x.greaterThanOrEqualTo(y)\n case '<':\n return x.lessThan(y)\n case '<=':\n return x.lessThanOrEqualTo(y)\n case '==':\n return x.equals(y)\n }\n}\n\n/**\n * 四舍五入处理\n * @param num - 要处理的数值\n * @param decimals - 保留小数位数,默认为2\n * @param fill - 是否补0,默认为true\n * @returns 处理后的数字字符串\n */\nexport const toFixed = (num: Decimal.Value, decimals = 2, fill = true) => {\n const x = new Decimal(num)\n if (fill) {\n return x.toFixed(decimals, Decimal.ROUND_HALF_UP)\n } else {\n return x.toDecimalPlaces(decimals, Decimal.ROUND_HALF_UP).toString()\n }\n}\n\n/**\n * 判断是否为整数\n * @param num - 要判断的数值\n * @returns 是否为整数\n */\nexport const isInteger = (num: Decimal.Value) => {\n return new Decimal(num).isInteger()\n}\n\n/**\n * 判断是否为负数\n * @param num - 要判断的数值\n * @returns 是否为负数\n */\nexport const isNegative = (num: Decimal.Value) => {\n return new Decimal(num).isNegative()\n}\n/**\n * 整数截取n位,小数四舍五入(已注释)\n * @param num - 要处理的数值\n * @param decimals - 截取位数\n */\n// export const toDigits = (num: Decimal.Value, decimals?: number) => {\n// let x = new Decimal(num)\n// if (decimals) {\n// const y = precision(num) - decimalPlaces(num)\n// if (isInteger(x) || y > decimals) {\n// return x.toString().substring(0, decimals)\n// } else {\n// return toFixed(num, decimals - y, false)\n// // return x.toSignificantDigits(decimals, Decimal.ROUND_HALF_UP).toString()\n// }\n// }\n// return x.toString()\n// }\n","import { ThemeConfig } from 'antd/lib'\n\n/**\n * 根据来源获取主色调\n * @returns 主色调十六进制值\n */\nconst getPrimaryColor = () => {\n const searchParams = new URLSearchParams(location.search)\n const mainSource = searchParams.get('mainSource') || 'cube-uc'\n if (mainSource === 'cube-uc') {\n return '#34AFBE'\n } else if (mainSource === 'uc') {\n return '#FA541C'\n }\n}\n\n/** 项目主色调 */\nexport const LgPrimaryColor = getPrimaryColor()\n\n/** Ant Design 主题配置 */\nexport const themeConfig: ThemeConfig = {\n token: { colorPrimary: LgPrimaryColor, colorLink: LgPrimaryColor },\n cssVar: true\n}\n","import { Modal, notification } from 'antd'\nimport { message } from 'antd/lib'\nimport { getTimestamp } from './date'\nimport { LgPrimaryColor } from './theme'\n\n/**\n * 消息提示配置接口\n */\nexport interface Message {\n /** 消息标题 */\n title?: string\n /** 消息内容 */\n content: string\n /** 显示时长(秒),为0则不自动关闭 */\n duration?: number\n /** 消息类型:成功、错误、警告、信息 */\n type?: 'success' | 'error' | 'warning' | 'info'\n /** 关闭回调 */\n onClose?: () => void\n}\n\n/**\n * 缓存消息配置接口\n * 扩展基础消息接口,增加缓存控制\n */\nexport interface CacheMessage extends Message {\n /** 是否启用缓存机制 */\n isCache?: boolean\n /** 是否为唯一消息 */\n isOnly?: boolean\n}\n/**\n * 创建缓存消息显示函数\n * 防止重复消息的显示,支持消息、通知、弹窗三种形式\n * @returns 缓存消息显示函数\n */\nconst cacheMessage = () => {\n const contents = {} as ObjectType<number>\n return ({ title = '提示', content, type = 'warning', duration = 3, onClose, isCache = true, isOnly = false }: CacheMessage) => {\n if (!content) return\n const key = isOnly ? 'cache-key' : content\n const onClose2 = () => {\n delete contents[key]\n onClose?.()\n }\n if (isCache && contents[key]) {\n } else {\n if (isCache) {\n contents[key] = getTimestamp()\n }\n if (duration) {\n // 根据内容长度选择显示方式\n if (content.length > 30) {\n // 长内容使用通知形式\n notification[type]({\n message: title,\n description: content,\n placement: 'top',\n duration,\n onClose: onClose2\n })\n } else {\n // 短内容使用消息形式\n message[type]({\n content,\n duration,\n onClose: onClose2\n })\n }\n } else {\n // 无时长使用弹窗形式\n Modal[type]({\n title,\n content,\n okButtonProps: { style: { background: LgPrimaryColor, outline: 'none' } },\n afterClose: onClose2\n })\n }\n }\n }\n}\n\n/**\n * 导出的缓存消息显示函数\n * 支持防重复显示、自动关闭、多种显示形式\n */\nexport const showMessage = cacheMessage()\n","/** Token 存储键名 */\nexport const TOKEN_KEY = 'NS-TOKEN'\n\n/**\n * 设置访问令牌到 localStorage\n * @param accessToken - 访问令牌\n */\nexport function setToken(accessToken: string) {\n localStorage.setItem(TOKEN_KEY, accessToken)\n}\n\n/**\n * 从 URL 查询参数中获取 Token\n * @returns Token 字符串或空字符串\n */\nexport function getUrlToken() {\n const searchParams = new URLSearchParams(location.search)\n const token = searchParams.get(TOKEN_KEY)\n return token || ''\n}\n\n/**\n * 获取当前有效的访问令牌\n * 优先从 URL 参数获取,其次从 localStorage 获取\n * @returns Token 字符串或空字符串\n */\nexport function getToken() {\n const token = getUrlToken()\n if (!token) {\n const token = localStorage.getItem(TOKEN_KEY)\n return token || ''\n } else {\n setToken(token)\n return token\n }\n}\n\n/**\n * 清除 localStorage 中的 Token\n */\nexport function clearToken() {\n localStorage.removeItem(TOKEN_KEY)\n}\n\n/** 登录路径存储键名 */\nconst SIGNPATH = 'SIGNPATH'\n\n/**\n * 获取登录页面路径\n * @returns 登录路径,默认为 '/sign-in'\n */\nexport function getSignPath() {\n const path = localStorage.getItem(SIGNPATH)\n return `${path || '/sign-in'}`\n}\n","import axios, { AxiosRequestConfig } from 'axios'\nimport { emit } from '../hooks'\nimport { isBlob } from './is'\nimport { showMessage } from './message'\nimport { getSignPath, getToken, TOKEN_KEY } from './session'\n\n/** HTTP 状态码常量:成功 */\nexport const OK = 200\n/** HTTP 状态码常量:服务器错误 */\nexport const ERROR = 500\n/** HTTP 状态码常量:缺少参数 */\nexport const MISSING_PARAMETER = 400\n/** HTTP 状态码常量:未授权 */\nexport const UNAUTHORIZED = 401\n/** HTTP 状态码常量:禁止访问 */\nexport const FORBIDDEN = 403\n/** HTTP 状态码常量:未找到资源 */\nexport const NOT_FOUND = 404\n/** 业务错误码常量:权限拒绝 */\nexport const PERMISSION_DENIED = 13001\n\n/**\n * 创建 Axios 请求实例\n * @param baseURL - API 基础路径,默认为 '/api'\n * @returns 请求实例对象\n */\nexport default function createRequest(baseURL: string = '/api') {\n /**\n * 跳转到登录页面\n */\n const redirectUrl = () => {\n emit('jumpLink', { url: `/uc${getSignPath()}` })\n }\n const instance = axios.create({\n baseURL,\n timeout: 60000\n })\n\n // ---------- request interceptor ----------\n instance.interceptors.request.use(\n function (config) {\n config.headers[TOKEN_KEY] = getToken()\n return config\n },\n function (error) {\n return Promise.reject(error)\n }\n )\n\n // ---------- response interceptor ----------\n instance.interceptors.response.use(\n function (response) {\n if (isBlob(response.data)) return response\n\n if (response.data?.code !== OK) {\n const isPermission = response.data?.code === PERMISSION_DENIED\n if ((response.config as any)?.showError !== false) {\n showMessage({\n title: isPermission ? '' : undefined,\n content: response.data.message,\n duration: isPermission ? 0 : 3\n })\n }\n return Promise.reject(response.data)\n }\n return response\n },\n function (err) {\n const showError = err?.config?.showError !== false\n if (!err.response) {\n if (showError) showMessage({ content: '网络异常,请检查网络', type: 'error' })\n } else {\n switch (err.response?.status) {\n case UNAUTHORIZED:\n if (showError) showMessage({ content: err.response?.data.message, type: 'error' })\n redirectUrl()\n break\n default:\n if (showError) showMessage({ content: err.response?.data.message || '请求错误!', type: 'error' })\n }\n }\n\n return Promise.reject(err)\n }\n )\n\n // -------- 导出 HTTP 方法 --------\n return {\n /**\n * GET 请求方法\n * @param url - 请求地址\n * @param params - 查询参数\n * @param options - Axios 配置选项\n * @returns 响应数据\n */\n get: async (url: string, params?: any, options?: AxiosRequestConfig) => {\n const res = await instance({ method: 'get', url, params, ...options })\n return res.data\n },\n\n /**\n * POST 请求方法\n * @param url - 请求地址\n * @param data - 请求数据\n * @param options - Axios 配置选项\n * @returns 响应数据\n */\n post: async (url: string, data?: any, options?: AxiosRequestConfig) => {\n const res = await instance({ method: 'post', url, data, ...options })\n return res.data\n },\n\n /**\n * PUT 请求方法\n * @param url - 请求地址\n * @param data - 请求数据\n * @param options - Axios 配置选项\n * @returns 响应数据\n */\n put: async (url: string, data?: any, options?: AxiosRequestConfig) => {\n const res = await instance({ method: 'put', url, data, ...options })\n return res.data\n },\n\n /**\n * DELETE 请求方法\n * @param url - 请求地址\n * @param data - 请求数据\n * @param options - Axios 配置选项\n * @returns 响应数据\n */\n delete: async (url: string, data?: any, options?: AxiosRequestConfig) => {\n const res = await instance({ method: 'delete', url, data, ...options })\n return res.data\n }\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { isNullOrUnDef, isNumber, isString } from '../../utils'\n\n// 定义 useWebSocket 的参数类型\ninterface UseWebSocketParams {\n url: string\n onMessage: (message: any) => void\n onClose?: () => void\n heartbeatInterval?: number\n heartbeatMessage?: string\n clientHeartbeat?: boolean // 是否开启客户端心跳\n reconnectInterval?: number // 重连间隔时间,单位为毫秒\n maxReconnectAttempts?: number // 最大重连尝试次数\n isReconnect?: boolean // 是否开启重连机制,默认为 true\n}\n\n// 定义返回值类型\ninterface UseWebSocketReturn {\n sendMessage: (message: string) => void\n socketReadyState: number | null\n}\n\nconst useWebSocket = ({\n url,\n onMessage,\n onClose,\n heartbeatInterval = 30000,\n heartbeatMessage = 'ping',\n clientHeartbeat = true,\n reconnectInterval = 5000, // 默认重连间隔为 5 秒\n maxReconnectAttempts, // 不设置默认值为无限重连\n isReconnect = true // 默认开启重连机制\n}: UseWebSocketParams): UseWebSocketReturn => {\n const socketRef = useRef<WebSocket | null>(null)\n const heartbeatIntervalRef = useRef<NodeJS.Timer | null>(null)\n const [socketReadyState, setSocketReadyState] = useState<number | null>(null)\n const reconnectIntervalRef = useRef<NodeJS.Timer | null>(null)\n const reconnectAttempts = useRef(0)\n const documentHide = useRef(document.visibilityState === 'hidden')\n const isDestroy = useRef(false)\n const onMessageEctype = useCallback(onMessage, [onMessage])\n // 启动心跳定时器\n const startHeartbeat = (currentSocket: WebSocket) => {\n if (!clientHeartbeat) {\n return\n }\n\n const intervalId = setInterval(() => {\n if (currentSocket.readyState === WebSocket.OPEN) {\n currentSocket.send(heartbeatMessage)\n }\n }, heartbeatInterval)\n heartbeatIntervalRef.current = intervalId\n }\n\n // 停止心跳定时器\n const stopHeartbeat = () => {\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current as unknown as number)\n }\n }\n // 停止重连定时器\n const stopReconnectTimer = () => {\n // console.log('停止重连定时器')\n if (reconnectIntervalRef.current) {\n clearTimeout(reconnectIntervalRef.current as unknown as number)\n reconnectIntervalRef.current = null\n }\n }\n\n // 尝试重连\n const tryReconnect = () => {\n if (isDestroy.current) return\n // console.log('尝试重连...', reconnectIntervalRef.current)\n if (isReconnect && !documentHide.current) {\n if ((!isNumber(maxReconnectAttempts) || reconnectAttempts.current < maxReconnectAttempts) && isNullOrUnDef(reconnectIntervalRef.current)) {\n reconnectIntervalRef.current = setTimeout(() => {\n console.log(`尝试第 ${reconnectAttempts.current + 1} 次重连...`, url)\n reconnectAttempts.current = reconnectAttempts.current + 1\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n createAndListenWebSocket()\n stopReconnectTimer()\n }, reconnectInterval)\n } else {\n if (isNumber(maxReconnectAttempts)) {\n console.log('达到最大重连尝试次数,停止重连')\n }\n }\n }\n }\n // 处理连接打开事件\n const handleOpen = (newSocket: WebSocket) => {\n console.log('WebSocket 连接已打开')\n setSocketReadyState(newSocket.readyState)\n startHeartbeat(newSocket)\n reconnectAttempts.current = 0\n }\n\n // 处理接收到消息事件\n const handleMessage = (event: MessageEvent) => {\n if (isString(event.data)) {\n try {\n const parsedData = JSON.parse(event.data)\n onMessageEctype?.(parsedData)\n stopHeartbeat()\n startHeartbeat(socketRef.current as WebSocket)\n } catch (error) {\n console.error('解析消息数据时出错:', error)\n }\n }\n }\n // 处理连接关闭事件\n const handleClose = (event: CloseEvent) => {\n console.log('WebSocket 连接已关闭', event.code, event.reason)\n setSocketReadyState(event.code)\n stopHeartbeat()\n onClose?.()\n tryReconnect()\n }\n\n // 处理连接错误事件\n const handleError = (error: Event) => {\n console.error('WebSocket 发生错误:', error)\n setSocketReadyState(null)\n stopHeartbeat()\n tryReconnect()\n }\n // 创建并监听 WebSocket 连接\n const createAndListenWebSocket = () => {\n const newSocket = new WebSocket(url)\n socketRef.current = newSocket\n setSocketReadyState(newSocket.readyState)\n\n newSocket.onopen = () => handleOpen(newSocket)\n newSocket.onmessage = handleMessage\n newSocket.onclose = handleClose\n newSocket.onerror = handleError\n }\n const handleVisibilityChange = () => {\n documentHide.current = document.visibilityState === 'hidden'\n if (socketRef.current?.readyState !== WebSocket.OPEN) {\n tryReconnect()\n }\n }\n\n useEffect(() => {\n if (!url) return\n isDestroy.current = false\n createAndListenWebSocket()\n window.addEventListener('visibilitychange', handleVisibilityChange)\n return () => {\n // 组件卸载时关闭 WebSocket 连接\n window.removeEventListener('visibilitychange', handleVisibilityChange)\n isDestroy.current = true\n if (socketRef.current) {\n socketRef.current.close()\n return\n }\n stopHeartbeat()\n stopReconnectTimer()\n }\n }, [url])\n\n const sendMessage = (message: string) => {\n if (socketRef.current?.readyState === WebSocket.OPEN) {\n socketRef.current.send(message)\n stopHeartbeat()\n startHeartbeat(socketRef.current)\n }\n }\n\n return {\n sendMessage,\n socketReadyState\n }\n}\n\nexport default useWebSocket\n","import { LoadError, PageChangeEvent, PasswordStatus, PdfJs, RenderProtectedViewProps, Viewer, Worker } from '@react-pdf-viewer/core'\nimport { pageNavigationPlugin } from '@react-pdf-viewer/page-navigation'\n// import { printPlugin } from '@react-pdf-viewer/print'\n// import { rotatePlugin } from '@react-pdf-viewer/rotate'\n// import { searchPlugin } from '@react-pdf-viewer/search'\nimport { thumbnailPlugin } from '@react-pdf-viewer/thumbnail'\nimport { zoomPlugin } from '@react-pdf-viewer/zoom'\nimport { useEffect, useRef, useState } from 'react'\n\n// 注意:CMap 字体加载错误通常是由于缺少字体映射文件导致的\n// 解决方案:通过 transformGetDocumentParams 配置 cMapUrl 和 standardFontDataUrl\n//\n// 常见错误:\n// - \"CMapReaderFactory not initialized, see the `useWorkerFetch` parameter\"\n// - \"Error during font loading: CMapReaderFactory not initialized\"\n//\n// 解决步骤:\n// 1. 配置 cMapUrl 指向 CMap 文件目录\n// 2. 配置 standardFontDataUrl 指向标准字体目录\n// 3. 设置 cMapPacked: true 使用压缩文件\n// 4. 禁用字体子集化 (disableFontFace: false)\n\nimport '@react-pdf-viewer/core/lib/styles/index.css'\nimport zh_CN from '@react-pdf-viewer/locales/lib/zh_CN.json'\nimport '@react-pdf-viewer/page-navigation/lib/styles/index.css'\nimport { useRefState } from '../../hooks'\nimport { isNumber } from '../../utils'\n// import '@react-pdf-viewer/print/lib/styles/index.css'\n// import '@react-pdf-viewer/rotate/lib/styles/index.css' // 注释掉,因为rotate包没有这个文件\n// import '@react-pdf-viewer/search/lib/styles/index.css'\nimport '@react-pdf-viewer/thumbnail/lib/styles/index.css'\nimport '@react-pdf-viewer/zoom/lib/styles/index.css'\nimport { Alert, Button, Flex, Form, Input, Splitter } from 'antd'\nimport styles from './styles.module.less'\n\nconst ProtectedView = ({\n passwordStatus,\n verifyPassword,\n onVerifyPasswordEnd\n}: RenderProtectedViewProps & { onVerifyPasswordEnd: (password: string) => void }) => {\n const [form] = Form.useForm()\n const onSubmit = (): void => {\n form.validateFields().then((values) => {\n if (values) {\n verifyPassword(values.password)\n onVerifyPasswordEnd(values.password)\n }\n })\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" className=\"height-full\">\n <div style={{ width: 300 }}>\n {passwordStatus === PasswordStatus.WrongPassword && <Alert message=\"密码无效。请再试一次!\" type=\"error\" />}\n <Form form={form} size=\"large\" className=\"m-t-24\">\n <Form.Item name=\"password\" rules={[{ required: true, message: '请输入密码' }]}>\n <Input.Password autoComplete=\"new-password\" placeholder=\"请输入密码\" />\n </Form.Item>\n <Flex justify=\"center\">\n <Button type=\"primary\" onClick={onSubmit}>\n 提 交\n </Button>\n </Flex>\n </Form>\n </div>\n </Flex>\n )\n}\n/**\n * PDF预览组件属性接口\n */\nexport interface PdfPreviewProps {\n /** PDF文件URL地址 */\n fileUrl: string\n /** 当前页码,默认为1 */\n pageNo?: number\n /** 缩放比例,默认为1 */\n scale?: number\n /** 是否显示缩略图,默认为true */\n isHasThumbnails?: boolean\n /** PDF文件密码 */\n password?: string\n /** 密码设置回调 */\n onSetPassword?: (password: string) => void\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n}\n\n/**\n * PDF预览组件\n * 基于react-pdf-viewer实现的PDF文件预览功能\n * 支持密码保护、缩略图、缩放、页面导航等功能\n * @param props - 组件属性\n */\nexport default ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }: PdfPreviewProps) => {\n const embedRef = useRef<HTMLDivElement>(null)\n const [sizes, setSizes] = useState<number[]>([0])\n const [, setDocLoaded, getDocLoaded] = useRefState(false)\n const [currentPage, setCurrentPage, getCurrentPage] = useRefState<number | undefined>(undefined)\n const [temporaryPassword, setTemporaryPassword] = useState('')\n const jumpToPageNo = useRef<number>()\n const onVerifyPasswordEnd = (password: string) => {\n setTemporaryPassword(password)\n }\n\n const pageNavigationPluginInstance = pageNavigationPlugin({ enableShortcuts: true })\n const thumbnailPluginInstance = thumbnailPlugin({\n thumbnailWidth: sizes[0] - 70 // 不会自适应\n })\n const zoomPluginInstance = zoomPlugin()\n // const printPluginInstance = printPlugin()\n // const rotatePluginInstance = rotatePlugin()\n // const searchPluginInstance = searchPlugin()\n\n // 获取插件组件\n const { Thumbnails } = thumbnailPluginInstance\n const { ZoomIn, ZoomOut } = zoomPluginInstance // Zoom\n // const { Print } = printPluginInstance\n // const { Rotate } = rotatePluginInstance\n // const { Search } = searchPluginInstance\n\n // 工具栏组件\n const Toolbar = () => (\n <Flex gap={6} align=\"center\" className={styles.pdfToolbar}>\n <ZoomIn />\n <ZoomOut />\n {/* <Print /> */}\n {/* <Rotate /> */}\n {/* <Search /> */}\n {/* <Tooltip title=\"全屏\">\n <Button\n type=\"text\"\n icon={<FullscreenOutlined />}\n onClick={() => {\n const element = embedRef.current?.querySelector('.rpv-core__viewer')\n if (element) {\n if (document.fullscreenElement) {\n document.exitFullscreen()\n } else {\n element.requestFullscreen()\n }\n }\n }}\n size=\"small\"\n />\n </Tooltip> */}\n </Flex>\n )\n const onJumpToPage = (pageNo?: number) => {\n // console.log('跳转页面', jumpToPageNo.current, getCurrentPage(), pageNo)\n if (getDocLoaded()) {\n if (pageNo && pageNo - 1 !== getCurrentPage()) {\n jumpToPageNo.current = pageNo - 1\n pageNavigationPluginInstance.jumpToPage(jumpToPageNo.current)\n }\n }\n }\n const handleDocumentLoad = () => {\n // console.log('文档加载完成', pageNo)\n setSizes([400])\n setDocLoaded(true)\n onJumpToPage(pageNo)\n if (temporaryPassword) {\n onSetPassword?.(temporaryPassword)\n setTemporaryPassword('')\n }\n }\n useEffect(() => {\n // console.log('pdfUrl', fileUrl)\n setCurrentPage(undefined)\n setDocLoaded(false)\n setSizes([0])\n }, [fileUrl])\n useEffect(() => {\n // console.log('pageNo变化', pageNo)\n setTimeout(() => {\n // 要在fileUrl变化之后执行\n onJumpToPage(pageNo)\n }, 0)\n }, [pageNo])\n const renderError = (error: LoadError) => {\n let message = ''\n switch (error.name) {\n case 'InvalidPDFException':\n message = '文件无效或已损坏'\n break\n case 'MissingPDFException':\n message = '文件不存在'\n break\n case 'UnexpectedResponseException':\n message = '意外的服务器响应'\n break\n // case 'CMapReaderFactory not initialized':\n // message = '字体映射文件加载失败,请刷新页面重试'\n // break\n default:\n message = '无法加载文档'\n break\n }\n\n return (\n <Flex className=\"height-full\" justify=\"center\" align=\"center\">\n <Alert message={message} type=\"error\" showIcon />\n </Flex>\n )\n }\n const onPageChange = (e: PageChangeEvent) => {\n // console.log('页面切换', jumpToPageNo.current, e.currentPage)\n let newCurrentPage = e.currentPage\n if (isNumber(jumpToPageNo.current)) {\n // 以方法跳转优先\n newCurrentPage = jumpToPageNo.current\n setTimeout(() => {\n jumpToPageNo.current = undefined\n }, 1000)\n }\n setCurrentPage(newCurrentPage)\n }\n useEffect(() => {\n // console.log('currentPage', currentPage)\n if (!(embedRef.current && isNumber(currentPage))) return\n // 设置当前页高亮\n setTimeout(() => {\n // console.log('设置当前页高亮', currentPage, embedRef.current?.querySelectorAll('.rpv-core__viewer .rpv-core__page-layer'))\n const pages = embedRef.current?.querySelectorAll('.rpv-core__viewer .rpv-core__page-layer')\n pages?.forEach((page) => {\n if (Number(page.getAttribute('data-virtual-index')) === currentPage) {\n page.classList.add('current-page-highlight')\n } else {\n // 移除所有已有高亮\n page.classList.remove('current-page-highlight')\n }\n })\n }, 500)\n onSetPageNo?.(currentPage + 1)\n }, [currentPage])\n\n // 监听 CMap 加载错误\n // useEffect(() => {\n // const handleCMapError = (event: ErrorEvent) => {\n // if (event.error && event.error.message && event.error.message.includes('CMapReaderFactory')) {\n // console.warn('CMap 字体映射文件加载失败,这可能导致中文字体显示异常')\n // console.warn('建议检查网络连接或刷新页面重试')\n // }\n // }\n\n // window.addEventListener('error', handleCMapError)\n // return () => window.removeEventListener('error', handleCMapError)\n // }, [])\n return (\n <div ref={embedRef} className={styles.nsPreviewPdf}>\n <Worker workerUrl={`//logosdata.cn/public/pdf/pdf.worker.min.js`}>\n <Splitter onResize={setSizes}>\n {isHasThumbnails && (\n <Splitter.Panel resizable={false} size={sizes[0]} min={250} max={500} collapsible>\n <Thumbnails />\n </Splitter.Panel>\n )}\n <Splitter.Panel>\n <div className=\"height-full\">\n <Viewer\n localization={zh_CN}\n withCredentials={true}\n onDocumentAskPassword={(e) => {\n // 自动执行,失败弹窗renderProtectedView\n // console.log('密码验证', password, e)\n setTemporaryPassword('')\n e.verifyPassword(password || '')\n }}\n // 不加disableStream的情况onDocumentAskPassword有bug,输不了密码\n transformGetDocumentParams={(options: PdfJs.GetDocumentParams) => {\n return Object.assign({}, options, {\n // disableRange: false,\n disableStream: true, // 建议传入是否加密字段来控制\n httpHeaders: { 'Cache-Control': 'no-cache' },\n // 启用 CMap 支持,解决中文字体显示问题\n // cMapUrl: 指定 CMap 文件的 URL,用于处理非拉丁字符(如中文)\n // cMapPacked: 使用压缩的 CMap 文件以提高性能\n cMapUrl: '//logosdata.cn/public/pdf/pdfjs-dist@3.2.146/cmaps/', // 使用可用的源\n cMapPacked: true,\n // 禁用字体子集化,确保完整字体加载\n disableFontFace: false,\n // 启用标准字体支持\n standardFontDataUrl: '//logosdata.cn/public/pdf/pdfjs-dist@3.2.146/standard_fonts/',\n // 设置字体回退策略\n fallbackFontName: 'Helvetica'\n })\n }}\n fileUrl={fileUrl}\n defaultScale={scale}\n // defaultScale={SpecialZoomLevel.PageFit}\n plugins={[\n pageNavigationPluginInstance,\n thumbnailPluginInstance,\n zoomPluginInstance\n // printPluginInstance,\n // rotatePluginInstance,\n // searchPluginInstance,\n ]}\n onPageChange={onPageChange}\n // renderPage={() => <></>} // 加水印\n renderError={renderError}\n onDocumentLoad={handleDocumentLoad}\n renderProtectedView={(renderProps) => <ProtectedView onVerifyPasswordEnd={onVerifyPasswordEnd} {...renderProps} />}\n />\n <Toolbar />\n </div>\n </Splitter.Panel>\n </Splitter>\n </Worker>\n </div>\n )\n}\n","import { Empty, Flex, Image, Result } from 'antd'\nimport { useMemo } from 'react'\nimport VideoPlayer from './VideoPlayer'\n\nimport AudioPlayer from './AudioPlayer'\nimport MarkdownPreview from './MarkdownPreview'\nimport PdfPreview from './PdfPreview'\nimport styles from './styles.module.less'\n\n/**\n * 文件预览组件属性接口\n */\nexport interface FilePreviewProps {\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** PDF文件密码 */\n password?: string\n /** 搜索关键字 */\n searchValue?: string\n /** PDF预览参数 */\n pdfParams?: {\n /** 当前页码 */\n pageNo?: number\n /** 缩放比例 */\n scale?: number\n /** 是否显示缩略图 */\n isHasThumbnails?: boolean\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n }\n /** 文件参数 */\n fileParams?: ObjectType<string>\n /** 密码设置成功回调 */\n onSetPassSuccess?: () => void\n}\n\n/**\n * 文件预览组件\n * 支持图片、PDF、视频、音频、Markdown等文件格式的预览\n * @param props - 组件属性\n */\nexport default ({ suffix, fileUrl, pdfParams, password, searchValue }: FilePreviewProps) => {\n // const fileUrl = useMemo(() => {\n // return getPreViewFileUrl({ ...extraParams, fileId, preview: true })\n // }, [fileId])\n // const onSetPassword = async (password: string) => {\n // // console.log('onSetPassword', password)\n // try {\n // await updateCaseFile({\n // ...fileParams,\n // filePassword: password,\n // mimeType: suffix\n // } as CaseFileUpdateType)\n // onSetPassSuccess?.()\n // } finally {\n // }\n // }\n const Preview = useMemo(() => {\n if (!fileUrl) {\n return <Empty />\n }\n switch (suffix?.toUpperCase()) {\n case 'PNG':\n case 'JPG':\n case 'JPEG':\n case 'GIF':\n return <Image rootClassName={styles.nsPreviewImage} src={fileUrl} alt=\"预览图片\" />\n\n case 'PDF':\n return <PdfPreview fileUrl={fileUrl} {...pdfParams} password={password} /> // onSetPassword={onSetPassword}\n\n case 'MP4':\n // case 'MOV':\n // case 'AVI':\n // case 'FLV':\n return <VideoPlayer fileUrl={fileUrl} />\n\n case 'MP3':\n return <AudioPlayer fileUrl={fileUrl} />\n\n case 'MD':\n case 'MARKDOWN':\n return <MarkdownPreview fileUrl={fileUrl} searchValue={searchValue} />\n\n default:\n return <Result subTitle={`暂不支持 ${suffix || ''} 文件的预览`} />\n }\n }, [suffix, fileUrl, pdfParams])\n\n return (\n <Flex justify=\"center\" align=\"center\" className=\"height-full\">\n {Preview}\n </Flex>\n )\n}\n","import { Drawer } from 'antd'\nimport FilePreview from './FilePreview'\n\n/**\n * 文件预览抽屉组件属性接口\n */\nexport interface FilePreviewDrawerProps {\n /** 是否打开抽屉 */\n open: boolean\n /** 关闭抽屉的回调函数 */\n onClose: () => void\n /** 抽屉标题,默认为'文件预览' */\n title?: string\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** PDF文件密码 */\n password?: string\n /** 文件参数 */\n fileParams?: ObjectType<string>\n /** PDF预览参数 */\n pdfParams?: {\n /** 当前页码 */\n pageNo?: number\n /** 缩放比例 */\n scale?: number\n /** 是否显示缩略图 */\n isHasThumbnails?: boolean\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n }\n /** 密码设置成功回调 */\n onSetPassSuccess?: () => void\n}\n\n/**\n * 文件预览抽屉组件\n * 在抽屉中显示文件预览,支持各种文件格式\n * 全屏显示,提供更好的文件查看体验\n *\n * @example\n * <FilePreviewDrawer\n * open={isOpen}\n * fileUrl=\"https://example.com/file.pdf\"\n * suffix=\"pdf\"\n * title=\"PDF文件预览\"\n * onClose={() => setIsOpen(false)}\n * />\n *\n * @param props - 组件属性\n * @returns 文件预览抽屉组件\n */\nexport default ({\n open,\n fileUrl,\n suffix,\n title = '文件预览',\n onClose,\n password,\n fileParams,\n pdfParams,\n onSetPassSuccess\n}: FilePreviewDrawerProps) => {\n return (\n <Drawer\n title={title}\n push={false}\n width=\"100%\"\n open={open}\n onClose={onClose}\n // 全屏宽度,提供更好的文件预览体验\n >\n <FilePreview\n fileUrl={fileUrl}\n suffix={suffix}\n password={password}\n fileParams={fileParams}\n pdfParams={pdfParams}\n onSetPassSuccess={onSetPassSuccess}\n />\n </Drawer>\n )\n}\n",".iframe {\n width: 100%;\n height: 100%;\n border: none;\n overflow: auto;\n display: block;\n}\n","import { Spin } from 'antd'\nimport classNames from 'classnames'\nimport { forwardRef, useEffect, useMemo, useState } from 'react'\nimport { addUrlLastSlash, buildUrlParams, getUrlMainSource } from '../../utils'\nimport styles from './styles.module.less'\n\n/**\n * Iframe组件属性接口\n */\nexport interface IframeProps {\n /** iframe ID */\n id?: string\n /** iframe源地址 */\n src: string\n /** 自定义类名 */\n className?: string\n /** 加载完成回调 */\n onLoad?: () => void\n}\n\n/**\n * Iframe组件\n * 支持加载状态、URL参数处理、防缓存等功能\n * @param props - 组件属性\n */\nexport default forwardRef<HTMLIFrameElement, IframeProps>(({ id, src, className, onLoad }: IframeProps, ref) => {\n const [loading, setLoading] = useState(false)\n const finalSrc = useMemo(() => {\n return buildUrlParams({ v: Date.now() }, addUrlLastSlash(getUrlMainSource(src, location.href)))\n }, [src])\n const onHandleLoad = () => {\n setLoading(false)\n onLoad?.()\n }\n useEffect(() => {\n setLoading(true)\n }, [src])\n\n return (\n <>\n <Spin spinning={loading} wrapperClassName=\"full-spin\" tip=\"加载中...\">\n <iframe id={id} ref={ref} src={finalSrc} className={classNames(styles.iframe, className)} onLoad={onHandleLoad}></iframe>\n </Spin>\n </>\n )\n})\n","import TiptapLink from '@tiptap/extension-link'\nimport { Plugin, TextSelection } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\nimport { getMarkRange } from '@tiptap/react'\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])'\n }\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(this.parent?.() || []),\n new Plugin({\n props: {\n handleKeyDown: (_: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === 'Escape' && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n handleClick(view, pos) {\n const { schema, doc, tr } = view.state\n let range: ReturnType<typeof getMarkRange> | undefined\n\n if (schema.marks.link) {\n range = getMarkRange(doc.resolve(pos), schema.marks.link)\n }\n\n if (!range) {\n return\n }\n\n const { from, to } = range\n const start = Math.min(from, to)\n const end = Math.max(from, to)\n\n if (pos < start || pos > end) {\n return\n }\n\n const $start = doc.resolve(start)\n const $end = doc.resolve(end)\n const transaction = tr.setSelection(new TextSelection($start, $end))\n\n view.dispatch(transaction)\n }\n }\n })\n ]\n }\n})\n\nexport default Link\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport { Extension, isNodeSelection } from '@tiptap/react'\n\nexport const Selection = Extension.create({\n name: 'selection',\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n new Plugin({\n key: new PluginKey('selection'),\n props: {\n decorations(state) {\n if (state.selection.empty) {\n return null\n }\n\n if (editor.isFocused === true || !editor.isEditable) {\n return null\n }\n\n if (isNodeSelection(state.selection)) {\n return null\n }\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(state.selection.from, state.selection.to, {\n class: 'selection'\n })\n ])\n }\n }\n })\n ]\n }\n})\n\nexport default Selection\n","import type { Node, NodeType } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Extension } from '@tiptap/react'\n\nfunction nodeEqualsType({ types, node }: { types: NodeType | NodeType[]; node: Node | null }) {\n if (!node) return false\n\n if (Array.isArray(types)) {\n return types.includes(node.type)\n }\n\n return node.type === types\n}\n\nexport interface TrailingNodeOptions {\n node: string\n notAfter: string[]\n}\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph']\n }\n },\n\n addProseMirrorPlugins() {\n const plugin = new PluginKey(this.name)\n const disabledNodes = Object.entries(this.editor.schema.nodes)\n .map(([, value]) => value)\n .filter((node) => this.options.notAfter.includes(node.name))\n\n return [\n new Plugin({\n key: plugin,\n appendTransaction: (_, __, state) => {\n const { doc, tr, schema } = state\n const shouldInsertNodeAtEnd = plugin.getState(state)\n const endPosition = doc.content.size\n const type = schema.nodes[this.options.node]\n\n if (!shouldInsertNodeAtEnd) {\n return null\n }\n\n if (type) {\n return tr.insert(endPosition, type.create())\n }\n\n return null\n },\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value\n }\n\n const lastNode = tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n }\n }\n })\n ]\n }\n})\n\nexport default TrailingNode\n","import './tooltip.less'\nimport {\n autoUpdate,\n flip,\n FloatingDelayGroup,\n FloatingPortal,\n offset,\n shift,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useMergeRefs,\n useRole,\n type Placement,\n type ReferenceType,\n type UseFloatingReturn\n} from '@floating-ui/react'\nimport * as React from 'react'\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<React.HTMLProps<HTMLElement>, 'ref'> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>\n getFloatingProps: (userProps?: React.HTMLProps<HTMLDivElement>) => 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] = React.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 React.useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = React.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 <TooltipContext.Provider value={tooltip}>{children}</TooltipContext.Provider>\n }\n\n return (\n <FloatingDelayGroup delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }} timeoutMs={props.timeout}>\n <TooltipContext.Provider value={tooltip}>{children}</TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = React.forwardRef<HTMLElement, TooltipTriggerProps>(function TooltipTrigger(\n { children, asChild = false, ...props },\n propRef\n) {\n const context = useTooltipContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.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 && React.isValidElement(children)) {\n const dataAttributes = {\n 'data-tooltip-state': context.open ? 'open' : 'closed'\n }\n\n return React.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 ref={ref} data-tooltip-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n )\n})\n\nexport const TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(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\nTooltip.displayName = 'Tooltip'\nTooltipTrigger.displayName = 'TooltipTrigger'\nTooltipContent.displayName = 'TooltipContent'\n","import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'\nimport * as React from 'react'\n\nimport './button-colors.less'\nimport './button-group.less'\nimport './button.less'\n\ntype PlatformShortcuts = Record<string, string>\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n}\n\nexport const MAC_SYMBOLS: PlatformShortcuts = {\n ctrl: '⌘',\n alt: '⌥',\n shift: '⇧'\n} as const\n\nexport const formatShortcutKey = (key: string, isMac: boolean) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || key.toUpperCase()\n }\n return key.charAt(0).toUpperCase() + key.slice(1)\n}\n\nexport const parseShortcutKeys = (shortcutKeys: string | undefined, isMac: boolean) => {\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split('-')\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac))\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({ shortcuts }) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <React.Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </React.Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className = '', children, tooltip, showTooltip = true, shortcutKeys, 'aria-label': ariaLabel, ...props }, ref) => {\n const isMac = React.useMemo(() => typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac'), [])\n\n const shortcuts = React.useMemo(() => parseShortcutKeys(shortcutKeys, isMac), [shortcutKeys, isMac])\n\n if (!tooltip || !showTooltip) {\n return (\n <button className={`tiptap-button ${className}`.trim()} ref={ref} aria-label={ariaLabel} {...props}>\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger className={`tiptap-button ${className}`.trim()} ref={ref} aria-label={ariaLabel} {...props}>\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 * as React from 'react'\n\ntype SpacerOrientation = 'horizontal' | 'vertical'\n\ninterface SpacerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: SpacerOrientation\n size?: string | number\n}\n\nexport const Spacer = React.forwardRef<HTMLDivElement, SpacerProps>(\n ({ orientation = 'horizontal', size, className = '', style = {}, ...props }, ref) => {\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 ref={ref} {...props} className={className} style={computedStyle} />\n }\n)\n\nSpacer.displayName = 'Spacer'\n","import './separator.less'\nimport * as React from 'react'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation\n decorative?: boolean\n}\n\nexport const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ decorative, orientation = 'vertical', className = '', ...divProps }, ref) => {\n const ariaOrientation = orientation === 'vertical' ? orientation : undefined\n const semanticProps = decorative ? { role: 'none' } : { 'aria-orientation': ariaOrientation, role: 'separator' }\n\n return <div className={`tiptap-separator ${className}`.trim()} data-orientation={orientation} {...semanticProps} {...divProps} ref={ref} />\n }\n)\n\nSeparator.displayName = 'Separator'\n","import { Separator } from '../../tiptap-ui-primitive/separator'\nimport './toolbar.less'\nimport * as React from 'react'\n\ntype BaseProps = React.HTMLAttributes<HTMLDivElement>\n\ninterface ToolbarProps extends BaseProps {\n variant?: 'floating' | 'fixed'\n}\n\nconst mergeRefs = <T,>(refs: Array<React.RefObject<T> | React.Ref<T> | null | undefined>): React.RefCallback<T> => {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(value)\n } else if (ref != null) {\n ;(ref as React.MutableRefObject<T | null>).current = value\n }\n })\n }\n}\n\nconst useObserveVisibility = (ref: React.RefObject<HTMLElement | null>, callback: () => void): void => {\n React.useEffect(() => {\n const element = ref.current\n if (!element) return\n\n let isMounted = true\n\n if (isMounted) {\n requestAnimationFrame(callback)\n }\n\n const observer = new MutationObserver(() => {\n if (isMounted) {\n requestAnimationFrame(callback)\n }\n })\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n attributes: true\n })\n\n return () => {\n isMounted = false\n observer.disconnect()\n }\n }, [ref, callback])\n}\n\nconst useToolbarKeyboardNav = (toolbarRef: React.RefObject<HTMLDivElement | null>): void => {\n React.useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const getFocusableElements = () =>\n Array.from(toolbar.querySelectorAll<HTMLElement>('button:not([disabled]), [role=\"button\"]:not([disabled]), [tabindex=\"0\"]:not([disabled])'))\n\n const navigateToIndex = (e: KeyboardEvent, targetIndex: number, elements: HTMLElement[]) => {\n e.preventDefault()\n let nextIndex = targetIndex\n\n if (nextIndex >= elements.length) {\n nextIndex = 0\n } else if (nextIndex < 0) {\n nextIndex = elements.length - 1\n }\n\n elements[nextIndex]?.focus()\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const focusableElements = getFocusableElements()\n if (!focusableElements.length) return\n\n const currentElement = document.activeElement as HTMLElement\n const currentIndex = focusableElements.indexOf(currentElement)\n\n if (!toolbar.contains(currentElement)) return\n\n const keyActions: Record<string, () => void> = {\n ArrowRight: () => navigateToIndex(e, currentIndex + 1, focusableElements),\n ArrowDown: () => navigateToIndex(e, currentIndex + 1, focusableElements),\n ArrowLeft: () => navigateToIndex(e, currentIndex - 1, focusableElements),\n ArrowUp: () => navigateToIndex(e, currentIndex - 1, focusableElements),\n Home: () => navigateToIndex(e, 0, focusableElements),\n End: () => navigateToIndex(e, focusableElements.length - 1, focusableElements)\n }\n\n const action = keyActions[e.key]\n if (action) {\n action()\n }\n }\n\n toolbar.addEventListener('keydown', handleKeyDown)\n return () => toolbar.removeEventListener('keydown', handleKeyDown)\n }, [toolbarRef])\n}\n\nconst useToolbarVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const toolbar = ref.current\n if (!toolbar) return\n\n // Check if any group has visible children\n const hasVisibleChildren = Array.from(toolbar.children).some((child) => {\n if (!(child instanceof HTMLElement)) return false\n if (child.getAttribute('role') === 'group') {\n return child.children.length > 0\n }\n return false\n })\n\n setIsVisible(hasVisibleChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nconst useGroupVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const group = ref.current\n if (!group) return\n\n const hasVisibleChildren = Array.from(group.children).some((child) => {\n if (!(child instanceof HTMLElement)) return false\n return true\n })\n\n setIsVisible(hasVisibleChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nconst useSeparatorVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const separator = ref.current\n if (!separator) return\n\n const prevSibling = separator.previousElementSibling as HTMLElement\n const nextSibling = separator.nextElementSibling as HTMLElement\n\n if (!prevSibling || !nextSibling) {\n setIsVisible(false)\n return\n }\n\n const areBothGroups = prevSibling.getAttribute('role') === 'group' && nextSibling.getAttribute('role') === 'group'\n\n const haveBothChildren = prevSibling.children.length > 0 && nextSibling.children.length > 0\n\n setIsVisible(areBothGroups && haveBothChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nexport const Toolbar = React.forwardRef<HTMLDivElement, ToolbarProps>(({ children, className, variant = 'fixed', ...props }, ref) => {\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useToolbarVisibility(toolbarRef)\n\n useToolbarKeyboardNav(toolbarRef)\n\n if (!isVisible) return null\n\n return (\n <div\n ref={mergeRefs([toolbarRef, ref])}\n role=\"toolbar\"\n aria-label=\"toolbar\"\n data-variant={variant}\n className={`tiptap-toolbar ${className || ''}`}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nToolbar.displayName = 'Toolbar'\n\nexport const ToolbarGroup = React.forwardRef<HTMLDivElement, BaseProps>(({ children, className, ...props }, ref) => {\n const groupRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useGroupVisibility(groupRef)\n\n if (!isVisible) return null\n\n return (\n <div ref={mergeRefs([groupRef, ref])} role=\"group\" className={`tiptap-toolbar-group ${className || ''}`} {...props}>\n {children}\n </div>\n )\n})\n\nToolbarGroup.displayName = 'ToolbarGroup'\n\nexport const ToolbarSeparator = React.forwardRef<HTMLDivElement, BaseProps>(({ ...props }, ref) => {\n const separatorRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useSeparatorVisibility(separatorRef)\n\n if (!isVisible) return null\n\n return <Separator ref={mergeRefs([separatorRef, ref])} orientation=\"vertical\" decorative {...props} />\n})\n\nToolbarSeparator.displayName = 'ToolbarSeparator'\n","import type { Editor } from '@tiptap/react'\nimport { useCurrentEditor } from '@tiptap/react'\nimport * as React from 'react'\n\nexport function useTiptapEditor(providedEditor?: Editor | null): Editor | null {\n const { editor: coreEditor } = useCurrentEditor()\n return React.useMemo(() => providedEditor || coreEditor, [providedEditor, coreEditor])\n}\n","import * as React from 'react'\n\nexport const ChevronDownIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M6 3C6.55228 3 7 3.44772 7 4V11H17V4C17 3.44772 17.4477 3 18 3C18.5523 3 19 3.44772 19 4V20C19 20.5523 18.5523 21 18 21C17.4477 21 17 20.5523 17 20V13H7V20C7 20.5523 6.55228 21 6 21C5.44772 21 5 20.5523 5 20V4C5 3.44772 5.44772 3 6 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingIcon.displayName = 'HeadingIcon'\n","import type { Attrs, Node } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/react'\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\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 = (markName: string, editor: Editor | null): 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 = (nodeName: string, editor: Editor | null): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.nodes.get(nodeName) !== undefined\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(editor: Editor | null, markName: string): Attrs | null {\n if (!editor) return null\n const { state } = editor\n const marks = state.storedMarks || state.selection.$from.marks()\n const mark = marks.find((mark) => mark.type.name === markName)\n\n return mark?.attrs ?? null\n}\n\n/**\n * Checks if a node is empty\n */\nexport function isEmptyNode(node?: Node | null): boolean {\n return !!node && node.content.size === 0\n}\n\n/**\n * Utility function to conditionally join class names into a single string.\n * Filters out falsey values like false, undefined, null, and empty strings.\n *\n * @param classes - List of class name strings or falsey values.\n * @returns A single space-separated string of valid class names.\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ')\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: { editor: Editor | null; node?: Node | null; nodePos?: number | null }): { pos: number; node: Node } | 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 = nodePos !== undefined && nodePos !== null\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n if (hasValidPos) {\n try {\n const nodeAtPos = editor.state.doc.nodeAt(nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n } catch (error) {\n console.error('Error checking node at position:', error)\n return null\n }\n }\n\n // Otherwise search for the node in the document\n let foundPos = -1\n let foundNode: Node | 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 return foundPos !== -1 && foundNode !== null ? { pos: foundPos, node: foundNode } : null\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(`File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`)\n }\n\n // For demo/testing: Simulate upload progress\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) => {\n setTimeout(resolve, 500)\n })\n onProgress?.({ progress })\n }\n\n return '/images/placeholder-image.png'\n\n // Uncomment for production use:\n // return convertFileToBase64(file, abortSignal);\n}\n\n/**\n * Converts a File to base64 string\n * @param file The file to convert\n * @param abortSignal Optional AbortSignal for cancelling the conversion\n * @returns Promise resolving to the base64 representation of the file\n */\nexport const convertFileToBase64 = (file: File, abortSignal?: AbortSignal): Promise<string> => {\n if (!file) {\n return Promise.reject(new Error('No file provided'))\n }\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n const abortHandler = () => {\n reader.abort()\n reject(new Error('Upload cancelled'))\n }\n\n if (abortSignal) {\n abortSignal.addEventListener('abort', abortHandler)\n }\n\n reader.onloadend = () => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler)\n }\n\n if (typeof reader.result === 'string') {\n resolve(reader.result)\n } else {\n reject(new Error('Failed to convert File to base64'))\n }\n }\n\n reader.onerror = (error) => reject(new Error(`File reading error: ${error}`))\n reader.readAsDataURL(file)\n })\n}\n","import * as React from 'react'\n\nexport const HeadingFiveIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingFourIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingOneIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingSixIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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","import * as React from 'react'\n\nexport const HeadingThreeIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingTwoIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { HeadingFiveIcon } from '../../tiptap-icons/heading-five-icon'\nimport { HeadingFourIcon } from '../../tiptap-icons/heading-four-icon'\nimport { HeadingOneIcon } from '../../tiptap-icons/heading-one-icon'\nimport { HeadingSixIcon } from '../../tiptap-icons/heading-six-icon'\nimport { HeadingThreeIcon } from '../../tiptap-icons/heading-three-icon'\nimport { HeadingTwoIcon } from '../../tiptap-icons/heading-two-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeadingButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The heading level.\n */\n level: Level\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the heading is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\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 headingShortcutKeys: Partial<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\nexport function canToggleHeading(editor: Editor | null, level: Level): boolean {\n if (!editor) return false\n\n try {\n return editor.can().toggleNode('heading', 'paragraph', { level })\n } catch {\n return false\n }\n}\n\nexport function isHeadingActive(editor: Editor | null, level: Level): boolean {\n if (!editor) return false\n return editor.isActive('heading', { level })\n}\n\nexport function toggleHeading(editor: Editor | null, level: Level): void {\n if (!editor) return\n\n if (editor.isActive('heading', { level })) {\n editor.chain().focus().setNode('paragraph').run()\n } else {\n editor.chain().focus().toggleNode('heading', 'paragraph', { level }).run()\n }\n}\n\nexport function isHeadingButtonDisabled(editor: Editor | null, level: Level, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (!canToggleHeading(editor, level)) return true\n return false\n}\n\nexport function shouldShowHeadingButton(params: {\n editor: Editor | null\n level: Level\n hideWhenUnavailable: boolean\n headingInSchema: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, headingInSchema } = params\n\n if (!headingInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection)) {\n return false\n }\n }\n\n return true\n}\n\nexport function getFormattedHeadingName(level: Level): string {\n return `标题 ${level}`\n}\n\nexport function useHeadingState(editor: Editor | null, level: Level, disabled: boolean = false) {\n const headingInSchema = isNodeInSchema('heading', editor)\n const isDisabled = isHeadingButtonDisabled(editor, level, disabled)\n const isActive = isHeadingActive(editor, level)\n\n const Icon = headingIcons[level]\n const shortcutKey = headingShortcutKeys[level]\n const formattedName = getFormattedHeadingName(level)\n\n return {\n headingInSchema,\n isDisabled,\n isActive,\n Icon,\n shortcutKey,\n formattedName\n }\n}\n\nexport const HeadingButton = React.forwardRef<HTMLButtonElement, HeadingButtonProps>(\n ({ editor: providedEditor, level, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { headingInSchema, isDisabled, isActive, Icon, shortcutKey, formattedName } = useHeadingState(editor, level, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleHeading(editor, level)\n }\n },\n [onClick, isDisabled, editor, level]\n )\n\n const show = React.useMemo(() => {\n return shouldShowHeadingButton({\n editor,\n level,\n hideWhenUnavailable,\n headingInSchema\n })\n }, [editor, level, hideWhenUnavailable, headingInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={formattedName}\n aria-pressed={isActive}\n tooltip={formattedName}\n shortcutKeys={shortcutKey}\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\nHeadingButton.displayName = 'HeadingButton'\n\nexport default HeadingButton\n","import './dropdown-menu.less'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\nimport type { Placement } from '@floating-ui/react'\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingPortal,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n useTypeahead\n} from '@floating-ui/react'\nimport * as React from 'react'\n\ninterface DropdownMenuOptions {\n initialOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n}\n\ninterface DropdownMenuProps extends DropdownMenuOptions {\n children: React.ReactNode\n}\n\ntype ContextType = ReturnType<typeof useDropdownMenu> & {\n updatePosition: (side: 'top' | 'right' | 'bottom' | 'left', align: 'start' | 'center' | 'end') => void\n}\n\nconst DropdownMenuContext = React.createContext<ContextType | null>(null)\n\nfunction useDropdownMenuContext() {\n const context = React.useContext(DropdownMenuContext)\n if (!context) {\n throw new Error('DropdownMenu components must be wrapped in <DropdownMenu />')\n }\n return context\n}\n\nfunction useDropdownMenu({\n initialOpen = false,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n side = 'bottom',\n align = 'start'\n}: DropdownMenuOptions) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen)\n const [currentPlacement, setCurrentPlacement] = React.useState<Placement>(`${side}-${align}` as Placement)\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const elementsRef = React.useRef<Array<HTMLElement | null>>([])\n const labelsRef = React.useRef<Array<string | null>>([])\n\n const floating = useFloating({\n open,\n onOpenChange: setOpen,\n placement: currentPlacement,\n middleware: [offset({ mainAxis: 4 }), flip(), shift({ padding: 4 })],\n whileElementsMounted: autoUpdate\n })\n\n const { context } = floating\n\n const interactions = useInteractions([\n useClick(context, {\n event: 'mousedown',\n toggle: true,\n ignoreMouse: false\n }),\n useRole(context, { role: 'menu' }),\n useDismiss(context, {\n outsidePress: true,\n outsidePressEvent: 'mousedown'\n }),\n useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true\n }),\n useTypeahead(context, {\n listRef: labelsRef,\n onMatch: open ? setActiveIndex : undefined,\n activeIndex\n })\n ])\n\n const updatePosition = React.useCallback((newSide: 'top' | 'right' | 'bottom' | 'left', newAlign: 'start' | 'center' | 'end') => {\n setCurrentPlacement(`${newSide}-${newAlign}` as Placement)\n }, [])\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n activeIndex,\n setActiveIndex,\n elementsRef,\n labelsRef,\n updatePosition,\n ...interactions,\n ...floating\n }),\n [open, setOpen, activeIndex, interactions, floating, updatePosition]\n )\n}\n\nexport function DropdownMenu({ children, ...options }: DropdownMenuProps) {\n const dropdown = useDropdownMenu(options)\n return (\n <DropdownMenuContext.Provider value={dropdown}>\n <FloatingList elementsRef={dropdown.elementsRef} labelsRef={dropdown.labelsRef}>\n {children}\n </FloatingList>\n </DropdownMenuContext.Provider>\n )\n}\n\ninterface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n ({ children, asChild = false, ...props }, propRef) => {\n const context = useDropdownMenuContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.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 && React.isValidElement(children)) {\n const dataAttributes = {\n 'data-state': context.open ? 'open' : 'closed'\n }\n\n return React.cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === 'object' ? children.props : {}),\n 'aria-expanded': context.open,\n 'aria-haspopup': 'menu' as const,\n ...dataAttributes\n })\n )\n }\n\n return (\n <button\n ref={ref}\n aria-expanded={context.open}\n aria-haspopup=\"menu\"\n data-state={context.open ? 'open' : 'closed'}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger'\n\ninterface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'vertical' | 'horizontal'\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n ({ style, className, orientation = 'vertical', side = 'bottom', align = 'start', portal = true, portalProps = {}, ...props }, propRef) => {\n const context = useDropdownMenuContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n React.useEffect(() => {\n context.updatePosition(side, align)\n }, [context, side, align])\n\n if (!context.open) return null\n\n const content = (\n <FloatingFocusManager context={context.context} modal={false} initialFocus={0} returnFocus={true}>\n <div\n ref={ref}\n className={`tiptap-dropdown-menu ${className || ''}`}\n style={{\n position: context.strategy,\n top: context.y ?? 0,\n left: context.x ?? 0,\n outline: 'none',\n ...style\n }}\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={context.open ? 'open' : 'closed'}\n data-side={side}\n data-align={align}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nDropdownMenuContent.displayName = 'DropdownMenuContent'\n\ninterface DropdownMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n ({ children, disabled, asChild = false, onSelect, className, ...props }, ref) => {\n const context = useDropdownMenuContext()\n const item = useListItem({ label: disabled ? null : children?.toString() })\n const isActive = context.activeIndex === item.index\n\n const handleSelect = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n onSelect?.()\n props.onClick?.(event)\n context.setOpen(false)\n },\n [context, disabled, onSelect, props]\n )\n\n const itemProps: React.HTMLAttributes<HTMLDivElement> & {\n ref: React.Ref<HTMLDivElement>\n role: string\n tabIndex: number\n 'aria-disabled'?: boolean\n 'data-highlighted'?: boolean\n } = {\n ref: useMergeRefs([item.ref, ref]),\n role: 'menuitem',\n className,\n tabIndex: isActive ? 0 : -1,\n 'data-highlighted': isActive,\n 'aria-disabled': disabled,\n ...context.getItemProps({\n ...props,\n onClick: handleSelect\n })\n }\n\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as {\n onClick?: (event: React.MouseEvent<HTMLElement>) => void\n }\n\n // Create merged props without adding onClick directly to the props object\n const mergedProps = {\n ...itemProps,\n ...(typeof children.props === 'object' ? children.props : {})\n }\n\n // Handle onClick separately based on the element type\n const eventHandlers = {\n onClick: (event: React.MouseEvent<HTMLElement>) => {\n // Cast the event to make it compatible with handleSelect\n handleSelect(event as unknown as React.MouseEvent<HTMLDivElement>)\n childProps.onClick?.(event)\n }\n }\n\n return React.cloneElement(children, {\n ...mergedProps,\n ...eventHandlers\n })\n }\n\n return <div {...itemProps}>{children}</div>\n }\n)\n\nDropdownMenuItem.displayName = 'DropdownMenuItem'\n\ninterface DropdownMenuGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string\n}\n\nexport const DropdownMenuGroup = React.forwardRef<HTMLDivElement, DropdownMenuGroupProps>(({ children, label, className, ...props }, ref) => {\n return (\n <div {...props} ref={ref} role=\"group\" aria-label={label} className={`tiptap-button-group ${className || ''}`}>\n {children}\n </div>\n )\n})\n\nDropdownMenuGroup.displayName = 'DropdownMenuGroup'\n\nexport const DropdownMenuSeparator = React.forwardRef<React.ElementRef<typeof Separator>, React.ComponentPropsWithoutRef<typeof Separator>>(\n ({ className, ...props }, ref) => <Separator ref={ref} className={`tiptap-dropdown-menu-separator ${className || ''}`} {...props} />\n)\nDropdownMenuSeparator.displayName = Separator.displayName\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { ChevronDownIcon } from '../../tiptap-icons/chevron-down-icon'\nimport { HeadingIcon } from '../../tiptap-icons/heading-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- Tiptap UI ---\nimport {\n getFormattedHeadingName,\n HeadingButton,\n headingIcons,\n type Level\n} from '../../tiptap-ui/heading-button/heading-button'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\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\nexport interface HeadingDropdownMenuProps extends Omit<ButtonProps, 'type'> {\n editor?: Editor | null\n levels?: Level[]\n hideWhenUnavailable?: boolean\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function HeadingDropdownMenu({\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n onOpenChange,\n ...props\n}: HeadingDropdownMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false)\n const editor = useTiptapEditor(providedEditor)\n\n const headingInSchema = isNodeInSchema('heading', editor)\n\n const handleOnOpenChange = React.useCallback(\n (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [onOpenChange]\n )\n\n const getActiveIcon = React.useCallback(() => {\n if (!editor) return <HeadingIcon className=\"tiptap-button-icon\" />\n\n const activeLevel = levels.find((level) => editor.isActive('heading', { level })) as Level | undefined\n\n if (!activeLevel) return <HeadingIcon className=\"tiptap-button-icon\" />\n\n const ActiveIcon = headingIcons[activeLevel]\n return <ActiveIcon className=\"tiptap-button-icon\" />\n }, [editor, levels])\n\n const canToggleAnyHeading = React.useCallback((): boolean => {\n if (!editor) return false\n return levels.some((level) => editor.can().toggleNode('heading', 'paragraph', { level }))\n }, [editor, levels])\n\n const isDisabled = !canToggleAnyHeading()\n const isAnyHeadingActive = editor?.isActive('heading') ?? false\n\n const show = React.useMemo(() => {\n if (!headingInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleAnyHeading()) {\n return false\n }\n }\n\n return true\n }, [headingInSchema, editor, hideWhenUnavailable, canToggleAnyHeading])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isAnyHeadingActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Format text as heading\"\n aria-pressed={isAnyHeadingActive}\n tooltip=\"标题\"\n {...props}\n >\n {getActiveIcon()}\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {levels.map((level) => (\n <DropdownMenuItem key={`heading-${level}`} asChild>\n <HeadingButton editor={editor} level={level} text={getFormattedHeadingName(level)} tooltip={''} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default HeadingDropdownMenu\n","import type { Editor } from '@tiptap/react'\nimport * as React from 'react'\n\ntype Orientation = 'horizontal' | 'vertical' | 'both'\n\ninterface MenuNavigationOptions<T> {\n editor?: Editor | null\n containerRef?: React.RefObject<HTMLElement | null>\n query?: string\n items: T[]\n onSelect?: (item: T) => void\n onClose?: () => void\n orientation?: Orientation\n autoSelectFirstItem?: boolean\n}\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] = React.useState<number>(autoSelectFirstItem ? 0 : -1)\n\n React.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('keydown', handleKeyboardNavigation, true)\n }\n }\n\n return undefined\n }, [editor, containerRef, items, selectedIndex, onSelect, onClose, orientation])\n\n React.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","import * as React from 'react'\n\nexport const BanIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HighlighterIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 './popover.less'\nimport type { Placement } from '@floating-ui/react'\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n limitShift,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useRole\n} from '@floating-ui/react'\nimport * as React from 'react'\n\ntype PopoverContextValue = ReturnType<typeof usePopover> & {\n setLabelId: (id: string | undefined) => void\n setDescriptionId: (id: string | undefined) => void\n updatePosition: (side: 'top' | 'right' | 'bottom' | 'left', align: 'start' | 'center' | 'end') => void\n}\n\ninterface PopoverOptions {\n initialOpen?: boolean\n modal?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n}\n\ninterface PopoverProps extends PopoverOptions {\n children: React.ReactNode\n}\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext() {\n const context = React.useContext(PopoverContext)\n if (!context) {\n throw new Error('Popover components must be wrapped in <Popover />')\n }\n return context\n}\n\nfunction usePopover({\n initialOpen = false,\n modal,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n side = 'bottom',\n align = 'center'\n}: PopoverOptions = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen)\n const [labelId, setLabelId] = React.useState<string>()\n const [descriptionId, setDescriptionId] = React.useState<string>()\n const [currentPlacement, setCurrentPlacement] = React.useState<Placement>(`${side}-${align}` as Placement)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const middleware = React.useMemo(\n () => [\n offset(4),\n flip({\n fallbackAxisSideDirection: 'end',\n crossAxis: false\n }),\n shift({\n limiter: limitShift({ offset: 4 })\n })\n ],\n []\n )\n\n const floating = useFloating({\n placement: currentPlacement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware\n })\n\n const interactions = useInteractions([useClick(floating.context), useDismiss(floating.context), useRole(floating.context)])\n\n const updatePosition = React.useCallback((newSide: 'top' | 'right' | 'bottom' | 'left', newAlign: 'start' | 'center' | 'end') => {\n setCurrentPlacement(`${newSide}-${newAlign}` as Placement)\n }, [])\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...floating,\n modal,\n labelId,\n descriptionId,\n setLabelId,\n setDescriptionId,\n updatePosition\n }),\n [open, setOpen, interactions, floating, modal, labelId, descriptionId, updatePosition]\n )\n}\n\nfunction Popover({ children, modal = false, ...options }: PopoverProps) {\n const popover = usePopover({ modal, ...options })\n return <PopoverContext.Provider value={popover}>{children}</PopoverContext.Provider>\n}\n\ninterface TriggerElementProps extends React.HTMLProps<HTMLElement> {\n asChild?: boolean\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLElement, TriggerElementProps>(function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const context = usePopoverContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.version, 10) >= 19\n ? (children.props as any).ref\n : (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(children.props as any),\n 'data-state': context.open ? 'open' : 'closed'\n })\n )\n }\n\n return (\n <button ref={ref} data-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n )\n})\n\ninterface PopoverContentProps extends React.HTMLProps<HTMLDivElement> {\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(function PopoverContent(\n { className, side = 'bottom', align = 'center', style, portal = true, portalProps = {}, ...props },\n propRef\n) {\n const context = usePopoverContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n React.useEffect(() => {\n context.updatePosition(side, align)\n }, [context, side, align])\n\n if (!context.context.open) return null\n\n const content = (\n <FloatingFocusManager context={context.context} modal={context.modal}>\n <div\n ref={ref}\n style={{\n position: context.strategy,\n top: context.y ?? 0,\n left: context.x ?? 0,\n ...style\n }}\n aria-labelledby={context.labelId}\n aria-describedby={context.descriptionId}\n className={`tiptap-popover ${className || ''}`}\n data-side={side}\n data-align={align}\n data-state={context.context.open ? 'open' : 'closed'}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n})\n\nPopoverTrigger.displayName = 'PopoverTrigger'\nPopoverContent.displayName = 'PopoverContent'\n\nexport { Popover, PopoverContent, PopoverTrigger }\n","import type { Node } from '@tiptap/pm/model'\nimport { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Lib ---\nimport { findNodePosition, isEmptyNode, isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\n// --- Styles ---\nimport './highlight-button.less'\n\nexport const HIGHLIGHT_COLORS = [\n {\n label: 'Default background',\n value: 'var(--tt-bg-color)',\n border: 'var(--tt-bg-color-contrast)'\n },\n {\n label: 'Gray background',\n value: 'var(--tt-highlight-gray)',\n border: 'var(--tt-highlight-gray-contrast)'\n },\n {\n label: 'Brown background',\n value: 'var(--tt-highlight-brown)',\n border: 'var(--tt-highlight-brown-contrast)'\n },\n {\n label: 'Orange background',\n value: 'var(--tt-highlight-orange)',\n border: 'var(--tt-highlight-orange-contrast)'\n },\n {\n label: 'Yellow background',\n value: 'var(--tt-highlight-yellow)',\n border: 'var(--tt-highlight-yellow-contrast)'\n },\n {\n label: 'Green background',\n value: 'var(--tt-highlight-green)',\n border: 'var(--tt-highlight-green-contrast)'\n },\n {\n label: 'Blue background',\n value: 'var(--tt-highlight-blue)',\n border: 'var(--tt-highlight-blue-contrast)'\n },\n {\n label: 'Purple background',\n value: 'var(--tt-highlight-purple)',\n border: 'var(--tt-highlight-purple-contrast)'\n },\n {\n label: 'Pink background',\n value: 'var(--tt-highlight-pink)',\n border: 'var(--tt-highlight-pink-contrast)'\n },\n {\n label: 'Red background',\n value: 'var(--tt-highlight-red)',\n border: 'var(--tt-highlight-red-contrast)'\n }\n]\n\nexport interface HighlightButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The node to apply highlight to\n */\n node?: Node | null\n /**\n * The position of the node in the document\n */\n nodePos?: number | null\n /**\n * The color to apply when toggling the highlight.\n * If not provided, it will use the default color from the extension.\n */\n color: string\n /**\n * Optional text to display alongside the icon.\n */\n text?: 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 highlight is applied.\n */\n onApplied?: (color: string) => void\n}\n\n/**\n * Checks if highlight can be toggled in the current editor state\n */\nexport function canToggleHighlight(editor: Editor | null): boolean {\n if (!editor) return false\n try {\n return editor.can().setMark('highlight')\n } catch {\n return false\n }\n}\n\n/**\n * Checks if highlight is active in the current selection\n */\nexport function isHighlightActive(editor: Editor | null, color: string): boolean {\n if (!editor) return false\n return editor.isActive('highlight', { color })\n}\n\n/**\n * Toggles highlight on the current selection or specified node\n */\nexport function toggleHighlight(editor: Editor | null, color: string, node?: Node | null, nodePos?: number | null): void {\n if (!editor) return\n\n try {\n const chain = editor.chain().focus()\n\n if (isEmptyNode(node)) {\n chain.toggleMark('highlight', { color }).run()\n } else if (nodePos !== undefined && nodePos !== null && nodePos !== -1) {\n chain.setNodeSelection(nodePos).toggleMark('highlight', { color }).run()\n } else if (node) {\n const foundPos = findNodePosition({ editor, node })\n if (foundPos) {\n chain.setNodeSelection(foundPos.pos).toggleMark('highlight', { color }).run()\n } else {\n chain.toggleMark('highlight', { color }).run()\n }\n } else {\n chain.toggleMark('highlight', { color }).run()\n }\n\n editor.chain().setMeta('hideDragHandle', true).run()\n } catch (error) {\n console.error('Failed to apply highlight:', error)\n }\n}\n\n/**\n * Determines if the highlight button should be disabled\n */\nexport function isHighlightButtonDisabled(editor: Editor | null, userDisabled: boolean = false): boolean {\n if (!editor || userDisabled) return true\n\n const isIncompatibleContext = editor.isActive('code') || editor.isActive('codeBlock') || editor.isActive('imageUpload')\n\n return isIncompatibleContext || !canToggleHighlight(editor)\n}\n\n/**\n * Determines if the highlight button should be shown\n */\nexport function shouldShowHighlightButton(editor: Editor | null, hideWhenUnavailable: boolean, highlightInSchema: boolean): boolean {\n if (!highlightInSchema || !editor) return false\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleHighlight(editor)) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Custom hook to manage highlight button state\n */\nexport function useHighlightState(editor: Editor | null, color: string, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const highlightInSchema = isMarkInSchema('highlight', editor)\n const isDisabled = isHighlightButtonDisabled(editor, disabled)\n const isActive = isHighlightActive(editor, color)\n\n const shouldShow = React.useMemo(\n () => shouldShowHighlightButton(editor, hideWhenUnavailable, highlightInSchema),\n [editor, hideWhenUnavailable, highlightInSchema]\n )\n\n return {\n highlightInSchema,\n isDisabled,\n isActive,\n shouldShow\n }\n}\n\n/**\n * HighlightButton component for TipTap editor\n */\nexport const HighlightButton = React.forwardRef<HTMLButtonElement, HighlightButtonProps>(\n (\n {\n editor: providedEditor,\n node,\n nodePos,\n color,\n text,\n hideWhenUnavailable = false,\n className = '',\n disabled,\n onClick,\n onApplied,\n children,\n style,\n ...buttonProps\n },\n ref\n ) => {\n const editor = useTiptapEditor(providedEditor)\n const { isDisabled, isActive, shouldShow } = useHighlightState(editor, color, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleHighlight(editor, color, node, nodePos)\n onApplied?.(color)\n }\n },\n [color, editor, isDisabled, node, nodePos, onClick, onApplied]\n )\n\n const buttonStyle = React.useMemo(\n () =>\n ({\n ...style,\n '--highlight-color': color\n }) as React.CSSProperties,\n [color, style]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={`${color} highlight color`}\n aria-pressed={isActive}\n onClick={handleClick}\n style={buttonStyle}\n {...buttonProps}\n ref={ref}\n >\n {children || (\n <>\n <span className=\"tiptap-button-highlight\" style={{ '--highlight-color': color } as React.CSSProperties} />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n </>\n )}\n </Button>\n )\n }\n)\n\nHighlightButton.displayName = 'HighlightButton'\n\nexport default HighlightButton\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useMenuNavigation } from '../../../hooks/use-menu-navigation'\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// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../tiptap-ui-primitive/popover'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\n\n// --- Tiptap UI ---\nimport { HighlightButton, canToggleHighlight } from '../../tiptap-ui/highlight-button'\n\n// --- Styles ---\nimport './highlight-popover.less'\n\nexport interface HighlightColor {\n label: string\n value: string\n border?: string\n}\n\nexport interface HighlightContentProps {\n editor?: Editor | null\n colors?: HighlightColor[]\n onClose?: () => void\n}\n\nexport interface HighlightPopoverProps extends Omit<ButtonProps, 'type'> {\n /** The TipTap editor instance. */\n editor?: Editor | null\n /** The highlight colors to display in the popover. */\n colors?: HighlightColor[]\n /** Whether to hide the highlight popover when unavailable. */\n hideWhenUnavailable?: boolean\n}\n\nexport const DEFAULT_HIGHLIGHT_COLORS: HighlightColor[] = [\n {\n label: 'Green',\n value: 'var(--tt-highlight-green)',\n border: 'var(--tt-highlight-green-contrast)'\n },\n {\n label: 'Blue',\n value: 'var(--tt-highlight-blue)',\n border: 'var(--tt-highlight-blue-contrast)'\n },\n {\n label: 'Red',\n value: 'var(--tt-highlight-red)',\n border: 'var(--tt-highlight-red-contrast)'\n },\n {\n label: 'Purple',\n value: 'var(--tt-highlight-purple)',\n border: 'var(--tt-highlight-purple-contrast)'\n },\n {\n label: 'Yellow',\n value: 'var(--tt-highlight-yellow)',\n border: 'var(--tt-highlight-yellow-contrast)'\n }\n]\n\nexport const HighlighterButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Highlight text\"\n tooltip=\"背景颜色\"\n ref={ref}\n {...props}\n >\n {children || <HighlighterIcon className=\"tiptap-button-icon\" />}\n </Button>\n))\n\nHighlighterButton.displayName = 'HighlighterButton'\n\nexport function HighlightContent({ editor: providedEditor, colors = DEFAULT_HIGHLIGHT_COLORS, onClose }: HighlightContentProps) {\n const editor = useTiptapEditor(providedEditor)\n const containerRef = React.useRef<HTMLDivElement>(null)\n\n const removeHighlight = React.useCallback(() => {\n if (!editor) return\n editor.chain().focus().unsetMark('highlight').run()\n onClose?.()\n }, [editor, onClose])\n\n const menuItems = React.useMemo(() => [...colors, { label: 'Remove highlight', value: 'none' }], [colors])\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n orientation: 'both',\n onSelect: (item) => {\n if (item.value === 'none') {\n removeHighlight()\n }\n onClose?.()\n },\n onClose,\n autoSelectFirstItem: false\n })\n\n return (\n <div ref={containerRef} className=\"tiptap-highlight-content\" tabIndex={0}>\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n {colors.map((color, index) => (\n <HighlightButton\n key={color.value}\n editor={editor}\n color={color.value}\n aria-label={`${color.label} highlight color`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n onClick={onClose}\n />\n ))}\n </div>\n\n <Separator />\n\n <div className=\"tiptap-button-group\">\n <Button\n onClick={removeHighlight}\n aria-label=\"Remove highlight\"\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n data-style=\"ghost\"\n data-highlighted={selectedIndex === colors.length}\n >\n <BanIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </div>\n )\n}\n\nexport function HighlightPopover({\n editor: providedEditor,\n colors = DEFAULT_HIGHLIGHT_COLORS,\n hideWhenUnavailable = false,\n ...props\n}: HighlightPopoverProps) {\n const editor = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = React.useState(false)\n const [isDisabled, setIsDisabled] = React.useState(false)\n\n const markAvailable = isMarkInSchema('highlight', editor)\n\n React.useEffect(() => {\n if (!editor) return\n\n const updateIsDisabled = () => {\n let isDisabled = false\n\n if (!markAvailable || !editor) {\n isDisabled = true\n }\n\n const isInCompatibleContext = editor.isActive('code') || editor.isActive('codeBlock') || editor.isActive('imageUpload')\n\n if (isInCompatibleContext) {\n isDisabled = true\n }\n\n setIsDisabled(isDisabled)\n }\n\n editor.on('selectionUpdate', updateIsDisabled)\n editor.on('update', updateIsDisabled)\n\n return () => {\n editor.off('selectionUpdate', updateIsDisabled)\n editor.off('update', updateIsDisabled)\n }\n }, [editor, markAvailable])\n\n const isActive = editor?.isActive('highlight') ?? false\n\n const shouldShow = React.useMemo(() => {\n if (!hideWhenUnavailable || !editor) return true\n\n return !(isNodeSelection(editor.state.selection) || !canToggleHighlight(editor))\n }, [hideWhenUnavailable, editor])\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <HighlighterButton\n disabled={isDisabled}\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n aria-pressed={isActive}\n {...props}\n />\n </PopoverTrigger>\n\n <PopoverContent aria-label=\"Highlight colors\">\n <HighlightContent editor={editor} colors={colors} onClose={() => setIsOpen(false)} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default HighlightPopover\n","import * as React from 'react'\n\nexport const CornerDownLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ExternalLinkIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M14 3C14 2.44772 14.4477 2 15 2H21C21.5523 2 22 2.44772 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L10.7071 14.7071C10.3166 15.0976 9.68342 15.0976 9.29289 14.7071C8.90237 14.3166 8.90237 13.6834 9.29289 13.2929L18.5858 4H15C14.4477 4 14 3.55228 14 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.29289 7.29289C4.48043 7.10536 4.73478 7 5 7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H5C4.20435 5 3.44129 5.31607 2.87868 5.87868C2.31607 6.44129 2 7.20435 2 8V19C2 19.7957 2.31607 20.5587 2.87868 21.1213C3.44129 21.6839 4.20435 22 5 22H16C16.7957 22 17.5587 21.6839 18.1213 21.1213C18.6839 20.5587 19 19.7957 19 19V13C19 12.4477 18.5523 12 18 12C17.4477 12 17 12.4477 17 13V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V8C4 7.73478 4.10536 7.48043 4.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nExternalLinkIcon.displayName = 'ExternalLinkIcon'\n","import * as React from 'react'\n\nexport const LinkIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const TrashIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 5V4C7 3.17477 7.40255 2.43324 7.91789 1.91789C8.43324 1.40255 9.17477 1 10 1H14C14.8252 1 15.5668 1.40255 16.0821 1.91789C16.5975 2.43324 17 3.17477 17 4V5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H20V20C20 20.8252 19.5975 21.5668 19.0821 22.0821C18.5668 22.5975 17.8252 23 17 23H7C6.17477 23 5.43324 22.5975 4.91789 22.0821C4.40255 21.5668 4 20.8252 4 20V7H3C2.44772 7 2 6.55228 2 6C2 5.44772 2.44772 5 3 5H7ZM9 4C9 3.82523 9.09745 3.56676 9.33211 3.33211C9.56676 3.09745 9.82523 3 10 3H14C14.1748 3 14.4332 3.09745 14.6679 3.33211C14.9025 3.56676 15 3.82523 15 4V5H9V4ZM6 7V20C6 20.1748 6.09745 20.4332 6.33211 20.6679C6.56676 20.9025 6.82523 21 7 21H17C17.1748 21 17.4332 20.9025 17.6679 20.6679C17.9025 20.4332 18 20.1748 18 20V7H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTrashIcon.displayName = 'TrashIcon'\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\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// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../tiptap-ui-primitive/popover'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\n\n// --- Styles ---\nimport './link-popover.less'\n\nexport interface LinkHandlerProps {\n editor: Editor | null\n onSetLink?: () => void\n onLinkActive?: () => void\n}\n\nexport interface LinkMainProps {\n url: string\n setUrl: React.Dispatch<React.SetStateAction<string>>\n setLink: () => void\n removeLink: () => void\n isActive: boolean\n}\n\nexport const useLinkHandler = (props: LinkHandlerProps) => {\n const { editor, onSetLink, onLinkActive } = props\n const [url, setUrl] = React.useState<string>('')\n\n React.useEffect(() => {\n if (!editor) return\n\n // Get URL immediately on mount\n const { href } = editor.getAttributes('link')\n\n if (editor.isActive('link') && !url) {\n setUrl(href || '')\n onLinkActive?.()\n }\n }, [editor, onLinkActive, url])\n\n React.useEffect(() => {\n if (!editor) return\n\n const updateLinkState = () => {\n const { href } = editor.getAttributes('link')\n setUrl(href || '')\n\n if (editor.isActive('link') && !url) {\n onLinkActive?.()\n }\n }\n\n editor.on('selectionUpdate', updateLinkState)\n return () => {\n editor.off('selectionUpdate', updateLinkState)\n }\n }, [editor, onLinkActive, url])\n\n const setLink = React.useCallback(() => {\n if (!url || !editor) return\n\n const { from, to } = editor.state.selection\n const text = editor.state.doc.textBetween(from, to)\n\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text: text || url,\n marks: [{ type: 'link', attrs: { href: url } }]\n })\n .run()\n\n onSetLink?.()\n }, [editor, onSetLink, url])\n\n const removeLink = React.useCallback(() => {\n if (!editor) return\n editor.chain().focus().unsetMark('link', { extendEmptyMarkRange: true }).setMeta('preventAutolink', true).run()\n setUrl('')\n }, [editor])\n\n return {\n url,\n setUrl,\n setLink,\n removeLink,\n isActive: editor?.isActive('link') || false\n }\n}\n\nexport const LinkButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, children, ...props }, ref) => {\n return (\n <Button type=\"button\" className={className} data-style=\"ghost\" role=\"button\" tabIndex={-1} aria-label=\"Link\" tooltip=\"链接\" ref={ref} {...props}>\n {children || <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n )\n})\n\nexport const LinkContent: React.FC<{\n editor?: Editor | null\n}> = ({ editor: providedEditor }) => {\n const editor = useTiptapEditor(providedEditor)\n\n const linkHandler = useLinkHandler({\n editor: editor\n })\n\n return <LinkMain {...linkHandler} />\n}\n\nconst LinkMain: React.FC<LinkMainProps> = ({ url, setUrl, setLink, removeLink, isActive }) => {\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n setLink()\n }\n }\n\n return (\n <>\n <input\n type=\"url\"\n placeholder=\"输入链接\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n className=\"tiptap-input tiptap-input-clamp\"\n />\n\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n <Button type=\"button\" onClick={setLink} title=\"确认\" disabled={!url && !isActive} data-style=\"ghost\">\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n\n <Separator />\n\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n <Button type=\"button\" onClick={() => window.open(url, '_blank')} title=\"新窗口打开\" disabled={!url && !isActive} data-style=\"ghost\">\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n\n <Button type=\"button\" onClick={removeLink} title=\"删除链接\" disabled={!url && !isActive} data-style=\"ghost\">\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </>\n )\n}\n\nexport interface LinkPopoverProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the link popover.\n * @default false\n */\n hideWhenUnavailable?: boolean\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\nexport function LinkPopover({\n editor: providedEditor,\n hideWhenUnavailable = false,\n onOpenChange,\n autoOpenOnLinkActive = true,\n ...props\n}: LinkPopoverProps) {\n const editor = useTiptapEditor(providedEditor)\n\n const linkInSchema = isMarkInSchema('link', editor)\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const onSetLink = () => {\n setIsOpen(false)\n }\n\n const onLinkActive = () => setIsOpen(autoOpenOnLinkActive)\n\n const linkHandler = useLinkHandler({\n editor: editor,\n onSetLink,\n onLinkActive\n })\n\n const isDisabled = React.useMemo(() => {\n if (!editor) return true\n if (editor.isActive('codeBlock')) return true\n return !editor.can().setLink?.({ href: '' })\n }, [editor])\n\n const canSetLink = React.useMemo(() => {\n if (!editor) return false\n try {\n return editor.can().setMark('link')\n } catch {\n return false\n }\n }, [editor])\n\n const isActive = editor?.isActive('link') ?? false\n\n const handleOnOpenChange = React.useCallback(\n (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n onOpenChange?.(nextIsOpen)\n },\n [onOpenChange]\n )\n\n const show = React.useMemo(() => {\n if (!linkInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canSetLink) {\n return false\n }\n }\n\n return true\n }, [linkInSchema, hideWhenUnavailable, editor, canSetLink])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOnOpenChange}>\n <PopoverTrigger asChild>\n <LinkButton disabled={isDisabled} data-active-state={isActive ? 'on' : 'off'} data-disabled={isDisabled} {...props} />\n </PopoverTrigger>\n\n <PopoverContent>\n <LinkMain {...linkHandler} />\n </PopoverContent>\n </Popover>\n )\n}\n\nLinkButton.displayName = 'LinkButton'\n","import * as React from 'react'\n\nexport const ListIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ListOrderedIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ListTodoIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\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 { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type ListType = 'bulletList' | 'orderedList' | 'taskList'\n\nexport interface ListOption {\n label: string\n type: ListType\n icon: React.ElementType\n}\n\nexport interface ListButtonProps extends Omit<ButtonProps, 'type'> {\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 * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the list is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const listOptions: ListOption[] = [\n {\n label: '无序列表',\n type: 'bulletList',\n icon: ListIcon\n },\n {\n label: '有序列表',\n type: 'orderedList',\n icon: ListOrderedIcon\n },\n {\n label: '任务列表',\n type: 'taskList',\n icon: ListTodoIcon\n }\n]\n\nexport const listShortcutKeys: Record<ListType, string> = {\n bulletList: 'Ctrl-Shift-8',\n orderedList: 'Ctrl-Shift-7',\n taskList: 'Ctrl-Shift-9'\n}\n\nexport function canToggleList(editor: Editor | null, type: ListType): boolean {\n if (!editor) {\n return false\n }\n\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\nexport function isListActive(editor: Editor | null, type: ListType): boolean {\n if (!editor) 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\nexport function toggleList(editor: Editor | null, type: ListType): void {\n if (!editor) return\n\n switch (type) {\n case 'bulletList':\n editor.chain().focus().toggleBulletList().run()\n break\n case 'orderedList':\n editor.chain().focus().toggleOrderedList().run()\n break\n case 'taskList':\n editor.chain().focus().toggleList('taskList', 'taskItem').run()\n break\n }\n}\n\nexport function getListOption(type: ListType): ListOption | undefined {\n return listOptions.find((option) => option.type === type)\n}\n\nexport function shouldShowListButton(params: {\n editor: Editor | null\n type: ListType\n hideWhenUnavailable: boolean\n listInSchema: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable, listInSchema } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleList(editor, type)) {\n return false\n }\n }\n\n return true\n}\n\nexport function useListState(editor: Editor | null, type: ListType) {\n const listInSchema = isNodeInSchema(type, editor)\n const listOption = getListOption(type)\n const isActive = isListActive(editor, type)\n const shortcutKey = listShortcutKeys[type]\n\n return {\n listInSchema,\n listOption,\n isActive,\n shortcutKey\n }\n}\n\nexport const ListButton = React.forwardRef<HTMLButtonElement, ListButtonProps>(\n ({ editor: providedEditor, type, hideWhenUnavailable = false, className = '', onClick, text, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n const { listInSchema, listOption, isActive, shortcutKey } = useListState(editor, type)\n\n const Icon = listOption?.icon || ListIcon\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && editor) {\n toggleList(editor, type)\n }\n },\n [onClick, editor, type]\n )\n\n const show = React.useMemo(() => {\n return shouldShowListButton({\n editor,\n type,\n hideWhenUnavailable,\n listInSchema\n })\n }, [editor, type, hideWhenUnavailable, listInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n role=\"button\"\n tabIndex={-1}\n aria-label={listOption?.label || type}\n aria-pressed={isActive}\n tooltip={listOption?.label || type}\n shortcutKeys={shortcutKey}\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\nListButton.displayName = 'ListButton'\n\nexport default ListButton\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { ChevronDownIcon } from '../../tiptap-icons/chevron-down-icon'\nimport { ListIcon } from '../../tiptap-icons/list-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- Tiptap UI ---\nimport {\n ListButton,\n canToggleList,\n isListActive,\n listOptions,\n type ListType\n} from '../../tiptap-ui/list-button/list-button'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\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\nexport interface ListDropdownMenuProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor\n /**\n * The list types to display in the dropdown.\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function canToggleAnyList(editor: Editor | null, listTypes: ListType[]): boolean {\n if (!editor) return false\n return listTypes.some((type) => canToggleList(editor, type))\n}\n\nexport function isAnyListActive(editor: Editor | null, listTypes: ListType[]): boolean {\n if (!editor) return false\n return listTypes.some((type) => isListActive(editor, type))\n}\n\nexport function getFilteredListOptions(availableTypes: ListType[]): typeof listOptions {\n return listOptions.filter((option) => !option.type || availableTypes.includes(option.type))\n}\n\nexport function shouldShowListDropdown(params: {\n editor: Editor | null\n listTypes: ListType[]\n hideWhenUnavailable: boolean\n listInSchema: boolean\n canToggleAny: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, listInSchema, canToggleAny } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleAny) {\n return false\n }\n }\n\n return true\n}\n\nexport function useListDropdownState(editor: Editor | null, availableTypes: ListType[]) {\n const [isOpen, setIsOpen] = React.useState(false)\n\n const listInSchema = availableTypes.some((type) => isNodeInSchema(type, editor))\n\n const filteredLists = React.useMemo(() => getFilteredListOptions(availableTypes), [availableTypes])\n\n const canToggleAny = canToggleAnyList(editor, availableTypes)\n const isAnyActive = isAnyListActive(editor, availableTypes)\n\n const handleOpenChange = React.useCallback((open: boolean, callback?: (isOpen: boolean) => void) => {\n setIsOpen(open)\n callback?.(open)\n }, [])\n\n return {\n isOpen,\n setIsOpen,\n listInSchema,\n filteredLists,\n canToggleAny,\n isAnyActive,\n handleOpenChange\n }\n}\n\nexport function useActiveListIcon(editor: Editor | null, filteredLists: typeof listOptions) {\n return React.useCallback(() => {\n const activeOption = filteredLists.find((option) => isListActive(editor, option.type))\n\n return activeOption ? <activeOption.icon className=\"tiptap-button-icon\" /> : <ListIcon className=\"tiptap-button-icon\" />\n }, [editor, filteredLists])\n}\n\nexport function ListDropdownMenu({\n editor: providedEditor,\n types = ['bulletList', 'orderedList', 'taskList'],\n hideWhenUnavailable = false,\n onOpenChange,\n ...props\n}: ListDropdownMenuProps) {\n const editor = useTiptapEditor(providedEditor)\n\n const { isOpen, listInSchema, filteredLists, canToggleAny, isAnyActive, handleOpenChange } = useListDropdownState(editor, types)\n\n const getActiveIcon = useActiveListIcon(editor, filteredLists)\n\n const show = React.useMemo(() => {\n return shouldShowListDropdown({\n editor,\n listTypes: types,\n hideWhenUnavailable,\n listInSchema,\n canToggleAny\n })\n }, [editor, types, hideWhenUnavailable, listInSchema, canToggleAny])\n\n const handleOnOpenChange = React.useCallback((open: boolean) => handleOpenChange(open, onOpenChange), [handleOpenChange, onOpenChange])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isAnyActive ? 'on' : 'off'}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"List options\"\n tooltip=\"列表\"\n {...props}\n >\n {getActiveIcon()}\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {filteredLists.map((option) => (\n <DropdownMenuItem key={option.type} asChild>\n <ListButton editor={editor} type={option.type} text={option.label} hideWhenUnavailable={hideWhenUnavailable} tooltip={''} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ListDropdownMenu\n","import * as React from 'react'\n\nexport const BoldIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const Code2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ItalicIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const StrikeIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const SubscriptIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const SuperscriptIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const UnderlineIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\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\n// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type Mark = 'bold' | 'italic' | 'strike' | 'code' | 'underline' | 'superscript' | 'subscript'\n\nexport interface MarkButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The type of mark to toggle\n */\n type: Mark\n /**\n * Optional editor instance. If not provided, will use editor from context\n */\n editor?: Editor | null\n /**\n * Display text for the button (optional)\n */\n text?: string\n /**\n * Whether this button should be hidden when the mark is not available\n */\n hideWhenUnavailable?: boolean\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 markShortcutKeys: Partial<Record<Mark, string>> = {\n bold: 'Ctrl-b',\n italic: 'Ctrl-i',\n underline: 'Ctrl-u',\n strike: 'Ctrl-Shift-s',\n code: 'Ctrl-e',\n superscript: 'Ctrl-.',\n subscript: 'Ctrl-,'\n}\nexport const markActionLabels: Partial<Record<Mark, string>> = {\n bold: '粗体',\n italic: '斜体',\n underline: '下划线',\n strike: '删除线',\n code: '代码',\n superscript: '上角标',\n subscript: '下角标'\n}\n\nexport function canToggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor) return false\n\n try {\n return editor.can().toggleMark(type)\n } catch {\n return false\n }\n}\n\nexport function isMarkActive(editor: Editor | null, type: Mark): boolean {\n if (!editor) return false\n return editor.isActive(type)\n}\n\nexport function toggleMark(editor: Editor | null, type: Mark): void {\n if (!editor) return\n editor.chain().focus().toggleMark(type).run()\n}\n\nexport function isMarkButtonDisabled(editor: Editor | null, type: Mark, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (editor.isActive('codeBlock')) return true\n if (!canToggleMark(editor, type)) return true\n return false\n}\n\nexport function shouldShowMarkButton(params: { editor: Editor | null; type: Mark; hideWhenUnavailable: boolean; markInSchema: boolean }): boolean {\n const { editor, type, hideWhenUnavailable, markInSchema } = params\n\n if (!markInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleMark(editor, type)) {\n return false\n }\n }\n\n return true\n}\n\nexport function getFormattedMarkName(type: Mark): string {\n return markActionLabels[type] || type.charAt(0).toUpperCase() + type.slice(1)\n}\n\nexport function useMarkState(editor: Editor | null, type: Mark, disabled: boolean = false) {\n const markInSchema = isMarkInSchema(type, editor)\n const isDisabled = isMarkButtonDisabled(editor, type, disabled)\n const isActive = isMarkActive(editor, type)\n\n const Icon = markIcons[type]\n const shortcutKey = markShortcutKeys[type]\n const formattedName = getFormattedMarkName(type)\n\n return {\n markInSchema,\n isDisabled,\n isActive,\n Icon,\n shortcutKey,\n formattedName\n }\n}\n\nexport const MarkButton = React.forwardRef<HTMLButtonElement, MarkButtonProps>(\n ({ editor: providedEditor, type, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { markInSchema, isDisabled, isActive, Icon, shortcutKey, formattedName } = useMarkState(editor, type, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleMark(editor, type)\n }\n },\n [onClick, isDisabled, editor, type]\n )\n\n const show = React.useMemo(() => {\n return shouldShowMarkButton({\n editor,\n type,\n hideWhenUnavailable,\n markInSchema\n })\n }, [editor, type, hideWhenUnavailable, markInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={type}\n aria-pressed={isActive}\n tooltip={formattedName}\n shortcutKeys={shortcutKey}\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\nMarkButton.displayName = 'MarkButton'\n\nexport default MarkButton\n","import * as React from 'react'\n\nexport const BlockQuoteIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const CodeBlockIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { BlockQuoteIcon } from '../../tiptap-icons/block-quote-icon'\nimport { CodeBlockIcon } from '../../tiptap-icons/code-block-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type NodeType = 'codeBlock' | 'blockquote'\n\nexport interface NodeButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of node to toggle.\n */\n type: NodeType\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the node is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const nodeIcons = {\n codeBlock: CodeBlockIcon,\n blockquote: BlockQuoteIcon\n}\n\nexport const nodeShortcutKeys: Partial<Record<NodeType, string>> = {\n codeBlock: 'Ctrl-Alt-c',\n blockquote: 'Ctrl-Shift-b'\n}\n\nexport const nodeLabels: Record<NodeType, string> = {\n codeBlock: '代码块',\n blockquote: '引用块'\n}\n\nexport function canToggleNode(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n\n try {\n return type === 'codeBlock' ? editor.can().toggleNode('codeBlock', 'paragraph') : editor.can().toggleWrap('blockquote')\n } catch {\n return false\n }\n}\n\nexport function isNodeActive(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n return editor.isActive(type)\n}\n\nexport function toggleNode(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n\n if (type === 'codeBlock') {\n return editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()\n } else {\n return editor.chain().focus().toggleWrap('blockquote').run()\n }\n}\n\nexport function isNodeButtonDisabled(editor: Editor | null, canToggle: boolean, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (!canToggle) return true\n return false\n}\n\nexport function shouldShowNodeButton(params: {\n editor: Editor | null\n type: NodeType\n hideWhenUnavailable: boolean\n nodeInSchema: boolean\n canToggle: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, nodeInSchema, canToggle } = params\n\n if (!nodeInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggle) {\n return false\n }\n }\n\n return Boolean(editor?.isEditable)\n}\n\nexport function formatNodeName(type: NodeType): string {\n return type.charAt(0).toUpperCase() + type.slice(1)\n}\n\nexport function useNodeState(editor: Editor | null, type: NodeType, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const nodeInSchema = isNodeInSchema(type, editor)\n\n const canToggle = canToggleNode(editor, type)\n const isDisabled = isNodeButtonDisabled(editor, canToggle, disabled)\n const isActive = isNodeActive(editor, type)\n\n const shouldShow = React.useMemo(\n () =>\n shouldShowNodeButton({\n editor,\n type,\n hideWhenUnavailable,\n nodeInSchema,\n canToggle\n }),\n [editor, type, hideWhenUnavailable, nodeInSchema, canToggle]\n )\n\n const handleToggle = React.useCallback(() => {\n if (!isDisabled && editor) {\n return toggleNode(editor, type)\n }\n return false\n }, [editor, type, isDisabled])\n\n const Icon = nodeIcons[type]\n const shortcutKey = nodeShortcutKeys[type]\n const label = nodeLabels[type]\n\n return {\n nodeInSchema,\n canToggle,\n isDisabled,\n isActive,\n shouldShow,\n handleToggle,\n Icon,\n shortcutKey,\n label\n }\n}\n\nexport const NodeButton = React.forwardRef<HTMLButtonElement, NodeButtonProps>(\n ({ editor: providedEditor, type, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, isActive, shouldShow, handleToggle, Icon, shortcutKey, label } = useNodeState(editor, type, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled) {\n handleToggle()\n }\n },\n [onClick, isDisabled, handleToggle]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={type}\n aria-pressed={isActive}\n tooltip={label}\n shortcutKeys={shortcutKey}\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\nNodeButton.displayName = 'NodeButton'\n\nexport default NodeButton\n","import * as React from 'react'\n\nexport const QuoteIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 1024 1024\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M130.16 789.92V500.25q-1.85-62.51 18-117.41T204 286.23a308 308 0 0 1 86.13-69.1A304.32 304.32 0 0 1 386.26 184 11 11 0 0 1 399 194.86v104.52a11 11 0 0 1-7.21 10.29q-66.13 24.5-91.25 70.31-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.84a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11h-257.9z m403.3 0V500.25q-2-62.51 17.95-117.41t55.85-96.61q35.94-41.6 86.13-69.1A304.7 304.7 0 0 1 789.56 184a11 11 0 0 1 12.76 10.82v104.56a11 11 0 0 1-7.21 10.29Q729 334.18 703.86 380q-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.82a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11H533.45z m0 0\"\n fill=\"currentColor\">\n </path>\n </svg>\n )\n})\n\nQuoteIcon.displayName = 'QuoteIcon'\n","import { type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { QuoteIcon } from '../../tiptap-icons/quote-icon'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport interface QuoteButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n\n /**\n * Callback when text is quoted (fires when user clicks while text is selected)\n */\n onQuote?: (text: string) => void\n\n /**\n * Optional label text shown next to the icon.\n */\n text?: string\n\n /**\n * Whether to hide the button if no text is selected.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * 检查是否选中了文本\n */\nexport function hasSelection(editor: Editor | null): boolean {\n if (!editor) return false\n const selection = editor.state.selection\n return !!selection && !selection.empty\n}\n\n/**\n * 获取当前选中文本\n */\nexport function getSelectedText(editor: Editor | null): string {\n if (!editor) return ''\n const { from, to } = editor.state.selection\n return editor.state.doc.textBetween(from, to, ' ')\n}\n\n/**\n * QuoteButton Hook\n */\nexport function useQuote(editor: Editor | null, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const selectionAvailable = React.useMemo(() => hasSelection(editor), [editor?.state.selection])\n\n const isDisabled = React.useMemo(() => !selectionAvailable || disabled, [selectionAvailable, disabled])\n const shouldShow = React.useMemo(() => {\n if (!editor?.isEditable) return false\n if (hideWhenUnavailable && !selectionAvailable) return false\n return true\n }, [editor, hideWhenUnavailable, selectionAvailable])\n\n const getText = React.useCallback(() => getSelectedText(editor), [editor])\n\n return {\n isDisabled,\n shouldShow,\n getText\n }\n}\n\nexport const QuoteButton = React.forwardRef<HTMLButtonElement, QuoteButtonProps>(\n (\n { editor: providedEditor, onQuote, text, className = '', disabled = false, hideWhenUnavailable = false, onClick, children, ...buttonProps },\n ref\n ) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, shouldShow, getText } = useQuote(editor, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (e.defaultPrevented || isDisabled || !editor) return\n\n const selectedText = getText()\n if (selectedText) {\n onQuote?.(selectedText)\n } else {\n console.warn('No text selected for quote.')\n }\n },\n [onClick, editor, isDisabled, getText, onQuote]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) return null\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-disabled={isDisabled}\n tooltip=\"引用选中文本\"\n // shortcutKeys=\"Ctrl-Shift-Q\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children || (\n <>\n <QuoteIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n </>\n )}\n </Button>\n )\n }\n)\n\nQuoteButton.displayName = 'QuoteButton'\n\nexport default QuoteButton\n","import * as React from 'react'\n\nexport const AlignCenterIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignJustifyIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignRightIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { type ChainedCommands, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\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\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify'\n\nexport interface TextAlignButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The text alignment to apply.\n */\n align: TextAlign\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the alignment is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const textAlignIcons = {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon\n}\n\nexport const textAlignShortcutKeys: Partial<Record<TextAlign, string>> = {\n left: 'Ctrl-Shift-l',\n center: 'Ctrl-Shift-e',\n right: 'Ctrl-Shift-r',\n justify: 'Ctrl-Shift-j'\n}\n\nexport const textAlignLabels: Record<TextAlign, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n justify: '两端对齐'\n}\n\nexport function hasSetTextAlign(commands: ChainedCommands): commands is ChainedCommands & {\n setTextAlign: (align: TextAlign) => ChainedCommands\n} {\n return 'setTextAlign' in commands\n}\n\nexport function checkTextAlignExtension(editor: Editor | null): boolean {\n if (!editor) return false\n\n const hasExtension = editor.extensionManager.extensions.some((extension) => extension.name === 'textAlign')\n\n if (!hasExtension) {\n console.warn('TextAlign extension is not available. ' + 'Make sure it is included in your editor configuration.')\n }\n\n return hasExtension\n}\n\nexport function canSetTextAlign(editor: Editor | null, align: TextAlign, alignAvailable: boolean): boolean {\n if (!editor || !alignAvailable) return false\n\n try {\n return editor.can().setTextAlign(align)\n } catch {\n return false\n }\n}\n\nexport function isTextAlignActive(editor: Editor | null, align: TextAlign): boolean {\n if (!editor) return false\n return editor.isActive({ textAlign: align })\n}\n\nexport function setTextAlign(editor: Editor | null, align: TextAlign): boolean {\n if (!editor) return false\n\n const chain = editor.chain().focus()\n if (hasSetTextAlign(chain)) {\n return chain.setTextAlign(align).run()\n }\n return false\n}\n\nexport function isTextAlignButtonDisabled(editor: Editor | null, alignAvailable: boolean, canAlign: boolean, userDisabled: boolean = false): boolean {\n if (!editor || !alignAvailable) return true\n if (userDisabled) return true\n if (!canAlign) return true\n return false\n}\n\nexport function shouldShowTextAlignButton(editor: Editor | null, canAlign: boolean, hideWhenUnavailable: boolean): boolean {\n if (!editor?.isEditable) return false\n if (hideWhenUnavailable && !canAlign) return false\n return true\n}\n\nexport function useTextAlign(editor: Editor | null, align: TextAlign, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const alignAvailable = React.useMemo(() => checkTextAlignExtension(editor), [editor])\n\n const canAlign = React.useMemo(() => canSetTextAlign(editor, align, alignAvailable), [editor, align, alignAvailable])\n\n const isDisabled = isTextAlignButtonDisabled(editor, alignAvailable, canAlign, disabled)\n const isActive = isTextAlignActive(editor, align)\n\n const handleAlignment = React.useCallback(() => {\n if (!alignAvailable || !editor || isDisabled) return false\n return setTextAlign(editor, align)\n }, [alignAvailable, editor, isDisabled, align])\n\n const shouldShow = React.useMemo(() => shouldShowTextAlignButton(editor, canAlign, hideWhenUnavailable), [editor, canAlign, hideWhenUnavailable])\n\n const Icon = textAlignIcons[align]\n const shortcutKey = textAlignShortcutKeys[align]\n const label = textAlignLabels[align]\n\n return {\n alignAvailable,\n canAlign,\n isDisabled,\n isActive,\n handleAlignment,\n shouldShow,\n Icon,\n shortcutKey,\n label\n }\n}\n\nexport const TextAlignButton = React.forwardRef<HTMLButtonElement, TextAlignButtonProps>(\n ({ editor: providedEditor, align, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, isActive, handleAlignment, shouldShow, Icon, shortcutKey, label } = useTextAlign(editor, align, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !disabled) {\n handleAlignment()\n }\n },\n [onClick, disabled, handleAlignment]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n shortcutKeys={shortcutKey}\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\nTextAlignButton.displayName = 'TextAlignButton'\n\nexport default TextAlignButton\n","import * as React from 'react'\n\nexport const Redo2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const Undo2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 3.70711C10.0976 3.31658 10.0976 2.68342 9.70711 2.29289C9.31658 1.90237 8.68342 1.90237 8.29289 2.29289L3.29289 7.29289C2.90237 7.68342 2.90237 8.31658 3.29289 8.70711L8.29289 13.7071C8.68342 14.0976 9.31658 14.0976 9.70711 13.7071C10.0976 13.3166 10.0976 12.6834 9.70711 12.2929L6.41421 9H14.5C15.0909 9 15.6761 9.1164 16.2221 9.34254C16.768 9.56869 17.2641 9.90016 17.682 10.318C18.0998 10.7359 18.4313 11.232 18.6575 11.7779C18.8836 12.3239 19 12.9091 19 13.5C19 14.0909 18.8836 14.6761 18.6575 15.2221C18.4313 15.768 18.0998 16.2641 17.682 16.682C17.2641 17.0998 16.768 17.4313 16.2221 17.6575C15.6761 17.8836 15.0909 18 14.5 18H11C10.4477 18 10 18.4477 10 19C10 19.5523 10.4477 20 11 20H14.5C15.3536 20 16.1988 19.8319 16.9874 19.5052C17.7761 19.1786 18.4926 18.6998 19.0962 18.0962C19.6998 17.4926 20.1786 16.7761 20.5052 15.9874C20.8319 15.1988 21 14.3536 21 13.5C21 12.6464 20.8319 11.8012 20.5052 11.0126C20.1786 10.2239 19.6998 9.50739 19.0962 8.90381C18.4926 8.30022 17.7761 7.82144 16.9874 7.49478C16.1988 7.16813 15.3536 7 14.5 7H6.41421L9.70711 3.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUndo2Icon.displayName = 'Undo2Icon'\n","import { type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { Redo2Icon } from '../../tiptap-icons/redo2-icon'\nimport { Undo2Icon } from '../../tiptap-icons/undo2-icon'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type HistoryAction = 'undo' | 'redo'\n\n/**\n * Props for the UndoRedoButton component.\n */\nexport interface UndoRedoButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * The history action to perform (undo or redo).\n */\n action: HistoryAction\n}\n\nexport const historyIcons = {\n undo: Undo2Icon,\n redo: Redo2Icon\n}\n\nexport const historyShortcutKeys: Partial<Record<HistoryAction, string>> = {\n undo: 'Ctrl-z',\n redo: 'Ctrl-Shift-z'\n}\n\nexport const historyActionLabels: Record<HistoryAction, string> = {\n undo: '撤销',\n redo: '重做'\n}\n\n/**\n * Checks if a history action can be executed.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to check\n * @returns Whether the action can be executed\n */\nexport function canExecuteHistoryAction(editor: Editor | null, action: HistoryAction): boolean {\n if (!editor) return false\n return action === 'undo' ? editor.can().undo() : editor.can().redo()\n}\n\n/**\n * Executes a history action on the editor.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to execute\n * @returns Whether the action was executed successfully\n */\nexport function executeHistoryAction(editor: Editor | null, action: HistoryAction): boolean {\n if (!editor) return false\n const chain = editor.chain().focus()\n return action === 'undo' ? chain.undo().run() : chain.redo().run()\n}\n\n/**\n * Determines if a history action should be disabled.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to check\n * @param userDisabled Whether the action is explicitly disabled by the user\n * @returns Whether the action should be disabled\n */\nexport function isHistoryActionDisabled(editor: Editor | null, action: HistoryAction, userDisabled: boolean = false): boolean {\n if (userDisabled) return true\n return !canExecuteHistoryAction(editor, action)\n}\n\n/**\n * Hook that provides all the necessary state and handlers for a history action.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to handle\n * @param disabled Whether the action is explicitly disabled\n * @returns Object containing state and handlers for the history action\n */\nexport function useHistoryAction(editor: Editor | null, action: HistoryAction, disabled: boolean = false) {\n const canExecute = React.useMemo(() => canExecuteHistoryAction(editor, action), [editor, action])\n\n const isDisabled = isHistoryActionDisabled(editor, action, disabled)\n\n const handleAction = React.useCallback(() => {\n if (!editor || isDisabled) return\n executeHistoryAction(editor, action)\n }, [editor, action, isDisabled])\n\n const Icon = historyIcons[action]\n const actionLabel = historyActionLabels[action]\n const shortcutKey = historyShortcutKeys[action]\n\n return {\n canExecute,\n isDisabled,\n handleAction,\n Icon,\n actionLabel,\n shortcutKey\n }\n}\n\n/**\n * Button component for triggering undo/redo actions in a TipTap editor.\n */\nexport const UndoRedoButton = React.forwardRef<HTMLButtonElement, UndoRedoButtonProps>(\n ({ editor: providedEditor, action, text, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, handleAction, Icon, actionLabel, shortcutKey } = useHistoryAction(editor, action, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !disabled) {\n handleAction()\n }\n },\n [onClick, disabled, handleAction]\n )\n\n if (!editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={actionLabel}\n tooltip={actionLabel}\n shortcutKeys={shortcutKey}\n onClick={handleClick}\n {...buttonProps}\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\nUndoRedoButton.displayName = 'UndoRedoButton'\n\nexport default UndoRedoButton\n","import * as React from 'react'\n\nexport const ArrowLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\ninterface WindowSizeState {\n width: number\n height: number\n offsetTop: number\n}\n\n/**\n * Custom hook to track window size and viewport information\n * @returns Current window dimensions and offsetTop\n */\nexport function useWindowSize(): WindowSizeState {\n const [windowSize, setWindowSize] = React.useState<WindowSizeState>({\n width: 0,\n height: 0,\n offsetTop: 0\n })\n\n function handleResize() {\n if (typeof window === 'undefined') return\n\n const vp = window.visualViewport\n if (!vp) return\n\n const { width = 0, height = 0, offsetTop = 0 } = vp\n\n // Only update state if values have changed\n setWindowSize((state) => {\n if (width === state.width && height === state.height && offsetTop === state.offsetTop) {\n return state\n }\n\n return { width, height, offsetTop }\n })\n }\n React.useEffect(() => {\n handleResize()\n\n const visualViewport = window.visualViewport\n if (visualViewport) {\n visualViewport.addEventListener('resize', handleResize)\n visualViewport.addEventListener('scroll', handleResize)\n }\n\n return () => {\n if (visualViewport) {\n visualViewport.removeEventListener('resize', handleResize)\n visualViewport.removeEventListener('scroll', handleResize)\n }\n }\n }, [])\n\n return windowSize\n}\n","import type { Editor } from '@tiptap/react'\nimport * as React from 'react'\nimport { useWindowSize } from './use-window-size'\n\n/**\n * Interface defining required parameters for the cursor visibility hook\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 * Reference to the element to track for cursor visibility\n */\n elementRef?: React.RefObject<HTMLElement> | null\n}\n\n/**\n * Simplified DOMRect type containing only the essential positioning properties\n */\nexport type RectState = Pick<DOMRect, 'x' | 'y' | 'width' | 'height'>\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 * This is particularly useful for long-form content editing where the cursor\n * might move out of the visible area as the user types.\n *\n * @param options Configuration options for cursor visibility behavior\n * @returns void\n */\nexport function useCursorVisibility({ editor, overlayHeight = 0, elementRef = null }: CursorVisibilityOptions) {\n const { height: windowHeight } = useWindowSize()\n const [rect, setRect] = React.useState<RectState>({\n x: 0,\n y: 0,\n width: 0,\n height: 0\n })\n\n const updateRect = React.useCallback(() => {\n const element = elementRef?.current ?? document.body\n\n const { x, y, width, height } = element.getBoundingClientRect()\n setRect({ x, y, width, height })\n }, [elementRef])\n\n React.useEffect(() => {\n const element = elementRef?.current ?? document.body\n\n updateRect()\n\n const resizeObserver = new ResizeObserver(() => {\n window.requestAnimationFrame(updateRect)\n })\n\n resizeObserver.observe(element)\n window.addEventListener('scroll', updateRect, { passive: true })\n\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('scroll', updateRect)\n }\n }, [elementRef, updateRect])\n\n React.useEffect(() => {\n const ensureCursorVisibility = () => {\n if (!editor) return\n\n const { state, view } = editor\n\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) {\n if (cursorCoords) {\n // Check if there's enough space between cursor and bottom of window\n const availableSpace = windowHeight - cursorCoords.top - overlayHeight > 0\n\n // If not enough space, scroll to position cursor in the middle of viewport\n if (!availableSpace) {\n const targetScrollY =\n // TODO: Needed?\n // window.scrollY + (cursorCoords.top - windowHeight / 2)\n cursorCoords.top - windowHeight / 2\n\n window.scrollTo({\n top: targetScrollY,\n behavior: 'smooth'\n })\n }\n }\n }\n }\n\n ensureCursorVisibility()\n }, [editor, overlayHeight, windowHeight, rect.height])\n\n return rect\n}\n","import * as React from 'react'\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener('change', onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n return !!isMobile\n}\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport default Node.create({\n name: 'PageNoNode', // 节点名称\n\n group: 'block', // 可以作为块级元素\n // content: 'block+', // 能嵌套多个块级内容(如 heading, paragraph 等)\n\n // defining: true, // 使其在文档结构中稳定,避免被合并\n\n // 自定义渲染HTML\n renderHTML({ node, HTMLAttributes }) {\n // 获取动态的 pageIndex 属性\n const pageIndex = node.attrs.pageIndex || '1' // 如果没有传值,则默认值为 1\n\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: 'page-no', // 添加类名\n 'page-no': pageIndex // 设置动态的 page-no 属性\n })\n // 0\n ]\n },\n\n // 自定义节点的可视化表现\n addAttributes() {\n return {\n pageIndex: {\n default: null, // 默认没有值,允许动态传递\n renderHTML: (attributes) => {\n return {\n 'page-no': attributes.pageIndex\n }\n }\n }\n }\n },\n\n // 用于从节点中提取文本内容\n parseHTML() {\n return [\n {\n tag: 'div.page-no', // 匹配 `.page-no` 类的 div\n getAttrs: (node) => {\n const pageIndex = node.getAttribute('page-no')\n return { pageIndex } // 获取 page-no 属性并传递给节点\n }\n }\n ]\n }\n})\n","// MIT License\n// https://github.com/sereneinserenade/tiptap-search-and-replace\n\n// Copyright (c) 2023 - 2024 Jeet Mandaliya (Github Username: sereneinserenade)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { Extension, Range, type Dispatch } from '@tiptap/core'\nimport { Node as PMNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey, type EditorState, type Transaction } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n search: {\n /**\n * @description Set search term in extension.\n */\n setSearchTerm: (searchTerm: string) => ReturnType\n /**\n * @description Set replace term in extension.\n */\n setReplaceTerm: (replaceTerm: string) => ReturnType\n /**\n * @description Set case sensitivity in extension.\n */\n setCaseSensitive: (caseSensitive: boolean) => ReturnType\n /**\n * @description Reset current search result to first instance.\n */\n resetIndex: () => ReturnType\n /**\n * @description Find next instance of search result.\n */\n nextSearchResult: () => ReturnType\n /**\n * @description Find previous instance of search result.\n */\n previousSearchResult: () => ReturnType\n /**\n * @description Replace first instance of search result with given replace term.\n */\n replace: () => ReturnType\n /**\n * @description Replace all instances of search result with given replace term.\n */\n replaceAll: () => ReturnType\n }\n }\n}\n\ninterface TextNodesWithPosition {\n text: string\n pos: number\n}\n\nconst getRegex = (s: string, disableRegex: boolean, caseSensitive: boolean): RegExp => {\n return RegExp(disableRegex ? s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') : s, caseSensitive ? 'gu' : 'gui')\n}\n\ninterface ProcessedSearches {\n decorationsToReturn: DecorationSet\n results: Range[]\n}\n\nfunction processSearches(doc: PMNode, searchTerm: RegExp, searchResultClass: string, resultIndex: number): ProcessedSearches {\n const decorations: Decoration[] = []\n const results: Range[] = []\n\n let textNodesWithPosition: TextNodesWithPosition[] = []\n let index = 0\n\n if (!searchTerm) {\n return {\n decorationsToReturn: DecorationSet.empty,\n results: []\n }\n }\n\n doc?.descendants((node, pos) => {\n if (node.isText) {\n if (textNodesWithPosition[index]) {\n textNodesWithPosition[index] = {\n text: textNodesWithPosition[index].text + node.text,\n pos: textNodesWithPosition[index].pos\n }\n } else {\n textNodesWithPosition[index] = {\n text: `${node.text}`,\n pos\n }\n }\n } else {\n index += 1\n }\n })\n\n textNodesWithPosition = textNodesWithPosition.filter(Boolean)\n\n for (const element of textNodesWithPosition) {\n const { text, pos } = element\n const matches = Array.from(text.matchAll(searchTerm)).filter(([matchText]) => matchText.trim())\n\n for (const m of matches) {\n if (m[0] === '') break\n\n if (m.index !== undefined) {\n results.push({\n from: pos + m.index,\n to: pos + m.index + m[0].length\n })\n }\n }\n }\n\n for (let i = 0; i < results.length; i += 1) {\n const r = results[i]\n const className = i === resultIndex ? `${searchResultClass} ${searchResultClass}-current` : searchResultClass\n const decoration: Decoration = Decoration.inline(r.from, r.to, {\n class: className\n })\n\n decorations.push(decoration)\n }\n\n return {\n decorationsToReturn: DecorationSet.create(doc, decorations),\n results\n }\n}\n\nconst replace = (replaceTerm: string, results: Range[], { state, dispatch }: { state: EditorState; dispatch: Dispatch }) => {\n const firstResult = results[0]\n\n if (!firstResult) return\n\n const { from, to } = results[0]\n\n if (dispatch) dispatch(state.tr.insertText(replaceTerm, from, to))\n}\n\nconst rebaseNextResult = (replaceTerm: string, index: number, lastOffset: number, results: Range[]): [number, Range[]] | null => {\n const nextIndex = index + 1\n\n if (!results[nextIndex]) return null\n\n const { from: currentFrom, to: currentTo } = results[index]\n\n const offset = currentTo - currentFrom - replaceTerm.length + lastOffset\n\n const { from, to } = results[nextIndex]\n\n results[nextIndex] = {\n to: to - offset,\n from: from - offset\n }\n\n return [offset, results]\n}\n\nconst replaceAll = (replaceTerm: string, results: Range[], { tr, dispatch }: { tr: Transaction; dispatch: Dispatch }) => {\n let offset = 0\n\n let resultsCopy = results.slice()\n\n if (!resultsCopy.length) return\n\n for (let i = 0; i < resultsCopy.length; i += 1) {\n const { from, to } = resultsCopy[i]\n\n tr.insertText(replaceTerm, from, to)\n\n const rebaseNextResultResponse = rebaseNextResult(replaceTerm, i, offset, resultsCopy)\n\n if (!rebaseNextResultResponse) continue\n\n offset = rebaseNextResultResponse[0]\n resultsCopy = rebaseNextResultResponse[1]\n }\n\n dispatch?.(tr)\n}\n\nexport const searchAndReplacePluginKey = new PluginKey('searchAndReplacePlugin')\n\nexport interface SearchAndReplaceOptions {\n searchResultClass: string\n disableRegex: boolean\n}\n\nexport interface SearchAndReplaceStorage {\n searchTerm: string\n replaceTerm: string\n results: Range[]\n lastSearchTerm: string\n caseSensitive: boolean\n lastCaseSensitive: boolean\n resultIndex: number\n lastResultIndex: number\n}\n\nexport const SearchAndReplace = Extension.create<SearchAndReplaceOptions, SearchAndReplaceStorage>({\n name: 'searchAndReplace',\n\n addOptions() {\n return {\n searchResultClass: 'search-result',\n disableRegex: true\n }\n },\n\n addStorage() {\n return {\n searchTerm: '',\n replaceTerm: '',\n results: [],\n lastSearchTerm: '',\n caseSensitive: false,\n lastCaseSensitive: false,\n resultIndex: 0,\n lastResultIndex: 0\n }\n },\n\n addCommands() {\n return {\n setSearchTerm:\n (searchTerm: string) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.searchTerm = searchTerm\n\n return false\n },\n setReplaceTerm:\n (replaceTerm: string) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.replaceTerm = replaceTerm\n\n return false\n },\n setCaseSensitive:\n (caseSensitive: boolean) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.caseSensitive = caseSensitive\n\n return false\n },\n resetIndex:\n () =>\n ({ editor }) => {\n editor.storage.searchAndReplace.resultIndex = 0\n\n return false\n },\n nextSearchResult:\n () =>\n ({ editor }) => {\n const { results, resultIndex } = editor.storage.searchAndReplace\n\n const nextIndex = resultIndex + 1\n\n if (results[nextIndex]) {\n editor.storage.searchAndReplace.resultIndex = nextIndex\n } else {\n editor.storage.searchAndReplace.resultIndex = 0\n }\n\n return false\n },\n previousSearchResult:\n () =>\n ({ editor }) => {\n const { results, resultIndex } = editor.storage.searchAndReplace\n\n const prevIndex = resultIndex - 1\n\n if (results[prevIndex]) {\n editor.storage.searchAndReplace.resultIndex = prevIndex\n } else {\n editor.storage.searchAndReplace.resultIndex = results.length - 1\n }\n\n return false\n },\n replace:\n () =>\n ({ editor, state, dispatch }) => {\n const { replaceTerm, results } = editor.storage.searchAndReplace\n\n replace(replaceTerm, results, { state, dispatch })\n\n return false\n },\n replaceAll:\n () =>\n ({ editor, tr, dispatch }) => {\n const { replaceTerm, results } = editor.storage.searchAndReplace\n\n replaceAll(replaceTerm, results, { tr, dispatch })\n\n return false\n }\n }\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor\n const { searchResultClass, disableRegex } = this.options\n\n const setLastSearchTerm = (t: string) => (editor.storage.searchAndReplace.lastSearchTerm = t)\n const setLastCaseSensitive = (t: boolean) => (editor.storage.searchAndReplace.lastCaseSensitive = t)\n const setLastResultIndex = (t: number) => (editor.storage.searchAndReplace.lastResultIndex = t)\n\n return [\n new Plugin({\n key: searchAndReplacePluginKey,\n state: {\n init: () => DecorationSet.empty,\n apply({ doc, docChanged }, oldState) {\n const { searchTerm, lastSearchTerm, caseSensitive, lastCaseSensitive, resultIndex, lastResultIndex } = editor.storage.searchAndReplace\n\n if (!docChanged && lastSearchTerm === searchTerm && lastCaseSensitive === caseSensitive && lastResultIndex === resultIndex)\n return oldState\n\n setLastSearchTerm(searchTerm)\n setLastCaseSensitive(caseSensitive)\n setLastResultIndex(resultIndex)\n\n if (!searchTerm) {\n editor.storage.searchAndReplace.results = []\n return DecorationSet.empty\n }\n\n const { decorationsToReturn, results } = processSearches(\n doc,\n getRegex(searchTerm, disableRegex, caseSensitive),\n searchResultClass,\n resultIndex\n )\n\n editor.storage.searchAndReplace.results = results\n\n return decorationsToReturn\n }\n },\n props: {\n decorations(state) {\n return this.getState(state)\n }\n }\n })\n ]\n }\n})\n\nexport default SearchAndReplace\n","import { EditorContent, EditorContext, useEditor } from '@tiptap/react'\n\n// --- Styles ---\nimport './index.less'\nimport './styles/_keyframe-animations.less'\nimport './styles/_reset.less'\nimport './styles/_variables.less'\n\nimport { Markdown } from 'tiptap-markdown'\n\n// --- Tiptap Core Extensions ---\nimport { Highlight } from '@tiptap/extension-highlight'\nimport { Image } from '@tiptap/extension-image'\nimport { Subscript } from '@tiptap/extension-subscript'\nimport { Superscript } from '@tiptap/extension-superscript'\nimport { TaskItem } from '@tiptap/extension-task-item'\nimport { TaskList } from '@tiptap/extension-task-list'\nimport { TextAlign } from '@tiptap/extension-text-align'\nimport { Typography } from '@tiptap/extension-typography'\nimport { Underline } from '@tiptap/extension-underline'\nimport { StarterKit } from '@tiptap/starter-kit'\n\nimport Table from '@tiptap/extension-table'\nimport TableCell from '@tiptap/extension-table-cell'\nimport TableHeader from '@tiptap/extension-table-header'\nimport TableRow from '@tiptap/extension-table-row'\n// import { Gapcursor } from '@tiptap/extensions'\nimport { BubbleMenu } from '@tiptap/react'\n\n// --- Custom Extensions ---\nimport { Link } from './components/tiptap-extension/link-extension'\nimport { Selection } from './components/tiptap-extension/selection-extension'\nimport { TrailingNode } from './components/tiptap-extension/trailing-node-extension'\n\n// --- UI Primitives ---\nimport { Button } from './components/tiptap-ui-primitive/button'\nimport { Spacer } from './components/tiptap-ui-primitive/spacer'\nimport { Toolbar, ToolbarGroup, ToolbarSeparator } from './components/tiptap-ui-primitive/toolbar'\n\n// --- Tiptap Node ---\nimport './components/tiptap-node/code-block-node/code-block-node.less'\nimport './components/tiptap-node/image-node/image-node.less'\nimport './components/tiptap-node/list-node/list-node.less'\nimport './components/tiptap-node/paragraph-node/paragraph-node.less'\n\n// --- Tiptap UI ---\nimport { HeadingDropdownMenu } from './components/tiptap-ui/heading-dropdown-menu'\nimport { HighlightContent, HighlighterButton, HighlightPopover } from './components/tiptap-ui/highlight-popover'\nimport { LinkButton, LinkContent, LinkPopover } from './components/tiptap-ui/link-popover'\nimport { ListDropdownMenu } from './components/tiptap-ui/list-dropdown-menu'\nimport { MarkButton } from './components/tiptap-ui/mark-button'\nimport { NodeButton } from './components/tiptap-ui/node-button'\nimport { QuoteButton } from './components/tiptap-ui/quote-button'\nimport { TextAlignButton } from './components/tiptap-ui/text-align-button'\nimport { UndoRedoButton } from './components/tiptap-ui/undo-redo-button'\n\n// --- Icons ---\nimport { ArrowLeftIcon } from './components/tiptap-icons/arrow-left-icon'\nimport { HighlighterIcon } from './components/tiptap-icons/highlighter-icon'\nimport { LinkIcon } from './components/tiptap-icons/link-icon'\n\n// --- Hooks ---\nimport classNames from 'classnames'\nimport { ReactNode, useEffect, useRef, useState } from 'react'\nimport { useCursorVisibility } from './hooks/use-cursor-visibility'\nimport { useMobile } from './hooks/use-mobile'\nimport { useWindowSize } from './hooks/use-window-size'\n\nimport { Flex, Tag } from 'antd'\n// import TurndownService from 'turndown'\nimport { useDebounce } from '../../hooks/useDebounce'\nimport PageNoNode from './extensions/pageNoNode'\nimport SearchAndReplace from './extensions/searchAndReplace'\n\n// const turndown = new TurndownService()\nconst MainToolbarContent = ({\n onHighlighterClick,\n onLinkClick,\n onQuote,\n // onSetComment,\n isMobile,\n isBubble\n}: {\n onHighlighterClick: () => void\n onLinkClick: () => void\n onQuote?: MarkdownEditorProps['onQuote']\n // onSetComment: () => void\n isMobile: boolean\n isBubble: boolean\n}) => {\n return (\n <>\n <Spacer />\n {onQuote && (\n <ToolbarGroup>\n <QuoteButton onQuote={onQuote} />\n </ToolbarGroup>\n )}\n {!isBubble && (\n <>\n <ToolbarGroup>\n <UndoRedoButton action=\"undo\" />\n <UndoRedoButton action=\"redo\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )}\n {/* <Button onClick={onSetComment}>评论</Button> */}\n\n <ToolbarGroup>\n <HeadingDropdownMenu levels={[1, 2, 3, 4]} />\n <ListDropdownMenu types={['bulletList', 'orderedList', 'taskList']} />\n <NodeButton type=\"codeBlock\" />\n <NodeButton type=\"blockquote\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"bold\" />\n <MarkButton type=\"italic\" />\n <MarkButton type=\"strike\" />\n <MarkButton type=\"code\" />\n <MarkButton type=\"underline\" />\n {!isMobile ? <HighlightPopover /> : <HighlighterButton onClick={onHighlighterClick} />}\n {!isMobile ? <LinkPopover /> : <LinkButton onClick={onLinkClick} />}\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\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 <Spacer />\n\n {isMobile && <ToolbarSeparator />}\n </>\n )\n}\n\nconst MobileToolbarContent = ({ type, onBack }: { type: 'highlighter' | 'link'; onBack: () => void }) => (\n <>\n <ToolbarGroup>\n <Button data-style=\"ghost\" onClick={onBack}>\n <ArrowLeftIcon className=\"tiptap-button-icon\" />\n {type === 'highlighter' ? <HighlighterIcon className=\"tiptap-button-icon\" /> : <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n {type === 'highlighter' ? <HighlightContent /> : <LinkContent />}\n </>\n)\n/**\n * Markdown编辑器组件属性接口\n */\nexport interface MarkdownEditorProps {\n /** 是否禁用编辑器 */\n disabled?: boolean\n /** 搜索关键字 */\n searchValue?: string\n /** 编辑器内容 */\n value?: string\n /** 内容变化回调 */\n onChange?: (value: string) => void\n /** 页面滚动回调 */\n onScrollPage?: (pageIndex: number) => void\n /** 额外导航内容 */\n extraNav?: ReactNode\n /** 是否显示工具栏,默认为true */\n showToolbar?: boolean\n /** 引用文本回调 */\n onQuote?: (text: string) => void\n /** 文件下载回调 */\n onDownloadFile?: (fileContent: string, targetFormat?: string) => Promise<void>\n}\n\n/**\n * Markdown编辑器组件\n * 基于Tiptap构建的富文本编辑器,支持Markdown语法\n * 提供丰富的编辑功能:格式化、链接、图片、表格、高亮等\n * @param props - 组件属性\n */\nexport default ({\n value = '',\n onChange,\n onScrollPage,\n searchValue,\n disabled,\n extraNav,\n showToolbar = true,\n onQuote,\n onDownloadFile\n}: MarkdownEditorProps) => {\n const isMobile = useMobile()\n const windowSize = useWindowSize()\n const lastContentRef = useRef<string>('') // 存储 editor 上一次内容\n const [mobileView, setMobileView] = useState<'main' | 'highlighter' | 'link'>('main')\n const toolbarRef = useRef<HTMLDivElement>(null)\n const editor = useEditor({\n immediatelyRender: false,\n editorProps: {\n attributes: {\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n 'aria-label': 'Main content area, start typing to enter text.'\n }\n },\n extensions: [\n Markdown.configure({\n transformPastedText: true,\n transformCopiedText: true,\n breaks: true\n }),\n StarterKit,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Underline,\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Image,\n Typography,\n Superscript,\n Subscript,\n Selection,\n TrailingNode,\n Link.configure({ openOnClick: false }),\n\n Table.configure({\n resizable: true // 可选,允许调整表格大小\n }),\n TableHeader,\n TableRow,\n TableCell,\n // Gapcursor,\n SearchAndReplace.configure({\n searchResultClass: 'cube-hl', // class to give to found items. default 'cube-hl'\n disableRegex: false // also no need to explain\n }),\n PageNoNode\n // Comment.configure({\n // HTMLAttributes: {\n // class: 'my-comment'\n // },\n // onCommentActivated: (commentId) => {\n // setActiveCommentId(commentId)\n\n // if (commentId) setTimeout(() => focusCommentWithActiveId(commentId))\n // }\n // })\n ],\n content: '',\n onUpdate: () => {\n // console.log('update 文本改变')\n const markdownOutput = getMarkdown()\n // ✅ 防抖:与上一次一致则不触发(避免无限循环)\n if (markdownOutput === lastContentRef.current) return\n lastContentRef.current = markdownOutput\n onChange?.(markdownOutput)\n }\n })\n\n const getMarkdown = () => {\n if (!editor) return ''\n return editor.storage.markdown.getMarkdown()\n // return turndown.turndown(editor.getHTML())\n }\n // const [comments, setComments] = useState<Comment[]>([])\n\n // const [activeCommentId, setActiveCommentId] = useState<string | null>(null)\n\n // const commentsSectionRef = useRef<HTMLDivElement | null>(null)\n\n // const focusCommentWithActiveId = (id: string) => {\n // if (!commentsSectionRef.current) return\n\n // const commentInput = commentsSectionRef.current.querySelector<HTMLInputElement>(`input#${id}`)\n\n // if (!commentInput) return\n\n // commentInput.scrollIntoView({\n // behavior: 'smooth',\n // block: 'center',\n // inline: 'center'\n // })\n // }\n\n // useEffect(() => {\n // if (!activeCommentId) return\n\n // focusCommentWithActiveId(activeCommentId)\n // }, [activeCommentId])\n // interface Comment {\n // id: string\n // content: string\n // replies: Comment[]\n // createdAt: Date\n // }\n // const getNewComment = (content: string): Comment => {\n // return {\n // id: genNonDuplicateID(),\n // content,\n // replies: [],\n // createdAt: new Date()\n // }\n // }\n // const onSetComment = () => {\n // const newComment = getNewComment('')\n\n // setComments([...comments, newComment])\n\n // editor?.commands.setComment(newComment.id)\n\n // setActiveCommentId(newComment.id)\n\n // setTimeout(focusCommentWithActiveId)\n\n // console.log('comments', comments)\n // }\n\n const bodyRect = useCursorVisibility({\n editor,\n overlayHeight: toolbarRef.current?.getBoundingClientRect().height ?? 0\n })\n\n useEffect(() => {\n if (!isMobile && mobileView !== 'main') {\n setMobileView('main')\n }\n }, [isMobile, mobileView])\n\n useEffect(() => {\n // console.log('value改变')\n if (!editor) return\n // const current = getMarkdown()\n // // ✅ 如果外部 value 和当前 editor 内容一致 → 不更新\n // if (current === value) return\n\n // ✅ 如果外部 value 和内部记录一致 → 不更新\n if (lastContentRef.current === value) return\n\n editor?.commands.setContent(value)\n // ✅ 同步内部历史,避免 onUpdate 再次触发回调\n lastContentRef.current = value\n\n // 监听滚动\n // if (value) {\n // // 获取所有的 page-no 节点\n // const pageNoNodes = editor.view.dom.querySelectorAll('.page-no')\n // if (!pageNoNodes.length) return\n // // 创建 IntersectionObserver 实例\n // const observer = new IntersectionObserver(\n // (entries) => {\n // entries.forEach((entry) => {\n // if (entry.isIntersecting && entry.intersectionRatio > 0) {\n // // 这里可以执行节点进入视口时的逻辑\n // const boundingTop = entry.boundingClientRect.top\n // const rootTop = entry.rootBounds?.top ?? 0\n // console.log('当前页面索引1:', boundingTop, rootTop)\n // if (Math.abs(boundingTop - rootTop) <= 10) {\n // const pageIndex = entry.target.getAttribute('page-no')\n // console.log('当前页面索引:', pageIndex)\n // // onPageChange(pageIndex) // 调用回调并传递 pageIndex\n // }\n // }\n // })\n // },\n // {\n // root: document.querySelector('.content-wrapper'), // 视口\n // rootMargin: '0px 0px -99% 0px',\n // threshold: 0 // 进入视口时触发\n // }\n // )\n\n // // 为每个 page-no 节点添加观察\n // pageNoNodes.forEach((node) => observer.observe(node))\n\n // // 清理: 在组件卸载时停止观察\n // return () => {\n // pageNoNodes.forEach((node) => observer.unobserve(node))\n // }\n // }\n }, [value, editor])\n\n const onPageChange = useDebounce((pageIndex?: string) => {\n // console.log('onPageChange', pageIndex)\n onScrollPage?.(parseInt(pageIndex ?? '0'))\n }, 300)\n useEffect(() => {\n if (!editor) return\n const container = document.querySelector('.content-wrapper')\n if (!container) return\n const handleSelectionUpdate = () => {\n const { from } = editor.state.selection\n const domAtPos = editor.view.domAtPos(from)\n const domNode = domAtPos.node as HTMLElement\n\n // 获取 content DOM\n const contentRoot = editor.view.dom\n\n // 当前节点或父节点查找 page-no\n let el: HTMLElement | null = domNode.nodeType === 1 ? domNode : domNode.parentElement\n let pageNo: string | null = null\n\n while (el && el !== contentRoot) {\n if (el.classList.contains('page-no')) {\n pageNo = el.getAttribute('page-no')\n break\n }\n el = (el.previousElementSibling as HTMLElement) || el.parentElement\n }\n\n if (!pageNo && domNode) {\n // 如果上面找不到,尝试从当前位置向上寻找最近的 page-no\n const allPageNoEls = Array.from(contentRoot.querySelectorAll('.page-no')) as HTMLElement[]\n const scrollTop = domNode.getBoundingClientRect?.()?.top\n\n for (let i = allPageNoEls.length - 1; i >= 0; i--) {\n const elTop = allPageNoEls[i].getBoundingClientRect().top\n if (elTop < scrollTop) {\n pageNo = allPageNoEls[i].getAttribute('page-no')\n break\n }\n }\n }\n\n if (pageNo) {\n // console.log('最近的上一个 page-no:', pageNo)\n onPageChange(pageNo)\n }\n }\n\n const handleScroll = () => {\n const pageNos = Array.from(container.querySelectorAll('.page-no')) as HTMLElement[]\n if (!pageNos.length) return\n\n let closestNode: HTMLElement | null = null\n let closestTopDiff = -Infinity\n const containerTop = container.getBoundingClientRect().top\n pageNos.forEach((node) => {\n const rect = node.getBoundingClientRect()\n const top = rect.top - containerTop\n\n // 优先找 top ≈ 0 的节点(±5px 容差)\n if (Math.abs(top) <= 80) {\n closestNode = node\n closestTopDiff = 0\n }\n\n // 否则找 top < 0 且最大的(离顶部最近但在视口上方)\n else if (top < 0 && top > closestTopDiff) {\n closestNode = node\n closestTopDiff = top\n }\n })\n\n if (closestNode) {\n const pageNo = (closestNode as HTMLElement).getAttribute('page-no')\n // console.log('当前滚动最近 page-no:', pageNo)\n onPageChange(pageNo!)\n }\n }\n\n editor.on('selectionUpdate', handleSelectionUpdate)\n container.addEventListener('scroll', handleScroll)\n\n return () => {\n editor.off('selectionUpdate', handleSelectionUpdate)\n container.removeEventListener('scroll', handleScroll)\n }\n }, [editor])\n\n useEffect(() => {\n editor?.commands.setSearchTerm(searchValue || '')\n }, [searchValue, value, editor])\n\n useEffect(() => {\n editor?.setEditable(!disabled)\n }, [disabled, editor])\n\n const NsToolBar = ({ isBubble = true }: { isBubble?: boolean }) => (\n <>\n <Toolbar\n {...(isBubble\n ? {}\n : {\n ref: toolbarRef,\n style: isMobile\n ? {\n bottom: `calc(100% - ${windowSize.height - bodyRect.y}px)`\n }\n : {}\n })}\n >\n {mobileView === 'main' ? (\n <MainToolbarContent\n isBubble={isBubble}\n // onSetComment={onSetComment}\n onHighlighterClick={() => setMobileView('highlighter')}\n onLinkClick={() => setMobileView('link')}\n onQuote={onQuote}\n isMobile={isMobile}\n />\n ) : (\n <MobileToolbarContent type={mobileView === 'highlighter' ? 'highlighter' : 'link'} onBack={() => setMobileView('main')} />\n )}\n </Toolbar>\n </>\n )\n\n const downloadFile = () => {\n onDownloadFile?.(getMarkdown(), 'docx')\n }\n\n return (\n <div className={classNames('height-full', 'editor-parent')}>\n <EditorContext.Provider value={{ editor }}>\n {showToolbar && (\n <>\n <Flex justify=\"end\" align=\"center\">\n {NsToolBar({ isBubble: false })}\n {extraNav && (\n <Flex align=\"center\" className=\"m-l-16 m-r-16\">\n {onDownloadFile && (\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={downloadFile}>\n 下载\n </Tag>\n )}\n {extraNav}\n </Flex>\n )}\n </Flex>\n {!isMobile && <BubbleMenu editor={editor}>{NsToolBar({ isBubble: true })}</BubbleMenu>}\n </>\n )}\n <div className=\"content-wrapper scroll-fade-in\">\n <EditorContent\n editor={editor}\n role=\"presentation\"\n className={classNames('simple-editor-content ns-markdown', { 'no-toolbar': !showToolbar })}\n />\n </div>\n </EditorContext.Provider>\n </div>\n )\n}\n","import { forwardRef } from 'react'\nimport { isBoolean, isFunction, isNull, isObject } from '../../utils'\n\n/**\n * 渲染控制对象类型\n * 用于控制组件的显示、渲染函数和属性\n */\nexport type RenderControlObj<C, P = ObjectType<any>> = {\n /** 是否可见 */\n visible?: boolean\n /** 渲染函数 */\n render?: (ctx: C) => React.ReactNode\n /** 传递给组件的属性 */\n props?: P\n}\n\n/**\n * 渲染控制类型\n * 支持布尔值或控制对象\n */\nexport type RenderControl<C, P = ObjectType<any>> = boolean | RenderControlObj<C, P>\n\n/**\n * RenderWrapper组件属性接口\n * @param C - 上下文类型\n * @param P - 属性类型\n */\nexport interface RenderWrapperProps<C, P> {\n /** 渲染控制配置 */\n control?: RenderControl<C, P> | null\n /** 上下文数据 */\n ctx?: C\n /** 默认组件或渲染函数 */\n DefaultComponent?: React.ReactNode | ((props: P) => React.ReactNode)\n}\n\n/**\n * 判断节点是否为渲染函数\n * @param node - 要判断的节点\n * @returns 是否为渲染函数\n */\nfunction isRenderFn<P>(node: React.ReactNode | ((props: P) => React.ReactNode)): node is (props: P) => React.ReactNode {\n return isFunction(node) || (isObject(node) && !isNull(node) && '$$typeof' in node && node.$$typeof === Symbol.for('react.forward_ref'))\n}\n\n/**\n * 渲染默认组件\n * @param DefaultComponent - 默认组件\n * @param ref - ref引用\n * @param props - 组件属性\n * @returns 渲染的组件\n */\nfunction renderDefault<P>(DefaultComponent?: React.ReactNode | ((props: P) => React.ReactNode), ref?: any, props?: P) {\n if (!DefaultComponent) return null\n return isRenderFn(DefaultComponent) ? <DefaultComponent ref={ref} {...(props as P)} /> : DefaultComponent\n}\n\n/**\n * 渲染包装器组件\n * 根据控制配置条件性地渲染组件,支持动态渲染函数和属性传递\n *\n * @example\n * // 基本用法\n * <RenderWrapper control={true} DefaultComponent={<div>内容</div>} />\n *\n * // 条件渲染\n * <RenderWrapper control={{ visible: false }} DefaultComponent={<div>不显示</div>} />\n *\n * // 动态渲染\n * <RenderWrapper\n * control={{ render: (ctx) => <div>动态内容: {ctx.value}</div> }}\n * ctx={{ value: 'hello' }}\n * />\n *\n * @param props - 组件属性\n * @returns 渲染的组件或null\n */\nexport const RenderWrapper = forwardRef(function RenderWrapper<C = any, P = any>(\n { control = true, ctx, DefaultComponent }: RenderWrapperProps<C, P>,\n ref\n) {\n if (control === false || isNull(control)) return null\n\n if (control === true || control === undefined) {\n return renderDefault(DefaultComponent, ref)\n }\n\n const { visible = true, render, props } = control\n if (!visible) return null\n if (render) {\n return typeof render === 'function' ? render(ctx!) : render\n }\n\n // 若 DefaultComponent 是 JSX,props 会被忽略\n return renderDefault(DefaultComponent, ref, props)\n})\n\n/**\n * 判断是否应该渲染组件\n * @param control - 渲染控制配置\n * @returns 是否应该渲染\n */\nexport const shouldRender = (control?: RenderControl<any, any> | null) =>\n control != null && (isBoolean(control) ? control : control?.visible !== false)\n\n/**\n * 合并上级传入的props与当前的props\n * 用于智能地合并组件属性\n *\n * @param control - 渲染控制配置\n * @param props - 要合并的属性\n * @returns 合并后的属性对象或null\n */\nexport function propsMerge(control?: RenderControl<any, any> | null, props?: ObjectType<any>) {\n if (control === true || control === undefined) {\n return {\n props\n }\n }\n if (isObject(control) && (control?.visible === true || control?.visible === undefined)) {\n return {\n props: {\n ...props,\n ...control?.props\n }\n }\n }\n return null\n}\n","import { Avatar } from 'antd'\n\n/**\n * 用户头像组件属性接口\n */\nexport interface UserAvatarProps {\n /** 头像图片地址 */\n avatarSrc?: string\n /** 用户名 */\n userName?: string\n /** 头像尺寸 */\n size?: number\n}\n\n/**\n * 用户头像组件\n * 如果没有头像图片,则显示用户名首字母作为头像\n * @param props - 组件属性\n */\nexport default ({ size, avatarSrc, userName }: UserAvatarProps) => {\n return avatarSrc ? (\n <Avatar size={size} src={avatarSrc} />\n ) : (\n <Avatar size={size} className=\"cursor-pointer\" style={{ backgroundColor: 'var(--ant-color-primary)' }}>\n {userName?.slice(0, 1)?.toLocaleUpperCase()}\n </Avatar>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/File/styles.module.less","../src/components/File/AudioPlayer.tsx","../src/components/File/FileIcon.tsx","../src/components/File/VideoPlayer.tsx","../src/components/LazyComponent/index.tsx","../src/components/RenderMarkdown/index.tsx","../src/components/File/MarkdownPreview.tsx","../src/hooks/iframe/iframeRelay.ts","../src/utils/is.ts","../src/hooks/iframe/useIframeRelayBridge.ts","../src/hooks/useAutoRefresh.ts","../src/hooks/useCountDown.ts","../src/hooks/useCreateValtioContext.tsx","../src/hooks/useDebounce.ts","../src/utils/common.ts","../src/hooks/useDeepEffect.ts","../src/hooks/useRefState.ts","../src/hooks/useSyncInput.ts","../src/hooks/useThrottle.ts","../src/utils/date.ts","../src/utils/math.ts","../src/utils/message.ts","../src/utils/pattern.ts","../src/utils/request.ts","../src/utils/storage.ts","../src/hooks/webSocket/useWebSocket.ts","../src/components/File/PdfPreview.tsx","../src/components/File/FilePreview.tsx","../src/components/File/FilePreviewDrawer.tsx","../src/components/Iframe/styles.module.less","../src/components/Iframe/index.tsx","../src/components/MarkdownEditor/components/tiptap-extension/link-extension.ts","../src/components/MarkdownEditor/components/tiptap-extension/selection-extension.ts","../src/components/MarkdownEditor/components/tiptap-extension/trailing-node-extension.ts","../src/components/MarkdownEditor/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/button/button.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/spacer/spacer.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/separator/separator.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/components/MarkdownEditor/hooks/use-tiptap-editor.ts","../src/components/MarkdownEditor/components/tiptap-icons/chevron-down-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-icon.tsx","../src/components/MarkdownEditor/lib/tiptap-utils.ts","../src/components/MarkdownEditor/components/tiptap-icons/heading-five-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-four-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-one-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-six-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-three-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-two-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-button/heading-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx","../src/components/MarkdownEditor/hooks/use-menu-navigation.ts","../src/components/MarkdownEditor/components/tiptap-icons/ban-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/highlighter-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/popover/popover.tsx","../src/components/MarkdownEditor/components/tiptap-ui/highlight-button/highlight-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui/highlight-popover/highlight-popover.tsx","../src/components/MarkdownEditor/components/tiptap-icons/corner-down-left-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/external-link-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/link-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/trash-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/link-popover/link-popover.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-ordered-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/list-todo-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/list-button/list-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/MarkdownEditor/components/tiptap-icons/bold-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/code2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/italic-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/strike-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/subscript-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/superscript-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/underline-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/mark-button/mark-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/block-quote-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/code-block-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/node-button/node-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/quote-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/quote-button/quote-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-center-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-justify-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-left-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/align-right-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/text-align-button/text-align-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/redo2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/undo2-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/undo-redo-button/undo-redo-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/arrow-left-icon.tsx","../src/components/MarkdownEditor/hooks/use-window-size.ts","../src/components/MarkdownEditor/hooks/use-cursor-visibility.ts","../src/components/MarkdownEditor/hooks/use-mobile.ts","../src/components/MarkdownEditor/extensions/pageNoNode.ts","../src/components/MarkdownEditor/extensions/searchAndReplace.ts","../src/components/MarkdownEditor/index.tsx","../src/components/RenderWrapper/index.tsx","../src/components/UserAvatar/index.tsx"],"names":["nsPreviewImage","nsPreviewPdf","pdfToolbar","nsPreviewVideo","nsPreviewAudio","jsx","jsxs","useMemo","md","error","useEffect","useRef","useState","startCount","count","isJson","setInterval","minus","document","useCallback","message","showError","config","password","Toolbar","pageNo","Result","Flex","styles_module_default","iframe","classNames","Plugin","Extension","PluginKey","React","TooltipTrigger","TooltipContent","React2","Button","React3","React4","React5","React6","React7","React8","React9","React10","React11","React12","React13","React14","isNodeSelection","React15","Fragment","useFloating","offset","flip","shift","autoUpdate","useInteractions","useRole","useDismiss","useMergeRefs","FloatingPortal","React17","React18","React19","React20","React21","useClick","PopoverTrigger","PopoverContent","FloatingFocusManager","React22","React23","isDisabled","React24","React25","React26","React27","React28","React29","React30","React31","React32","React33","React34","React35","React36","React37","React38","React39","React40","React41","React42","React43","React44","React45","React46","React47","React48","React49","React50","React51","React52","React53","React54","React55","React56","React57","React58","DecorationSet","Decoration","Image","downloadFile","forwardRef"],"mappings":"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","file":"index.esm.js","sourcesContent":[".nsPreviewImage {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.nsPreviewImage img {\n max-width: 100%;\n max-height: 100%;\n width: auto !important;\n}\n.nsPreviewPdf {\n width: 100%;\n height: 100%;\n overflow: auto;\n}\n.nsPreviewPdf .pdfToolbar {\n position: absolute;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: #fff;\n padding: 8px 16px 6px;\n border-radius: 6px;\n box-shadow: 0 0 15px rgba(1, 1, 1, 0.1);\n}\n.nsPreviewPdf .pdfToolbar :global .rpv-core__tooltip-body {\n display: none;\n}\n.nsPreviewPdf :global .current-page-highlight::after {\n box-shadow: 0 0 10px var(--ant-color-primary);\n transition: box-shadow 0.3s;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n border-radius: 4px;\n transition: background-color 0.3s ease 0.3s;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages::-webkit-scrollbar-track {\n background: transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages:hover {\n scrollbar-color: rgba(0, 0, 0, 0.3) transparent;\n}\n.nsPreviewPdf :global .rpv-core__inner-pages:hover::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.3);\n transition-delay: 0s;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list {\n scrollbar-width: thin;\n scrollbar-color: transparent transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n border-radius: 4px;\n transition: background-color 0.3s ease 0.3s;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list::-webkit-scrollbar-track {\n background: transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list:hover {\n scrollbar-color: rgba(0, 0, 0, 0.3) transparent;\n}\n.nsPreviewPdf :global .rpv-thumbnail__list:hover::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0.3);\n transition-delay: 0s;\n}\n.nsPreviewVideo {\n max-width: 100%;\n max-height: 100%;\n}\n.nsPreviewAudio {\n width: 100%;\n max-width: 400px;\n}\n","import styles from './styles.module.less'\n\n/**\n * 音频播放器组件属性接口\n */\nexport interface AudioPlayerProps {\n /** 音频文件URL地址 */\n fileUrl: string\n}\n\n/**\n * 音频播放器组件\n * 提供基本的音频播放功能\n * @param props - 组件属性\n */\nexport default ({ fileUrl }: AudioPlayerProps) => {\n return (\n <audio controls className={styles.nsPreviewAudio}>\n <source src={fileUrl} type=\"audio/mpeg\" />\n 您的浏览器不支持 audio 标签。\n </audio>\n )\n}\n","import {\n FileExcelOutlined,\n FileGifOutlined,\n FileImageOutlined,\n FileJpgOutlined,\n FileMarkdownOutlined,\n FilePdfOutlined,\n FilePptOutlined,\n FileTextOutlined,\n FileUnknownOutlined,\n FileWordOutlined,\n FileZipOutlined,\n NotificationOutlined,\n VideoCameraOutlined\n} from '@ant-design/icons'\nimport { useMemo } from 'react'\n\n/**\n * 文件图标组件属性接口\n */\nexport interface FileIconProps {\n /** 文件后缀名,不区分大小写 */\n suffix?: string\n /** 图标字体大小,默认为22px */\n fontSize?: number\n}\n/**\n * 文件图标组件\n * 根据文件后缀名显示对应的图标\n * 支持常见的文件类型:文档、图片、音视频、压缩包等\n *\n * 支持的文件类型:\n * - 文档:PDF, DOC/DOCX, XLS/XLSX, PPT, TXT, MD/MARKDOWN\n * - 图片:JPG, JPEG, PNG, GIF\n * - 音视频:MP3, MP4, MOV, AVI, FLV\n * - 压缩包:ZIP, RAR, 7Z\n * - 其他:显示为默认图标或文件夹图标\n *\n * @param props - 组件属性\n * @returns 对应文件类型的图标\n */\nexport default ({ suffix, fontSize = 22 }: FileIconProps) => {\n // 设置图标样式:使用主题色和指定字体大小\n const styles = { fontSize, color: 'var(--ant-color-primary)' }\n\n /**\n * 根据文件后缀名选择对应的图标\n * 使用 useMemo 优化性能,避免每次渲染都重新计算\n */\n const Icon = useMemo(() => {\n switch (suffix?.toUpperCase()) {\n case 'TXT':\n return <FileTextOutlined />\n case 'PDF':\n return <FilePdfOutlined />\n case 'DOC':\n case 'DOCX':\n return <FileWordOutlined />\n case 'XLS':\n case 'XLSX':\n return <FileExcelOutlined />\n case 'PPT':\n return <FilePptOutlined />\n case 'MP4':\n case 'MOV':\n case 'AVI':\n case 'FLV':\n return <VideoCameraOutlined />\n case 'MP3':\n return <NotificationOutlined />\n case 'JPG':\n case 'JPEG':\n return <FileJpgOutlined />\n case 'PNG':\n return <FileImageOutlined />\n case 'GIF':\n return <FileGifOutlined />\n case 'MD':\n case 'MARKDOWN':\n return <FileMarkdownOutlined />\n case 'ZIP':\n case 'RAR':\n case '7Z':\n return <FileZipOutlined />\n case 'CATALOG':\n return <i style={styles} className=\"iconfont icon-wenjianjia\" /> // 文件夹图标\n default:\n return <FileUnknownOutlined /> // 默认未知文件图标\n }\n }, [suffix]) // 仅在suffix变化时重新计算\n\n return <span style={styles}>{Icon}</span>\n}\n","// // components/VideoPlayer.tsx\n// import { useEffect, useRef } from 'react'\n// import videojs from 'video.js'\n// import Player from 'video.js/dist/types/player'\n// import 'video.js/dist/video-js.css'\n\n// interface VideoPlayerProps {\n// fileUrl: string // 视频地址\n// poster?: string // 可选封面图\n// }\n\n// export default ({ fileUrl, poster }: VideoPlayerProps) => {\n// const videoRef = useRef<HTMLVideoElement | null>(null)\n// const playerRef = useRef<Player | null>(null)\n\n// useEffect(() => {\n// if (videoRef.current && !playerRef.current) {\n// playerRef.current = videojs(videoRef.current, {\n// controls: true,\n// preload: 'auto',\n// autoplay: false,\n// playbackRates: [0.5, 1, 1.5, 2], // 倍速选项\n// fluid: true,\n// poster,\n// sources: [\n// {\n// src: fileUrl,\n// type: 'video/mp4'\n// }\n// ]\n// })\n// }\n\n// return () => {\n// if (playerRef.current) {\n// playerRef.current.dispose()\n// playerRef.current = null\n// }\n// }\n// }, [fileUrl, poster])\n\n// return (\n// <div data-vjs-player>\n// <video ref={videoRef} className=\"video-js vjs-default-skin\" />\n// </div>\n// )\n// }\n\nimport styles from './styles.module.less'\n\n/**\n * 视频播放器组件属性接口\n */\nexport interface VideoPlayerProps {\n /** 视频文件URL地址 */\n fileUrl: string\n}\n\n/**\n * 视频播放器组件\n * 提供基本的视频播放功能\n * @param props - 组件属性\n */\nexport default ({ fileUrl }: VideoPlayerProps) => {\n return (\n <video controls className={styles.nsPreviewVideo}>\n <source src={fileUrl} type=\"video/mp4\" />\n 您的浏览器不支持 video 标签。\n </video>\n )\n}\n","import { Suspense, lazy, useMemo } from 'react'\n\n/**\n * 组件映射类型,用于延时加载\n */\nexport type ComponentMapType = Record<\n string,\n () => Promise<{\n default: React.ComponentType<any>\n }>\n>\n\n/**\n * 基础组件映射表\n */\nconst baseComponentMap: ComponentMapType = {\n // renderMarkdown: () => import('@/components/RenderMarkdown')\n}\n\n/**\n * LazyComponent组件属性接口\n */\nexport interface LazyComponentProps {\n /** 组件类型名称 */\n type: string\n /** 自定义组件映射 */\n customComponents?: ComponentMapType\n /** 其他属性会透传给组件 */\n [key: string]: any\n}\n\n/**\n * 延时加载组件\n * 根据type动态加载对应的组件,支持自定义组件映射\n * 使用示例:<LazyComponent type=\"renderMarkdown\" data={{}} loading={true} />\n * @param props - 组件属性\n */\nexport default ({ type, customComponents, ...rest }: LazyComponentProps) => {\n const componentMap = useMemo(() => {\n return { ...baseComponentMap, ...customComponents }\n }, [customComponents])\n const LazyComponent = useMemo(() => {\n const loader = componentMap[type]\n return loader ? lazy(loader) : null\n }, [type, componentMap])\n\n // {type}-{JSON.stringify(rest.data)}-{String(rest.loading)}\n if (!LazyComponent) return <div>未知类型:{type}</div>\n\n return (\n <Suspense fallback={<div>加载中...</div>}>\n <LazyComponent {...rest} />\n </Suspense>\n )\n}\n","import parse, { Element } from 'html-react-parser'\nimport { jsonrepair } from 'jsonrepair'\nimport markdownit from 'markdown-it'\nimport { useMemo } from 'react'\nimport LazyComponent, { ComponentMapType } from '../LazyComponent'\nimport './markdown.less'\n\n/**\n * Markdown渲染组件属性接口\n */\nexport interface RenderMarkdownProps {\n /** Markdown内容 */\n content?: string\n /** 搜索关键字 */\n searchValue?: string\n /** 自定义组件映射 */\n customComponents?: ComponentMapType\n /** 内容变化回调 */\n onChange?: (value: string) => void\n /** 部分内容变化回调 */\n onPartialChange?: (oldValue: string, newValue: string) => void\n}\n\n// ========================\n// MarkdownIt 基础设置\n// ========================\nconst md = markdownit({ html: true, breaks: true })\n\n// 所有 link 默认打开新标签页\nmd.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n const token = tokens[idx]\n token.attrPush(['target', '_blank'])\n return self.renderToken(tokens, idx, options)\n}\n\n// ========================\n// 工具函数:安全解析 data JSON\n// ========================\nfunction parseData(raw: string) {\n let obj: any = {}\n try {\n // 尝试直接 JSON.parse\n obj = JSON.parse(raw)\n } catch {\n try {\n // JSON 修复后再解析\n obj = JSON.parse(jsonrepair(raw))\n } catch {\n // 解析失败就保留原文\n obj = { _raw: raw }\n }\n }\n return obj\n}\n\n// ========================\n// 关键词高亮\n// ========================\nfunction highlightKeywords(html: string, keywords: string[]) {\n const escaped = keywords.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n const regex = new RegExp(`(${escaped.join('|')})`, 'gi')\n return html.replace(regex, '<span class=\"cube-hl\">$1</span>')\n}\n\n// 占位符格式,例如 \"__ALERT_DATA_0__\"\nfunction makePlaceholder(id: number) {\n return `__ALERT_DATA_${id}__`\n}\n\n// ============================================================\n// 抽取 :::alert ... ::: 块,把 data={...} 替换成占位符\n// ============================================================\n//\n// 步骤:\n// 1. 找到所有 :::alert\n// 2. 从中提取 type 和 data 原文\n// 3. 用单行格式替换为 `:::alert type=xx data=\"__PH__\" :::`\n// 4. 返回替换后的字符串 + 占位符映射表\nfunction alertMarkClean(src: string) {\n let pos = 0\n let id = 0\n let out = ''\n const placeholders = new Map<string, string>()\n\n while (pos < src.length) {\n const start = src.indexOf(':::alert', pos)\n if (start === -1) {\n // 无更多 alert,直接收尾\n out += src.slice(pos)\n break\n }\n\n // 保留 alert 之前的部分\n out += src.slice(pos, start)\n\n // ========================\n // 定位结束 ::: 块\n // ========================\n\n const afterStart = src.slice(start)\n\n // 优先匹配 “换行开始的 :::” 作为块级结束符\n const relAfter = afterStart.slice(':::alert'.length)\n const matchLineEnd = relAfter.search(/\\s*:::\\s*/)\n let endIdx = -1\n // 判断是否结束\n let isNoEnd = 1\n\n if (matchLineEnd !== -1) {\n // 找到块级结束符\n endIdx = start + ':::alert'.length + matchLineEnd\n isNoEnd = 0\n } else {\n // 没找到闭合符,最后的内容都属于当前标记\n endIdx = src.length\n isNoEnd = 1\n }\n\n // ========================\n // 解析 inner(alert 内部内容)\n // ========================\n const inner = src.slice(start + ':::alert'.length, endIdx).trim()\n\n // 解析 type=xxxx\n const typeMatch = inner.match(/type\\s*=\\s*(?:(['\"])(.*?)\\1|(\\S+))/)\n const type = typeMatch ? (typeMatch[2] ?? typeMatch[3]) : undefined\n\n // data= 后面整个都是 data 内容\n const dataIdx = inner.search(/\\bdata\\s*=/)\n let rawData = ''\n if (dataIdx !== -1) {\n rawData = inner.slice(dataIdx + inner.slice(dataIdx).match(/\\bdata\\s*=/)![0].length).trim()\n }\n\n // 生成占位符\n const ph = makePlaceholder(id++)\n placeholders.set(ph, rawData)\n\n // 使用 单行 alert 重写,此格式能被 inline 插件识别\n const typeText = type ? `type=${JSON.stringify(type)}` : ''\n out += `:::alert ${typeText} data=\"${ph}\" loading=\"${isNoEnd}\" :::`\n\n // 跳到结束 ::: 后继续扫描\n const realClose = src.indexOf(':::', endIdx)\n pos = realClose === -1 ? endIdx : realClose + 3\n }\n\n return { text: out, placeholders }\n}\n\n// ============================================================\n// MarkdownIt inline 插件\n// 将单行 `:::alert ... :::` 转成 <lazy-component ... />\n// ============================================================\nfunction alertInlinePlugin(md: any) {\n md.inline.ruler.before('emphasis', 'alert_inline', function (state: any, silent: boolean) {\n const pos = state.pos\n const src = state.src\n if (src.slice(pos, pos + 3) !== ':::') return false\n\n // 匹配“同一行中的 :::alert ... :::”\n const m = src.slice(pos).match(/^:::alert\\b([^\\n\\r]*?):::/)\n if (!m) return false\n if (silent) return false\n\n // m[1] 是 type=xxx data=\"xxx\" ...\n const raw = m[1].trim()\n\n // 构造 HTML inline token\n const html = `<lazy-component ${raw}></lazy-component>`\n const token = state.push('html_inline', '', 0)\n token.content = html\n\n // 移动光标\n state.pos += m[0].length\n return true\n })\n}\n\n// 注册 inline 插件(适配 HMR)\ntry {\n md.use(alertInlinePlugin)\n} catch {}\n\n/**\n * Markdown渲染组件\n * 将Markdown文本转换为HTML并渲染为React组件\n * 支持自定义组件、搜索高亮、内容编辑等功能\n * @param RenderMarkdownProps - 组件属性\n */\nexport default ({ content = '', searchValue, customComponents, onChange, onPartialChange }: RenderMarkdownProps) => {\n // console.log('RenderMarkdown', content)\n const reactContent = useMemo(() => {\n if (!content) return null\n\n // 1) 抽取 data={...},替换为占位符\n const { text: preprocessed, placeholders } = alertMarkClean(content)\n\n // 2) Markdown 渲染\n let rawHtml = md.render(preprocessed)\n\n // 3) 关键词高亮\n rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml\n\n // ============================================================\n // 4) 把 <lazy-component> 转成真正的 React LazyComponent\n // ============================================================\n let lazyIndex = -1\n return parse(rawHtml, {\n replace: (domNode) => {\n if ((domNode as Element).name === 'lazy-component') {\n lazyIndex++\n\n const el = domNode as Element\n const type = el.attribs.type\n const loading = !!Number(el.attribs.loading)\n const dataAttr = el.attribs.data || ''\n let data: any = {}\n // console.log('el.attribs', placeholders)\n // 用占位符从 Map 中恢复原始 data 文本并解析成对象\n if (/^__ALERT_DATA_\\d+__$/.test(dataAttr)) {\n const raw = placeholders.get(dataAttr) ?? ''\n data = parseData(raw)\n // console.log('__ALERT_DATA_', raw, parseData(raw))\n }\n // console.log('lazyIndex', `${type}${lazyIndex}`)\n return (\n <LazyComponent\n key={`${type}${lazyIndex}`}\n type={type}\n data={data}\n loading={loading}\n customComponents={customComponents}\n onChange={onChange}\n onPartialChange={onPartialChange}\n />\n )\n }\n }\n })\n }, [content, searchValue])\n\n return <div className=\"ns-markdown\">{reactContent}</div>\n}\n\n// `:::alert type=info data={data:\"123\"} \\n::: \\n你好 \\n:::alert type=info data={data:234} \\n::: `\n// return <RenderMarkdown content={`<think> \\n ### 你好你好你好你好</think> `} />\n","import { Result } from 'antd'\nimport { useEffect, useState } from 'react'\nimport RenderMarkdown from '../RenderMarkdown'\n\n/**\n * Markdown预览组件属性接口\n */\nexport interface MarkdownPreviewProps {\n /** Markdown文件URL地址 */\n fileUrl: string\n /** 搜索关键字 */\n searchValue?: string\n}\n\n/**\n * Markdown预览组件\n * 从指定URL获取Markdown内容并渲染显示\n * @param props - 组件属性\n */\nexport default ({ fileUrl, searchValue }: MarkdownPreviewProps) => {\n const [content, setContent] = useState('')\n const [error, setError] = useState('')\n const fetchMarkdown = async () => {\n const res = await fetch(fileUrl)\n\n if (res.status !== 200) {\n throw new Error(`请求失败,状态码: ${res.status}`)\n }\n\n const markdownText = await res.text()\n\n if (!markdownText) {\n throw new Error('返回内容为空')\n }\n setContent(markdownText)\n }\n const init = async () => {\n setContent('')\n setError('')\n if (fileUrl) {\n try {\n await fetchMarkdown()\n } catch (error) {\n // console.error('加载或解析 Markdown 失败:', error)\n setError('加载或解析 Markdown 失败')\n }\n }\n }\n\n useEffect(() => {\n init()\n }, [fileUrl])\n return error ? (\n <Result status=\"error\" title={error} />\n ) : (\n <div className=\"height-full\">\n <RenderMarkdown content={content} searchValue={searchValue} />\n </div>\n )\n}\n","/**\n * iframe 消息参数类型\n * 定义跨iframe通信时的参数结构\n */\nexport type Params = Record<string, any>\n\n/**\n * iframe 消息载荷类型\n * 包含消息类型、数据和目标方向\n */\ntype Payload<P = Params> = { type: string; data?: P; to?: 'parent' | 'top' | 'child' }\n\n/**\n * 向父页面或顶级窗口发送消息\n * @param type - 消息类型\n * @param data - 消息数据\n * @param to - 发送目标,默认为'top'\n */\nexport function emit(type: string, data?: Params, to: 'parent' | 'top' = 'top') {\n const payload: Payload = { type, data, to }\n try {\n window.parent.postMessage(payload, '*')\n } catch (err) {\n console.warn('emit parent failed', err)\n }\n}\n\n/**\n * 向子iframe发送消息\n * @param iframeWindow - 目标iframe的contentWindow\n * @param type - 消息类型\n * @param data - 消息数据\n * @param origin - 消息源,默认为'*'\n */\nexport function emitToChild(iframeWindow: Window | null, type: string, data?: Params, origin: string = '*') {\n if (!iframeWindow) {\n console.warn('emitToChild failed: iframeWindow is null')\n return\n }\n const payload: Payload = { type, data, to: 'child' }\n try {\n iframeWindow.postMessage(payload, origin)\n } catch (err) {\n console.warn('emit to child failed', err)\n }\n}\n","const toString = Object.prototype.toString\n\n/**\n * 类型判断函数\n *\n * @param val - 要判断的值\n * @param type - 目标类型名\n * @returns 是否为目标类型\n *\n * @example\n * ```typescript\n * is({}, 'Object') // true\n * is([], 'Array') // true\n * is(123, 'Number') // true\n * ```\n */\nexport function is(val: unknown, type: string): boolean {\n return toString.call(val) === `[object ${type}]`\n}\n\n/**\n * 判断值是否为 undefined\n *\n * @param val - 要判断的值\n * @returns 是否为 undefined\n *\n * @example\n * ```typescript\n * isUnDef(undefined) // true\n * isUnDef(null) // false\n * isUnDef(0) // false\n * ```\n */\nexport function isUnDef<T = unknown>(val?: T): val is T {\n return is(val, 'Undefined')\n}\n\n/**\n * 判断值是否已定义(非 undefined)\n *\n * @param val - 要判断的值\n * @returns 是否已定义\n *\n * @example\n * ```typescript\n * isDef(null) // true\n * isDef(0) // true\n * isDef('') // true\n * isDef(undefined) // false\n * ```\n */\nexport function isDef<T = unknown>(val?: T): val is T {\n return !isUnDef(val)\n}\n/**\n * 判断值是否为纯对象\n *\n * @param val - 要判断的值\n * @returns 是否为纯对象\n *\n * @example\n * ```typescript\n * isObject({}) // true\n * isObject([]) // false\n * isObject(null) // false\n * isObject(new Date()) // false\n * ```\n */\nexport function isObject(val: any): val is Record<any, any> {\n return is(val, 'Object')\n}\n\n/**\n * 判断对象是否为空对象\n *\n * @param val - 要判断的值\n * @returns 是否为空对象\n *\n * @example\n * ```typescript\n * isEmptyObj({}) // true\n * isEmptyObj({ a: 1 }) // false\n * isEmptyObj([]) // false\n * isEmptyObj(null) // false\n * ```\n */\nexport function isEmptyObj<T = unknown>(val: T): boolean {\n if (isObject(val)) {\n return Object.keys(val).length === 0\n }\n return false\n}\n\n/**\n * 判断值是否为 Date 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Date 对象\n *\n * @example\n * ```typescript\n * isDate(new Date()) // true\n * isDate('2023-01-01') // false\n * isDate({}) // false\n * ```\n */\nexport function isDate(val: unknown): val is Date {\n return is(val, 'Date')\n}\n\n/**\n * 判断值是否为 null\n *\n * @param val - 要判断的值\n * @returns 是否为 null\n *\n * @example\n * ```typescript\n * isNull(null) // true\n * isNull(undefined) // false\n * isNull(0) // false\n * ```\n */\nexport function isNull(val: unknown): val is null {\n return is(val, 'Null')\n // return val === null\n}\n\n/**\n * 判断值是否为 null 或 undefined\n *\n * @param val - 要判断的值\n * @returns 是否为 null 或 undefined\n *\n * @example\n * ```typescript\n * isNullOrUnDef(null) // true\n * isNullOrUnDef(undefined) // true\n * isNullOrUnDef(0) // false\n * isNullOrUnDef('') // false\n * ```\n */\nexport function isNullOrUnDef(val: unknown): val is null | undefined {\n return isUnDef(val) || isNull(val)\n}\n\n/**\n * 判断值是否为数字(包括 NaN)\n *\n * @param val - 要判断的值\n * @returns 是否为数字类型\n *\n * @example\n * ```typescript\n * isNumber(123) // true\n * isNumber('123') // false\n * isNumber(NaN) // true\n * ```\n */\nexport function isNumber(val: unknown): val is number {\n return is(val, 'Number')\n}\n\n/**\n * 判断值是否为有效数字(不包括 NaN)\n *\n * @param val - 要判断的值\n * @returns 是否为有效数字\n *\n * @example\n * ```typescript\n * isNumberNoNaN(123) // true\n * isNumberNoNaN(NaN) // false\n * isNumberNoNaN('123') // false\n * ```\n */\nexport function isNumberNoNaN(val: unknown): val is number {\n return isNumber(val) && !isNaN(val as number)\n}\n\n/**\n * 判断值是否为字符串\n *\n * @param val - 要判断的值\n * @returns 是否为字符串\n *\n * @example\n * ```typescript\n * isString('hello') // true\n * isString(123) // false\n * isString(new String('hello')) // true\n * ```\n */\nexport function isString(val: unknown): val is string {\n return is(val, 'String')\n}\n\n/**\n * 判断值是否为函数\n *\n * @param val - 要判断的值\n * @returns 是否为函数\n *\n * @example\n * ```typescript\n * isFunction(() => {}) // true\n * isFunction(function() {}) // true\n * isFunction('function') // false\n * isFunction({}) // false\n * ```\n */\nexport function isFunction(val: unknown) {\n return is(val, 'Function')\n}\n\n/**\n * 判断值是否为 Promise 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Promise\n *\n * @example\n * ```typescript\n * isPromise(Promise.resolve()) // true\n * isPromise({ then: () => {}, catch: () => {} }) // false\n * isPromise({}) // false\n * ```\n */\nexport function isPromise<T = any>(val: unknown): val is Promise<T> {\n return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch)\n}\n\n/**\n * 判断值是否为布尔值\n *\n * @param val - 要判断的值\n * @returns 是否为布尔值\n *\n * @example\n * ```typescript\n * isBoolean(true) // true\n * isBoolean(false) // true\n * isBoolean(1) // false\n * isBoolean('true') // false\n * ```\n */\nexport function isBoolean(val: unknown): val is boolean {\n return is(val, 'Boolean')\n}\n\n/**\n * 判断值是否为正则表达式\n *\n * @param val - 要判断的值\n * @returns 是否为正则表达式\n *\n * @example\n * ```typescript\n * isRegExp(/test/) // true\n * isRegExp(new RegExp('test')) // true\n * isRegExp('/test/') // false\n * isRegExp({}) // false\n * ```\n */\nexport function isRegExp(val: unknown): val is RegExp {\n return is(val, 'RegExp')\n}\n\n/**\n * 判断值是否为数组\n *\n * @param val - 要判断的值\n * @returns 是否为数组\n *\n * @example\n * ```typescript\n * isArray([]) // true\n * isArray([1, 2, 3]) // true\n * isArray({}) // false\n * isArray('array') // false\n * ```\n */\nexport function isArray<T = any>(val: unknown): val is Array<T> {\n return Array.isArray(val)\n}\n\n/**\n * 判断值是否为空值\n *\n * @param val - 要判断的值\n * @returns 是否为空值\n *\n * @example\n * ```typescript\n * isEmpty('') // true\n * isEmpty([]) // true\n * isEmpty({}) // true\n * isEmpty(null) // true\n * isEmpty(undefined) // true\n * isEmpty(0) // false\n * isEmpty(false) // false\n * ```\n */\nexport function isEmpty<T = unknown>(val: T): boolean {\n // 处理字符串和数组\n if (isString(val) || isArray(val)) {\n return val.length === 0\n }\n\n // 处理 null 和 undefined\n if (isNullOrUnDef(val)) {\n return true\n }\n\n // 处理 Map 和 Set\n if (val instanceof Map || val instanceof Set) {\n return val.size === 0\n }\n\n // 处理纯对象\n return isEmptyObj(val)\n}\n\n/**\n * 判断值是否为 Window 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Window 对象\n *\n * @example\n * ```typescript\n * isWindow(window) // true\n * isWindow({}) // false\n * isWindow(global) // false\n * ```\n */\nexport function isWindow(val: any): val is Window {\n return is(val, 'Window')\n}\n\n/**\n * 判断值是否为 DOM 元素\n *\n * @param val - 要判断的值\n * @returns 是否为 DOM 元素\n *\n * @example\n * ```typescript\n * isElement(document.body) // true\n * isElement(document.createElement('div')) // true\n * isElement({ tagName: 'div' }) // false\n * isElement('div') // false\n * ```\n */\nexport function isElement(val: unknown): val is Element {\n return isObject(val) && !!val?.tagName\n}\n\n/**\n * 判断值是否为 Map 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Map\n *\n * @example\n * ```typescript\n * isMap(new Map()) // true\n * isMap(new WeakMap()) // false\n * isMap({}) // false\n * ```\n */\nexport function isMap<K = any, V = any>(val: unknown): val is Map<K, V> {\n return is(val, 'Map')\n}\n/**\n * 判断值是否为 Set 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Set\n *\n * @example\n * ```typescript\n * isSet(new Set()) // true\n * isSet(new WeakSet()) // false\n * isSet([]) // false\n * ```\n */\nexport function isSet<T = any>(val: unknown): val is Set<T> {\n return is(val, 'Set')\n}\n/**\n * 判断是否为外部链接\n *\n * @param path - 路径字符串\n * @returns 是否为外部链接\n *\n * @example\n * ```typescript\n * isExternal('https://example.com') // true\n * isExternal('mailto:test@example.com') // true\n * isExternal('tel:123456789') // true\n * isExternal('/home') // false\n * isExternal('http://localhost:3000') // true\n * ```\n */\nexport const isExternal = (path: string): boolean => {\n if (!isString(path)) return false\n return /^(https?:|mailto:|tel:|ftp:)/.test(path)\n}\n\n/**\n * 判断值是否为 Blob 对象\n *\n * @param val - 要判断的值\n * @returns 是否为 Blob\n *\n * @example\n * ```typescript\n * isBlob(new Blob()) // true\n * isBlob(new File([], 'test.txt')) // true\n * isBlob({}) // false\n * ```\n */\nexport const isBlob = (val: unknown): val is Blob => {\n return is(val, 'Blob')\n}\n\n/**\n * 判断是否为本地主机\n *\n * @param host - 主机名,默认取当前 location.host\n * @returns 是否为本地主机\n *\n * @example\n * ```typescript\n * isLocalhost() // 检查当前主机\n * isLocalhost('localhost:3000') // true\n * isLocalhost('127.0.0.1:3000') // true\n * isLocalhost('example.com') // false\n * ```\n */\nexport const isLocalhost = (host?: string): boolean => {\n const targetHost = host || location.host\n return /^(localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|\\[?::1\\]?)(:\\d+)?$/.test(targetHost)\n}\n/**\n * 判断值是否为引用类型(对象或函数)\n * 引用类型包括:Object, Array, Function, Date, RegExp, Map, Set 等\n *\n * @param val - 要判断的值\n * @returns 是否为引用类型\n *\n * @example\n * ```typescript\n * isReferenceType({}) // true\n * isReferenceType([]) // true\n * isReferenceType(function(){}) // true\n * isReferenceType(null) // false\n * isReferenceType(undefined) // false\n * isReferenceType(123) // false\n * isReferenceType('string') // false\n * ```\n */\nexport function isReferenceType(val: unknown): boolean {\n return (typeof val === 'object' && !isNull(val)) || isFunction(val)\n}\n\n/**\n * 检查脚本字符串是否安全\n *\n * 该函数用于检测给定的脚本字符串是否包含潜在的不安全代码,\n * 主要用于防范 XSS(跨站脚本攻击)和其他安全风险。\n * 通过检测常见的危险关键字和全局对象来判断脚本的安全性。\n *\n * @param script - 需要检查的脚本字符串\n * @returns 如果脚本被认为是安全的则返回 true,否则返回 false\n *\n * @example\n * // 安全的脚本\n * isScriptSafe('const a = 1; console.log(a);') // true\n *\n * @example\n * // 不安全的脚本(包含 eval)\n * isScriptSafe('eval(\"alert(1)\")') // false\n *\n * @example\n * // 不安全的脚本(访问全局对象)\n * isScriptSafe('window.location.href = \"http://malicious.com\"') // false\n *\n * @remarks\n * - 该函数仅做基础的关键字检测,不能保证 100% 安全\n * - 对于复杂的安全需求,应使用专门的沙箱环境或服务端验证\n * - 函数不区分大小写进行关键字匹配\n * - 关键字使用单词边界匹配,避免误判(如 'evaluation' 不会被误判为 'eval')\n *\n * @security\n * - 注意:这只是一个基础的安全检查,不应作为唯一的安全防护措施\n * - 生产环境中建议结合 Content Security Policy (CSP) 等多重安全机制\n */\nexport const isScriptSafe = (script: string): boolean => {\n if (isString(script)) {\n // 定义不安全的关键字和模式\n const unsafeKeywords = [\n 'eval', // 动态执行代码,极高风险\n 'new Function', // 动态创建函数,高风险\n 'setTimeout', // 可能被用于延迟恶意代码执行\n 'setInterval', // 可能被用于持续执行恶意代码\n 'window', // 访问全局窗口对象\n 'document', // 访问文档对象,可能操作DOM\n 'location', // 可能被用于钓鱼攻击或重定向\n 'navigator', // 访问浏览器信息\n 'localStorage', // 访问本地存储数据\n 'sessionStorage', // 访问会话存储数据\n 'history', // 可能被用于操纵浏览历史\n 'fetch', // 发起网络请求\n 'XMLHttpRequest', // 发起 AJAX 请求\n 'WebSocket', // 建立 WebSocket 连接\n 'alert', // 弹出警告框(可能用于社会工程学攻击)\n 'confirm', // 弹出确认框(可能用于社会工程学攻击)\n 'prompt' // 弹出输入框(可能用于社会工程学攻击)\n // 'console' // 控制台对象(通常被注释掉)\n ]\n\n // 构建正则表达式\n const regex = new RegExp(`\\\\b(${unsafeKeywords.join('|')})\\\\b`, 'i')\n\n // 检查脚本是否包含任何不安全的关键字\n if (regex.test(script)) {\n return false\n }\n\n // 如果没有检测到不安全的关键字,则认为是安全的\n return true\n }\n return false\n}\n\n/**\n * 检查字符串是否为有效的 JSON 格式\n *\n * @param text - 需要检查的字符串,默认为空字符串\n * @returns 如果字符串是有效的 JSON 格式则返回 true,否则返回 false\n *\n * @example\n * isJson('{\"name\": \"张三\", \"age\": 25}') // true\n * isJson('[1, 2, 3]') // true\n * isJson('hello world') // false\n * isJson('true') // false (虽然 JSON.parse('true') 有效,但不是对象或数组)\n * isJson('') // false\n *\n * @remarks\n * - 该函数使用 try/catch 机制来捕获 JSON.parse 解析结果\n * - 只接受 JSON 对象 ({}) 或 JSON 数组 ([]),不接受基本类型值 (如: true, 123, \"string\")\n */\nexport const isJson = (text = '') => {\n try {\n const parsed = JSON.parse(text)\n return isObject(parsed) || isArray(parsed)\n } catch {\n return false\n }\n}\n","import { useEffect, useRef } from 'react'\nimport { isObject } from '../../utils/is'\nimport { Params } from './iframeRelay'\n\n/**\n * 消息处理器函数类型定义\n * @template P 参数类型,默认为 Params\n * @param params 消息参数\n * @param source 消息源窗口对象\n * @param origin 消息来源\n */\ntype Handler<P = Params> = (params: P, source?: MessageEventSource | null, origin?: string) => void\n\n/**\n * iframe 消息中继桥接 Hook\n *\n * 提供跨 iframe 消息通信的桥接功能,支持:\n * - 消息监听与分发\n * - 来源验证(白名单机制)\n * - 消息类型处理\n * - 父子窗口通信\n * - 顶层窗口消息转发\n *\n * @param allowedOrigins 允许的消息来源域名列表,默认允许所有来源\n *\n * @example\n * ```tsx\n * const { on, off } = useIframeRelayBridge(['https://example.com'])\n *\n * // 监听消息\n * const handleMessage = (params, source, origin) => {\n * console.log('收到消息:', params)\n * }\n * on('custom-event', handleMessage)\n *\n * // 取消监听\n * off('custom-event', handleMessage)\n * ```\n */\nexport default (allowedOrigins: string[] = ['*']) => {\n /** 消息处理器存储,按消息类型分组 */\n const handlers = useRef<Record<string, Handler[]>>({})\n\n useEffect(() => {\n /**\n * 全局消息监听器\n * @param evt 消息事件对象\n */\n const onMessage = (evt: MessageEvent) => {\n const { data, source, origin } = evt\n\n // 验证消息格式:必须是对象且包含 type 字段\n if (!data || !isObject(data) || !data.type) return\n\n // 验证来源白名单\n if (allowedOrigins[0] !== '*' && !allowedOrigins.includes(origin)) return\n\n const { type, data: params, to = 'parent' } = data\n\n // 检查当前窗口是否为顶层窗口\n const isTop = window.parent === window\n\n // 如果目标是顶层窗口但当前不是顶层,则继续向父级转发\n if (to === 'top' && !isTop) {\n window.parent.postMessage(data, allowedOrigins[0] === '*' ? '*' : origin)\n return\n }\n\n // 处理本层消息(包括 to: 'child' | 'parent' | 'top' 但当前是顶层的情况)\n const fns = handlers.current[type] || []\n fns.forEach((fn) => fn(params, source, origin))\n }\n\n // 添加全局消息监听\n window.addEventListener('message', onMessage)\n\n // 清理函数:移除消息监听器\n return () => window.removeEventListener('message', onMessage)\n }, [allowedOrigins])\n\n /**\n * 注册消息处理器\n *\n * @param type 消息类型标识\n * @param handler 消息处理函数\n *\n * @example\n * ```tsx\n * on('user-login', (params, source, origin) => {\n * console.log('用户登录:', params)\n * })\n * ```\n */\n function on(type: string, handler: Handler<Params>) {\n handlers.current[type] = handlers.current[type] || []\n handlers.current[type].push(handler)\n }\n\n /**\n * 移除消息处理器\n *\n * @param type 消息类型标识\n * @param handler 要移除的处理函数引用\n *\n * @example\n * ```tsx\n * const handler = (params, source, origin) => { ... }\n * on('user-login', handler)\n * // 之后移除\n * off('user-login', handler)\n * ```\n */\n function off(type: string, handler: Handler<Params>) {\n handlers.current[type] = (handlers.current[type] || []).filter((fn) => fn !== handler)\n }\n\n return { on, off }\n}\n","import { useEffect, useRef, useState } from 'react'\n\n/**\n * 通用的自动刷新 Hook\n * 监听指定值的变化,当满足条件时自动触发回调函数\n *\n * @param listenValue - 要监听的值\n * @param shouldRefresh - 判断是否需要触发回调的函数,接收 listenValue 作为参数\n * @param callback - 执行刷新动作的异步方法\n * @param delay - 延迟时间(毫秒),默认为 10000ms\n * @returns 清理定时器的函数\n */\nexport default <T>(listenValue: T, shouldRefresh: (listenValue: T) => boolean, callback: () => Promise<void>, delay = 10000) => {\n /** 定时器引用,用于管理 setTimeout */\n const timerRef = useRef<NodeJS.Timeout | null>(null)\n /** 保存 shouldRefresh 和 callback 的最新引用 */\n const shouldRefreshRef = useRef(shouldRefresh)\n const callbackRef = useRef(callback)\n /** 触发次数计数器,用于强制重新执行 useEffect */\n const [num, setNum] = useState(0)\n\n /** 更新 refs 中保存的函数 */\n useEffect(() => {\n shouldRefreshRef.current = shouldRefresh\n callbackRef.current = callback\n }, [shouldRefresh, callback])\n\n /** 核心逻辑:监听值变化并执行回调 */\n useEffect(() => {\n // 清除之前的定时器\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n\n // 检查是否需要触发刷新\n if (shouldRefreshRef.current(listenValue)) {\n timerRef.current = setTimeout(async () => {\n await callbackRef.current()\n setNum(num + 1) // 更新计数器以触发下一次 useEffect\n }, delay)\n }\n\n /** 返回清理函数 */\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n }\n }, [listenValue, delay, num])\n}\n","import { useEffect, useRef, useState } from 'react'\n\n/**\n * 倒计时 Hook\n * 提供倒计时功能,支持开始、暂停、完成回调等操作\n *\n * @param callback - 倒计时结束时的回调函数\n * @returns 倒计时控制对象\n */\nexport default (callback?: () => void) => {\n /** 倒计时当前值 */\n const [count, setCount] = useState(0)\n /** 开始次数计数器,用于追踪倒计时启动次数 */\n const [startCount, setStartCount] = useState(0)\n /** 计时器引用 */\n const timer = useRef<NodeJS.Timeout | null>(null)\n\n /**\n * 暂停倒计时\n */\n const pause = () => {\n clearInterval(timer.current!)\n timer.current = null\n }\n\n /**\n * 开始倒计时\n * @param initialValue - 倒计时初始值,默认为60秒\n */\n const start = (initialValue: number = 60) => {\n pause()\n // 重置倒计时值\n setCount(initialValue)\n setStartCount((startCount) => startCount + 1)\n // 开始倒计时,每秒减1\n timer.current = setInterval(() => {\n setCount((count) => count - 1)\n }, 1000)\n }\n\n /**\n * 组件卸载时自动清理定时器\n */\n useEffect(() => {\n return () => {\n pause()\n }\n }, [])\n\n /**\n * 监听倒计时结束\n * 当倒计时归零且已启动过时,触发回调并暂停\n */\n useEffect(() => {\n if (count === 0 && startCount !== 0) {\n // 倒计时结束,暂停定时器并触发回调\n pause()\n callback?.()\n }\n }, [count])\n\n /** 返回倒计时控制对象 */\n return { count, start, pause, startCount }\n}\n","import { createContext, ReactNode, useContext } from 'react'\n\n/**\n * 通用的 Valtio Context 创建工厂 Hook\n * 创建 Valtio 状态管理的 Context 和 Provider\n *\n * 支持的操作:\n * - ValtioProvider:包裹组件以提供 store 状态\n * - useValtioStore:在组件中获取 store 实例\n *\n * @template T - Store 对象类型\n * @returns Valtio Context 相关的工具函数\n */\nexport default <T extends object>() => {\n const Context = createContext<T | null>(null)\n\n /**\n * Valtio Provider 组件\n * @param props - 包含 store 和 children 的属性\n * @returns Provider 组件\n */\n const ValtioProvider = ({ store, children }: { store: T; children?: ReactNode }) => <Context.Provider value={store}>{children}</Context.Provider>\n\n /**\n * 获取 Valtio store 的 Hook\n * @returns store 实例\n * @throws 当在 Provider 外使用时抛出错误\n */\n const useValtioStore = (): T => {\n const store = useContext(Context)\n if (!store) throw new Error('useStore must be used within Provider')\n return store\n }\n\n return {\n ValtioProvider,\n useValtioStore,\n // 导出 Context 以便外部使用\n Context\n }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n/**\n * 防抖 Hook\n * 在指定时间内多次调用只执行最后一次,延迟指定时间后执行\n *\n * @param func - 需要防抖的函数\n * @param wait - 延迟时间(毫秒),默认为400ms\n * @returns 防抖处理后的函数,包含 flush 和 cancel 方法\n */\nexport default <A extends Array<any>, R = void>(func: (..._args: A) => R, wait: number = 400) => {\n /** 保存函数和定时器的引用 */\n const { current } = useRef({ func, timeOut: null } as { func: (..._args: A) => R; timeOut: null | NodeJS.Timeout })\n\n /** 更新最新的函数引用 */\n useEffect(() => {\n current.func = func\n }, [func])\n\n /** 保存最新的参数 */\n let args: A\n\n /**\n * 防抖处理函数\n * @param _args - 函数参数\n * @returns Promise 包装的结果\n */\n function debounce(..._args: A) {\n args = _args\n if (current.timeOut) {\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n return new Promise<R>((resolve, reject) => {\n current.timeOut = setTimeout(async () => {\n try {\n const result = await current.func.apply(null, args)\n resolve(result)\n } catch (e) {\n reject(e)\n }\n }, wait)\n })\n }\n\n /**\n * 取消防抖\n */\n function cancel() {\n if (!current.timeOut) return\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n\n /**\n * 立即执行防抖函数\n * @returns 函数执行结果\n */\n function flush() {\n cancel()\n return current.func.apply(null, args)\n }\n\n /** 添加额外方法到防抖函数 */\n debounce.flush = flush\n debounce.cancel = cancel\n\n return useCallback(debounce, [])\n}\n","import { message } from 'antd'\nimport AES from 'crypto-js/aes'\nimport encUtf8 from 'crypto-js/enc-utf8'\nimport { isArray, isDate, isDef, isExternal, isFunction, isMap, isNull, isNullOrUnDef, isObject, isRegExp, isScriptSafe, isSet, isString } from './is'\n\n/**\n * 深拷贝函数\n *\n * @template T\n * @param obj - 要拷贝的对象\n * @param isJson - 是否使用 JSON 深拷贝(默认 true)\n * @returns 拷贝后的新对象\n *\n * @example\n * const a = { x: { y: 1 } }\n * const b = deepCopy(a)\n * b.x.y = 2\n * console.log(a.x.y) // 1\n *\n * @remarks\n * - JSON 深拷贝会丢失:函数、Map、Set、RegExp、Date 等信息\n * - isJson = false 时使用递归版本,性能差但支持大部分类型,支持循环引用\n * - 不处理 Symbol、getter/setter 属性\n */\nexport const deepCopy = <T>(obj: T, isJson = true): T => {\n // JSON 模式:快速,但有局限\n if (isJson) {\n try {\n return JSON.parse(JSON.stringify(obj))\n } catch {\n // 如果 JSON 执行失败,自动 fallback 到递归深拷贝\n return deepCopy(obj, false)\n }\n }\n\n // 用于存储已经拷贝过的对象,避免循环引用导致的无限递归\n const visited = new WeakMap()\n\n const cloneRecursively = (value: any): any => {\n // 1. null 和 undefined 直接返回\n if (isNullOrUnDef(value)) return value\n\n // 2. 处理原始类型(string, number, boolean, symbol, function)\n const type = typeof value\n if (type !== 'object') return value\n\n // 3. 处理循环引用\n if (visited.has(value)) {\n return visited.get(value)\n }\n\n // 4. 处理特殊对象\n if (isDate(value)) return new Date(value)\n if (isRegExp(value)) return new RegExp(value)\n if (isMap(value)) {\n const clonedMap = new Map()\n visited.set(value, clonedMap)\n for (const [k, v] of value.entries()) {\n clonedMap.set(cloneRecursively(k), cloneRecursively(v))\n }\n return clonedMap\n }\n if (isSet(value)) {\n const clonedSet = new Set()\n visited.set(value, clonedSet)\n for (const v of value.values()) {\n clonedSet.add(cloneRecursively(v))\n }\n return clonedSet\n }\n\n // 5. 处理数组和普通对象\n if (isArray(value)) {\n const result: any[] = []\n visited.set(value, result)\n for (let i = 0; i < value.length; i++) {\n result[i] = cloneRecursively(value[i])\n }\n return result\n } else {\n const result = {}\n visited.set(value, result)\n // 仅拷贝可枚举的字符串属性\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n result[key] = cloneRecursively(value[key])\n }\n }\n return result\n }\n }\n return cloneRecursively(obj)\n}\n\n/**\n * 深度比较两个对象是否相等\n *\n * @param a - 第一个对象\n * @param b - 第二个对象\n * @returns 是否相等\n *\n * @example\n * deepEqual({ a: 1 }, { a: 1 }) // true\n * deepEqual([1, 2], [1, 2]) // true\n * deepEqual(new Date(1), new Date(1)) // true\n * deepEqual(new Set([1]), new Set([1])) // true\n *\n * @remarks\n * - 支持 Date、RegExp、Map、Set、Array、Function(仅作引用比较)、Object\n * - 支持循环引用检测\n * - 不处理不可枚举属性、getter/setter 和 Symbol\n */\nexport function deepEqual(a: any, b: any): boolean {\n // 使用 WeakMap 存储已比较过的对象对,处理循环引用\n const visited = new WeakMap()\n\n const isEqual = (x: any, y: any): boolean => {\n // 使用 Object.is 比较基础类型和相同引用\n if (Object.is(x, y)) return true\n\n // 只有当 x 和 y 都是对象时才检查循环引用\n if (typeof x === 'object' && !isNull(x) && typeof y === 'object' && !isNull(y)) {\n // 检查是否已经比较过这对对象(处理循环引用)\n if (visited.has(x)) {\n // 如果之前比较过 x 和 y,则直接返回结果,避免无限递归\n if (visited.get(x).has(y)) return true\n // 如果之前比较过 x 但不是和 y,则继续\n }\n\n // 记录正在比较的对象对\n if (!visited.has(x)) visited.set(x, new WeakSet())\n visited.get(x).add(y)\n\n // 同时也要记录 y->x 的比较,确保对称性\n if (!visited.has(y)) visited.set(y, new WeakSet())\n visited.get(y).add(x)\n }\n\n // === 特殊类型处理 ===\n if (isDate(x) && isDate(y)) return x.getTime() === y.getTime()\n\n if (isRegExp(x) && isRegExp(y)) return x.toString() === y.toString()\n\n if (isMap(x) && isMap(y)) {\n if (x.size !== y.size) return false\n for (const [key, val] of x.entries()) {\n if (!y.has(key)) return false\n if (!isEqual(val, y.get(key))) return false\n }\n return true\n }\n\n if (isSet(x) && isSet(y)) {\n if (x.size !== y.size) return false\n for (const val of x.values()) {\n // 使用 some 查找匹配项,支持深度比较 Set 中的复杂对象\n const hasEqual = Array.from(y.values()).some((bVal) => isEqual(val, bVal))\n if (!hasEqual) return false\n }\n return true\n }\n\n // 数组比较\n if (isArray(x) && isArray(y)) {\n if (x.length !== y.length) return false\n return x.every((item, i) => isEqual(item, y[i]))\n }\n\n // 函数(通过字符串比较)\n // if (isFunction(x) && isFunction(y)) return x.toString() === y.toString()\n\n // 函数比较(仅作引用比较,因为函数的深层比较意义不大且不可靠)\n if (isFunction(x) && isFunction(y)) return x === y\n\n // 普通对象递归比较\n if (isObject(x) && isObject(y)) {\n const keysA = Object.keys(x)\n const keysB = Object.keys(y)\n\n // 先比较键的数量\n if (keysA.length !== keysB.length) return false\n\n // 比较每个键值对\n for (const key of keysA) {\n // 检查 b 是否有这个键\n if (!keysB.includes(key)) return false\n\n // 递归比较值\n if (!isEqual(x[key], y[key])) return false\n }\n return true\n }\n\n return false\n }\n\n return isEqual(a, b)\n}\n\n/**\n * 深度合并两个对象\n *\n * @template T\n * @param base - 基础对象\n * @param override - 覆盖对象\n * @returns 合并后的新对象\n *\n * @example\n * deepMerge(\n * { a: 1, b: { x: 1 } },\n * { b: { x: 2, y: 3 } }\n * )\n * // => { a: 1, b: { x: 2, y: 3 } }\n *\n * @remarks\n * - 数组不进行合并,只会被直接覆盖\n * - 内部使用递归,性能良好\n * - 只处理普通对象的深度合并,特殊对象(如 Date、RegExp、Map、Set 等)会被直接覆盖\n * - undefined 值会被忽略,不会覆盖原有值\n */\nexport const deepMerge = <T extends Record<string, any>>(base: T, override: Partial<T>): T => {\n // 处理空值情况\n if (!base || !override) {\n return (base || override || {}) as T\n }\n\n const result = { ...base }\n\n Object.keys(override || {}).forEach((key: keyof T) => {\n const baseValue = base[key]\n const overrideValue = override[key]\n\n if (isObject(baseValue) && isObject(overrideValue)) {\n // 递归合并对象\n result[key] = deepMerge(baseValue, overrideValue)\n } else if (isDef(overrideValue)) {\n // 覆盖简单值\n result[key] = overrideValue as any\n }\n })\n\n return result\n}\n\n/**\n * 将对象或者数组转换为下拉选项数组\n *\n * @param obj - 键值对象\n * @param filter - 可选的过滤函数,用于过滤不需要的项\n * @returns label/value 数组,value根据键的类型智能转换:数字字符串转为数字,其他保持为字符串\n *\n * @example\n * objToOptions({ 1: '男', 2: '女' })\n * // => [ { label: '男', value: 1 }, { label: '女', value: 2 } ]\n *\n * @example\n * objToOptions({ admin: '管理员', user: '用户' })\n * // => [ { label: '管理员', value: 'admin' }, { label: '用户', value: 'user' } ]\n *\n * @example\n * objToOptions({ '1': '男', '2': '女', '0': '未知' }, (key) => Number(key) > 0)\n * // => [ { label: '男', value: 1 }, { label: '女', value: 2 } ]\n */\nexport const objToOptions = (obj: Record<string, string> | string[], filter?: (key: string, value: string) => boolean) => {\n return Object.keys(obj)\n .filter((key) => !filter || filter(key, obj[key]))\n .map((key) => ({\n label: obj[key],\n value: isNaN(Number(key)) ? key : Number(key)\n }))\n}\n\n/**\n * 将数组按照某个 key 转换为对象\n *\n * @template T\n * @param arr - 数组\n * @param key - 作为对象 key 的字段名\n * @returns 转换后的对象\n *\n * @example\n * arrToObj([{ id: 1, name: 'a' }], 'id')\n * // => { \"1\": { id: 1, name: \"a\" } }\n */\nexport const arrToObj = <T>(arr: T[] = [], key: string) => {\n const obj = {} as { [key: string]: T }\n arr.forEach((item) => {\n obj[item[key]] = item\n })\n return obj\n}\n\n/**\n * 使用 setTimeout 模拟 setInterval,避免堆积\n *\n * @param fn - 要执行的函数(允许 async)\n * @param t - 间隔毫秒数\n * @returns 控制对象\n *\n * @example\n * const timer = setInterval(() => console.log('run'), 1000)\n *\n * setTimeout(() => timer.cancel(), 5000)\n *\n * @remarks\n * - 可以确保执行 fn 时间不影响下一次调用,天然避免 setInterval 的堆积问题\n */\nexport const setInterval = (fn: () => void | Promise<void>, t: number) => {\n let timer: NodeJS.Timeout | null = null\n let running = true\n\n const loop = () => {\n timer = setTimeout(async () => {\n if (!running) return\n await fn()\n if (running) loop()\n }, t)\n }\n\n loop()\n\n return {\n isRun: () => running,\n cancel: () => {\n running = false\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n }\n}\n\n/**\n * 生成唯一的 UUID v4 格式 ID\n * 使用 crypto.randomUUID() 生成符合 RFC 4122 标准的 UUID\n *\n * @returns 符合 UUID v4 格式的唯一标识符字符串\n *\n * @example\n * const id = genNonDuplicateID()\n * console.log(id) // 输出类似: \"f8c8e6d2-35a2-4f4d-9d53-994f2b6e1c2d\"\n */\nexport const genNonDuplicateID = () => {\n return crypto.randomUUID()\n}\n\n/**\n * 复制文本到剪贴板\n *\n * @param text - 文本\n * @param prompt - 提示语(默认\"复制成功\")\n *\n * @example\n * copyText('HELLO')\n */\nexport const copyText = async (text: string, prompt = '复制成功') => {\n try {\n // 使用现代 Clipboard API 将文本写入剪贴板\n // 这是一个异步操作,可能会因为以下原因失败:\n // 1. 浏览器权限策略限制(需要用户手势触发)\n // 2. 用户未授予权限\n // 3. 浏览器不支持 Clipboard API\n await navigator.clipboard.writeText(text)\n if (prompt) message.success(prompt)\n } catch (e) {\n // 当现代 Clipboard API 不可用或失败时,回退到传统的 document.execCommand 方案\n // 创建一个临时的 textarea 元素用于复制操作\n const textArea = document.createElement('textarea')\n textArea.value = text\n // 将 textarea 设置为不可见并移出视口,避免影响页面布局和视觉效果\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n textArea.style.left = '-999999px'\n textArea.style.top = '-999999px'\n document.body.appendChild(textArea)\n textArea.focus()\n textArea.select()\n // 执行复制命令,返回布尔值表示操作是否成功\n // 注意:document.execCommand 已被标记为废弃,但在现代浏览器中仍有良好支持\n const ok = document.execCommand('copy')\n if (ok && prompt) message.success(prompt)\n textArea.remove()\n }\n}\n\n/**\n * 数字千分位格式化\n *\n * @param number - 数字或字符串\n * @returns 格式化字符串\n *\n * @example\n * formatNumberWithCommas(1234567) // \"1,234,567\"\n */\nexport function formatNumberWithCommas(number: number | string) {\n // 将输入值转换为数字,以处理字符串数字的情况\n const numericValue = parseFloat(number as string)\n if (!isNaN(numericValue)) {\n return numericValue.toLocaleString()\n }\n return number\n}\n\n/**\n * 生成范围内的不重复随机数\n *\n * @param min - 最小值\n * @param max - 最大值\n * @param count - 生成数量\n * @returns 不重复的随机数数组\n *\n * @example\n * generateRandomNumbers(1, 100, 3)\n * // => [13, 77, 54]\n */\nexport const generateRandomNumbers = (min: number, max: number, count: number) => {\n const randomNumbers = new Set()\n while (randomNumbers.size < count) {\n const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min\n randomNumbers.add(randomNumber)\n }\n return Array.from(randomNumbers) as number[]\n}\n\n/**\n * 根据文件路径提取文件名\n *\n * @param filePath - 路径\n * @returns 文件名\n *\n * @example\n * getFileName('/a/b/c.png?xxx') // \"c.png\"\n */\nexport const getFileName = (filePath: string) => {\n return filePath.split('?')[0].split('/').pop() || ''\n}\n\n/**\n * 获取文件后缀\n *\n * @param fileName - 文件名\n * @returns 后缀\n *\n * @example\n * getFileSuffixName('a.png') // \"png\"\n */\nexport const getFileSuffixName = (fileName: string) => {\n return fileName.split('.').pop() || ''\n}\n\n/**\n * 将换行转换为 <br/>\n *\n * @param con - 文本\n * @returns HTML 字符串\n *\n * @example\n * convertNewlineToBr(\"a\\nb\")\n * // => \"a<br/>b\"\n */\nexport const convertNewlineToBr = (con?: string) => {\n return con ? con.replace(/\\r\\n/g, '\\n').replace(/\\n/g, '<br/>') : ''\n}\n\n/**\n * 获取 URL 中所有参数\n * @param url - URL\n * @returns Record<string, string | string[]> 返回参数键值对对象,对于同名参数会以数组形式存储\n *\n * @example\n * getAllUrlParams(\"http://example.com?a=1&b=2\")\n * // => { a: \"1\", b: \"2\" }\n *\n * @example\n * getAllUrlParams(\"http://example.com?a=1&a=2&b=3\")\n * // => { a: [\"1\", \"2\"], b: \"3\" }\n */\nexport const getAllUrlParams = (url = ''): Record<string, string | string[]> => {\n const result: Record<string, string | string[]> = {}\n\n if (!url) return result\n\n let query = ''\n try {\n const u = new URL(url, 'http://dummy.com') // 使用虚拟域名以防 preHref 是相对路径\n query = u.search\n } catch {\n // URL 无效,尝试手动解析 ? 后部分\n const qIndex = url.indexOf('?')\n if (qIndex === -1) return result\n query = url.slice(qIndex)\n }\n\n const params = new URLSearchParams(query)\n const seen = new Set<string>()\n\n for (const [key, value] of params.entries()) {\n if (seen.has(key)) {\n // 已经有值,变成数组或追加\n if (isArray(result[key])) {\n ;(result[key] as string[]).push(value)\n } else {\n result[key] = [result[key] as string, value]\n }\n } else {\n result[key] = value\n seen.add(key)\n }\n }\n\n return result\n}\n\n/**\n * 构建 URL 查询参数\n *\n * @param obj - 参数对象\n * @param url - 可选,拼接到某个 URL 上\n * @param format - 数组格式化方式,'repeat' | 'comma'; 默认为 'repeat'\n * @returns 最终字符串\n *\n * @example\n * buildUrlParams({ a: 1, b: [2, 3] })\n * // \"a=1&b=2&b=3\"\n *\n * buildUrlParams({ a: 1 }, \"/api\")\n * // \"/api?a=1\"\n *\n * buildUrlParams({ a: [1, 2] }, \"/api\", \"comma\")\n * // \"/api?a=1,2\"\n */\nexport const buildUrlParams = (obj: Record<string, any>, url?: string, format: 'repeat' | 'comma' = 'repeat'): string => {\n if (!isObject(obj)) return url ?? ''\n // 分离 hash\n let base = url || ''\n let hash = ''\n if (base.includes('#')) {\n const i = base.indexOf('#')\n hash = base.slice(i)\n base = base.slice(0, i)\n }\n // 1️⃣ 获取原 URL 参数\n const originalParams = getAllUrlParams(base)\n\n // 2️⃣ 合并 obj(覆盖原参数)\n const merged: Record<string, any> = { ...originalParams, ...obj }\n\n // 3️⃣ 生成 URLSearchParams\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(merged)) {\n if (isNullOrUnDef(value)) continue\n\n if (isArray(value)) {\n const list = value.filter((v) => !isNullOrUnDef(v)).map(String)\n if (list.length === 0) continue\n\n if (format === 'repeat') {\n list.forEach((v) => params.append(key, v))\n } else {\n params.set(key, list.join(','))\n }\n } else {\n params.set(key, String(value))\n }\n }\n\n const query = params.toString()\n if (!base) return query\n const cleanBase = base.split('?')[0]\n return `${cleanBase}${query ? `?${query}` : ''}${hash}`\n}\n\n/**\n * 触发浏览器下载文件\n *\n * @param url - 文件地址\n * @param name - 文件名 默认 \"图片下载\"\n *\n * @example\n * downloadFile(\"/xx/a.png\", \"头像.png\")\n */\nexport const downloadFile = (url: string, name?: string) => {\n const a = document.createElement('a')\n a.download = name || '文件'\n a.href = url\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n window.URL.revokeObjectURL(url)\n}\n\n/**\n * 给 URL 最后追加斜杠\n *\n * @param url - URL\n * @returns 新 URL\n *\n * @example\n * addUrlLastSlash(\"/api/user\") // \"/api/user/\"\n */\nexport const addUrlLastSlash = (url = '') => {\n // 尝试当成完整 URL 解析\n const u = new URL(url, 'http://dummy.com') // 使用虚拟域名以防 preHref 是相对路径\n if (!u.pathname.endsWith('/')) u.pathname += '/'\n return isExternal(url) ? u.toString() : `${u.pathname}${u.search}${u.hash}`\n}\n\n/**\n * 给URL增加mainSource参数\n *\n * 此函数用于在URL中添加或保留mainSource查询参数,主要用于追踪来源。\n * 如果URL中已经存在mainSource参数,则不会修改该URL。\n * 如果不存在,则会从preHref参数中提取mainSource值,如果preHref中也没有,\n * 则使用默认值defaultMainSource。\n *\n * @param url - 需要处理的目标URL\n * @param preHref - 可选,参考URL,用于从中提取mainSource参数值\n * @param defaultMainSource - 可选,mainSource默认值,默认为'cube-uc'\n * @returns 添加了mainSource参数的URL字符串\n *\n * @example\n * // URL中已有mainSource参数,直接返回原URL\n * setUrlMainSource('https://example.com/page?mainSource=adwords')\n * // => 'https://example.com/page?mainSource=adwords'\n *\n * @example\n * // URL中没有mainSource参数,preHref中有mainSource参数\n * setUrlMainSource('https://example.com/page', 'https://referrer.com/?mainSource=facebook')\n * // => 'https://example.com/page?mainSource=facebook'\n *\n * @example\n * // URL和preHref中都没有mainSource参数,使用默认值\n * setUrlMainSource('https://example.com/page')\n * // => 'https://example.com/page?mainSource=defaultMainSource'\n */\nexport const setUrlMainSource = (url: string, preHref?: string, defaultMainSource?: string) => {\n // 解析 url 中已有的参数\n const urlParts = url.split('?')\n const srcParams = new URLSearchParams(urlParts[1] || '')\n\n // 如果 url 中已经存在 mainSource 参数,则直接返回原始 url\n if (srcParams.has('mainSource')) {\n return url\n }\n\n // 如果 preHref 不存在或者不包含 mainSource,则使用默认值\n let mainSourceValue = defaultMainSource\n\n if (preHref) {\n try {\n const preHrefUrl = new URL(preHref, 'http://dummy.com') // 使用虚拟域名以防 preHref 是相对路径\n const preMainSource = preHrefUrl.searchParams.get('mainSource')\n if (preMainSource) {\n mainSourceValue = preMainSource\n }\n } catch (e) {\n // 如果 preHref 不是有效 URL,则继续使用默认值\n }\n }\n\n // 使用 buildUrlParams 方法来构建 URL\n return buildUrlParams({ mainSource: mainSourceValue }, url)\n}\n\n/**\n * 构建 WebSocket 地址\n *\n * @param path - WS 路径\n * @param customHost - 可选 host; 默认使用当前页面的 host\n * @returns 完整 WS 地址\n *\n * @example\n * getWebSocketUrl(\"/ws\") // \"ws://xxx/ws\"\n */\nexport const getWebSocketUrl = (path: string, customHost?: string) => {\n // 根据页面协议决定 ws / wss\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'\n const host = customHost || window.location.host\n\n // 统一拼接\n return `${protocol}//${host}${path}`\n}\n\n/**\n * 按照字段映射转换对象\n *\n * @template T, U\n * @param source - 源对象\n * @param fieldMap - 字段映射表\n * @returns 转换结果\n *\n * @example\n * transform(\n * { a: 1, b: 2 },\n * { x: 'a', y: (s) => s.b + 1 }\n * )\n * // => { x: 1, y: 3 }\n */\nexport function transform<T extends object, U extends object>(\n source: T,\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U {\n const result = {} as U\n for (const [targetKey, mapping] of Object.entries(fieldMap)) {\n const key = targetKey as keyof U\n if (typeof mapping === 'function') {\n result[key] = (mapping as (src: T) => U[typeof key])(source)\n } else if (typeof mapping === 'string' && source && mapping in source) {\n result[key] = source[mapping as keyof T] as unknown as U[typeof key]\n } else {\n result[key] = mapping as U[typeof key]\n }\n }\n return result\n}\n\n/**\n * 批量对象转换函数\n * @param sources - 源对象数组\n * @param fieldMap - 字段映射配置\n * @returns 转换后的目标对象数组\n *\n * @example\n * transforms([{ a: 1 }], { x: 'a' })\n * // => [{ x: 1 }]\n */\nexport function transforms<T extends object, U extends object>(\n sources: T[],\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U[] {\n return sources?.map((source) => transform<T, U>(source, fieldMap)) || []\n}\n\n/**\n * 将数字金额转换为中文大写金额\n *\n * 该函数将阿拉伯数字表示的金额转换为中文大写形式,常用于财务票据、合同等正式场合\n * 支持处理整数和小数部分,最大处理金额不超过 999,999,999,999,999.9999\n *\n * @param money - 需要转换的金额,可以是数字或字符串形式的数字\n * @returns 中文大写金额字符串\n *\n * @example\n * convertCurrency(123456.78)\n * // => \"壹拾贰万叁仟肆佰伍拾陆圆柒角捌分\"\n *\n * @example\n * convertCurrency(\"1000\")\n * // => \"壹仟圆整\"\n *\n * @example\n * convertCurrency(-123.45)\n * // => \"(负数)壹佰贰拾叁圆肆角伍分\"\n */\nexport const convertCurrency = (money: string | number = '') => {\n let newMoney = money\n //汉字的数字\n const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']\n //基本单位\n const cnIntRadice = ['', '拾', '佰', '仟']\n //对应整数部分扩展单位\n const cnIntUnits = ['', '万', '亿', '兆']\n //对应小数部分单位\n const cnDecUnits = ['角', '分', '毫', '厘']\n //整数金额时后面跟的字符\n const cnInteger = '整'\n //整型完以后的单位\n const cnIntLast = '圆'\n // 负数\n const minus = '(负数)'\n let isMinus = false\n //最大处理的数字\n const maxNum = 999999999999999.9999\n //金额整数部分\n let integerNum\n //金额小数部分\n let decimalNum\n //输出的中文金额字符串\n let chineseStr = ''\n //分离金额后用的数组,预定义\n let parts\n // 传入的参数为空情况\n if (newMoney === '') {\n return ''\n }\n // 统一转换为数字类型处理\n newMoney = isString(newMoney) ? parseFloat(newMoney) : newMoney\n // 处理负数情况\n if (newMoney < 0) {\n isMinus = true\n newMoney = Math.abs(newMoney)\n }\n // 超过最大处理范围\n if (newMoney >= maxNum) {\n return ''\n }\n // 传入的参数为0情况\n if (newMoney === 0) {\n chineseStr = cnNums[0] + cnIntLast + cnInteger\n return chineseStr\n }\n // 转为字符串\n newMoney = newMoney.toString()\n // 分离整数和小数部分; indexOf 检测某字符在字符串中首次出现的位置 返回索引值(从0 开始) -1 代表无\n if (newMoney.indexOf('.') === -1) {\n integerNum = newMoney\n decimalNum = ''\n } else {\n parts = newMoney.split('.')\n integerNum = parts[0]\n decimalNum = parts[1].substr(0, 4) // 最多保留4位小数\n }\n //转换整数部分\n if (parseInt(integerNum, 10) > 0) {\n let zeroCount = 0\n const IntLen = integerNum.length\n for (let i = 0; i < IntLen; i++) {\n const n = integerNum.substr(i, 1)\n const p = IntLen - i - 1\n const q = p / 4\n const m = p % 4\n if (n === '0') {\n zeroCount++\n } else {\n // 处理前面的零\n if (zeroCount > 0) {\n chineseStr += cnNums[0]\n }\n zeroCount = 0\n // 添加数字及基本单位\n chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]\n }\n\n // 到达万、亿、兆位时添加对应单位\n if (m === 0 && zeroCount < 4) {\n chineseStr += cnIntUnits[q]\n }\n }\n // 最后加上\"圆\"\n chineseStr += cnIntLast\n }\n // 转换小数部分\n if (decimalNum !== '') {\n const decLen = decimalNum.length\n for (let i = 0; i < decLen; i++) {\n const n = decimalNum.substr(i, 1)\n if (n !== '0') {\n // 添加数字及小数单位\n chineseStr += cnNums[Number(n)] + cnDecUnits[i]\n } else {\n // 为零时添加零字\n chineseStr += cnNums[0]\n }\n }\n }\n // 处理结尾字符\n if (chineseStr === '') {\n // 如果结果为空,说明输入为0\n chineseStr += cnNums[0] + cnIntLast + cnInteger\n } else if (decimalNum === '') {\n // 如果没有小数部分,加上\"整\"\n chineseStr += cnInteger\n }\n\n // 处理负数\n if (isMinus) {\n chineseStr = minus + chineseStr\n }\n\n return chineseStr\n}\n\n/**\n * 计算表格中指定列的行合并数量\n *\n * 该函数通常用于表格渲染中,根据某一列的相同值进行行合并(rowspan)\n * 它会将连续相同的值分为一组,并返回目标位置所在的组的大小\n *\n * @param data - 数据数组,每一项应为对象\n * @param key - 需要检查的字段名,用于比较值是否相同\n * @param target - 目标索引位置,函数将返回该位置所在组的大小\n * @returns 目标位置所在组的大小,如果是组的第一个元素则返回组大小,否则返回0\n *\n * @example\n * const data = [\n * { name: 'Alice', dept: 'IT' },\n * { name: 'Bob', dept: 'IT' },\n * { name: 'Charlie', dept: 'HR' },\n * { name: 'David', dept: 'HR' },\n * { name: 'Eve', dept: 'HR' }\n * ]\n *\n * getRowSpanCount(data, 'dept', 0) // 返回 2 (IT部门有2人)\n * getRowSpanCount(data, 'dept', 1) // 返回 0 (IT部门第2个人)\n * getRowSpanCount(data, 'dept', 2) // 返回 3 (HR部门有3人)\n * getRowSpanCount(data, 'dept', 3) // 返回 0 (HR部门第2个人)\n * getRowSpanCount(data, 'dept', 4) // 返回 0 (HR部门第3个人)\n */\nexport const getRowSpanCount = (data: any[], key: string, target: number) => {\n if (!Array.isArray(data)) return 1\n const newData = data.map((_) => _[key]) // 只取出筛选项\n let preValue = newData[0]\n const res = [[preValue]] // 放进二维数组里\n let index = 0 // 二维数组下标\n for (let i = 1; i < newData.length; i++) {\n if (newData[i] === preValue) {\n // 相同放进二维数组\n res[index].push(newData[i])\n } else {\n // 不相同二维数组下标后移\n index += 1\n res[index] = []\n res[index].push(newData[i])\n preValue = newData[i]\n }\n }\n const arr = [] as any[]\n res.forEach((_) => {\n const len = _.length\n for (let i = 0; i < len; i++) {\n arr.push(i === 0 ? len : 0)\n }\n })\n return arr[target]\n}\n\n/**\n * 动态加载第三方文件(JavaScript 或 CSS)\n *\n * 该函数用于在运行时动态加载外部资源文件,支持 JavaScript 和 CSS 文件\n * 主要用于按需加载第三方库或样式文件,避免在页面初始加载时引入所有资源\n *\n * @param document - DOM 文档对象,用于创建和插入元素\n * @param path - 文件路径,支持相对路径或绝对路径\n *\n * @example\n * // 加载 JavaScript 文件\n * importThirdPartyFile(document, 'https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.js')\n *\n * @example\n * // 加载 CSS 文件\n * importThirdPartyFile(document, '/assets/styles/third-party.css')\n *\n * @example\n * // 加载本地 JavaScript 文件\n * importThirdPartyFile(document, './libs/custom-lib.js')\n *\n * @remarks\n * - 根据文件扩展名自动识别文件类型(.js 为脚本文件,其他为样式文件)\n * - JavaScript 文件会异步加载(async = true)\n * - CSS 文件会作为 stylesheet 添加到文档头部\n * - 需要确保 document.head 存在才会添加元素\n */\nexport const importThirdPartyFile = (document: Document, path: string) => {\n const type = path.endsWith('.js') ? 'script' : 'link'\n const element = type === 'script' ? document.createElement('script') : document.createElement('link')\n if (type === 'script') {\n const scriptElement = element as HTMLScriptElement\n scriptElement.async = true\n scriptElement.src = path\n } else {\n const linkElement = element as HTMLLinkElement\n linkElement.rel = 'stylesheet'\n linkElement.type = 'text/css'\n linkElement.href = path\n }\n if (document.head) {\n document.head.appendChild(element)\n }\n}\n\n/**\n * 主要用于处理需要设置key的数组数据\n *\n * 该函数用于过滤和处理项目数组,主要功能包括:\n * 1. 过滤掉标记为隐藏的项目(hidden 为 true 的项目)\n * 2. 为每个项目添加唯一的 key 属性(使用数组索引)\n *\n * @template T - 项目类型,hidden 属性(可选)\n * @param items - 需要处理的项目数组\n * @returns 处理后的项目数组,已过滤隐藏项并添加了 key 属性(优先使用数组项自身的key属性)\n *\n * @example\n * // 过滤带有 hidden 标记的菜单项\n * const menuItems = [\n * { name: '首页', path: '/', hidden: true },\n * { name: '关于', path: '/about' },\n * { name: '联系', path: '/contact', hidden: false }\n * ];\n * const processedItems = processItemList(menuItems);\n * // 结果: [{ key: 0, name: '关于', path: '/about' }, { key: 1, name: '联系', path: '/contact', hidden: false }]\n *\n * @remarks\n * - 该函数不会修改原始数组,而是返回一个新的处理后的数组\n * - key 值基于过滤后的数组索引生成,不是原始数组的索引\n * - hidden 属性为 true 的项目会被过滤掉,其他情况(false、undefined、null等)都会保留\n */\nexport const processItemList = <T extends { hidden?: boolean }>(items: T[]): (T & { key: number })[] => {\n return items.filter((item) => item.hidden !== true).map((item, index) => ({ key: index, ...item }))\n}\n\n/**\n * 执行安全的脚本代码\n *\n * @param script - 需要执行的脚本代码字符串\n * @param params - 传递给脚本的参数对象,键为参数名,值为参数值\n *\n * @example\n * // 执行简单的数学运算脚本\n * executeScript('return a + b;', { a: 1, b: 2 });\n *\n * @example\n * // 执行带条件逻辑的脚本\n * executeScript(`\n * if (age >= 18) {\n * return \"成年人\";\n * } else {\n * return \"未成年人\";\n * }\n * `, { age: 20 });\n *\n * @example\n * // 执行数组处理脚本\n * executeScript(`\n * return numbers.map(n => n * 2).filter(n => n > 5);\n * `, { numbers: [1, 2, 3, 4, 5] });\n *\n * @remarks\n * - 函数会先调用 isScriptSafe 检查脚本安全性,只有安全的脚本才会被执行\n * - 使用 Function 构造器而非 eval,相对更安全\n * - 参数通过解构方式传递给脚本函数\n * - 脚本中可以直接使用 params 对象中的键作为变量名\n * - 如果脚本执行出错,会在控制台输出错误信息\n *\n * @security\n * - 脚本执行在 JavaScript 运行时环境中,仍可能访问全局对象\n * - 应确保传入的脚本来自可信源\n * - 仅依赖 isScriptSafe 检查不足以防范所有安全风险\n */\nexport const executeScript = (script: string, params: { [key: string]: any }) => {\n if (isScriptSafe(script)) {\n // 创建一个新的函数,使用解构后的参数\n const func = new Function(\n ...Object.keys(params), // 参数列表\n script // 脚本字符串\n )\n try {\n // 执行函数并传递解构后的参数\n return func(...Object.values(params))\n } catch (error) {\n console.error('Error executing script:', error)\n }\n } else {\n console.error('unsafe script')\n }\n}\n\n/**\n * AES 加密\n * @param data - 需要加密的数据\n * @param key - 加密密钥\n * @returns 加密后的字符串\n * @throws 当密钥为空或加密过程失败时抛出错误\n */\nexport function aesEncrypt<T = any>(data: T, key: string): string {\n if (!key) throw new Error('AES Encrypt: key is required')\n if (isNullOrUnDef(data)) return ''\n\n try {\n const text = JSON.stringify(data)\n return AES.encrypt(text, key.trim()).toString()\n } catch (err) {\n console.error('AES Encrypt error:', err)\n throw new Error('AES Encrypt failed')\n }\n}\n\n/**\n * AES 解密\n * @param data - 加密后的字符串\n * @param key - 解密密钥\n * @returns 解密后的数据,解密失败时返回null\n */\nexport function aesDecrypt<T = any>(data: string, key: string): T | null {\n if (!key) throw new Error('AES Decrypt: key is required')\n if (!data) return null\n\n try {\n const bytes = AES.decrypt(data, key.trim())\n const decoded = bytes.toString(encUtf8)\n\n // 解密失败会返回null\n if (!decoded) return null\n\n return JSON.parse(decoded) as T\n } catch (err) {\n console.error('AES Decrypt error:', err)\n return null\n }\n}\n","import { useEffect, useRef } from 'react'\nimport { deepEqual } from '../utils/common'\n\n/**\n * 深度比较 useEffect Hook\n * 使用深度比较算法来检测依赖项变化,避免不必要的重新渲染\n *\n * @param effect - 要执行的副作用函数\n * @param deps - 依赖项数组\n */\nexport default (effect: React.EffectCallback, deps: any[]) => {\n /** 保存上一次的依赖项引用 */\n const prevDepsRef = useRef<any[]>()\n\n /** 检查依赖项是否发生变化(使用深度比较) */\n const depsChanged =\n !prevDepsRef.current || deps.length !== prevDepsRef.current.length || deps.some((dep, i) => !deepEqual(dep, prevDepsRef.current![i]))\n\n useEffect(() => {\n if (depsChanged) {\n prevDepsRef.current = deps\n return effect()\n }\n }, [depsChanged]) // 注意:这里用 depsChanged 控制触发\n}\n","import { useRef, useState } from 'react'\n\n/**\n * 创建同时具有 ref 和 state 特性的状态 Hook\n * 解决了 useState 在异步闭包中获取不到最新值的问题\n *\n * @param init - 初始值\n * @returns [state, setState, getState] 元组,包含状态值、设置函数和获取函数\n */\nexport default <T>(init: T) => {\n const [state, setState] = useState(init)\n /** 保存状态值的 ref */\n const stateRef = useRef(init)\n\n /**\n * 同时更新 ref 和 state\n * @param newVal - 新值\n */\n const setProxy = (newVal: T) => {\n stateRef.current = newVal\n setState(newVal)\n }\n\n /**\n * 获取当前 ref 值(异步安全的)\n * @returns 当前状态值\n */\n const getState = () => stateRef.current\n\n return [state, setProxy, getState] as const\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * 同步输入框组件和外部状态的 Hook\n * 解决输入中文时因连续渲染关闭中文输入法的问题\n *\n * @template T - 值类型\n * @param storeValue - 外部存储的值\n * @param setStoreValue - 设置外部存储值的函数\n * @returns 包含 inputValue 和 setInputValue 的对象\n */\nexport default <T>(storeValue: T, setStoreValue: (value: T) => void) => {\n /** 内部输入状态 */\n const [inputValue, setInputValue] = useState<T>(storeValue)\n\n /** 监听外部值变化并同步到内部状态 */\n useEffect(() => {\n if (storeValue !== inputValue) {\n setInputValue(storeValue)\n }\n }, [storeValue])\n\n /**\n * 处理输入值变化,同时更新外部存储和内部状态\n * @param value - 新的输入值\n */\n const handleValueChange = (value: T) => {\n setStoreValue(value)\n setInputValue(value)\n }\n\n return {\n inputValue,\n setInputValue: handleValueChange\n }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n/**\n * 节流 Hook\n * 在指定时间间隔内只执行一次函数,节流控制函数调用频率\n *\n * @template A - 函数参数类型\n * @template R - 返回值类型\n * @param func - 需要节流的函数\n * @param wait - 节流间隔时间(毫秒)\n * @returns 节流处理后的函数,包含 flush 和 cancel 方法\n */\nexport default <A extends Array<any>, R = void>(func: (..._args: A) => R, wait: number) => {\n /** 保存函数和定时器的引用 */\n const { current } = useRef({ func, timeOut: null } as { func: (..._args: A) => R; timeOut: null | NodeJS.Timeout })\n\n /** 更新最新的函数引用 */\n useEffect(() => {\n current.func = func\n }, [func])\n\n /** 保存最新的参数 */\n let args: A\n\n /**\n * 节流处理函数\n * @param _args - 函数参数\n * @returns Promise 包装的执行结果\n */\n function throttle(..._args: A) {\n args = _args\n return new Promise<R>((resolve, reject) => {\n if (!current.timeOut) {\n try {\n const result = current.func.apply(null, args) // 未来可能支持异步\n resolve(result)\n } catch (e) {\n reject(e)\n }\n /** 设置定时器,在指定时间后允许下次执行 */\n current.timeOut = setTimeout(() => {\n current.timeOut = null\n }, wait)\n }\n })\n }\n\n /**\n * 取消节流\n * 清除定时器,重置状态\n */\n function cancel() {\n if (!current.timeOut) return\n clearTimeout(current.timeOut)\n current.timeOut = null\n }\n\n /**\n * 立即执行节流函数\n * 取消当前节流并立即执行一次\n * @returns 函数执行结果\n */\n function flush() {\n cancel()\n return current.func.apply(null, args)\n }\n\n /** 添加额外方法到节流函数 */\n throttle.flush = flush\n throttle.cancel = cancel\n\n return useCallback(throttle, [])\n}\n","import dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\n\ndayjs.extend(relativeTime)\n\ntype DateType = string | number | Date | dayjs.Dayjs | null\n\n/** 默认日期时间格式:年-月-日 时:分:秒 */\nexport const DEFAULT_DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'\n/** 默认日期格式:年-月-日 */\nexport const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD'\n/** 年月中文格式:**年**月 */\nexport const DEFAULT_YEAR_MONTH_FORMAT = 'YYYY年MM月'\n/** 年月日格式:**年**月**日 */\nexport const DEFAULT_YEAR_MONTH_DAY_FORMAT = 'YYYY年MM月DD日'\n\n/** 日期处理默认单位:天 */\nconst DEFAULT_UNIT = 'date'\n\n/**\n * 获取指定日期开始时间戳 (如: '2023/10/17 00:00:00')\n * @param date 日期\n * @param unit 时间单位,默认为 'date' (天)\n * @returns 时间戳\n */\nexport const getStartOfTimestamp = (date?: DateType, unit: dayjs.OpUnitType = DEFAULT_UNIT) => {\n return dayjs(date).startOf(unit).valueOf()\n}\n\n/**\n * 获取指定日期结束时间戳 (如: '2023/10/17 23:59:59')\n * @param date 日期\n * @param unit 时间单位,默认为 'date' (天)\n * @returns 时间戳\n */\nexport const getEndOfTimestamp = (date?: DateType, unit: dayjs.OpUnitType = DEFAULT_UNIT) => {\n return dayjs(date).endOf(unit).valueOf()\n}\n\n/**\n * 格式化日期\n * @param date 待格式化的日期\n * @param format 格式字符串,默认为 'YYYY-MM-DD HH:mm:ss'\n * @returns 格式化后的日期字符串\n */\nexport const formatDate = (date: Date | number | string, fmt: string = DEFAULT_DATE_TIME_FORMAT) => {\n if (date) {\n return dayjs(date).format(fmt)\n }\n return ''\n}\n\n/**\n * 获取日期的时间戳\n * @param date 日期,默认当前时间\n * @returns 时间戳\n */\nexport const getTimestamp = (date?: DateType) => {\n return dayjs(date).valueOf()\n}\n\n/**\n * 检查日期是否已过期\n * @param date 待检查的日期, 默认当前时间\n * @returns 是否过期\n */\nexport const isExpire = (date?: DateType) => {\n return dayjs(date).isBefore(getStartOfTimestamp())\n}\n","import Decimal from 'decimal.js'\n/** Decimal.js 方法类型 */\ntype MethodType = 'plus' | 'minus' | 'times' | 'dividedBy'\n/** 数学运算符类型 */\ntype OperatorType = '+' | '-' | '*' | '/'\n/** 运算符到方法名的映射 */\nconst OperatorToMethodName: Record<OperatorType, MethodType> = {\n '+': 'plus',\n '-': 'minus',\n '*': 'times',\n '/': 'dividedBy'\n}\n\n/**\n * 通用数学计算函数\n * 支持链式运算,对多个数值执行相同类型的运算\n *\n * 实现原理:\n * 1. 取第一个数值作为初始值\n * 2. 使用reduce对剩余数值依次进行运算\n * 3. 使用Decimal.js确保精度\n *\n * @param operator - 运算符:+、-、*、/\n * @param args - 要计算的数值数组(可变参数)\n * @returns 计算结果字符串\n *\n * @example\n * calculate('+', 0.1, 0.2) // 返回 \"0.3\"\n * calculate('*', 2, 3, 4) // 返回 \"24\"\n */\nexport const calculate = (operator: OperatorType, ...args: Decimal.Value[]) => {\n if (args.length === 0) return '0'\n const [arg, ...newArgs] = args\n return newArgs.reduce((acc: Decimal, val) => acc[OperatorToMethodName[operator]](new Decimal(val)), new Decimal(arg)).toString()\n}\n\n/**\n * 精确加法运算\n * 解决JavaScript浮点数精度问题,支持多个数值相加\n *\n * @param args - 要相加的数值列表(可变参数)\n * @returns 相加结果字符串\n *\n * @example\n * plus(0.1, 0.2) // 返回 \"0.3\"\n * plus(1, 2, 3, 4, 5) // 返回 \"15\"\n */\nexport const plus = (...args: Decimal.Value[]) => calculate('+', ...args)\n\n/**\n * 精确减法运算\n * 解决JavaScript浮点数精度问题,支持多个数值连续相减\n *\n * @param args - 要相减的数值列表(可变参数)\n * @returns 相减结果字符串\n *\n * @example\n * minus(0.3, 0.1) // 返回 \"0.2\"\n * minus(10, 1, 2, 3) // 返回 \"4\" (10-1-2-3)\n */\nexport const minus = (...args: Decimal.Value[]) => calculate('-', ...args)\n\n/**\n * 精确乘法运算\n * 解决JavaScript浮点数精度问题,支持多个数值连续相乘\n *\n * @param args - 要相乘的数值列表(可变参数)\n * @returns 相乘结果字符串\n *\n * @example\n * times(0.1, 0.2) // 返回 \"0.02\"\n * times(2, 3, 4) // 返回 \"24\"\n */\nexport const times = (...args: Decimal.Value[]) => calculate('*', ...args)\n\n/**\n * 精确除法运算\n * 解决JavaScript浮点数精度问题,支持多个数值连续相除\n *\n * @param args - 要相除的数值列表(可变参数)\n * @returns 相除结果字符串\n *\n * @example\n * dividedBy(0.3, 0.1) // 返回 \"3\"\n * dividedBy(100, 2, 5) // 返回 \"10\" (100/2/5)\n */\nexport const dividedBy = (...args: Decimal.Value[]) => calculate('/', ...args)\n\n/**\n * 查看小数位数(不计算小数点最后末尾的0)\n * 返回数值中小数点后非零数字的位数\n *\n * @param arg1 - 要检查的数值\n * @returns 小数位数\n *\n * @example\n * decimalPlaces(1.23) // 返回 2\n * decimalPlaces(1.2300) // 返回 2 (末尾的0不计入)\n * decimalPlaces(1) // 返回 0\n */\nexport const decimalPlaces = (arg1: Decimal.Value) => {\n return new Decimal(arg1).decimalPlaces()\n}\n\n/**\n * 查看数值总位数(包括整数和小数部分)\n * 返回数值中所有有效数字的总位数\n *\n * @param arg1 - 要检查的数值\n * @returns 总位数\n *\n * @example\n * precision(1.23) // 返回 3\n * precision(123) // 返回 3\n * precision(0.01) // 返回 1\n */\nexport const precision = (arg1: Decimal.Value) => {\n return new Decimal(arg1).precision(true)\n}\n\n/**\n * 取绝对值\n * 返回数值的绝对值(非负值)\n *\n * @param arg1 - 要处理的数值\n * @returns 绝对值字符串\n *\n * @example\n * absVal(-5) // 返回 \"5\"\n * absVal(5) // 返回 \"5\"\n * absVal(-1.5) // 返回 \"1.5\"\n */\nexport const absVal = (arg1: Decimal.Value) => new Decimal(arg1).abs().toString()\n\n/**\n * 数值比较函数\n * 支持多种比较操作,解决浮点数比较精度问题\n *\n * @param arg1 - 第一个数值\n * @param arg2 - 第二个数值\n * @param type - 比较类型:>、>=、<、<=、==\n * @returns 比较结果布尔值\n *\n * @example\n * compareNum(0.1 + 0.2, 0.3, '==') // 返回 true\n * compareNum(1, 2, '<') // 返回 true\n * compareNum(2, 2, '>=') // 返回 true\n */\nexport const compareNum = (arg1: Decimal.Value, arg2: Decimal.Value, type: string) => {\n const x = new Decimal(arg1)\n const y = new Decimal(arg2)\n switch (type) {\n case '>':\n return x.greaterThan(y)\n case '>=':\n return x.greaterThanOrEqualTo(y)\n case '<':\n return x.lessThan(y)\n case '<=':\n return x.lessThanOrEqualTo(y)\n case '==':\n return x.equals(y)\n }\n}\n\n/**\n * 四舍五入处理\n * 对数值进行指定小数位数的四舍五入处理(解决原始toFixed精度问题)\n *\n * @param num - 要处理的数值\n * @param decimals - 保留小数位数,默认为2\n * @param fill - 是否补0,默认为true\n * @returns 处理后的数字字符串\n *\n * @example\n * toFixed(1.2345) // 返回 \"1.23\"\n * toFixed(1.2345, 3) // 返回 \"1.235\"\n * toFixed(1.2, 2, true) // 返回 \"1.20\" (补0)\n * toFixed(1.2, 2, false) // 返回 \"1.2\" (不补0)\n */\nexport const toFixed = (num: Decimal.Value, decimals = 2, fill = true) => {\n const x = new Decimal(num)\n if (fill) {\n return x.toFixed(decimals, Decimal.ROUND_HALF_UP)\n } else {\n return x.toDecimalPlaces(decimals, Decimal.ROUND_HALF_UP).toString()\n }\n}\n\n/**\n * 判断是否为整数\n * 检查数值是否为整数(没有小数部分)\n *\n * @param num - 要判断的数值\n * @returns 是否为整数\n *\n * @example\n * isInteger(1) // 返回 true\n * isInteger(1.0) // 返回 true\n * isInteger(1.1) // 返回 false\n */\nexport const isInteger = (num: Decimal.Value) => {\n return new Decimal(num).isInteger()\n}\n\n/**\n * 判断是否为负数\n * 检查数值是否小于0\n *\n * @param num - 要判断的数值\n * @returns 是否为负数\n *\n * @example\n * isNegative(-1) // 返回 true\n * isNegative(0) // 返回 false\n * isNegative(1) // 返回 false\n */\nexport const isNegative = (num: Decimal.Value) => {\n return new Decimal(num).isNegative()\n}\n/**\n * 整数截取n位,小数四舍五入(已注释)\n * 该功能已被注释,暂不可用\n *\n * 设计思路:\n * 1. 对于整数部分,直接截取前n位\n * 2. 对于小数部分,进行四舍五入处理\n *\n * @param num - 要处理的数值\n * @param decimals - 截取位数\n */\n// export const toDigits = (num: Decimal.Value, decimals?: number) => {\n// let x = new Decimal(num)\n// if (decimals) {\n// const y = precision(num) - decimalPlaces(num)\n// if (isInteger(x) || y > decimals) {\n// return x.toString().substring(0, decimals)\n// } else {\n// return toFixed(num, decimals - y, false)\n// // return x.toSignificantDigits(decimals, Decimal.ROUND_HALF_UP).toString()\n// }\n// }\n// return x.toString()\n// }\n","import { message, Modal, notification } from 'antd'\nimport { getTimestamp } from './date'\n\n/**\n * 消息提示配置接口\n */\ninterface Message {\n /** 消息标题 */\n title?: string\n /** 消息内容 */\n content: string\n /** 显示时长(秒),为0则不自动关闭 */\n duration?: number\n /** 消息类型:成功、错误、警告、信息 */\n type?: 'success' | 'error' | 'warning' | 'info'\n /** 关闭回调 */\n onClose?: () => void\n}\n\n/**\n * 缓存消息配置接口\n * 扩展基础消息接口,增加缓存控制\n */\nexport interface CacheMessage extends Message {\n /** 是否启用缓存机制 */\n isCache?: boolean\n /** 是否为唯一消息 */\n isOnly?: boolean\n}\n/**\n * 创建缓存消息显示函数\n * 防止重复消息的显示,支持消息、通知、弹窗三种形式\n *\n * 功能特点:\n * 1. 防重复显示:相同内容的消息不会重复显示\n * 2. 自动选择显示形式:\n * - 短内容(≤30字符):使用 message 形式显示在页面顶部\n * - 长内容(>30字符):使用 notification 形式显示在页面右上角\n * - 无时长(duration=0):使用 Modal 弹窗形式显示\n * 3. 缓存控制:\n * - isCache=true(默认):启用防重复机制\n * - isOnly=true:将所有消息视为同一类消息,只显示一次\n *\n * @returns 缓存消息显示函数\n */\nconst createCachedMessage = () => {\n // 用于记录已显示消息的时间戳,防止重复显示\n const messageCache = {} as ObjectType<number>\n /**\n * 缓存消息显示函数\n * @param options 消息配置选项\n */\n return ({ title = '提示', content, type = 'warning', duration = 3, onClose, isCache = true, isOnly = false }: CacheMessage) => {\n if (!content) return\n\n // 确定消息的唯一标识\n // isOnly=true时,所有消息共用一个key,即只会显示一次\n // isOnly=false时,以消息内容作为key,相同内容的消息不会重复显示\n const cacheKey = isOnly ? 'unique-message-key' : content\n const handleClose = () => {\n delete messageCache[cacheKey]\n onClose?.()\n }\n // 如果启用了缓存且该消息已经显示过,则直接返回不重复显示\n if (isCache && messageCache[cacheKey]) return\n\n if (isCache) {\n messageCache[cacheKey] = getTimestamp()\n }\n if (duration) {\n // 根据内容长度选择显示方式\n if (content.length > 30) {\n // 长内容使用通知形式\n notification[type]({\n message: title,\n description: content,\n placement: 'top',\n duration,\n onClose: handleClose\n })\n } else {\n // 短内容使用消息形式\n message[type]({\n content,\n duration,\n onClose: handleClose\n })\n }\n } else {\n // 无时长使用弹窗形式\n Modal[type]({\n title,\n content,\n closable: true,\n centered: true,\n footer: null,\n afterClose: handleClose\n })\n }\n }\n}\n\n/**\n * 导出的缓存消息显示函数\n * 支持防重复显示、自动关闭、多种显示形式\n *\n * 使用示例:\n * ```typescript\n * // 基本用法\n * cachedMessage({ content: '操作成功', type: 'success' })\n *\n * // 长消息自动使用通知形式\n * cachedMessage({ title: '系统通知', content: '这是一条很长的通知内容,将会以notification形式显示...', type: 'info' })\n *\n * // 弹窗形式(duration=0)\n * cachedMessage({ title: '确认操作', content: '确定要删除这项数据吗?', duration: 0, type: 'warning' })\n *\n * // 防重复显示\n * cachedMessage({ content: '请先登录', type: 'error' })\n * cachedMessage({ content: '请先登录', type: 'error' }) // 此条不会显示\n *\n * // 强制重新显示(禁用缓存)\n * cachedMessage({ content: '请先登录', type: 'error', isCache: false })\n * ```\n */\nexport const cachedMessage = createCachedMessage()\n","import { RuleObject } from 'antd/es/form'\nimport { isNumber, isNumberNoNaN } from './is'\nimport { decimalPlaces, precision } from './math'\n\n/**\n * 手机号验证规则\n * 匹配以1开头,第二位为3-9的11位数字\n */\nexport const RegMobile = {\n pattern: /^1[3-9]\\d{9}$/,\n message: '手机号格式不正确!'\n}\n\n/**\n * 固定电话验证规则\n * 匹配区号(0开头2-3位数字) + 连字符 + 7-8位号码\n */\nexport const RegFixedTelePhone = {\n pattern: /^0\\d{2,3}-\\d{7,8}$/,\n message: '电话号码格式不正确!'\n}\n\n/**\n * 通用电话号码验证规则\n * 匹配包含数字及常见电话符号(+、-、()、()、 )的1-20位字符串\n */\nexport const RegTelePhone = {\n pattern: /^[\\\\+\\-\\\\(\\\\)\\\\(\\\\)\\d]{1,20}$/,\n message: '电话号码格式不正确!'\n}\n\n/**\n * 税号验证规则\n * 匹配15位、18位或20位的大写字母和数字组合\n */\nexport const RegTaxNo = {\n pattern: /^[A-Z0-9]{15}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$/,\n message: '税号格式有误!'\n}\n\n/**\n * 银行卡号验证规则\n * 匹配纯数字组成的字符串\n */\nexport const RegBankCardNo = {\n pattern: /^[0-9]*$/,\n message: '银行卡号格式有误!'\n}\n\n/**\n * 身份证号验证规则\n * 匹配15位数字、18位数字或17位数字加X/x的格式\n */\nexport const RegIdentityCardNo = {\n pattern: /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/,\n message: '身份证号格式有误!'\n}\n\n/**\n * 数字验证规则\n * 匹配纯数字组成的字符串\n */\nexport const RegNumNo = {\n pattern: /^[0-9]*$/,\n message: '格式有误,请重新输入!'\n}\n\n/**\n * 短信验证码验证规则\n * 匹配6位数字\n */\nexport const RegSmsCode = {\n pattern: /^[0-9]{6}$/,\n message: '验证码为6位数字'\n}\n\n/**\n * 邮箱验证规则\n * 匹配标准邮箱格式:用户名@域名.顶级域名\n */\nexport const RegEmail = {\n pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\n message: '邮箱格式有误!'\n}\n\n/**\n * 详细地址验证规则\n * 必须包含地址相关关键词(街、路、村、乡、镇、道、巷、号)\n */\nexport const RegDetailAddress = {\n pattern: /.*(街|路|村|乡|镇|道|巷|号).*/,\n message: '必须包含“街、路、村、乡、镇、道、巷、号”等关键词之一'\n}\n\n/**\n * 手机号或固定电话验证器\n * 验证输入是否符合手机号或固定电话格式\n *\n * @param errMessage - 自定义错误消息\n * @returns Ant Design 表单验证规则对象\n *\n * @example\n * // 基本使用\n * <Form.Item name=\"phone\" rules={[PhoneOrMobileValidator()]}>\n * <Input />\n * </Form.Item>\n *\n * @example\n * // 自定义错误消息\n * <Form.Item name=\"phone\" rules={[PhoneOrMobileValidator('请输入正确的联系电话')]}>\n * <Input />\n * </Form.Item>\n */\nexport const PhoneOrMobileValidator = (errMessage = '联系电话格式不正确') => ({\n validator: (_: RuleObject, value: string) =>\n !value || RegFixedTelePhone.pattern.test(value) || RegMobile.pattern.test(value) ? Promise.resolve() : Promise.reject(new Error(errMessage))\n})\n\n/**\n * 数值范围验证器\n * 验证输入数值是否在指定范围内\n *\n * @param options - 验证选项\n * @param options.min - 最小值\n * @param options.max - 最大值\n * @param options.equalMin - 是否可等于最小值,默认false\n * @param options.equalMax - 是否可等于最大值,默认false\n * @param options.errMessage - 通用错误消息\n * @param options.maxErrMessage - 最大值错误消息\n * @param options.minErrMessage - 最小值错误消息\n * @returns Ant Design 表单验证规则对象\n *\n * @example\n * // 验证年龄在0-150之间\n * <Form.Item name=\"age\" rules={[ThanNumValidator({ min: 0, max: 150, equalMin: true, equalMax: true })]}>\n * <InputNumber />\n * </Form.Item>\n *\n * @example\n * // 验证价格大于0\n * <Form.Item name=\"price\" rules={[ThanNumValidator({ min: 0, equalMin: false })]}>\n * <InputNumber />\n * </Form.Item>\n */\nexport const ThanNumValidator = ({\n min,\n max,\n equalMin = false,\n equalMax = false,\n errMessage,\n maxErrMessage,\n minErrMessage\n}: {\n min?: number | string\n max?: number | string\n equalMin?: boolean // 是否可与最小值相等\n equalMax?: boolean\n maxErrMessage?: string\n minErrMessage?: string\n errMessage?: string\n}) => ({\n validator: (_: RuleObject, value: string) => {\n // console.log(_, 123)\n if (!value) {\n return Promise.resolve()\n }\n if (isNumberNoNaN(parseFloat(min as string))) {\n if (!(Number(value) > Number(min) || (equalMin && Number(value) === Number(min)))) {\n return Promise.reject(new Error(minErrMessage || errMessage || `不能小于${equalMin ? '' : '等于'}${min}`))\n }\n }\n if (isNumberNoNaN(parseFloat(max as string))) {\n if (!(Number(value) < Number(max) || (equalMax && Number(value) === Number(max)))) {\n return Promise.reject(new Error(maxErrMessage || errMessage || `不能大于${equalMax ? '' : '等于'}${max}`))\n }\n }\n return Promise.resolve()\n }\n})\n\n/**\n * 数值位数验证器\n * 验证输入数值的总位数、整数位数和小数位数是否符合要求\n *\n * @param options - 验证选项\n * @param options.length - 总位数限制\n * @param options.decimalsLength - 小数位数限制\n * @param options.integerLength - 整数位数限制\n * @param options.lengthErrMessage - 总位数错误消息\n * @param options.decimalsLengthErrMessage - 小数位数错误消息\n * @param options.integerLengthErrMessage - 整数位数错误消息\n * @returns Ant Design 表单验证规则对象\n *\n * @example\n * // 验证金额最多8位,其中小数点后2位\n * <Form.Item name=\"amount\" rules={[ThanNumLengthValidator({ length: 8, decimalsLength: 2 })]}>\n * <InputNumber />\n * </Form.Item>\n *\n * @example\n * // 验证百分比最多3位整数,最多2位小数\n * <Form.Item name=\"percent\" rules={[ThanNumLengthValidator({ integerLength: 3, decimalsLength: 2 })]}>\n * <InputNumber />\n * </Form.Item>\n */\nexport const ThanNumLengthValidator = ({\n length,\n decimalsLength,\n integerLength,\n lengthErrMessage,\n decimalsLengthErrMessage,\n integerLengthErrMessage\n}: {\n length?: number // 总位数\n decimalsLength?: number // 小数位数\n integerLength?: number // 整数位数\n lengthErrMessage?: string\n decimalsLengthErrMessage?: string\n integerLengthErrMessage?: string\n}) => ({\n validator: (_: RuleObject, value: string) => {\n // console.log(value, length, decimalsLength, integerLength)\n if (!value) {\n return Promise.resolve()\n }\n if (isNumber(length)) {\n if (precision(value) > length) {\n return Promise.reject(new Error(lengthErrMessage || `总位数不能超过${length}位`))\n }\n }\n if (isNumber(integerLength)) {\n if (precision(value) - decimalPlaces(value) > integerLength) {\n return Promise.reject(new Error(integerLengthErrMessage || `整数位不能超过${integerLength}位`))\n }\n }\n if (isNumber(decimalsLength)) {\n if (decimalPlaces(value) > decimalsLength) {\n return Promise.reject(new Error(decimalsLengthErrMessage || `小数位不能超过${decimalsLength}位`))\n }\n }\n return Promise.resolve()\n }\n})\n\n/**\n * 多邮箱验证器\n * 验证逗号分隔的多个邮箱地址是否都符合格式要求\n *\n * @param max - 最大邮箱数量\n * @returns Ant Design 表单验证规则对象\n *\n * @example\n * // 最多允许输入5个邮箱\n * <Form.Item name=\"emails\" rules={[MultiEmailValidator(5)]}>\n * <Input placeholder=\"多个邮箱用逗号分隔\" />\n * </Form.Item>\n */\nexport const MultiEmailValidator = (max: number) => ({\n validator: (_: RuleObject, value: string) => {\n if (value) {\n const emailArr = value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v)\n if (emailArr.length > max) return Promise.reject(new Error(`最多输入${max}个邮箱`))\n const noEmailArr = emailArr.filter((email) => !RegEmail.pattern.test(email))\n if (noEmailArr.length) return Promise.reject(new Error(RegEmail.message))\n }\n return Promise.resolve()\n }\n})\n","import axios, { AxiosRequestConfig } from 'axios'\nimport { isBlob } from './is'\nimport { cachedMessage } from './message'\n\n/**\n * HTTP 错误状态码常量映射\n * 用于定义常见的 HTTP 错误响应状态码\n */\nexport const HttpStatus = {\n /** 服务器错误 */\n ERROR: 500,\n /** 缺少参数或参数错误 */\n MISSING_PARAMETER: 400,\n /** 未授权,需要用户验证 */\n UNAUTHORIZED: 401,\n /** 禁止访问,服务器理解请求但拒绝执行 */\n FORBIDDEN: 403,\n /** 请求的资源未找到 */\n NOT_FOUND: 404\n} as const\n\n/**\n * 业务码常量映射\n * 用于定义应用层面的业务逻辑码\n */\nexport const BusinessCode = {\n /** 请求成功 */\n OK: 200,\n /** 权限拒绝,没有足够的权限执行操作 */\n PERMISSION_DENIED: 13001\n} as const\n\n/**\n * 判断是否应该显示错误信息\n * @param showError - 配置项,决定是否显示错误信息\n * @returns 如果 showError 不为 false,则返回 true,否则返回 false\n */\nconst showError = (showError?: boolean) => showError !== false\n\n/**\n * 扩展的请求配置接口\n * 继承自 AxiosRequestConfig,并增加了控制错误提示的选项\n */\nexport interface RequestConfig extends AxiosRequestConfig {\n showError?: boolean\n}\n\n/**\n * 创建一个配置好的 HTTP 请求实例\n * @param config - 可选的默认配置项\n * @returns 包含各种 HTTP 方法的对象\n */\nexport function createRequest(config?: RequestConfig) {\n const instance = axios.create({\n baseURL: '/api', // 默认基础URL\n timeout: 60000, // 请求超时时间设为60秒\n ...config // 合并传入的配置项\n })\n\n // ---------- 请求拦截器(先注册后执行) ----------\n instance.interceptors.request.use(\n function (config) {\n // console.log('请求拦截器:', config)\n return config\n },\n function (error) {\n // 处理请求错误, onFulfilled报错后会执行当前以及之后的所有报错拦截\n return Promise.reject(error)\n }\n )\n\n // ---------- 响应拦截器(先注册先执行)----------\n instance.interceptors.response.use(\n function (response) {\n // console.log('响应拦截器:', config)\n // 如果响应数据是 Blob 类型,直接返回响应\n if (isBlob(response.data)) return response\n\n // 检查业务逻辑错误码\n if (response.data?.code !== BusinessCode.OK) {\n const isPermission = response.data?.code === BusinessCode.PERMISSION_DENIED\n if (showError((response.config as RequestConfig)?.showError)) {\n cachedMessage({\n title: isPermission ? '' : undefined,\n content: response.data.message,\n duration: isPermission ? 0 : 3\n })\n }\n // 返回 rejected 状态的 Promise,使调用方能捕获到错误\n return Promise.reject(response) // TODO 之前返回response.data\n }\n return response\n },\n function (err) {\n // 处理onFulfilled报错、网络错误或其他异常情况, onFulfilled报错后会执行之后的所有报错拦截(不含当前)\n if (!err.response) {\n // 网络错误\n if (showError(err?.config?.showError)) cachedMessage({ content: '网络异常,请检查网络', type: 'error' })\n } else {\n // 根据 HTTP 状态码处理不同类型的错误\n switch (err.response?.status) {\n case HttpStatus.UNAUTHORIZED:\n // 未登录错误\n if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message, type: 'error' })\n break\n default:\n // 其他 HTTP 错误\n if (showError(err?.config?.showError)) cachedMessage({ content: err.response?.data.message || '请求错误!', type: 'error' })\n }\n }\n\n return Promise.reject(err)\n }\n )\n\n // -------- 导出 HTTP 方法 --------\n return {\n /**\n * 返回原始 axios 实例\n * 可以用于添加拦截器等\n */\n instance,\n /**\n * 发送 GET 请求\n * @param url - 请求地址\n * @param params - 查询参数\n * @param options - 额外的请求配置\n * @returns Promise<any> 响应数据\n */\n get: async (url: string, params?: any, options?: RequestConfig) => {\n const res = await instance({ method: 'get', url, params, ...options })\n return res.data\n },\n /**\n * 发送 POST 请求\n * @param url - 请求地址\n * @param data - 请求体数据\n * @param options - 额外的请求配置\n * @returns Promise<any> 响应数据\n */\n post: async (url: string, data?: any, options?: RequestConfig) => {\n const res = await instance({ method: 'post', url, data, ...options })\n return res.data\n },\n /**\n * 发送 PUT 请求\n * @param url - 请求地址\n * @param data - 请求体数据\n * @param options - 额外的请求配置\n * @returns Promise<any> 响应数据\n */\n put: async (url: string, data?: any, options?: RequestConfig) => {\n const res = await instance({ method: 'put', url, data, ...options })\n return res.data\n },\n /**\n * 发送 DELETE 请求\n * @param url - 请求地址\n * @param data - 请求体数据\n * @param options - 额外的请求配置\n * @returns Promise<any> 响应数据\n */\n delete: async (url: string, data?: any, options?: RequestConfig) => {\n const res = await instance({ method: 'delete', url, data, ...options })\n return res.data\n }\n }\n}\n","import { aesDecrypt, aesEncrypt, genNonDuplicateID } from './common'\nimport { isNullOrUnDef, isString } from './is'\n\n/**\n * 获取或生成设备唯一标识\n *\n * 该函数用于获取设备的唯一标识符,如果本地存储中不存在则会生成一个新的唯一ID\n * 主要用途:\n * 1. 跟踪用户设备(不涉及个人隐私)\n * 2. 设备统计分析\n * 3. 防止重复提交等场景\n *\n * 实现逻辑:\n * 1. 首先尝试从localStorage中获取已存储的设备ID\n * 2. 如果存在,则直接返回该设备ID\n * 3. 如果不存在,则生成一个新的唯一ID\n * 4. 将新生成的ID存储到localStorage中,以便下次使用\n * 5. 返回设备ID\n *\n * @param DEVICEID_KEY - 设备ID在localStorage中的存储键名\n * @returns 设备唯一标识字符串\n *\n * @example\n * // 使用自定义键名获取设备ID\n * const deviceId = getDeviceId('MY-APP-DEVICE-ID')\n *\n * 注意事项:\n * 1. 设备ID存储在localStorage中,清除浏览器数据会导致重新生成\n * 2. 不同域名下会有不同的设备ID\n * 3. 该ID不包含任何个人身份信息,仅用于设备识别\n */\nexport function getDeviceId(DEVICEID_KEY: string) {\n let deviceId = localStorage.getItem(DEVICEID_KEY)\n if (deviceId) {\n return deviceId\n }\n deviceId = genNonDuplicateID()\n localStorage.setItem(DEVICEID_KEY, deviceId)\n return deviceId\n}\n\nexport interface SecureManagerProps {\n /** 存储键名 */\n key: string\n /** AES加密密钥;(不传则明文存储) */\n aesKey?: string\n /** 存储类型,默认为localStorage */\n storage?: Storage\n}\n\n/**\n * 创建安全存储管理器\n *\n * 提供统一的数据存储接口,支持加密和明文两种存储模式\n *\n * 特性:\n * 1. 灵活存储:支持sessionStorage和localStorage\n * 2. 可选加密:通过aesKey参数控制是否加密存储\n * 3. 自动处理:根据是否提供aesKey自动切换加密/明文模式\n * 4. 类型安全:支持泛型,可指定存储数据的类型\n *\n * @param options 安全存储配置选项\n * @returns 安全存储管理器对象\n *\n * @example\n * // 加密存储(提供aesKey时自动启用加密)\n * const secureManager = createSecureManager({\n * key: 'user-profile',\n * aesKey: 'my-secret-key'\n * })\n * secureManager.set({ name: 'John', id: 123 })\n *\n * @example\n * // 明文存储(不提供aesKey时使用明文存储)\n * const plainManager = createSecureManager({\n * key: 'app-settings'\n * })\n * plainManager.set({ theme: 'dark', lang: 'en' })\n *\n * @example\n * // 自定义存储类型\n * const localManager = createSecureManager({\n * key: 'local-data',\n * aesKey: 'secret-key',\n * storage: localStorage\n * })\n */\nexport function createSecureManager<T>({ key, storage = localStorage, aesKey }: SecureManagerProps) {\n /**\n * 存储数据\n *\n * 根据初始化时是否提供aesKey参数自动选择存储方式:\n * - 提供aesKey:使用AES加密存储\n * - 未提供aesKey:如果是字符串则直接存储,否则使用JSON序列化明文存储\n *\n * @param data 要存储的数据\n */\n const set = (data: T) => {\n if (isNullOrUnDef(data)) return\n storage.setItem(key, aesKey ? aesEncrypt(data, aesKey) : isString(data) ? data : JSON.stringify(data))\n }\n\n /**\n * 获取数据\n *\n * 根据存储时的方式自动选择解析方式:\n * - 如果配置了aesKey:尝试解密数据\n * - 如果未配置aesKey:直接解析JSON,解析报错直接返回获取的值\n *\n * @returns 解密或解析后的数据,如果不存在或解析失败则返回null\n */\n const get = (): T | null => {\n const cipher = storage.getItem(key)\n if (!cipher) {\n return null\n }\n if (aesKey) {\n return aesDecrypt(cipher, aesKey)\n }\n // 直接解析JSON\n try {\n return JSON.parse(cipher) as T\n } catch (e) {\n console.log('Failed to parse stored data:', e)\n // TODO 兼容旧字符串数据\n return cipher as T\n }\n }\n\n /**\n * 清除存储的数据\n */\n const clear = () => storage.removeItem(key)\n\n return {\n set,\n get,\n clear\n }\n}\n\nexport interface TokenManagerProps {\n /** token在存储中的键名 */\n key: string\n /** 存储类型,支持localStorage和sessionStorage,默认为localStorage */\n storage?: Storage\n}\n\n/**\n * 创建token管理器\n *\n * 提供统一的token管理功能,支持从URL参数或存储中获取、设置和清除token\n *\n * 设计特点:\n * 1. 自动同步:从URL获取token时会自动同步到存储中\n * 2. 灵活存储:支持localStorage和sessionStorage\n * 3. 优先级获取:优先使用URL参数中的token\n * 4. 简洁API:提供完整的token管理操作\n *\n * @param options token管理器配置选项\n * @returns token管理器对象\n *\n * @example\n * // 创建基于localStorage的token管理器\n * const tokenManager = createTokenManager({\n * key: 'ACCESS_TOKEN'\n * })\n *\n * // 从URL参数或localStorage获取token\n * const token = tokenManager.get()\n *\n * // 设置token\n * tokenManager.set('new-token-value')\n *\n * // 清除token\n * tokenManager.clear()\n *\n * @example\n * // 创建基于sessionStorage的token管理器\n * const tokenManager = createTokenManager({\n * key: 'SESSION_TOKEN',\n * storage: sessionStorage\n * })\n */\nexport function createTokenManager({ key, storage = localStorage }: TokenManagerProps) {\n const tokenManager = createSecureManager<string>({ key, storage })\n /**\n * 从URL查询参数中获取token\n *\n * 通常用于单点登录(SSO)场景,token通过URL参数传递\n * @returns URL中的token字符串或空字符串\n */\n const getFromUrl = () => {\n const searchParams = new URLSearchParams(location.search)\n return searchParams.get(key)\n }\n\n /**\n * 获取token\n *\n * 获取token的优先级顺序:\n * 1. URL查询参数中的token(优先级最高)\n * 2. 存储中的token\n * 3. 空字符串(默认值)\n *\n * 当从URL获取到token时,会自动将其存储到指定存储中,实现token同步\n * @returns token字符串或空字符串\n */\n const get = (): string => {\n const urlToken = getFromUrl()\n if (urlToken) {\n tokenManager.set(urlToken)\n return urlToken\n }\n return tokenManager.get()\n }\n\n return {\n set: tokenManager.set,\n get,\n clear: tokenManager.clear\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { isNullOrUnDef, isNumber, isString } from '../../utils'\n\n/**\n * useWebSocket Hook 参数类型定义\n */\nexport interface WebSocketProps {\n /** WebSocket 服务器地址 */\n url: string\n /** 接收到消息时的回调函数 */\n onMessage: (message: any) => void\n /** 连接关闭时的回调函数(可选) */\n onClose?: () => void\n /** 心跳间隔时间,单位毫秒,默认 30000ms */\n heartbeatInterval?: number\n /** 心跳消息内容,默认 'ping' */\n heartbeatMessage?: string\n /** 是否开启客户端心跳,默认 true */\n clientHeartbeat?: boolean\n /** 重连间隔时间,单位毫秒,默认 5000ms */\n reconnectInterval?: number\n /** 最大重连尝试次数,不设置则无限重连 */\n maxReconnectAttempts?: number\n /** 是否开启重连机制,默认 true */\n isReconnect?: boolean\n}\n\n/**\n * useWebSocket Hook 返回值类型定义\n */\nexport interface WebSocketType {\n /** 发送消息的方法 */\n sendMessage: (message: string) => void\n /** WebSocket 连接状态,对应 WebSocket.readyState */\n socketReadyState: number | null\n}\n\n/**\n * WebSocket 连接管理 Hook\n *\n * 提供完整的 WebSocket 连接管理功能,包括:\n * - 自动重连机制\n * - 心跳检测\n * - 页面可见性监听\n * - 连接状态管理\n * - 消息发送与接收\n *\n * @example\n * ```tsx\n * const { sendMessage, socketReadyState } = useWebSocket({\n * url: 'ws://localhost:8080',\n * onMessage: (message) => console.log('收到消息:', message),\n * heartbeatInterval: 30000,\n * maxReconnectAttempts: 5\n * })\n * ```\n */\nexport default ({\n url,\n onMessage,\n onClose,\n heartbeatInterval = 30000,\n heartbeatMessage = 'ping',\n clientHeartbeat = true,\n reconnectInterval = 5000,\n maxReconnectAttempts,\n isReconnect = true\n}: WebSocketProps): WebSocketType => {\n /** WebSocket 实例引用 */\n const socketRef = useRef<WebSocket | null>(null)\n /** 心跳定时器引用 */\n const heartbeatIntervalRef = useRef<NodeJS.Timer | null>(null)\n /** WebSocket 连接状态 */\n const [socketReadyState, setSocketReadyState] = useState<number | null>(null)\n /** 重连定时器引用 */\n const reconnectIntervalRef = useRef<NodeJS.Timer | null>(null)\n /** 当前重连尝试次数 */\n const reconnectAttempts = useRef(0)\n /** 页面是否隐藏状态 */\n const documentHide = useRef(document.visibilityState === 'hidden')\n /** 组件是否已销毁 */\n const isDestroy = useRef(false)\n /** 稳定的消息回调函数引用 */\n const onMessageEctype = useCallback(onMessage, [onMessage])\n /**\n * 启动心跳定时器\n * @param currentSocket 当前的 WebSocket 实例\n */\n const startHeartbeat = (currentSocket: WebSocket) => {\n if (!clientHeartbeat) {\n return\n }\n\n const intervalId = setInterval(() => {\n // 只有在连接开启时才发送心跳消息\n if (currentSocket.readyState === WebSocket.OPEN) {\n currentSocket.send(heartbeatMessage)\n }\n }, heartbeatInterval)\n heartbeatIntervalRef.current = intervalId\n }\n\n /**\n * 停止心跳定时器\n * 清理心跳相关的定时器资源\n */\n const stopHeartbeat = () => {\n if (heartbeatIntervalRef.current) {\n clearInterval(heartbeatIntervalRef.current as unknown as number)\n heartbeatIntervalRef.current = null\n }\n }\n\n /**\n * 停止重连定时器\n * 清理重连相关的定时器资源\n */\n const stopReconnectTimer = () => {\n if (reconnectIntervalRef.current) {\n clearTimeout(reconnectIntervalRef.current as unknown as number)\n reconnectIntervalRef.current = null\n }\n }\n\n /**\n * 尝试重新连接 WebSocket\n *\n * 重连条件:\n * 1. 组件未销毁\n * 2. 开启了重连机制\n * 3. 页面处于可见状态\n * 4. 未达到最大重连次数\n * 5. 当前没有进行中的重连操作\n */\n const tryReconnect = () => {\n // 组件已销毁,不再进行重连\n if (isDestroy.current) return\n\n // 只有在开启重连且页面可见时才进行重连\n if (isReconnect && !documentHide.current) {\n // 检查是否达到最大重连次数且当前没有重连操作\n if ((!isNumber(maxReconnectAttempts) || reconnectAttempts.current < maxReconnectAttempts) && isNullOrUnDef(reconnectIntervalRef.current)) {\n // 设置延迟重连\n reconnectIntervalRef.current = setTimeout(() => {\n console.log(`尝试第 ${reconnectAttempts.current + 1} 次重连...`, url)\n reconnectAttempts.current = reconnectAttempts.current + 1\n // 创建新的 WebSocket 连接并开始监听\n createAndListenWebSocket()\n // 停止当前的重连定时器\n stopReconnectTimer()\n }, reconnectInterval)\n } else {\n // 达到最大重连次数,停止重连\n if (isNumber(maxReconnectAttempts)) {\n console.log('达到最大重连尝试次数,停止重连')\n }\n }\n }\n }\n /**\n * 处理 WebSocket 连接打开事件\n * @param newSocket 新建立的 WebSocket 实例\n */\n const handleOpen = (newSocket: WebSocket) => {\n console.log('WebSocket 连接已打开')\n setSocketReadyState(newSocket.readyState)\n // 连接成功后启动心跳\n startHeartbeat(newSocket)\n // 重置重连计数器\n reconnectAttempts.current = 0\n }\n\n /**\n * 处理接收到消息事件\n * @param event WebSocket 消息事件\n */\n const handleMessage = (event: MessageEvent) => {\n // 只处理字符串类型的消息\n if (isString(event.data)) {\n try {\n // 尝试解析 JSON 格式的消息\n const parsedData = JSON.parse(event.data)\n onMessageEctype?.(parsedData)\n // 收到消息后重置心跳定时器\n stopHeartbeat()\n startHeartbeat(socketRef.current as WebSocket)\n } catch (error) {\n console.error('解析消息数据时出错:', error)\n }\n }\n }\n\n /**\n * 处理 WebSocket 连接关闭事件\n * @param event WebSocket 关闭事件\n */\n const handleClose = (event: CloseEvent) => {\n console.log('WebSocket 连接已关闭', event.code, event.reason)\n setSocketReadyState(event.code)\n // 停止心跳\n stopHeartbeat()\n // 调用用户自定义的关闭回调\n onClose?.()\n // 尝试重新连接\n tryReconnect()\n }\n\n /**\n * 处理 WebSocket 连接错误事件\n * @param error WebSocket 错误事件\n */\n const handleError = (error: Event) => {\n console.error('WebSocket 发生错误:', error)\n setSocketReadyState(null)\n // 停止心跳\n stopHeartbeat()\n // 尝试重新连接\n tryReconnect()\n }\n /**\n * 创建新的 WebSocket 连接并绑定事件监听器\n *\n * 此方法负责:\n * 1. 创建新的 WebSocket 实例\n * 2. 更新 socket 引用和状态\n * 3. 绑定所有 WebSocket 事件处理器\n */\n const createAndListenWebSocket = () => {\n const newSocket = new WebSocket(url)\n socketRef.current = newSocket\n setSocketReadyState(newSocket.readyState)\n\n // 绑定 WebSocket 事件处理器\n newSocket.onopen = () => handleOpen(newSocket)\n newSocket.onmessage = handleMessage\n newSocket.onclose = handleClose\n newSocket.onerror = handleError\n }\n\n /**\n * 处理页面可见性变化事件\n *\n * 逻辑说明:\n * - 当页面隐藏时,暂停心跳和重连机制,节省资源\n * - 当页面重新显示时,检查连接状态,如果未连接则尝试重连\n */\n const handleVisibilityChange = () => {\n documentHide.current = document.visibilityState === 'hidden'\n // 页面重新显示且连接未开启时,尝试重连\n if (socketRef.current?.readyState !== WebSocket.OPEN) {\n tryReconnect()\n }\n }\n\n /**\n * Hook 生命周期管理\n *\n * 初始化时:\n * - 创建 WebSocket 连接\n * - 监听页面可见性变化\n *\n * 清理时:\n * - 标记组件为已销毁状态\n * - 关闭 WebSocket 连接\n * - 清理所有定时器\n * - 移除事件监听器\n */\n useEffect(() => {\n if (!url) return\n\n // 重置销毁标志\n isDestroy.current = false\n // 创建 WebSocket 连接\n createAndListenWebSocket()\n // 监听页面可见性变化\n window.addEventListener('visibilitychange', handleVisibilityChange)\n\n return () => {\n // 组件卸载时的清理工作\n window.removeEventListener('visibilitychange', handleVisibilityChange)\n // 标记组件已销毁,阻止后续的重连和心跳操作\n isDestroy.current = true\n\n // 关闭 WebSocket 连接\n if (socketRef.current) {\n socketRef.current.close()\n return\n }\n\n // 清理定时器\n stopHeartbeat()\n stopReconnectTimer()\n }\n }, [url])\n\n /**\n * 发送消息到 WebSocket 服务器\n *\n * @param message 要发送的消息内容\n *\n * 发送逻辑:\n * 1. 检查 WebSocket 连接状态\n * 2. 只有在连接开启时才发送消息\n * 3. 发送后重置心跳定时器\n */\n const sendMessage = (message: string) => {\n if (socketRef.current?.readyState === WebSocket.OPEN) {\n socketRef.current.send(message)\n // 发送消息后重置心跳定时器\n stopHeartbeat()\n startHeartbeat(socketRef.current)\n } else {\n console.warn('WebSocket 未连接,无法发送消息:', message)\n }\n }\n\n return {\n /** 发送消息方法 */\n sendMessage,\n /** Socket 连接状态 */\n socketReadyState\n }\n}\n","import { LoadError, PageChangeEvent, PasswordStatus, PdfJs, RenderProtectedViewProps, Viewer, Worker } from '@react-pdf-viewer/core'\nimport { pageNavigationPlugin } from '@react-pdf-viewer/page-navigation'\n// import { printPlugin } from '@react-pdf-viewer/print'\n// import { rotatePlugin } from '@react-pdf-viewer/rotate'\n// import { searchPlugin } from '@react-pdf-viewer/search'\nimport { thumbnailPlugin } from '@react-pdf-viewer/thumbnail'\nimport { zoomPlugin } from '@react-pdf-viewer/zoom'\nimport { useEffect, useRef, useState } from 'react'\n\n// 注意:CMap 字体加载错误通常是由于缺少字体映射文件导致的\n// 解决方案:通过 transformGetDocumentParams 配置 cMapUrl 和 standardFontDataUrl\n//\n// 常见错误:\n// - \"CMapReaderFactory not initialized, see the `useWorkerFetch` parameter\"\n// - \"Error during font loading: CMapReaderFactory not initialized\"\n//\n// 解决步骤:\n// 1. 配置 cMapUrl 指向 CMap 文件目录\n// 2. 配置 standardFontDataUrl 指向标准字体目录\n// 3. 设置 cMapPacked: true 使用压缩文件\n// 4. 禁用字体子集化 (disableFontFace: false)\n\nimport '@react-pdf-viewer/core/lib/styles/index.css'\nimport zh_CN from '@react-pdf-viewer/locales/lib/zh_CN.json'\nimport '@react-pdf-viewer/page-navigation/lib/styles/index.css'\nimport { useRefState } from '../../hooks'\nimport { isNumber } from '../../utils'\n// import '@react-pdf-viewer/print/lib/styles/index.css'\n// import '@react-pdf-viewer/rotate/lib/styles/index.css' // 注释掉,因为rotate包没有这个文件\n// import '@react-pdf-viewer/search/lib/styles/index.css'\nimport '@react-pdf-viewer/thumbnail/lib/styles/index.css'\nimport '@react-pdf-viewer/zoom/lib/styles/index.css'\nimport { Alert, Button, Flex, Form, Input, Splitter } from 'antd'\nimport styles from './styles.module.less'\n\nconst ProtectedView = ({\n passwordStatus,\n verifyPassword,\n onVerifyPasswordEnd\n}: RenderProtectedViewProps & { onVerifyPasswordEnd: (password: string) => void }) => {\n const [form] = Form.useForm()\n const onSubmit = (): void => {\n form.validateFields().then((values) => {\n if (values) {\n verifyPassword(values.password)\n onVerifyPasswordEnd(values.password)\n }\n })\n }\n\n return (\n <Flex justify=\"center\" align=\"center\" className=\"height-full\">\n <div style={{ width: 300 }}>\n {passwordStatus === PasswordStatus.WrongPassword && <Alert message=\"密码无效。请再试一次!\" type=\"error\" />}\n <Form form={form} size=\"large\" className=\"m-t-24\">\n <Form.Item name=\"password\" rules={[{ required: true, message: '请输入密码' }]}>\n <Input.Password autoComplete=\"new-password\" placeholder=\"请输入密码\" />\n </Form.Item>\n <Flex justify=\"center\">\n <Button type=\"primary\" onClick={onSubmit}>\n 提 交\n </Button>\n </Flex>\n </Form>\n </div>\n </Flex>\n )\n}\n/**\n * PDF预览组件属性接口\n */\nexport interface PdfPreviewProps {\n /** PDF文件URL地址 */\n fileUrl: string\n /** 当前页码,默认为1 */\n pageNo?: number\n /** 缩放比例,默认为1 */\n scale?: number\n /** 是否显示缩略图,默认为true */\n isHasThumbnails?: boolean\n /** PDF文件密码 */\n password?: string\n /** 密码设置回调 */\n onSetPassword?: (password: string) => void\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n}\n\n/**\n * PDF预览组件\n * 基于react-pdf-viewer实现的PDF文件预览功能\n * 支持密码保护、缩略图、缩放、页面导航等功能\n * @param props - 组件属性\n */\nexport default ({ password, fileUrl, pageNo = 1, scale = 1, isHasThumbnails = true, onSetPassword, onSetPageNo }: PdfPreviewProps) => {\n const embedRef = useRef<HTMLDivElement>(null)\n const [sizes, setSizes] = useState<number[]>([0])\n const [, setDocLoaded, getDocLoaded] = useRefState(false)\n const [currentPage, setCurrentPage, getCurrentPage] = useRefState<number | undefined>(undefined)\n const [temporaryPassword, setTemporaryPassword] = useState('')\n const jumpToPageNo = useRef<number>()\n const onVerifyPasswordEnd = (password: string) => {\n setTemporaryPassword(password)\n }\n\n const pageNavigationPluginInstance = pageNavigationPlugin({ enableShortcuts: true })\n const thumbnailPluginInstance = thumbnailPlugin({\n thumbnailWidth: sizes[0] - 70 // 不会自适应\n })\n const zoomPluginInstance = zoomPlugin()\n // const printPluginInstance = printPlugin()\n // const rotatePluginInstance = rotatePlugin()\n // const searchPluginInstance = searchPlugin()\n\n // 获取插件组件\n const { Thumbnails } = thumbnailPluginInstance\n const { ZoomIn, ZoomOut } = zoomPluginInstance // Zoom\n // const { Print } = printPluginInstance\n // const { Rotate } = rotatePluginInstance\n // const { Search } = searchPluginInstance\n\n // 工具栏组件\n const Toolbar = () => (\n <Flex gap={6} align=\"center\" className={styles.pdfToolbar}>\n <ZoomIn />\n <ZoomOut />\n {/* <Print /> */}\n {/* <Rotate /> */}\n {/* <Search /> */}\n {/* <Tooltip title=\"全屏\">\n <Button\n type=\"text\"\n icon={<FullscreenOutlined />}\n onClick={() => {\n const element = embedRef.current?.querySelector('.rpv-core__viewer')\n if (element) {\n if (document.fullscreenElement) {\n document.exitFullscreen()\n } else {\n element.requestFullscreen()\n }\n }\n }}\n size=\"small\"\n />\n </Tooltip> */}\n </Flex>\n )\n const onJumpToPage = (pageNo?: number) => {\n // console.log('跳转页面', jumpToPageNo.current, getCurrentPage(), pageNo)\n if (getDocLoaded()) {\n if (pageNo && pageNo - 1 !== getCurrentPage()) {\n jumpToPageNo.current = pageNo - 1\n pageNavigationPluginInstance.jumpToPage(jumpToPageNo.current)\n }\n }\n }\n const handleDocumentLoad = () => {\n // console.log('文档加载完成', pageNo)\n setSizes([400])\n setDocLoaded(true)\n onJumpToPage(pageNo)\n if (temporaryPassword) {\n onSetPassword?.(temporaryPassword)\n setTemporaryPassword('')\n }\n }\n useEffect(() => {\n // console.log('pdfUrl', fileUrl)\n setCurrentPage(undefined)\n setDocLoaded(false)\n setSizes([0])\n }, [fileUrl])\n useEffect(() => {\n // console.log('pageNo变化', pageNo)\n setTimeout(() => {\n // 要在fileUrl变化之后执行\n onJumpToPage(pageNo)\n }, 0)\n }, [pageNo])\n const renderError = (error: LoadError) => {\n let message = ''\n switch (error.name) {\n case 'InvalidPDFException':\n message = '文件无效或已损坏'\n break\n case 'MissingPDFException':\n message = '文件不存在'\n break\n case 'UnexpectedResponseException':\n message = '意外的服务器响应'\n break\n // case 'CMapReaderFactory not initialized':\n // message = '字体映射文件加载失败,请刷新页面重试'\n // break\n default:\n message = '无法加载文档'\n break\n }\n\n return (\n <Flex className=\"height-full\" justify=\"center\" align=\"center\">\n <Alert message={message} type=\"error\" showIcon />\n </Flex>\n )\n }\n const onPageChange = (e: PageChangeEvent) => {\n // console.log('页面切换', jumpToPageNo.current, e.currentPage)\n let newCurrentPage = e.currentPage\n if (isNumber(jumpToPageNo.current)) {\n // 以方法跳转优先\n newCurrentPage = jumpToPageNo.current\n setTimeout(() => {\n jumpToPageNo.current = undefined\n }, 1000)\n }\n setCurrentPage(newCurrentPage)\n }\n useEffect(() => {\n // console.log('currentPage', currentPage)\n if (!(embedRef.current && isNumber(currentPage))) return\n // 设置当前页高亮\n setTimeout(() => {\n // console.log('设置当前页高亮', currentPage, embedRef.current?.querySelectorAll('.rpv-core__viewer .rpv-core__page-layer'))\n const pages = embedRef.current?.querySelectorAll('.rpv-core__viewer .rpv-core__page-layer')\n pages?.forEach((page) => {\n if (Number(page.getAttribute('data-virtual-index')) === currentPage) {\n page.classList.add('current-page-highlight')\n } else {\n // 移除所有已有高亮\n page.classList.remove('current-page-highlight')\n }\n })\n }, 500)\n onSetPageNo?.(currentPage + 1)\n }, [currentPage])\n\n // 监听 CMap 加载错误\n // useEffect(() => {\n // const handleCMapError = (event: ErrorEvent) => {\n // if (event.error && event.error.message && event.error.message.includes('CMapReaderFactory')) {\n // console.warn('CMap 字体映射文件加载失败,这可能导致中文字体显示异常')\n // console.warn('建议检查网络连接或刷新页面重试')\n // }\n // }\n\n // window.addEventListener('error', handleCMapError)\n // return () => window.removeEventListener('error', handleCMapError)\n // }, [])\n return (\n <div ref={embedRef} className={styles.nsPreviewPdf}>\n <Worker workerUrl={`//logosdata.cn/public/pdf/pdf.worker.min.js`}>\n <Splitter onResize={setSizes}>\n {isHasThumbnails && (\n <Splitter.Panel resizable={false} size={sizes[0]} min={250} max={500} collapsible>\n <Thumbnails />\n </Splitter.Panel>\n )}\n <Splitter.Panel>\n <div className=\"height-full\">\n <Viewer\n localization={zh_CN}\n withCredentials={true}\n onDocumentAskPassword={(e) => {\n // 自动执行,失败弹窗renderProtectedView\n // console.log('密码验证', password, e)\n setTemporaryPassword('')\n e.verifyPassword(password || '')\n }}\n // 不加disableStream的情况onDocumentAskPassword有bug,输不了密码\n transformGetDocumentParams={(options: PdfJs.GetDocumentParams) => {\n return Object.assign({}, options, {\n // disableRange: false,\n disableStream: true, // 建议传入是否加密字段来控制\n httpHeaders: { 'Cache-Control': 'no-cache' },\n // 启用 CMap 支持,解决中文字体显示问题\n // cMapUrl: 指定 CMap 文件的 URL,用于处理非拉丁字符(如中文)\n // cMapPacked: 使用压缩的 CMap 文件以提高性能\n cMapUrl: '//logosdata.cn/public/pdf/pdfjs-dist@3.2.146/cmaps/', // 使用可用的源\n cMapPacked: true,\n // 禁用字体子集化,确保完整字体加载\n disableFontFace: false,\n // 启用标准字体支持\n standardFontDataUrl: '//logosdata.cn/public/pdf/pdfjs-dist@3.2.146/standard_fonts/',\n // 设置字体回退策略\n fallbackFontName: 'Helvetica'\n })\n }}\n fileUrl={fileUrl}\n defaultScale={scale}\n // defaultScale={SpecialZoomLevel.PageFit}\n plugins={[\n pageNavigationPluginInstance,\n thumbnailPluginInstance,\n zoomPluginInstance\n // printPluginInstance,\n // rotatePluginInstance,\n // searchPluginInstance,\n ]}\n onPageChange={onPageChange}\n // renderPage={() => <></>} // 加水印\n renderError={renderError}\n onDocumentLoad={handleDocumentLoad}\n renderProtectedView={(renderProps) => <ProtectedView onVerifyPasswordEnd={onVerifyPasswordEnd} {...renderProps} />}\n />\n <Toolbar />\n </div>\n </Splitter.Panel>\n </Splitter>\n </Worker>\n </div>\n )\n}\n","import { Empty, Flex, Image, Result } from 'antd'\nimport { useMemo } from 'react'\nimport VideoPlayer from './VideoPlayer'\n\nimport AudioPlayer from './AudioPlayer'\nimport MarkdownPreview from './MarkdownPreview'\nimport PdfPreview from './PdfPreview'\nimport styles from './styles.module.less'\n\n/**\n * 文件预览组件属性接口\n */\nexport interface FilePreviewProps {\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** PDF文件密码 */\n password?: string\n /** 搜索关键字 */\n searchValue?: string\n /** PDF预览参数 */\n pdfParams?: {\n /** 当前页码 */\n pageNo?: number\n /** 缩放比例 */\n scale?: number\n /** 是否显示缩略图 */\n isHasThumbnails?: boolean\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n }\n /** 文件参数 */\n fileParams?: ObjectType<string>\n /** 密码设置成功回调 */\n onSetPassSuccess?: () => void\n}\n\n/**\n * 文件预览组件\n * 支持图片、PDF、视频、音频、Markdown等文件格式的预览\n * @param props - 组件属性\n */\nexport default ({ suffix, fileUrl, pdfParams, password, searchValue }: FilePreviewProps) => {\n // const fileUrl = useMemo(() => {\n // return getPreViewFileUrl({ ...extraParams, fileId, preview: true })\n // }, [fileId])\n // const onSetPassword = async (password: string) => {\n // // console.log('onSetPassword', password)\n // try {\n // await updateCaseFile({\n // ...fileParams,\n // filePassword: password,\n // mimeType: suffix\n // } as CaseFileUpdateType)\n // onSetPassSuccess?.()\n // } finally {\n // }\n // }\n const Preview = useMemo(() => {\n if (!fileUrl) {\n return <Empty />\n }\n switch (suffix?.toUpperCase()) {\n case 'PNG':\n case 'JPG':\n case 'JPEG':\n case 'GIF':\n return <Image rootClassName={styles.nsPreviewImage} src={fileUrl} alt=\"预览图片\" />\n\n case 'PDF':\n return <PdfPreview fileUrl={fileUrl} {...pdfParams} password={password} /> // onSetPassword={onSetPassword}\n\n case 'MP4':\n // case 'MOV':\n // case 'AVI':\n // case 'FLV':\n return <VideoPlayer fileUrl={fileUrl} />\n\n case 'MP3':\n return <AudioPlayer fileUrl={fileUrl} />\n\n case 'MD':\n case 'MARKDOWN':\n return <MarkdownPreview fileUrl={fileUrl} searchValue={searchValue} />\n\n default:\n return <Result subTitle={`暂不支持 ${suffix || ''} 文件的预览`} />\n }\n }, [suffix, fileUrl, pdfParams])\n\n return (\n <Flex justify=\"center\" align=\"center\" className=\"height-full\">\n {Preview}\n </Flex>\n )\n}\n","import { Drawer } from 'antd'\nimport FilePreview from './FilePreview'\n\n/**\n * 文件预览抽屉组件属性接口\n */\nexport interface FilePreviewDrawerProps {\n /** 是否打开抽屉 */\n open: boolean\n /** 关闭抽屉的回调函数 */\n onClose: () => void\n /** 抽屉标题,默认为'文件预览' */\n title?: string\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** PDF文件密码 */\n password?: string\n /** 文件参数 */\n fileParams?: ObjectType<string>\n /** PDF预览参数 */\n pdfParams?: {\n /** 当前页码 */\n pageNo?: number\n /** 缩放比例 */\n scale?: number\n /** 是否显示缩略图 */\n isHasThumbnails?: boolean\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n }\n /** 密码设置成功回调 */\n onSetPassSuccess?: () => void\n}\n\n/**\n * 文件预览抽屉组件\n * 在抽屉中显示文件预览,支持各种文件格式\n * 全屏显示,提供更好的文件查看体验\n *\n * @example\n * <FilePreviewDrawer\n * open={isOpen}\n * fileUrl=\"https://example.com/file.pdf\"\n * suffix=\"pdf\"\n * title=\"PDF文件预览\"\n * onClose={() => setIsOpen(false)}\n * />\n *\n * @param props - 组件属性\n * @returns 文件预览抽屉组件\n */\nexport default ({\n open,\n fileUrl,\n suffix,\n title = '文件预览',\n onClose,\n password,\n fileParams,\n pdfParams,\n onSetPassSuccess\n}: FilePreviewDrawerProps) => {\n return (\n <Drawer\n title={title}\n push={false}\n width=\"100%\"\n open={open}\n onClose={onClose}\n // 全屏宽度,提供更好的文件预览体验\n >\n <FilePreview\n fileUrl={fileUrl}\n suffix={suffix}\n password={password}\n fileParams={fileParams}\n pdfParams={pdfParams}\n onSetPassSuccess={onSetPassSuccess}\n />\n </Drawer>\n )\n}\n",".iframe {\n width: 100%;\n height: 100%;\n border: none;\n overflow: auto;\n display: block;\n}\n","import { Spin } from 'antd'\nimport classNames from 'classnames'\nimport { forwardRef, useEffect, useMemo, useState } from 'react'\nimport { addUrlLastSlash, buildUrlParams, setUrlMainSource } from '../../utils'\nimport styles from './styles.module.less'\n\n/**\n * Iframe组件属性接口\n */\nexport interface IframeProps {\n /** 默认主源 */\n defaultMainSource?: string\n /** iframe ID */\n id?: string\n /** iframe源地址 */\n src: string\n /** 自定义类名 */\n className?: string\n /** 加载完成回调 */\n onLoad?: () => void\n}\n\n/**\n * Iframe组件\n * 支持加载状态、URL参数处理、防缓存等功能\n * @param props - 组件属性\n */\nexport default forwardRef<HTMLIFrameElement, IframeProps>(({ defaultMainSource, id, src, className, onLoad }: IframeProps, ref) => {\n const [loading, setLoading] = useState(false)\n const finalSrc = useMemo(() => {\n return buildUrlParams({ v: Date.now() }, addUrlLastSlash(setUrlMainSource(src, location.href, defaultMainSource)))\n }, [src])\n const onHandleLoad = () => {\n setLoading(false)\n onLoad?.()\n }\n useEffect(() => {\n setLoading(true)\n }, [src])\n\n return (\n <>\n <Spin spinning={loading} wrapperClassName=\"full-spin\" tip=\"加载中...\">\n <iframe\n id={id}\n ref={ref}\n src={finalSrc}\n className={classNames(styles.iframe, className)}\n onLoad={onHandleLoad}\n allow=\"clipboard-write\"\n ></iframe>\n </Spin>\n </>\n )\n})\n","import TiptapLink from '@tiptap/extension-link'\nimport { Plugin, TextSelection } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\nimport { getMarkRange } from '@tiptap/react'\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])'\n }\n ]\n },\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n ...(this.parent?.() || []),\n new Plugin({\n props: {\n handleKeyDown: (_: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state\n\n if (event.key === 'Escape' && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false })\n }\n\n return false\n },\n handleClick(view, pos) {\n const { schema, doc, tr } = view.state\n let range: ReturnType<typeof getMarkRange> | undefined\n\n if (schema.marks.link) {\n range = getMarkRange(doc.resolve(pos), schema.marks.link)\n }\n\n if (!range) {\n return\n }\n\n const { from, to } = range\n const start = Math.min(from, to)\n const end = Math.max(from, to)\n\n if (pos < start || pos > end) {\n return\n }\n\n const $start = doc.resolve(start)\n const $end = doc.resolve(end)\n const transaction = tr.setSelection(new TextSelection($start, $end))\n\n view.dispatch(transaction)\n }\n }\n })\n ]\n }\n})\n\nexport default Link\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport { Extension, isNodeSelection } from '@tiptap/react'\n\nexport const Selection = Extension.create({\n name: 'selection',\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n new Plugin({\n key: new PluginKey('selection'),\n props: {\n decorations(state) {\n if (state.selection.empty) {\n return null\n }\n\n if (editor.isFocused === true || !editor.isEditable) {\n return null\n }\n\n if (isNodeSelection(state.selection)) {\n return null\n }\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(state.selection.from, state.selection.to, {\n class: 'selection'\n })\n ])\n }\n }\n })\n ]\n }\n})\n\nexport default Selection\n","import type { Node, NodeType } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Extension } from '@tiptap/react'\n\nfunction nodeEqualsType({ types, node }: { types: NodeType | NodeType[]; node: Node | null }) {\n if (!node) return false\n\n if (Array.isArray(types)) {\n return types.includes(node.type)\n }\n\n return node.type === types\n}\n\nexport interface TrailingNodeOptions {\n node: string\n notAfter: string[]\n}\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph']\n }\n },\n\n addProseMirrorPlugins() {\n const plugin = new PluginKey(this.name)\n const disabledNodes = Object.entries(this.editor.schema.nodes)\n .map(([, value]) => value)\n .filter((node) => this.options.notAfter.includes(node.name))\n\n return [\n new Plugin({\n key: plugin,\n appendTransaction: (_, __, state) => {\n const { doc, tr, schema } = state\n const shouldInsertNodeAtEnd = plugin.getState(state)\n const endPosition = doc.content.size\n const type = schema.nodes[this.options.node]\n\n if (!shouldInsertNodeAtEnd) {\n return null\n }\n\n if (type) {\n return tr.insert(endPosition, type.create())\n }\n\n return null\n },\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value\n }\n\n const lastNode = tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n }\n }\n })\n ]\n }\n})\n\nexport default TrailingNode\n","import './tooltip.less'\nimport {\n autoUpdate,\n flip,\n FloatingDelayGroup,\n FloatingPortal,\n offset,\n shift,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useMergeRefs,\n useRole,\n type Placement,\n type ReferenceType,\n type UseFloatingReturn\n} from '@floating-ui/react'\nimport * as React from 'react'\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<React.HTMLProps<HTMLElement>, 'ref'> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>\n getFloatingProps: (userProps?: React.HTMLProps<HTMLDivElement>) => 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] = React.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 React.useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = React.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 <TooltipContext.Provider value={tooltip}>{children}</TooltipContext.Provider>\n }\n\n return (\n <FloatingDelayGroup delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }} timeoutMs={props.timeout}>\n <TooltipContext.Provider value={tooltip}>{children}</TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = React.forwardRef<HTMLElement, TooltipTriggerProps>(function TooltipTrigger(\n { children, asChild = false, ...props },\n propRef\n) {\n const context = useTooltipContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.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 && React.isValidElement(children)) {\n const dataAttributes = {\n 'data-tooltip-state': context.open ? 'open' : 'closed'\n }\n\n return React.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 ref={ref} data-tooltip-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n )\n})\n\nexport const TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(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\nTooltip.displayName = 'Tooltip'\nTooltipTrigger.displayName = 'TooltipTrigger'\nTooltipContent.displayName = 'TooltipContent'\n","import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'\nimport * as React from 'react'\n\nimport './button-colors.less'\nimport './button-group.less'\nimport './button.less'\n\ntype PlatformShortcuts = Record<string, string>\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n}\n\nexport const MAC_SYMBOLS: PlatformShortcuts = {\n ctrl: '⌘',\n alt: '⌥',\n shift: '⇧'\n} as const\n\nexport const formatShortcutKey = (key: string, isMac: boolean) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || key.toUpperCase()\n }\n return key.charAt(0).toUpperCase() + key.slice(1)\n}\n\nexport const parseShortcutKeys = (shortcutKeys: string | undefined, isMac: boolean) => {\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split('-')\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac))\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({ shortcuts }) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <React.Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </React.Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className = '', children, tooltip, showTooltip = true, shortcutKeys, 'aria-label': ariaLabel, ...props }, ref) => {\n const isMac = React.useMemo(() => typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac'), [])\n\n const shortcuts = React.useMemo(() => parseShortcutKeys(shortcutKeys, isMac), [shortcutKeys, isMac])\n\n if (!tooltip || !showTooltip) {\n return (\n <button className={`tiptap-button ${className}`.trim()} ref={ref} aria-label={ariaLabel} {...props}>\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger className={`tiptap-button ${className}`.trim()} ref={ref} aria-label={ariaLabel} {...props}>\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 * as React from 'react'\n\ntype SpacerOrientation = 'horizontal' | 'vertical'\n\ninterface SpacerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: SpacerOrientation\n size?: string | number\n}\n\nexport const Spacer = React.forwardRef<HTMLDivElement, SpacerProps>(\n ({ orientation = 'horizontal', size, className = '', style = {}, ...props }, ref) => {\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 ref={ref} {...props} className={className} style={computedStyle} />\n }\n)\n\nSpacer.displayName = 'Spacer'\n","import './separator.less'\nimport * as React from 'react'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation\n decorative?: boolean\n}\n\nexport const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ decorative, orientation = 'vertical', className = '', ...divProps }, ref) => {\n const ariaOrientation = orientation === 'vertical' ? orientation : undefined\n const semanticProps = decorative ? { role: 'none' } : { 'aria-orientation': ariaOrientation, role: 'separator' }\n\n return <div className={`tiptap-separator ${className}`.trim()} data-orientation={orientation} {...semanticProps} {...divProps} ref={ref} />\n }\n)\n\nSeparator.displayName = 'Separator'\n","import { Separator } from '../../tiptap-ui-primitive/separator'\nimport './toolbar.less'\nimport * as React from 'react'\n\ntype BaseProps = React.HTMLAttributes<HTMLDivElement>\n\ninterface ToolbarProps extends BaseProps {\n variant?: 'floating' | 'fixed'\n}\n\nconst mergeRefs = <T,>(refs: Array<React.RefObject<T> | React.Ref<T> | null | undefined>): React.RefCallback<T> => {\n return (value) => {\n refs.forEach((ref) => {\n if (typeof ref === 'function') {\n ref(value)\n } else if (ref != null) {\n ;(ref as React.MutableRefObject<T | null>).current = value\n }\n })\n }\n}\n\nconst useObserveVisibility = (ref: React.RefObject<HTMLElement | null>, callback: () => void): void => {\n React.useEffect(() => {\n const element = ref.current\n if (!element) return\n\n let isMounted = true\n\n if (isMounted) {\n requestAnimationFrame(callback)\n }\n\n const observer = new MutationObserver(() => {\n if (isMounted) {\n requestAnimationFrame(callback)\n }\n })\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n attributes: true\n })\n\n return () => {\n isMounted = false\n observer.disconnect()\n }\n }, [ref, callback])\n}\n\nconst useToolbarKeyboardNav = (toolbarRef: React.RefObject<HTMLDivElement | null>): void => {\n React.useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const getFocusableElements = () =>\n Array.from(toolbar.querySelectorAll<HTMLElement>('button:not([disabled]), [role=\"button\"]:not([disabled]), [tabindex=\"0\"]:not([disabled])'))\n\n const navigateToIndex = (e: KeyboardEvent, targetIndex: number, elements: HTMLElement[]) => {\n e.preventDefault()\n let nextIndex = targetIndex\n\n if (nextIndex >= elements.length) {\n nextIndex = 0\n } else if (nextIndex < 0) {\n nextIndex = elements.length - 1\n }\n\n elements[nextIndex]?.focus()\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const focusableElements = getFocusableElements()\n if (!focusableElements.length) return\n\n const currentElement = document.activeElement as HTMLElement\n const currentIndex = focusableElements.indexOf(currentElement)\n\n if (!toolbar.contains(currentElement)) return\n\n const keyActions: Record<string, () => void> = {\n ArrowRight: () => navigateToIndex(e, currentIndex + 1, focusableElements),\n ArrowDown: () => navigateToIndex(e, currentIndex + 1, focusableElements),\n ArrowLeft: () => navigateToIndex(e, currentIndex - 1, focusableElements),\n ArrowUp: () => navigateToIndex(e, currentIndex - 1, focusableElements),\n Home: () => navigateToIndex(e, 0, focusableElements),\n End: () => navigateToIndex(e, focusableElements.length - 1, focusableElements)\n }\n\n const action = keyActions[e.key]\n if (action) {\n action()\n }\n }\n\n toolbar.addEventListener('keydown', handleKeyDown)\n return () => toolbar.removeEventListener('keydown', handleKeyDown)\n }, [toolbarRef])\n}\n\nconst useToolbarVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const toolbar = ref.current\n if (!toolbar) return\n\n // Check if any group has visible children\n const hasVisibleChildren = Array.from(toolbar.children).some((child) => {\n if (!(child instanceof HTMLElement)) return false\n if (child.getAttribute('role') === 'group') {\n return child.children.length > 0\n }\n return false\n })\n\n setIsVisible(hasVisibleChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nconst useGroupVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const group = ref.current\n if (!group) return\n\n const hasVisibleChildren = Array.from(group.children).some((child) => {\n if (!(child instanceof HTMLElement)) return false\n return true\n })\n\n setIsVisible(hasVisibleChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nconst useSeparatorVisibility = (ref: React.RefObject<HTMLDivElement | null>): boolean => {\n const [isVisible, setIsVisible] = React.useState(true)\n const isMountedRef = React.useRef(false)\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n const checkVisibility = React.useCallback(() => {\n if (!isMountedRef.current) return\n\n const separator = ref.current\n if (!separator) return\n\n const prevSibling = separator.previousElementSibling as HTMLElement\n const nextSibling = separator.nextElementSibling as HTMLElement\n\n if (!prevSibling || !nextSibling) {\n setIsVisible(false)\n return\n }\n\n const areBothGroups = prevSibling.getAttribute('role') === 'group' && nextSibling.getAttribute('role') === 'group'\n\n const haveBothChildren = prevSibling.children.length > 0 && nextSibling.children.length > 0\n\n setIsVisible(areBothGroups && haveBothChildren)\n }, [ref])\n\n useObserveVisibility(ref, checkVisibility)\n return isVisible\n}\n\nexport const Toolbar = React.forwardRef<HTMLDivElement, ToolbarProps>(({ children, className, variant = 'fixed', ...props }, ref) => {\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useToolbarVisibility(toolbarRef)\n\n useToolbarKeyboardNav(toolbarRef)\n\n if (!isVisible) return null\n\n return (\n <div\n ref={mergeRefs([toolbarRef, ref])}\n role=\"toolbar\"\n aria-label=\"toolbar\"\n data-variant={variant}\n className={`tiptap-toolbar ${className || ''}`}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nToolbar.displayName = 'Toolbar'\n\nexport const ToolbarGroup = React.forwardRef<HTMLDivElement, BaseProps>(({ children, className, ...props }, ref) => {\n const groupRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useGroupVisibility(groupRef)\n\n if (!isVisible) return null\n\n return (\n <div ref={mergeRefs([groupRef, ref])} role=\"group\" className={`tiptap-toolbar-group ${className || ''}`} {...props}>\n {children}\n </div>\n )\n})\n\nToolbarGroup.displayName = 'ToolbarGroup'\n\nexport const ToolbarSeparator = React.forwardRef<HTMLDivElement, BaseProps>(({ ...props }, ref) => {\n const separatorRef = React.useRef<HTMLDivElement>(null)\n const isVisible = useSeparatorVisibility(separatorRef)\n\n if (!isVisible) return null\n\n return <Separator ref={mergeRefs([separatorRef, ref])} orientation=\"vertical\" decorative {...props} />\n})\n\nToolbarSeparator.displayName = 'ToolbarSeparator'\n","import type { Editor } from '@tiptap/react'\nimport { useCurrentEditor } from '@tiptap/react'\nimport * as React from 'react'\n\nexport function useTiptapEditor(providedEditor?: Editor | null): Editor | null {\n const { editor: coreEditor } = useCurrentEditor()\n return React.useMemo(() => providedEditor || coreEditor, [providedEditor, coreEditor])\n}\n","import * as React from 'react'\n\nexport const ChevronDownIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M6 3C6.55228 3 7 3.44772 7 4V11H17V4C17 3.44772 17.4477 3 18 3C18.5523 3 19 3.44772 19 4V20C19 20.5523 18.5523 21 18 21C17.4477 21 17 20.5523 17 20V13H7V20C7 20.5523 6.55228 21 6 21C5.44772 21 5 20.5523 5 20V4C5 3.44772 5.44772 3 6 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingIcon.displayName = 'HeadingIcon'\n","import type { Attrs, Node } from '@tiptap/pm/model'\nimport type { Editor } from '@tiptap/react'\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\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 = (markName: string, editor: Editor | null): 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 = (nodeName: string, editor: Editor | null): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.nodes.get(nodeName) !== undefined\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(editor: Editor | null, markName: string): Attrs | null {\n if (!editor) return null\n const { state } = editor\n const marks = state.storedMarks || state.selection.$from.marks()\n const mark = marks.find((mark) => mark.type.name === markName)\n\n return mark?.attrs ?? null\n}\n\n/**\n * Checks if a node is empty\n */\nexport function isEmptyNode(node?: Node | null): boolean {\n return !!node && node.content.size === 0\n}\n\n/**\n * Utility function to conditionally join class names into a single string.\n * Filters out falsey values like false, undefined, null, and empty strings.\n *\n * @param classes - List of class name strings or falsey values.\n * @returns A single space-separated string of valid class names.\n */\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ')\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: { editor: Editor | null; node?: Node | null; nodePos?: number | null }): { pos: number; node: Node } | 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 = nodePos !== undefined && nodePos !== null\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n if (hasValidPos) {\n try {\n const nodeAtPos = editor.state.doc.nodeAt(nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n } catch (error) {\n console.error('Error checking node at position:', error)\n return null\n }\n }\n\n // Otherwise search for the node in the document\n let foundPos = -1\n let foundNode: Node | 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 return foundPos !== -1 && foundNode !== null ? { pos: foundPos, node: foundNode } : null\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(`File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`)\n }\n\n // For demo/testing: Simulate upload progress\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) => {\n setTimeout(resolve, 500)\n })\n onProgress?.({ progress })\n }\n\n return '/images/placeholder-image.png'\n\n // Uncomment for production use:\n // return convertFileToBase64(file, abortSignal);\n}\n\n/**\n * Converts a File to base64 string\n * @param file The file to convert\n * @param abortSignal Optional AbortSignal for cancelling the conversion\n * @returns Promise resolving to the base64 representation of the file\n */\nexport const convertFileToBase64 = (file: File, abortSignal?: AbortSignal): Promise<string> => {\n if (!file) {\n return Promise.reject(new Error('No file provided'))\n }\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n\n const abortHandler = () => {\n reader.abort()\n reject(new Error('Upload cancelled'))\n }\n\n if (abortSignal) {\n abortSignal.addEventListener('abort', abortHandler)\n }\n\n reader.onloadend = () => {\n if (abortSignal) {\n abortSignal.removeEventListener('abort', abortHandler)\n }\n\n if (typeof reader.result === 'string') {\n resolve(reader.result)\n } else {\n reject(new Error('Failed to convert File to base64'))\n }\n }\n\n reader.onerror = (error) => reject(new Error(`File reading error: ${error}`))\n reader.readAsDataURL(file)\n })\n}\n","import * as React from 'react'\n\nexport const HeadingFiveIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingFourIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingOneIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingSixIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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","import * as React from 'react'\n\nexport const HeadingThreeIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HeadingTwoIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { HeadingFiveIcon } from '../../tiptap-icons/heading-five-icon'\nimport { HeadingFourIcon } from '../../tiptap-icons/heading-four-icon'\nimport { HeadingOneIcon } from '../../tiptap-icons/heading-one-icon'\nimport { HeadingSixIcon } from '../../tiptap-icons/heading-six-icon'\nimport { HeadingThreeIcon } from '../../tiptap-icons/heading-three-icon'\nimport { HeadingTwoIcon } from '../../tiptap-icons/heading-two-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeadingButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The heading level.\n */\n level: Level\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the heading is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\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 headingShortcutKeys: Partial<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\nexport function canToggleHeading(editor: Editor | null, level: Level): boolean {\n if (!editor) return false\n\n try {\n return editor.can().toggleNode('heading', 'paragraph', { level })\n } catch {\n return false\n }\n}\n\nexport function isHeadingActive(editor: Editor | null, level: Level): boolean {\n if (!editor) return false\n return editor.isActive('heading', { level })\n}\n\nexport function toggleHeading(editor: Editor | null, level: Level): void {\n if (!editor) return\n\n if (editor.isActive('heading', { level })) {\n editor.chain().focus().setNode('paragraph').run()\n } else {\n editor.chain().focus().toggleNode('heading', 'paragraph', { level }).run()\n }\n}\n\nexport function isHeadingButtonDisabled(editor: Editor | null, level: Level, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (!canToggleHeading(editor, level)) return true\n return false\n}\n\nexport function shouldShowHeadingButton(params: {\n editor: Editor | null\n level: Level\n hideWhenUnavailable: boolean\n headingInSchema: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, headingInSchema } = params\n\n if (!headingInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection)) {\n return false\n }\n }\n\n return true\n}\n\nexport function getFormattedHeadingName(level: Level): string {\n return `标题 ${level}`\n}\n\nexport function useHeadingState(editor: Editor | null, level: Level, disabled: boolean = false) {\n const headingInSchema = isNodeInSchema('heading', editor)\n const isDisabled = isHeadingButtonDisabled(editor, level, disabled)\n const isActive = isHeadingActive(editor, level)\n\n const Icon = headingIcons[level]\n const shortcutKey = headingShortcutKeys[level]\n const formattedName = getFormattedHeadingName(level)\n\n return {\n headingInSchema,\n isDisabled,\n isActive,\n Icon,\n shortcutKey,\n formattedName\n }\n}\n\nexport const HeadingButton = React.forwardRef<HTMLButtonElement, HeadingButtonProps>(\n ({ editor: providedEditor, level, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { headingInSchema, isDisabled, isActive, Icon, shortcutKey, formattedName } = useHeadingState(editor, level, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleHeading(editor, level)\n }\n },\n [onClick, isDisabled, editor, level]\n )\n\n const show = React.useMemo(() => {\n return shouldShowHeadingButton({\n editor,\n level,\n hideWhenUnavailable,\n headingInSchema\n })\n }, [editor, level, hideWhenUnavailable, headingInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={formattedName}\n aria-pressed={isActive}\n tooltip={formattedName}\n shortcutKeys={shortcutKey}\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\nHeadingButton.displayName = 'HeadingButton'\n\nexport default HeadingButton\n","import './dropdown-menu.less'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\nimport type { Placement } from '@floating-ui/react'\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingPortal,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n useTypeahead\n} from '@floating-ui/react'\nimport * as React from 'react'\n\ninterface DropdownMenuOptions {\n initialOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n}\n\ninterface DropdownMenuProps extends DropdownMenuOptions {\n children: React.ReactNode\n}\n\ntype ContextType = ReturnType<typeof useDropdownMenu> & {\n updatePosition: (side: 'top' | 'right' | 'bottom' | 'left', align: 'start' | 'center' | 'end') => void\n}\n\nconst DropdownMenuContext = React.createContext<ContextType | null>(null)\n\nfunction useDropdownMenuContext() {\n const context = React.useContext(DropdownMenuContext)\n if (!context) {\n throw new Error('DropdownMenu components must be wrapped in <DropdownMenu />')\n }\n return context\n}\n\nfunction useDropdownMenu({\n initialOpen = false,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n side = 'bottom',\n align = 'start'\n}: DropdownMenuOptions) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen)\n const [currentPlacement, setCurrentPlacement] = React.useState<Placement>(`${side}-${align}` as Placement)\n const [activeIndex, setActiveIndex] = React.useState<number | null>(null)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const elementsRef = React.useRef<Array<HTMLElement | null>>([])\n const labelsRef = React.useRef<Array<string | null>>([])\n\n const floating = useFloating({\n open,\n onOpenChange: setOpen,\n placement: currentPlacement,\n middleware: [offset({ mainAxis: 4 }), flip(), shift({ padding: 4 })],\n whileElementsMounted: autoUpdate\n })\n\n const { context } = floating\n\n const interactions = useInteractions([\n useClick(context, {\n event: 'mousedown',\n toggle: true,\n ignoreMouse: false\n }),\n useRole(context, { role: 'menu' }),\n useDismiss(context, {\n outsidePress: true,\n outsidePressEvent: 'mousedown'\n }),\n useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true\n }),\n useTypeahead(context, {\n listRef: labelsRef,\n onMatch: open ? setActiveIndex : undefined,\n activeIndex\n })\n ])\n\n const updatePosition = React.useCallback((newSide: 'top' | 'right' | 'bottom' | 'left', newAlign: 'start' | 'center' | 'end') => {\n setCurrentPlacement(`${newSide}-${newAlign}` as Placement)\n }, [])\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n activeIndex,\n setActiveIndex,\n elementsRef,\n labelsRef,\n updatePosition,\n ...interactions,\n ...floating\n }),\n [open, setOpen, activeIndex, interactions, floating, updatePosition]\n )\n}\n\nexport function DropdownMenu({ children, ...options }: DropdownMenuProps) {\n const dropdown = useDropdownMenu(options)\n return (\n <DropdownMenuContext.Provider value={dropdown}>\n <FloatingList elementsRef={dropdown.elementsRef} labelsRef={dropdown.labelsRef}>\n {children}\n </FloatingList>\n </DropdownMenuContext.Provider>\n )\n}\n\ninterface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n ({ children, asChild = false, ...props }, propRef) => {\n const context = useDropdownMenuContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.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 && React.isValidElement(children)) {\n const dataAttributes = {\n 'data-state': context.open ? 'open' : 'closed'\n }\n\n return React.cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === 'object' ? children.props : {}),\n 'aria-expanded': context.open,\n 'aria-haspopup': 'menu' as const,\n ...dataAttributes\n })\n )\n }\n\n return (\n <button\n ref={ref}\n aria-expanded={context.open}\n aria-haspopup=\"menu\"\n data-state={context.open ? 'open' : 'closed'}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger'\n\ninterface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'vertical' | 'horizontal'\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n ({ style, className, orientation = 'vertical', side = 'bottom', align = 'start', portal = true, portalProps = {}, ...props }, propRef) => {\n const context = useDropdownMenuContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n React.useEffect(() => {\n context.updatePosition(side, align)\n }, [context, side, align])\n\n if (!context.open) return null\n\n const content = (\n <FloatingFocusManager context={context.context} modal={false} initialFocus={0} returnFocus={true}>\n <div\n ref={ref}\n className={`tiptap-dropdown-menu ${className || ''}`}\n style={{\n position: context.strategy,\n top: context.y ?? 0,\n left: context.x ?? 0,\n outline: 'none',\n ...style\n }}\n aria-orientation={orientation}\n data-orientation={orientation}\n data-state={context.open ? 'open' : 'closed'}\n data-side={side}\n data-align={align}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nDropdownMenuContent.displayName = 'DropdownMenuContent'\n\ninterface DropdownMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {\n asChild?: boolean\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n ({ children, disabled, asChild = false, onSelect, className, ...props }, ref) => {\n const context = useDropdownMenuContext()\n const item = useListItem({ label: disabled ? null : children?.toString() })\n const isActive = context.activeIndex === item.index\n\n const handleSelect = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n onSelect?.()\n props.onClick?.(event)\n context.setOpen(false)\n },\n [context, disabled, onSelect, props]\n )\n\n const itemProps: React.HTMLAttributes<HTMLDivElement> & {\n ref: React.Ref<HTMLDivElement>\n role: string\n tabIndex: number\n 'aria-disabled'?: boolean\n 'data-highlighted'?: boolean\n } = {\n ref: useMergeRefs([item.ref, ref]),\n role: 'menuitem',\n className,\n tabIndex: isActive ? 0 : -1,\n 'data-highlighted': isActive,\n 'aria-disabled': disabled,\n ...context.getItemProps({\n ...props,\n onClick: handleSelect\n })\n }\n\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as {\n onClick?: (event: React.MouseEvent<HTMLElement>) => void\n }\n\n // Create merged props without adding onClick directly to the props object\n const mergedProps = {\n ...itemProps,\n ...(typeof children.props === 'object' ? children.props : {})\n }\n\n // Handle onClick separately based on the element type\n const eventHandlers = {\n onClick: (event: React.MouseEvent<HTMLElement>) => {\n // Cast the event to make it compatible with handleSelect\n handleSelect(event as unknown as React.MouseEvent<HTMLDivElement>)\n childProps.onClick?.(event)\n }\n }\n\n return React.cloneElement(children, {\n ...mergedProps,\n ...eventHandlers\n })\n }\n\n return <div {...itemProps}>{children}</div>\n }\n)\n\nDropdownMenuItem.displayName = 'DropdownMenuItem'\n\ninterface DropdownMenuGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: string\n}\n\nexport const DropdownMenuGroup = React.forwardRef<HTMLDivElement, DropdownMenuGroupProps>(({ children, label, className, ...props }, ref) => {\n return (\n <div {...props} ref={ref} role=\"group\" aria-label={label} className={`tiptap-button-group ${className || ''}`}>\n {children}\n </div>\n )\n})\n\nDropdownMenuGroup.displayName = 'DropdownMenuGroup'\n\nexport const DropdownMenuSeparator = React.forwardRef<React.ElementRef<typeof Separator>, React.ComponentPropsWithoutRef<typeof Separator>>(\n ({ className, ...props }, ref) => <Separator ref={ref} className={`tiptap-dropdown-menu-separator ${className || ''}`} {...props} />\n)\nDropdownMenuSeparator.displayName = Separator.displayName\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { ChevronDownIcon } from '../../tiptap-icons/chevron-down-icon'\nimport { HeadingIcon } from '../../tiptap-icons/heading-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- Tiptap UI ---\nimport {\n getFormattedHeadingName,\n HeadingButton,\n headingIcons,\n type Level\n} from '../../tiptap-ui/heading-button/heading-button'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\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\nexport interface HeadingDropdownMenuProps extends Omit<ButtonProps, 'type'> {\n editor?: Editor | null\n levels?: Level[]\n hideWhenUnavailable?: boolean\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function HeadingDropdownMenu({\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n onOpenChange,\n ...props\n}: HeadingDropdownMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false)\n const editor = useTiptapEditor(providedEditor)\n\n const headingInSchema = isNodeInSchema('heading', editor)\n\n const handleOnOpenChange = React.useCallback(\n (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [onOpenChange]\n )\n\n const getActiveIcon = React.useCallback(() => {\n if (!editor) return <HeadingIcon className=\"tiptap-button-icon\" />\n\n const activeLevel = levels.find((level) => editor.isActive('heading', { level })) as Level | undefined\n\n if (!activeLevel) return <HeadingIcon className=\"tiptap-button-icon\" />\n\n const ActiveIcon = headingIcons[activeLevel]\n return <ActiveIcon className=\"tiptap-button-icon\" />\n }, [editor, levels])\n\n const canToggleAnyHeading = React.useCallback((): boolean => {\n if (!editor) return false\n return levels.some((level) => editor.can().toggleNode('heading', 'paragraph', { level }))\n }, [editor, levels])\n\n const isDisabled = !canToggleAnyHeading()\n const isAnyHeadingActive = editor?.isActive('heading') ?? false\n\n const show = React.useMemo(() => {\n if (!headingInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleAnyHeading()) {\n return false\n }\n }\n\n return true\n }, [headingInSchema, editor, hideWhenUnavailable, canToggleAnyHeading])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isAnyHeadingActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Format text as heading\"\n aria-pressed={isAnyHeadingActive}\n tooltip=\"标题\"\n {...props}\n >\n {getActiveIcon()}\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {levels.map((level) => (\n <DropdownMenuItem key={`heading-${level}`} asChild>\n <HeadingButton editor={editor} level={level} text={getFormattedHeadingName(level)} tooltip={''} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default HeadingDropdownMenu\n","import type { Editor } from '@tiptap/react'\nimport * as React from 'react'\n\ntype Orientation = 'horizontal' | 'vertical' | 'both'\n\ninterface MenuNavigationOptions<T> {\n editor?: Editor | null\n containerRef?: React.RefObject<HTMLElement | null>\n query?: string\n items: T[]\n onSelect?: (item: T) => void\n onClose?: () => void\n orientation?: Orientation\n autoSelectFirstItem?: boolean\n}\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] = React.useState<number>(autoSelectFirstItem ? 0 : -1)\n\n React.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('keydown', handleKeyboardNavigation, true)\n }\n }\n\n return undefined\n }, [editor, containerRef, items, selectedIndex, onSelect, onClose, orientation])\n\n React.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","import * as React from 'react'\n\nexport const BanIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const HighlighterIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 './popover.less'\nimport type { Placement } from '@floating-ui/react'\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingPortal,\n limitShift,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n useMergeRefs,\n useRole\n} from '@floating-ui/react'\nimport * as React from 'react'\n\ntype PopoverContextValue = ReturnType<typeof usePopover> & {\n setLabelId: (id: string | undefined) => void\n setDescriptionId: (id: string | undefined) => void\n updatePosition: (side: 'top' | 'right' | 'bottom' | 'left', align: 'start' | 'center' | 'end') => void\n}\n\ninterface PopoverOptions {\n initialOpen?: boolean\n modal?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n}\n\ninterface PopoverProps extends PopoverOptions {\n children: React.ReactNode\n}\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext() {\n const context = React.useContext(PopoverContext)\n if (!context) {\n throw new Error('Popover components must be wrapped in <Popover />')\n }\n return context\n}\n\nfunction usePopover({\n initialOpen = false,\n modal,\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n side = 'bottom',\n align = 'center'\n}: PopoverOptions = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen)\n const [labelId, setLabelId] = React.useState<string>()\n const [descriptionId, setDescriptionId] = React.useState<string>()\n const [currentPlacement, setCurrentPlacement] = React.useState<Placement>(`${side}-${align}` as Placement)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const middleware = React.useMemo(\n () => [\n offset(4),\n flip({\n fallbackAxisSideDirection: 'end',\n crossAxis: false\n }),\n shift({\n limiter: limitShift({ offset: 4 })\n })\n ],\n []\n )\n\n const floating = useFloating({\n placement: currentPlacement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware\n })\n\n const interactions = useInteractions([useClick(floating.context), useDismiss(floating.context), useRole(floating.context)])\n\n const updatePosition = React.useCallback((newSide: 'top' | 'right' | 'bottom' | 'left', newAlign: 'start' | 'center' | 'end') => {\n setCurrentPlacement(`${newSide}-${newAlign}` as Placement)\n }, [])\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...floating,\n modal,\n labelId,\n descriptionId,\n setLabelId,\n setDescriptionId,\n updatePosition\n }),\n [open, setOpen, interactions, floating, modal, labelId, descriptionId, updatePosition]\n )\n}\n\nfunction Popover({ children, modal = false, ...options }: PopoverProps) {\n const popover = usePopover({ modal, ...options })\n return <PopoverContext.Provider value={popover}>{children}</PopoverContext.Provider>\n}\n\ninterface TriggerElementProps extends React.HTMLProps<HTMLElement> {\n asChild?: boolean\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLElement, TriggerElementProps>(function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const context = usePopoverContext()\n const childrenRef = React.isValidElement(children)\n ? parseInt(React.version, 10) >= 19\n ? (children.props as any).ref\n : (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(children.props as any),\n 'data-state': context.open ? 'open' : 'closed'\n })\n )\n }\n\n return (\n <button ref={ref} data-state={context.open ? 'open' : 'closed'} {...context.getReferenceProps(props)}>\n {children}\n </button>\n )\n})\n\ninterface PopoverContentProps extends React.HTMLProps<HTMLDivElement> {\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, 'children'>\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(function PopoverContent(\n { className, side = 'bottom', align = 'center', style, portal = true, portalProps = {}, ...props },\n propRef\n) {\n const context = usePopoverContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n React.useEffect(() => {\n context.updatePosition(side, align)\n }, [context, side, align])\n\n if (!context.context.open) return null\n\n const content = (\n <FloatingFocusManager context={context.context} modal={context.modal}>\n <div\n ref={ref}\n style={{\n position: context.strategy,\n top: context.y ?? 0,\n left: context.x ?? 0,\n ...style\n }}\n aria-labelledby={context.labelId}\n aria-describedby={context.descriptionId}\n className={`tiptap-popover ${className || ''}`}\n data-side={side}\n data-align={align}\n data-state={context.context.open ? 'open' : 'closed'}\n {...context.getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n})\n\nPopoverTrigger.displayName = 'PopoverTrigger'\nPopoverContent.displayName = 'PopoverContent'\n\nexport { Popover, PopoverContent, PopoverTrigger }\n","import type { Node } from '@tiptap/pm/model'\nimport { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Lib ---\nimport { findNodePosition, isEmptyNode, isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\n// --- Styles ---\nimport './highlight-button.less'\n\nexport const HIGHLIGHT_COLORS = [\n {\n label: 'Default background',\n value: 'var(--tt-bg-color)',\n border: 'var(--tt-bg-color-contrast)'\n },\n {\n label: 'Gray background',\n value: 'var(--tt-highlight-gray)',\n border: 'var(--tt-highlight-gray-contrast)'\n },\n {\n label: 'Brown background',\n value: 'var(--tt-highlight-brown)',\n border: 'var(--tt-highlight-brown-contrast)'\n },\n {\n label: 'Orange background',\n value: 'var(--tt-highlight-orange)',\n border: 'var(--tt-highlight-orange-contrast)'\n },\n {\n label: 'Yellow background',\n value: 'var(--tt-highlight-yellow)',\n border: 'var(--tt-highlight-yellow-contrast)'\n },\n {\n label: 'Green background',\n value: 'var(--tt-highlight-green)',\n border: 'var(--tt-highlight-green-contrast)'\n },\n {\n label: 'Blue background',\n value: 'var(--tt-highlight-blue)',\n border: 'var(--tt-highlight-blue-contrast)'\n },\n {\n label: 'Purple background',\n value: 'var(--tt-highlight-purple)',\n border: 'var(--tt-highlight-purple-contrast)'\n },\n {\n label: 'Pink background',\n value: 'var(--tt-highlight-pink)',\n border: 'var(--tt-highlight-pink-contrast)'\n },\n {\n label: 'Red background',\n value: 'var(--tt-highlight-red)',\n border: 'var(--tt-highlight-red-contrast)'\n }\n]\n\nexport interface HighlightButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The node to apply highlight to\n */\n node?: Node | null\n /**\n * The position of the node in the document\n */\n nodePos?: number | null\n /**\n * The color to apply when toggling the highlight.\n * If not provided, it will use the default color from the extension.\n */\n color: string\n /**\n * Optional text to display alongside the icon.\n */\n text?: 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 highlight is applied.\n */\n onApplied?: (color: string) => void\n}\n\n/**\n * Checks if highlight can be toggled in the current editor state\n */\nexport function canToggleHighlight(editor: Editor | null): boolean {\n if (!editor) return false\n try {\n return editor.can().setMark('highlight')\n } catch {\n return false\n }\n}\n\n/**\n * Checks if highlight is active in the current selection\n */\nexport function isHighlightActive(editor: Editor | null, color: string): boolean {\n if (!editor) return false\n return editor.isActive('highlight', { color })\n}\n\n/**\n * Toggles highlight on the current selection or specified node\n */\nexport function toggleHighlight(editor: Editor | null, color: string, node?: Node | null, nodePos?: number | null): void {\n if (!editor) return\n\n try {\n const chain = editor.chain().focus()\n\n if (isEmptyNode(node)) {\n chain.toggleMark('highlight', { color }).run()\n } else if (nodePos !== undefined && nodePos !== null && nodePos !== -1) {\n chain.setNodeSelection(nodePos).toggleMark('highlight', { color }).run()\n } else if (node) {\n const foundPos = findNodePosition({ editor, node })\n if (foundPos) {\n chain.setNodeSelection(foundPos.pos).toggleMark('highlight', { color }).run()\n } else {\n chain.toggleMark('highlight', { color }).run()\n }\n } else {\n chain.toggleMark('highlight', { color }).run()\n }\n\n editor.chain().setMeta('hideDragHandle', true).run()\n } catch (error) {\n console.error('Failed to apply highlight:', error)\n }\n}\n\n/**\n * Determines if the highlight button should be disabled\n */\nexport function isHighlightButtonDisabled(editor: Editor | null, userDisabled: boolean = false): boolean {\n if (!editor || userDisabled) return true\n\n const isIncompatibleContext = editor.isActive('code') || editor.isActive('codeBlock') || editor.isActive('imageUpload')\n\n return isIncompatibleContext || !canToggleHighlight(editor)\n}\n\n/**\n * Determines if the highlight button should be shown\n */\nexport function shouldShowHighlightButton(editor: Editor | null, hideWhenUnavailable: boolean, highlightInSchema: boolean): boolean {\n if (!highlightInSchema || !editor) return false\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleHighlight(editor)) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Custom hook to manage highlight button state\n */\nexport function useHighlightState(editor: Editor | null, color: string, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const highlightInSchema = isMarkInSchema('highlight', editor)\n const isDisabled = isHighlightButtonDisabled(editor, disabled)\n const isActive = isHighlightActive(editor, color)\n\n const shouldShow = React.useMemo(\n () => shouldShowHighlightButton(editor, hideWhenUnavailable, highlightInSchema),\n [editor, hideWhenUnavailable, highlightInSchema]\n )\n\n return {\n highlightInSchema,\n isDisabled,\n isActive,\n shouldShow\n }\n}\n\n/**\n * HighlightButton component for TipTap editor\n */\nexport const HighlightButton = React.forwardRef<HTMLButtonElement, HighlightButtonProps>(\n (\n {\n editor: providedEditor,\n node,\n nodePos,\n color,\n text,\n hideWhenUnavailable = false,\n className = '',\n disabled,\n onClick,\n onApplied,\n children,\n style,\n ...buttonProps\n },\n ref\n ) => {\n const editor = useTiptapEditor(providedEditor)\n const { isDisabled, isActive, shouldShow } = useHighlightState(editor, color, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleHighlight(editor, color, node, nodePos)\n onApplied?.(color)\n }\n },\n [color, editor, isDisabled, node, nodePos, onClick, onApplied]\n )\n\n const buttonStyle = React.useMemo(\n () =>\n ({\n ...style,\n '--highlight-color': color\n }) as React.CSSProperties,\n [color, style]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={`${color} highlight color`}\n aria-pressed={isActive}\n onClick={handleClick}\n style={buttonStyle}\n {...buttonProps}\n ref={ref}\n >\n {children || (\n <>\n <span className=\"tiptap-button-highlight\" style={{ '--highlight-color': color } as React.CSSProperties} />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n </>\n )}\n </Button>\n )\n }\n)\n\nHighlightButton.displayName = 'HighlightButton'\n\nexport default HighlightButton\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useMenuNavigation } from '../../../hooks/use-menu-navigation'\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// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../tiptap-ui-primitive/popover'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\n\n// --- Tiptap UI ---\nimport { HighlightButton, canToggleHighlight } from '../../tiptap-ui/highlight-button'\n\n// --- Styles ---\nimport './highlight-popover.less'\n\nexport interface HighlightColor {\n label: string\n value: string\n border?: string\n}\n\nexport interface HighlightContentProps {\n editor?: Editor | null\n colors?: HighlightColor[]\n onClose?: () => void\n}\n\nexport interface HighlightPopoverProps extends Omit<ButtonProps, 'type'> {\n /** The TipTap editor instance. */\n editor?: Editor | null\n /** The highlight colors to display in the popover. */\n colors?: HighlightColor[]\n /** Whether to hide the highlight popover when unavailable. */\n hideWhenUnavailable?: boolean\n}\n\nexport const DEFAULT_HIGHLIGHT_COLORS: HighlightColor[] = [\n {\n label: 'Green',\n value: 'var(--tt-highlight-green)',\n border: 'var(--tt-highlight-green-contrast)'\n },\n {\n label: 'Blue',\n value: 'var(--tt-highlight-blue)',\n border: 'var(--tt-highlight-blue-contrast)'\n },\n {\n label: 'Red',\n value: 'var(--tt-highlight-red)',\n border: 'var(--tt-highlight-red-contrast)'\n },\n {\n label: 'Purple',\n value: 'var(--tt-highlight-purple)',\n border: 'var(--tt-highlight-purple-contrast)'\n },\n {\n label: 'Yellow',\n value: 'var(--tt-highlight-yellow)',\n border: 'var(--tt-highlight-yellow-contrast)'\n }\n]\n\nexport const HighlighterButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Highlight text\"\n tooltip=\"背景颜色\"\n ref={ref}\n {...props}\n >\n {children || <HighlighterIcon className=\"tiptap-button-icon\" />}\n </Button>\n))\n\nHighlighterButton.displayName = 'HighlighterButton'\n\nexport function HighlightContent({ editor: providedEditor, colors = DEFAULT_HIGHLIGHT_COLORS, onClose }: HighlightContentProps) {\n const editor = useTiptapEditor(providedEditor)\n const containerRef = React.useRef<HTMLDivElement>(null)\n\n const removeHighlight = React.useCallback(() => {\n if (!editor) return\n editor.chain().focus().unsetMark('highlight').run()\n onClose?.()\n }, [editor, onClose])\n\n const menuItems = React.useMemo(() => [...colors, { label: 'Remove highlight', value: 'none' }], [colors])\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n orientation: 'both',\n onSelect: (item) => {\n if (item.value === 'none') {\n removeHighlight()\n }\n onClose?.()\n },\n onClose,\n autoSelectFirstItem: false\n })\n\n return (\n <div ref={containerRef} className=\"tiptap-highlight-content\" tabIndex={0}>\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n {colors.map((color, index) => (\n <HighlightButton\n key={color.value}\n editor={editor}\n color={color.value}\n aria-label={`${color.label} highlight color`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n onClick={onClose}\n />\n ))}\n </div>\n\n <Separator />\n\n <div className=\"tiptap-button-group\">\n <Button\n onClick={removeHighlight}\n aria-label=\"Remove highlight\"\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n data-style=\"ghost\"\n data-highlighted={selectedIndex === colors.length}\n >\n <BanIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </div>\n )\n}\n\nexport function HighlightPopover({\n editor: providedEditor,\n colors = DEFAULT_HIGHLIGHT_COLORS,\n hideWhenUnavailable = false,\n ...props\n}: HighlightPopoverProps) {\n const editor = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = React.useState(false)\n const [isDisabled, setIsDisabled] = React.useState(false)\n\n const markAvailable = isMarkInSchema('highlight', editor)\n\n React.useEffect(() => {\n if (!editor) return\n\n const updateIsDisabled = () => {\n let isDisabled = false\n\n if (!markAvailable || !editor) {\n isDisabled = true\n }\n\n const isInCompatibleContext = editor.isActive('code') || editor.isActive('codeBlock') || editor.isActive('imageUpload')\n\n if (isInCompatibleContext) {\n isDisabled = true\n }\n\n setIsDisabled(isDisabled)\n }\n\n editor.on('selectionUpdate', updateIsDisabled)\n editor.on('update', updateIsDisabled)\n\n return () => {\n editor.off('selectionUpdate', updateIsDisabled)\n editor.off('update', updateIsDisabled)\n }\n }, [editor, markAvailable])\n\n const isActive = editor?.isActive('highlight') ?? false\n\n const shouldShow = React.useMemo(() => {\n if (!hideWhenUnavailable || !editor) return true\n\n return !(isNodeSelection(editor.state.selection) || !canToggleHighlight(editor))\n }, [hideWhenUnavailable, editor])\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <HighlighterButton\n disabled={isDisabled}\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n aria-pressed={isActive}\n {...props}\n />\n </PopoverTrigger>\n\n <PopoverContent aria-label=\"Highlight colors\">\n <HighlightContent editor={editor} colors={colors} onClose={() => setIsOpen(false)} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default HighlightPopover\n","import * as React from 'react'\n\nexport const CornerDownLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ExternalLinkIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M14 3C14 2.44772 14.4477 2 15 2H21C21.5523 2 22 2.44772 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L10.7071 14.7071C10.3166 15.0976 9.68342 15.0976 9.29289 14.7071C8.90237 14.3166 8.90237 13.6834 9.29289 13.2929L18.5858 4H15C14.4477 4 14 3.55228 14 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.29289 7.29289C4.48043 7.10536 4.73478 7 5 7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H5C4.20435 5 3.44129 5.31607 2.87868 5.87868C2.31607 6.44129 2 7.20435 2 8V19C2 19.7957 2.31607 20.5587 2.87868 21.1213C3.44129 21.6839 4.20435 22 5 22H16C16.7957 22 17.5587 21.6839 18.1213 21.1213C18.6839 20.5587 19 19.7957 19 19V13C19 12.4477 18.5523 12 18 12C17.4477 12 17 12.4477 17 13V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V8C4 7.73478 4.10536 7.48043 4.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nExternalLinkIcon.displayName = 'ExternalLinkIcon'\n","import * as React from 'react'\n\nexport const LinkIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const TrashIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 5V4C7 3.17477 7.40255 2.43324 7.91789 1.91789C8.43324 1.40255 9.17477 1 10 1H14C14.8252 1 15.5668 1.40255 16.0821 1.91789C16.5975 2.43324 17 3.17477 17 4V5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H20V20C20 20.8252 19.5975 21.5668 19.0821 22.0821C18.5668 22.5975 17.8252 23 17 23H7C6.17477 23 5.43324 22.5975 4.91789 22.0821C4.40255 21.5668 4 20.8252 4 20V7H3C2.44772 7 2 6.55228 2 6C2 5.44772 2.44772 5 3 5H7ZM9 4C9 3.82523 9.09745 3.56676 9.33211 3.33211C9.56676 3.09745 9.82523 3 10 3H14C14.1748 3 14.4332 3.09745 14.6679 3.33211C14.9025 3.56676 15 3.82523 15 4V5H9V4ZM6 7V20C6 20.1748 6.09745 20.4332 6.33211 20.6679C6.56676 20.9025 6.82523 21 7 21H17C17.1748 21 17.4332 20.9025 17.6679 20.6679C17.9025 20.4332 18 20.1748 18 20V7H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTrashIcon.displayName = 'TrashIcon'\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\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// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../tiptap-ui-primitive/popover'\nimport { Separator } from '../../tiptap-ui-primitive/separator'\n\n// --- Styles ---\nimport './link-popover.less'\n\nexport interface LinkHandlerProps {\n editor: Editor | null\n onSetLink?: () => void\n onLinkActive?: () => void\n}\n\nexport interface LinkMainProps {\n url: string\n setUrl: React.Dispatch<React.SetStateAction<string>>\n setLink: () => void\n removeLink: () => void\n isActive: boolean\n}\n\nexport const useLinkHandler = (props: LinkHandlerProps) => {\n const { editor, onSetLink, onLinkActive } = props\n const [url, setUrl] = React.useState<string>('')\n\n React.useEffect(() => {\n if (!editor) return\n\n // Get URL immediately on mount\n const { href } = editor.getAttributes('link')\n\n if (editor.isActive('link') && !url) {\n setUrl(href || '')\n onLinkActive?.()\n }\n }, [editor, onLinkActive, url])\n\n React.useEffect(() => {\n if (!editor) return\n\n const updateLinkState = () => {\n const { href } = editor.getAttributes('link')\n setUrl(href || '')\n\n if (editor.isActive('link') && !url) {\n onLinkActive?.()\n }\n }\n\n editor.on('selectionUpdate', updateLinkState)\n return () => {\n editor.off('selectionUpdate', updateLinkState)\n }\n }, [editor, onLinkActive, url])\n\n const setLink = React.useCallback(() => {\n if (!url || !editor) return\n\n const { from, to } = editor.state.selection\n const text = editor.state.doc.textBetween(from, to)\n\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text: text || url,\n marks: [{ type: 'link', attrs: { href: url } }]\n })\n .run()\n\n onSetLink?.()\n }, [editor, onSetLink, url])\n\n const removeLink = React.useCallback(() => {\n if (!editor) return\n editor.chain().focus().unsetMark('link', { extendEmptyMarkRange: true }).setMeta('preventAutolink', true).run()\n setUrl('')\n }, [editor])\n\n return {\n url,\n setUrl,\n setLink,\n removeLink,\n isActive: editor?.isActive('link') || false\n }\n}\n\nexport const LinkButton = React.forwardRef<HTMLButtonElement, ButtonProps>(({ className, children, ...props }, ref) => {\n return (\n <Button type=\"button\" className={className} data-style=\"ghost\" role=\"button\" tabIndex={-1} aria-label=\"Link\" tooltip=\"链接\" ref={ref} {...props}>\n {children || <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n )\n})\n\nexport const LinkContent: React.FC<{\n editor?: Editor | null\n}> = ({ editor: providedEditor }) => {\n const editor = useTiptapEditor(providedEditor)\n\n const linkHandler = useLinkHandler({\n editor: editor\n })\n\n return <LinkMain {...linkHandler} />\n}\n\nconst LinkMain: React.FC<LinkMainProps> = ({ url, setUrl, setLink, removeLink, isActive }) => {\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n setLink()\n }\n }\n\n return (\n <>\n <input\n type=\"url\"\n placeholder=\"输入链接\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n className=\"tiptap-input tiptap-input-clamp\"\n />\n\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n <Button type=\"button\" onClick={setLink} title=\"确认\" disabled={!url && !isActive} data-style=\"ghost\">\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n\n <Separator />\n\n <div className=\"tiptap-button-group\" data-orientation=\"horizontal\">\n <Button type=\"button\" onClick={() => window.open(url, '_blank')} title=\"新窗口打开\" disabled={!url && !isActive} data-style=\"ghost\">\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n\n <Button type=\"button\" onClick={removeLink} title=\"删除链接\" disabled={!url && !isActive} data-style=\"ghost\">\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </div>\n </>\n )\n}\n\nexport interface LinkPopoverProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the link popover.\n * @default false\n */\n hideWhenUnavailable?: boolean\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\nexport function LinkPopover({\n editor: providedEditor,\n hideWhenUnavailable = false,\n onOpenChange,\n autoOpenOnLinkActive = true,\n ...props\n}: LinkPopoverProps) {\n const editor = useTiptapEditor(providedEditor)\n\n const linkInSchema = isMarkInSchema('link', editor)\n\n const [isOpen, setIsOpen] = React.useState(false)\n\n const onSetLink = () => {\n setIsOpen(false)\n }\n\n const onLinkActive = () => setIsOpen(autoOpenOnLinkActive)\n\n const linkHandler = useLinkHandler({\n editor: editor,\n onSetLink,\n onLinkActive\n })\n\n const isDisabled = React.useMemo(() => {\n if (!editor) return true\n if (editor.isActive('codeBlock')) return true\n return !editor.can().setLink?.({ href: '' })\n }, [editor])\n\n const canSetLink = React.useMemo(() => {\n if (!editor) return false\n try {\n return editor.can().setMark('link')\n } catch {\n return false\n }\n }, [editor])\n\n const isActive = editor?.isActive('link') ?? false\n\n const handleOnOpenChange = React.useCallback(\n (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n onOpenChange?.(nextIsOpen)\n },\n [onOpenChange]\n )\n\n const show = React.useMemo(() => {\n if (!linkInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canSetLink) {\n return false\n }\n }\n\n return true\n }, [linkInSchema, hideWhenUnavailable, editor, canSetLink])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOnOpenChange}>\n <PopoverTrigger asChild>\n <LinkButton disabled={isDisabled} data-active-state={isActive ? 'on' : 'off'} data-disabled={isDisabled} {...props} />\n </PopoverTrigger>\n\n <PopoverContent>\n <LinkMain {...linkHandler} />\n </PopoverContent>\n </Popover>\n )\n}\n\nLinkButton.displayName = 'LinkButton'\n","import * as React from 'react'\n\nexport const ListIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ListOrderedIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ListTodoIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\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 { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type ListType = 'bulletList' | 'orderedList' | 'taskList'\n\nexport interface ListOption {\n label: string\n type: ListType\n icon: React.ElementType\n}\n\nexport interface ListButtonProps extends Omit<ButtonProps, 'type'> {\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 * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the list is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const listOptions: ListOption[] = [\n {\n label: '无序列表',\n type: 'bulletList',\n icon: ListIcon\n },\n {\n label: '有序列表',\n type: 'orderedList',\n icon: ListOrderedIcon\n },\n {\n label: '任务列表',\n type: 'taskList',\n icon: ListTodoIcon\n }\n]\n\nexport const listShortcutKeys: Record<ListType, string> = {\n bulletList: 'Ctrl-Shift-8',\n orderedList: 'Ctrl-Shift-7',\n taskList: 'Ctrl-Shift-9'\n}\n\nexport function canToggleList(editor: Editor | null, type: ListType): boolean {\n if (!editor) {\n return false\n }\n\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\nexport function isListActive(editor: Editor | null, type: ListType): boolean {\n if (!editor) 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\nexport function toggleList(editor: Editor | null, type: ListType): void {\n if (!editor) return\n\n switch (type) {\n case 'bulletList':\n editor.chain().focus().toggleBulletList().run()\n break\n case 'orderedList':\n editor.chain().focus().toggleOrderedList().run()\n break\n case 'taskList':\n editor.chain().focus().toggleList('taskList', 'taskItem').run()\n break\n }\n}\n\nexport function getListOption(type: ListType): ListOption | undefined {\n return listOptions.find((option) => option.type === type)\n}\n\nexport function shouldShowListButton(params: {\n editor: Editor | null\n type: ListType\n hideWhenUnavailable: boolean\n listInSchema: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable, listInSchema } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleList(editor, type)) {\n return false\n }\n }\n\n return true\n}\n\nexport function useListState(editor: Editor | null, type: ListType) {\n const listInSchema = isNodeInSchema(type, editor)\n const listOption = getListOption(type)\n const isActive = isListActive(editor, type)\n const shortcutKey = listShortcutKeys[type]\n\n return {\n listInSchema,\n listOption,\n isActive,\n shortcutKey\n }\n}\n\nexport const ListButton = React.forwardRef<HTMLButtonElement, ListButtonProps>(\n ({ editor: providedEditor, type, hideWhenUnavailable = false, className = '', onClick, text, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n const { listInSchema, listOption, isActive, shortcutKey } = useListState(editor, type)\n\n const Icon = listOption?.icon || ListIcon\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && editor) {\n toggleList(editor, type)\n }\n },\n [onClick, editor, type]\n )\n\n const show = React.useMemo(() => {\n return shouldShowListButton({\n editor,\n type,\n hideWhenUnavailable,\n listInSchema\n })\n }, [editor, type, hideWhenUnavailable, listInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n role=\"button\"\n tabIndex={-1}\n aria-label={listOption?.label || type}\n aria-pressed={isActive}\n tooltip={listOption?.label || type}\n shortcutKeys={shortcutKey}\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\nListButton.displayName = 'ListButton'\n\nexport default ListButton\n","import { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { ChevronDownIcon } from '../../tiptap-icons/chevron-down-icon'\nimport { ListIcon } from '../../tiptap-icons/list-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- Tiptap UI ---\nimport {\n ListButton,\n canToggleList,\n isListActive,\n listOptions,\n type ListType\n} from '../../tiptap-ui/list-button/list-button'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\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\nexport interface ListDropdownMenuProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor\n /**\n * The list types to display in the dropdown.\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport function canToggleAnyList(editor: Editor | null, listTypes: ListType[]): boolean {\n if (!editor) return false\n return listTypes.some((type) => canToggleList(editor, type))\n}\n\nexport function isAnyListActive(editor: Editor | null, listTypes: ListType[]): boolean {\n if (!editor) return false\n return listTypes.some((type) => isListActive(editor, type))\n}\n\nexport function getFilteredListOptions(availableTypes: ListType[]): typeof listOptions {\n return listOptions.filter((option) => !option.type || availableTypes.includes(option.type))\n}\n\nexport function shouldShowListDropdown(params: {\n editor: Editor | null\n listTypes: ListType[]\n hideWhenUnavailable: boolean\n listInSchema: boolean\n canToggleAny: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, listInSchema, canToggleAny } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleAny) {\n return false\n }\n }\n\n return true\n}\n\nexport function useListDropdownState(editor: Editor | null, availableTypes: ListType[]) {\n const [isOpen, setIsOpen] = React.useState(false)\n\n const listInSchema = availableTypes.some((type) => isNodeInSchema(type, editor))\n\n const filteredLists = React.useMemo(() => getFilteredListOptions(availableTypes), [availableTypes])\n\n const canToggleAny = canToggleAnyList(editor, availableTypes)\n const isAnyActive = isAnyListActive(editor, availableTypes)\n\n const handleOpenChange = React.useCallback((open: boolean, callback?: (isOpen: boolean) => void) => {\n setIsOpen(open)\n callback?.(open)\n }, [])\n\n return {\n isOpen,\n setIsOpen,\n listInSchema,\n filteredLists,\n canToggleAny,\n isAnyActive,\n handleOpenChange\n }\n}\n\nexport function useActiveListIcon(editor: Editor | null, filteredLists: typeof listOptions) {\n return React.useCallback(() => {\n const activeOption = filteredLists.find((option) => isListActive(editor, option.type))\n\n return activeOption ? <activeOption.icon className=\"tiptap-button-icon\" /> : <ListIcon className=\"tiptap-button-icon\" />\n }, [editor, filteredLists])\n}\n\nexport function ListDropdownMenu({\n editor: providedEditor,\n types = ['bulletList', 'orderedList', 'taskList'],\n hideWhenUnavailable = false,\n onOpenChange,\n ...props\n}: ListDropdownMenuProps) {\n const editor = useTiptapEditor(providedEditor)\n\n const { isOpen, listInSchema, filteredLists, canToggleAny, isAnyActive, handleOpenChange } = useListDropdownState(editor, types)\n\n const getActiveIcon = useActiveListIcon(editor, filteredLists)\n\n const show = React.useMemo(() => {\n return shouldShowListDropdown({\n editor,\n listTypes: types,\n hideWhenUnavailable,\n listInSchema,\n canToggleAny\n })\n }, [editor, types, hideWhenUnavailable, listInSchema, canToggleAny])\n\n const handleOnOpenChange = React.useCallback((open: boolean) => handleOpenChange(open, onOpenChange), [handleOpenChange, onOpenChange])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isAnyActive ? 'on' : 'off'}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"List options\"\n tooltip=\"列表\"\n {...props}\n >\n {getActiveIcon()}\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {filteredLists.map((option) => (\n <DropdownMenuItem key={option.type} asChild>\n <ListButton editor={editor} type={option.type} text={option.label} hideWhenUnavailable={hideWhenUnavailable} tooltip={''} />\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ListDropdownMenu\n","import * as React from 'react'\n\nexport const BoldIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const Code2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const ItalicIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const StrikeIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const SubscriptIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const SuperscriptIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const UnderlineIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\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\n// --- Lib ---\nimport { isMarkInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type Mark = 'bold' | 'italic' | 'strike' | 'code' | 'underline' | 'superscript' | 'subscript'\n\nexport interface MarkButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The type of mark to toggle\n */\n type: Mark\n /**\n * Optional editor instance. If not provided, will use editor from context\n */\n editor?: Editor | null\n /**\n * Display text for the button (optional)\n */\n text?: string\n /**\n * Whether this button should be hidden when the mark is not available\n */\n hideWhenUnavailable?: boolean\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 markShortcutKeys: Partial<Record<Mark, string>> = {\n bold: 'Ctrl-b',\n italic: 'Ctrl-i',\n underline: 'Ctrl-u',\n strike: 'Ctrl-Shift-s',\n code: 'Ctrl-e',\n superscript: 'Ctrl-.',\n subscript: 'Ctrl-,'\n}\nexport const markActionLabels: Partial<Record<Mark, string>> = {\n bold: '粗体',\n italic: '斜体',\n underline: '下划线',\n strike: '删除线',\n code: '代码',\n superscript: '上角标',\n subscript: '下角标'\n}\n\nexport function canToggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor) return false\n\n try {\n return editor.can().toggleMark(type)\n } catch {\n return false\n }\n}\n\nexport function isMarkActive(editor: Editor | null, type: Mark): boolean {\n if (!editor) return false\n return editor.isActive(type)\n}\n\nexport function toggleMark(editor: Editor | null, type: Mark): void {\n if (!editor) return\n editor.chain().focus().toggleMark(type).run()\n}\n\nexport function isMarkButtonDisabled(editor: Editor | null, type: Mark, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (editor.isActive('codeBlock')) return true\n if (!canToggleMark(editor, type)) return true\n return false\n}\n\nexport function shouldShowMarkButton(params: { editor: Editor | null; type: Mark; hideWhenUnavailable: boolean; markInSchema: boolean }): boolean {\n const { editor, type, hideWhenUnavailable, markInSchema } = params\n\n if (!markInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggleMark(editor, type)) {\n return false\n }\n }\n\n return true\n}\n\nexport function getFormattedMarkName(type: Mark): string {\n return markActionLabels[type] || type.charAt(0).toUpperCase() + type.slice(1)\n}\n\nexport function useMarkState(editor: Editor | null, type: Mark, disabled: boolean = false) {\n const markInSchema = isMarkInSchema(type, editor)\n const isDisabled = isMarkButtonDisabled(editor, type, disabled)\n const isActive = isMarkActive(editor, type)\n\n const Icon = markIcons[type]\n const shortcutKey = markShortcutKeys[type]\n const formattedName = getFormattedMarkName(type)\n\n return {\n markInSchema,\n isDisabled,\n isActive,\n Icon,\n shortcutKey,\n formattedName\n }\n}\n\nexport const MarkButton = React.forwardRef<HTMLButtonElement, MarkButtonProps>(\n ({ editor: providedEditor, type, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { markInSchema, isDisabled, isActive, Icon, shortcutKey, formattedName } = useMarkState(editor, type, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled && editor) {\n toggleMark(editor, type)\n }\n },\n [onClick, isDisabled, editor, type]\n )\n\n const show = React.useMemo(() => {\n return shouldShowMarkButton({\n editor,\n type,\n hideWhenUnavailable,\n markInSchema\n })\n }, [editor, type, hideWhenUnavailable, markInSchema])\n\n if (!show || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={type}\n aria-pressed={isActive}\n tooltip={formattedName}\n shortcutKeys={shortcutKey}\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\nMarkButton.displayName = 'MarkButton'\n\nexport default MarkButton\n","import * as React from 'react'\n\nexport const BlockQuoteIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const CodeBlockIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { isNodeSelection, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { BlockQuoteIcon } from '../../tiptap-icons/block-quote-icon'\nimport { CodeBlockIcon } from '../../tiptap-icons/code-block-icon'\n\n// --- Lib ---\nimport { isNodeInSchema } from '../../../lib/tiptap-utils'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type NodeType = 'codeBlock' | 'blockquote'\n\nexport interface NodeButtonProps extends Omit<ButtonProps, 'type'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of node to toggle.\n */\n type: NodeType\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the node is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const nodeIcons = {\n codeBlock: CodeBlockIcon,\n blockquote: BlockQuoteIcon\n}\n\nexport const nodeShortcutKeys: Partial<Record<NodeType, string>> = {\n codeBlock: 'Ctrl-Alt-c',\n blockquote: 'Ctrl-Shift-b'\n}\n\nexport const nodeLabels: Record<NodeType, string> = {\n codeBlock: '代码块',\n blockquote: '引用块'\n}\n\nexport function canToggleNode(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n\n try {\n return type === 'codeBlock' ? editor.can().toggleNode('codeBlock', 'paragraph') : editor.can().toggleWrap('blockquote')\n } catch {\n return false\n }\n}\n\nexport function isNodeActive(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n return editor.isActive(type)\n}\n\nexport function toggleNode(editor: Editor | null, type: NodeType): boolean {\n if (!editor) return false\n\n if (type === 'codeBlock') {\n return editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()\n } else {\n return editor.chain().focus().toggleWrap('blockquote').run()\n }\n}\n\nexport function isNodeButtonDisabled(editor: Editor | null, canToggle: boolean, userDisabled: boolean = false): boolean {\n if (!editor) return true\n if (userDisabled) return true\n if (!canToggle) return true\n return false\n}\n\nexport function shouldShowNodeButton(params: {\n editor: Editor | null\n type: NodeType\n hideWhenUnavailable: boolean\n nodeInSchema: boolean\n canToggle: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, nodeInSchema, canToggle } = params\n\n if (!nodeInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable) {\n if (isNodeSelection(editor.state.selection) || !canToggle) {\n return false\n }\n }\n\n return Boolean(editor?.isEditable)\n}\n\nexport function formatNodeName(type: NodeType): string {\n return type.charAt(0).toUpperCase() + type.slice(1)\n}\n\nexport function useNodeState(editor: Editor | null, type: NodeType, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const nodeInSchema = isNodeInSchema(type, editor)\n\n const canToggle = canToggleNode(editor, type)\n const isDisabled = isNodeButtonDisabled(editor, canToggle, disabled)\n const isActive = isNodeActive(editor, type)\n\n const shouldShow = React.useMemo(\n () =>\n shouldShowNodeButton({\n editor,\n type,\n hideWhenUnavailable,\n nodeInSchema,\n canToggle\n }),\n [editor, type, hideWhenUnavailable, nodeInSchema, canToggle]\n )\n\n const handleToggle = React.useCallback(() => {\n if (!isDisabled && editor) {\n return toggleNode(editor, type)\n }\n return false\n }, [editor, type, isDisabled])\n\n const Icon = nodeIcons[type]\n const shortcutKey = nodeShortcutKeys[type]\n const label = nodeLabels[type]\n\n return {\n nodeInSchema,\n canToggle,\n isDisabled,\n isActive,\n shouldShow,\n handleToggle,\n Icon,\n shortcutKey,\n label\n }\n}\n\nexport const NodeButton = React.forwardRef<HTMLButtonElement, NodeButtonProps>(\n ({ editor: providedEditor, type, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, isActive, shouldShow, handleToggle, Icon, shortcutKey, label } = useNodeState(editor, type, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !isDisabled) {\n handleToggle()\n }\n },\n [onClick, isDisabled, handleToggle]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={type}\n aria-pressed={isActive}\n tooltip={label}\n shortcutKeys={shortcutKey}\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\nNodeButton.displayName = 'NodeButton'\n\nexport default NodeButton\n","import * as React from 'react'\n\nexport const QuoteIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 1024 1024\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M130.16 789.92V500.25q-1.85-62.51 18-117.41T204 286.23a308 308 0 0 1 86.13-69.1A304.32 304.32 0 0 1 386.26 184 11 11 0 0 1 399 194.86v104.52a11 11 0 0 1-7.21 10.29q-66.13 24.5-91.25 70.31-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.84a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11h-257.9z m403.3 0V500.25q-2-62.51 17.95-117.41t55.85-96.61q35.94-41.6 86.13-69.1A304.7 304.7 0 0 1 789.56 184a11 11 0 0 1 12.76 10.82v104.56a11 11 0 0 1-7.21 10.29Q729 334.18 703.86 380q-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.82a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11H533.45z m0 0\"\n fill=\"currentColor\">\n </path>\n </svg>\n )\n})\n\nQuoteIcon.displayName = 'QuoteIcon'\n","import { type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { QuoteIcon } from '../../tiptap-icons/quote-icon'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport interface QuoteButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n\n /**\n * Callback when text is quoted (fires when user clicks while text is selected)\n */\n onQuote?: (text: string) => void\n\n /**\n * Optional label text shown next to the icon.\n */\n text?: string\n\n /**\n * Whether to hide the button if no text is selected.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * 检查是否选中了文本\n */\nexport function hasSelection(editor: Editor | null): boolean {\n if (!editor) return false\n const selection = editor.state.selection\n return !!selection && !selection.empty\n}\n\n/**\n * 获取当前选中文本\n */\nexport function getSelectedText(editor: Editor | null): string {\n if (!editor) return ''\n const { from, to } = editor.state.selection\n return editor.state.doc.textBetween(from, to, ' ')\n}\n\n/**\n * QuoteButton Hook\n */\nexport function useQuote(editor: Editor | null, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const selectionAvailable = React.useMemo(() => hasSelection(editor), [editor?.state.selection])\n\n const isDisabled = React.useMemo(() => !selectionAvailable || disabled, [selectionAvailable, disabled])\n const shouldShow = React.useMemo(() => {\n if (!editor?.isEditable) return false\n if (hideWhenUnavailable && !selectionAvailable) return false\n return true\n }, [editor, hideWhenUnavailable, selectionAvailable])\n\n const getText = React.useCallback(() => getSelectedText(editor), [editor])\n\n return {\n isDisabled,\n shouldShow,\n getText\n }\n}\n\nexport const QuoteButton = React.forwardRef<HTMLButtonElement, QuoteButtonProps>(\n (\n { editor: providedEditor, onQuote, text, className = '', disabled = false, hideWhenUnavailable = false, onClick, children, ...buttonProps },\n ref\n ) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, shouldShow, getText } = useQuote(editor, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (e.defaultPrevented || isDisabled || !editor) return\n\n const selectedText = getText()\n if (selectedText) {\n onQuote?.(selectedText)\n } else {\n console.warn('No text selected for quote.')\n }\n },\n [onClick, editor, isDisabled, getText, onQuote]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) return null\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-disabled={isDisabled}\n tooltip=\"引用选中文本\"\n // shortcutKeys=\"Ctrl-Shift-Q\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children || (\n <>\n <QuoteIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n </>\n )}\n </Button>\n )\n }\n)\n\nQuoteButton.displayName = 'QuoteButton'\n\nexport default QuoteButton\n","import * as React from 'react'\n\nexport const AlignCenterIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignJustifyIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const AlignRightIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 { type ChainedCommands, type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\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\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify'\n\nexport interface TextAlignButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * The text alignment to apply.\n */\n align: TextAlign\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Whether the button should hide when the alignment is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport const textAlignIcons = {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon\n}\n\nexport const textAlignShortcutKeys: Partial<Record<TextAlign, string>> = {\n left: 'Ctrl-Shift-l',\n center: 'Ctrl-Shift-e',\n right: 'Ctrl-Shift-r',\n justify: 'Ctrl-Shift-j'\n}\n\nexport const textAlignLabels: Record<TextAlign, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n justify: '两端对齐'\n}\n\nexport function hasSetTextAlign(commands: ChainedCommands): commands is ChainedCommands & {\n setTextAlign: (align: TextAlign) => ChainedCommands\n} {\n return 'setTextAlign' in commands\n}\n\nexport function checkTextAlignExtension(editor: Editor | null): boolean {\n if (!editor) return false\n\n const hasExtension = editor.extensionManager.extensions.some((extension) => extension.name === 'textAlign')\n\n if (!hasExtension) {\n console.warn('TextAlign extension is not available. ' + 'Make sure it is included in your editor configuration.')\n }\n\n return hasExtension\n}\n\nexport function canSetTextAlign(editor: Editor | null, align: TextAlign, alignAvailable: boolean): boolean {\n if (!editor || !alignAvailable) return false\n\n try {\n return editor.can().setTextAlign(align)\n } catch {\n return false\n }\n}\n\nexport function isTextAlignActive(editor: Editor | null, align: TextAlign): boolean {\n if (!editor) return false\n return editor.isActive({ textAlign: align })\n}\n\nexport function setTextAlign(editor: Editor | null, align: TextAlign): boolean {\n if (!editor) return false\n\n const chain = editor.chain().focus()\n if (hasSetTextAlign(chain)) {\n return chain.setTextAlign(align).run()\n }\n return false\n}\n\nexport function isTextAlignButtonDisabled(editor: Editor | null, alignAvailable: boolean, canAlign: boolean, userDisabled: boolean = false): boolean {\n if (!editor || !alignAvailable) return true\n if (userDisabled) return true\n if (!canAlign) return true\n return false\n}\n\nexport function shouldShowTextAlignButton(editor: Editor | null, canAlign: boolean, hideWhenUnavailable: boolean): boolean {\n if (!editor?.isEditable) return false\n if (hideWhenUnavailable && !canAlign) return false\n return true\n}\n\nexport function useTextAlign(editor: Editor | null, align: TextAlign, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const alignAvailable = React.useMemo(() => checkTextAlignExtension(editor), [editor])\n\n const canAlign = React.useMemo(() => canSetTextAlign(editor, align, alignAvailable), [editor, align, alignAvailable])\n\n const isDisabled = isTextAlignButtonDisabled(editor, alignAvailable, canAlign, disabled)\n const isActive = isTextAlignActive(editor, align)\n\n const handleAlignment = React.useCallback(() => {\n if (!alignAvailable || !editor || isDisabled) return false\n return setTextAlign(editor, align)\n }, [alignAvailable, editor, isDisabled, align])\n\n const shouldShow = React.useMemo(() => shouldShowTextAlignButton(editor, canAlign, hideWhenUnavailable), [editor, canAlign, hideWhenUnavailable])\n\n const Icon = textAlignIcons[align]\n const shortcutKey = textAlignShortcutKeys[align]\n const label = textAlignLabels[align]\n\n return {\n alignAvailable,\n canAlign,\n isDisabled,\n isActive,\n handleAlignment,\n shouldShow,\n Icon,\n shortcutKey,\n label\n }\n}\n\nexport const TextAlignButton = React.forwardRef<HTMLButtonElement, TextAlignButtonProps>(\n ({ editor: providedEditor, align, text, hideWhenUnavailable = false, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, isActive, handleAlignment, shouldShow, Icon, shortcutKey, label } = useTextAlign(editor, align, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !disabled) {\n handleAlignment()\n }\n },\n [onClick, disabled, handleAlignment]\n )\n\n if (!shouldShow || !editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-active-state={isActive ? 'on' : 'off'}\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n shortcutKeys={shortcutKey}\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\nTextAlignButton.displayName = 'TextAlignButton'\n\nexport default TextAlignButton\n","import * as React from 'react'\n\nexport const Redo2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\nexport const Undo2Icon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 3.70711C10.0976 3.31658 10.0976 2.68342 9.70711 2.29289C9.31658 1.90237 8.68342 1.90237 8.29289 2.29289L3.29289 7.29289C2.90237 7.68342 2.90237 8.31658 3.29289 8.70711L8.29289 13.7071C8.68342 14.0976 9.31658 14.0976 9.70711 13.7071C10.0976 13.3166 10.0976 12.6834 9.70711 12.2929L6.41421 9H14.5C15.0909 9 15.6761 9.1164 16.2221 9.34254C16.768 9.56869 17.2641 9.90016 17.682 10.318C18.0998 10.7359 18.4313 11.232 18.6575 11.7779C18.8836 12.3239 19 12.9091 19 13.5C19 14.0909 18.8836 14.6761 18.6575 15.2221C18.4313 15.768 18.0998 16.2641 17.682 16.682C17.2641 17.0998 16.768 17.4313 16.2221 17.6575C15.6761 17.8836 15.0909 18 14.5 18H11C10.4477 18 10 18.4477 10 19C10 19.5523 10.4477 20 11 20H14.5C15.3536 20 16.1988 19.8319 16.9874 19.5052C17.7761 19.1786 18.4926 18.6998 19.0962 18.0962C19.6998 17.4926 20.1786 16.7761 20.5052 15.9874C20.8319 15.1988 21 14.3536 21 13.5C21 12.6464 20.8319 11.8012 20.5052 11.0126C20.1786 10.2239 19.6998 9.50739 19.0962 8.90381C18.4926 8.30022 17.7761 7.82144 16.9874 7.49478C16.1988 7.16813 15.3536 7 14.5 7H6.41421L9.70711 3.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUndo2Icon.displayName = 'Undo2Icon'\n","import { type Editor } from '@tiptap/react'\nimport * as React from 'react'\n\n// --- Hooks ---\nimport { useTiptapEditor } from '../../../hooks/use-tiptap-editor'\n\n// --- Icons ---\nimport { Redo2Icon } from '../../tiptap-icons/redo2-icon'\nimport { Undo2Icon } from '../../tiptap-icons/undo2-icon'\n\n// --- UI Primitives ---\nimport type { ButtonProps } from '../../tiptap-ui-primitive/button'\nimport { Button } from '../../tiptap-ui-primitive/button'\n\nexport type HistoryAction = 'undo' | 'redo'\n\n/**\n * Props for the UndoRedoButton component.\n */\nexport interface UndoRedoButtonProps extends ButtonProps {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * The history action to perform (undo or redo).\n */\n action: HistoryAction\n}\n\nexport const historyIcons = {\n undo: Undo2Icon,\n redo: Redo2Icon\n}\n\nexport const historyShortcutKeys: Partial<Record<HistoryAction, string>> = {\n undo: 'Ctrl-z',\n redo: 'Ctrl-Shift-z'\n}\n\nexport const historyActionLabels: Record<HistoryAction, string> = {\n undo: '撤销',\n redo: '重做'\n}\n\n/**\n * Checks if a history action can be executed.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to check\n * @returns Whether the action can be executed\n */\nexport function canExecuteHistoryAction(editor: Editor | null, action: HistoryAction): boolean {\n if (!editor) return false\n return action === 'undo' ? editor.can().undo() : editor.can().redo()\n}\n\n/**\n * Executes a history action on the editor.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to execute\n * @returns Whether the action was executed successfully\n */\nexport function executeHistoryAction(editor: Editor | null, action: HistoryAction): boolean {\n if (!editor) return false\n const chain = editor.chain().focus()\n return action === 'undo' ? chain.undo().run() : chain.redo().run()\n}\n\n/**\n * Determines if a history action should be disabled.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to check\n * @param userDisabled Whether the action is explicitly disabled by the user\n * @returns Whether the action should be disabled\n */\nexport function isHistoryActionDisabled(editor: Editor | null, action: HistoryAction, userDisabled: boolean = false): boolean {\n if (userDisabled) return true\n return !canExecuteHistoryAction(editor, action)\n}\n\n/**\n * Hook that provides all the necessary state and handlers for a history action.\n *\n * @param editor The TipTap editor instance\n * @param action The history action to handle\n * @param disabled Whether the action is explicitly disabled\n * @returns Object containing state and handlers for the history action\n */\nexport function useHistoryAction(editor: Editor | null, action: HistoryAction, disabled: boolean = false) {\n const canExecute = React.useMemo(() => canExecuteHistoryAction(editor, action), [editor, action])\n\n const isDisabled = isHistoryActionDisabled(editor, action, disabled)\n\n const handleAction = React.useCallback(() => {\n if (!editor || isDisabled) return\n executeHistoryAction(editor, action)\n }, [editor, action, isDisabled])\n\n const Icon = historyIcons[action]\n const actionLabel = historyActionLabels[action]\n const shortcutKey = historyShortcutKeys[action]\n\n return {\n canExecute,\n isDisabled,\n handleAction,\n Icon,\n actionLabel,\n shortcutKey\n }\n}\n\n/**\n * Button component for triggering undo/redo actions in a TipTap editor.\n */\nexport const UndoRedoButton = React.forwardRef<HTMLButtonElement, UndoRedoButtonProps>(\n ({ editor: providedEditor, action, text, className = '', disabled, onClick, children, ...buttonProps }, ref) => {\n const editor = useTiptapEditor(providedEditor)\n\n const { isDisabled, handleAction, Icon, actionLabel, shortcutKey } = useHistoryAction(editor, action, disabled)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n\n if (!e.defaultPrevented && !disabled) {\n handleAction()\n }\n },\n [onClick, disabled, handleAction]\n )\n\n if (!editor || !editor.isEditable) {\n return null\n }\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n className={className.trim()}\n disabled={isDisabled}\n data-style=\"ghost\"\n data-disabled={isDisabled}\n role=\"button\"\n tabIndex={-1}\n aria-label={actionLabel}\n tooltip={actionLabel}\n shortcutKeys={shortcutKey}\n onClick={handleClick}\n {...buttonProps}\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\nUndoRedoButton.displayName = 'UndoRedoButton'\n\nexport default UndoRedoButton\n","import * as React from 'react'\n\nexport const ArrowLeftIcon = React.memo(({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n return (\n <svg width=\"24\" height=\"24\" className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\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 * as React from 'react'\n\ninterface WindowSizeState {\n width: number\n height: number\n offsetTop: number\n}\n\n/**\n * Custom hook to track window size and viewport information\n * @returns Current window dimensions and offsetTop\n */\nexport function useWindowSize(): WindowSizeState {\n const [windowSize, setWindowSize] = React.useState<WindowSizeState>({\n width: 0,\n height: 0,\n offsetTop: 0\n })\n\n function handleResize() {\n if (typeof window === 'undefined') return\n\n const vp = window.visualViewport\n if (!vp) return\n\n const { width = 0, height = 0, offsetTop = 0 } = vp\n\n // Only update state if values have changed\n setWindowSize((state) => {\n if (width === state.width && height === state.height && offsetTop === state.offsetTop) {\n return state\n }\n\n return { width, height, offsetTop }\n })\n }\n React.useEffect(() => {\n handleResize()\n\n const visualViewport = window.visualViewport\n if (visualViewport) {\n visualViewport.addEventListener('resize', handleResize)\n visualViewport.addEventListener('scroll', handleResize)\n }\n\n return () => {\n if (visualViewport) {\n visualViewport.removeEventListener('resize', handleResize)\n visualViewport.removeEventListener('scroll', handleResize)\n }\n }\n }, [])\n\n return windowSize\n}\n","import type { Editor } from '@tiptap/react'\nimport * as React from 'react'\nimport { useWindowSize } from './use-window-size'\n\n/**\n * Interface defining required parameters for the cursor visibility hook\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 * Reference to the element to track for cursor visibility\n */\n elementRef?: React.RefObject<HTMLElement> | null\n}\n\n/**\n * Simplified DOMRect type containing only the essential positioning properties\n */\nexport type RectState = Pick<DOMRect, 'x' | 'y' | 'width' | 'height'>\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 * This is particularly useful for long-form content editing where the cursor\n * might move out of the visible area as the user types.\n *\n * @param options Configuration options for cursor visibility behavior\n * @returns void\n */\nexport function useCursorVisibility({ editor, overlayHeight = 0, elementRef = null }: CursorVisibilityOptions) {\n const { height: windowHeight } = useWindowSize()\n const [rect, setRect] = React.useState<RectState>({\n x: 0,\n y: 0,\n width: 0,\n height: 0\n })\n\n const updateRect = React.useCallback(() => {\n const element = elementRef?.current ?? document.body\n\n const { x, y, width, height } = element.getBoundingClientRect()\n setRect({ x, y, width, height })\n }, [elementRef])\n\n React.useEffect(() => {\n const element = elementRef?.current ?? document.body\n\n updateRect()\n\n const resizeObserver = new ResizeObserver(() => {\n window.requestAnimationFrame(updateRect)\n })\n\n resizeObserver.observe(element)\n window.addEventListener('scroll', updateRect, { passive: true })\n\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('scroll', updateRect)\n }\n }, [elementRef, updateRect])\n\n React.useEffect(() => {\n const ensureCursorVisibility = () => {\n if (!editor) return\n\n const { state, view } = editor\n\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) {\n if (cursorCoords) {\n // Check if there's enough space between cursor and bottom of window\n const availableSpace = windowHeight - cursorCoords.top - overlayHeight > 0\n\n // If not enough space, scroll to position cursor in the middle of viewport\n if (!availableSpace) {\n const targetScrollY =\n // TODO: Needed?\n // window.scrollY + (cursorCoords.top - windowHeight / 2)\n cursorCoords.top - windowHeight / 2\n\n window.scrollTo({\n top: targetScrollY,\n behavior: 'smooth'\n })\n }\n }\n }\n }\n\n ensureCursorVisibility()\n }, [editor, overlayHeight, windowHeight, rect.height])\n\n return rect\n}\n","import * as React from 'react'\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener('change', onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener('change', onChange)\n }, [])\n\n return !!isMobile\n}\n","import { mergeAttributes, Node } from '@tiptap/core'\n\nexport default Node.create({\n name: 'PageNoNode', // 节点名称\n\n group: 'block', // 可以作为块级元素\n // content: 'block+', // 能嵌套多个块级内容(如 heading, paragraph 等)\n\n // defining: true, // 使其在文档结构中稳定,避免被合并\n\n // 自定义渲染HTML\n renderHTML({ node, HTMLAttributes }) {\n // 获取动态的 pageIndex 属性\n const pageIndex = node.attrs.pageIndex || '1' // 如果没有传值,则默认值为 1\n\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: 'page-no', // 添加类名\n 'page-no': pageIndex // 设置动态的 page-no 属性\n })\n // 0\n ]\n },\n\n // 自定义节点的可视化表现\n addAttributes() {\n return {\n pageIndex: {\n default: null, // 默认没有值,允许动态传递\n renderHTML: (attributes) => {\n return {\n 'page-no': attributes.pageIndex\n }\n }\n }\n }\n },\n\n // 用于从节点中提取文本内容\n parseHTML() {\n return [\n {\n tag: 'div.page-no', // 匹配 `.page-no` 类的 div\n getAttrs: (node) => {\n const pageIndex = node.getAttribute('page-no')\n return { pageIndex } // 获取 page-no 属性并传递给节点\n }\n }\n ]\n }\n})\n","// MIT License\n// https://github.com/sereneinserenade/tiptap-search-and-replace\n\n// Copyright (c) 2023 - 2024 Jeet Mandaliya (Github Username: sereneinserenade)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { Extension, Range, type Dispatch } from '@tiptap/core'\nimport { Node as PMNode } from '@tiptap/pm/model'\nimport { Plugin, PluginKey, type EditorState, type Transaction } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n search: {\n /**\n * @description Set search term in extension.\n */\n setSearchTerm: (searchTerm: string) => ReturnType\n /**\n * @description Set replace term in extension.\n */\n setReplaceTerm: (replaceTerm: string) => ReturnType\n /**\n * @description Set case sensitivity in extension.\n */\n setCaseSensitive: (caseSensitive: boolean) => ReturnType\n /**\n * @description Reset current search result to first instance.\n */\n resetIndex: () => ReturnType\n /**\n * @description Find next instance of search result.\n */\n nextSearchResult: () => ReturnType\n /**\n * @description Find previous instance of search result.\n */\n previousSearchResult: () => ReturnType\n /**\n * @description Replace first instance of search result with given replace term.\n */\n replace: () => ReturnType\n /**\n * @description Replace all instances of search result with given replace term.\n */\n replaceAll: () => ReturnType\n }\n }\n}\n\ninterface TextNodesWithPosition {\n text: string\n pos: number\n}\n\nconst getRegex = (s: string, disableRegex: boolean, caseSensitive: boolean): RegExp => {\n return RegExp(disableRegex ? s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') : s, caseSensitive ? 'gu' : 'gui')\n}\n\ninterface ProcessedSearches {\n decorationsToReturn: DecorationSet\n results: Range[]\n}\n\nfunction processSearches(doc: PMNode, searchTerm: RegExp, searchResultClass: string, resultIndex: number): ProcessedSearches {\n const decorations: Decoration[] = []\n const results: Range[] = []\n\n let textNodesWithPosition: TextNodesWithPosition[] = []\n let index = 0\n\n if (!searchTerm) {\n return {\n decorationsToReturn: DecorationSet.empty,\n results: []\n }\n }\n\n doc?.descendants((node, pos) => {\n if (node.isText) {\n if (textNodesWithPosition[index]) {\n textNodesWithPosition[index] = {\n text: textNodesWithPosition[index].text + node.text,\n pos: textNodesWithPosition[index].pos\n }\n } else {\n textNodesWithPosition[index] = {\n text: `${node.text}`,\n pos\n }\n }\n } else {\n index += 1\n }\n })\n\n textNodesWithPosition = textNodesWithPosition.filter(Boolean)\n\n for (const element of textNodesWithPosition) {\n const { text, pos } = element\n const matches = Array.from(text.matchAll(searchTerm)).filter(([matchText]) => matchText.trim())\n\n for (const m of matches) {\n if (m[0] === '') break\n\n if (m.index !== undefined) {\n results.push({\n from: pos + m.index,\n to: pos + m.index + m[0].length\n })\n }\n }\n }\n\n for (let i = 0; i < results.length; i += 1) {\n const r = results[i]\n const className = i === resultIndex ? `${searchResultClass} ${searchResultClass}-current` : searchResultClass\n const decoration: Decoration = Decoration.inline(r.from, r.to, {\n class: className\n })\n\n decorations.push(decoration)\n }\n\n return {\n decorationsToReturn: DecorationSet.create(doc, decorations),\n results\n }\n}\n\nconst replace = (replaceTerm: string, results: Range[], { state, dispatch }: { state: EditorState; dispatch: Dispatch }) => {\n const firstResult = results[0]\n\n if (!firstResult) return\n\n const { from, to } = results[0]\n\n if (dispatch) dispatch(state.tr.insertText(replaceTerm, from, to))\n}\n\nconst rebaseNextResult = (replaceTerm: string, index: number, lastOffset: number, results: Range[]): [number, Range[]] | null => {\n const nextIndex = index + 1\n\n if (!results[nextIndex]) return null\n\n const { from: currentFrom, to: currentTo } = results[index]\n\n const offset = currentTo - currentFrom - replaceTerm.length + lastOffset\n\n const { from, to } = results[nextIndex]\n\n results[nextIndex] = {\n to: to - offset,\n from: from - offset\n }\n\n return [offset, results]\n}\n\nconst replaceAll = (replaceTerm: string, results: Range[], { tr, dispatch }: { tr: Transaction; dispatch: Dispatch }) => {\n let offset = 0\n\n let resultsCopy = results.slice()\n\n if (!resultsCopy.length) return\n\n for (let i = 0; i < resultsCopy.length; i += 1) {\n const { from, to } = resultsCopy[i]\n\n tr.insertText(replaceTerm, from, to)\n\n const rebaseNextResultResponse = rebaseNextResult(replaceTerm, i, offset, resultsCopy)\n\n if (!rebaseNextResultResponse) continue\n\n offset = rebaseNextResultResponse[0]\n resultsCopy = rebaseNextResultResponse[1]\n }\n\n dispatch?.(tr)\n}\n\nexport const searchAndReplacePluginKey = new PluginKey('searchAndReplacePlugin')\n\nexport interface SearchAndReplaceOptions {\n searchResultClass: string\n disableRegex: boolean\n}\n\nexport interface SearchAndReplaceStorage {\n searchTerm: string\n replaceTerm: string\n results: Range[]\n lastSearchTerm: string\n caseSensitive: boolean\n lastCaseSensitive: boolean\n resultIndex: number\n lastResultIndex: number\n}\n\nexport const SearchAndReplace = Extension.create<SearchAndReplaceOptions, SearchAndReplaceStorage>({\n name: 'searchAndReplace',\n\n addOptions() {\n return {\n searchResultClass: 'search-result',\n disableRegex: true\n }\n },\n\n addStorage() {\n return {\n searchTerm: '',\n replaceTerm: '',\n results: [],\n lastSearchTerm: '',\n caseSensitive: false,\n lastCaseSensitive: false,\n resultIndex: 0,\n lastResultIndex: 0\n }\n },\n\n addCommands() {\n return {\n setSearchTerm:\n (searchTerm: string) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.searchTerm = searchTerm\n\n return false\n },\n setReplaceTerm:\n (replaceTerm: string) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.replaceTerm = replaceTerm\n\n return false\n },\n setCaseSensitive:\n (caseSensitive: boolean) =>\n ({ editor }) => {\n editor.storage.searchAndReplace.caseSensitive = caseSensitive\n\n return false\n },\n resetIndex:\n () =>\n ({ editor }) => {\n editor.storage.searchAndReplace.resultIndex = 0\n\n return false\n },\n nextSearchResult:\n () =>\n ({ editor }) => {\n const { results, resultIndex } = editor.storage.searchAndReplace\n\n const nextIndex = resultIndex + 1\n\n if (results[nextIndex]) {\n editor.storage.searchAndReplace.resultIndex = nextIndex\n } else {\n editor.storage.searchAndReplace.resultIndex = 0\n }\n\n return false\n },\n previousSearchResult:\n () =>\n ({ editor }) => {\n const { results, resultIndex } = editor.storage.searchAndReplace\n\n const prevIndex = resultIndex - 1\n\n if (results[prevIndex]) {\n editor.storage.searchAndReplace.resultIndex = prevIndex\n } else {\n editor.storage.searchAndReplace.resultIndex = results.length - 1\n }\n\n return false\n },\n replace:\n () =>\n ({ editor, state, dispatch }) => {\n const { replaceTerm, results } = editor.storage.searchAndReplace\n\n replace(replaceTerm, results, { state, dispatch })\n\n return false\n },\n replaceAll:\n () =>\n ({ editor, tr, dispatch }) => {\n const { replaceTerm, results } = editor.storage.searchAndReplace\n\n replaceAll(replaceTerm, results, { tr, dispatch })\n\n return false\n }\n }\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor\n const { searchResultClass, disableRegex } = this.options\n\n const setLastSearchTerm = (t: string) => (editor.storage.searchAndReplace.lastSearchTerm = t)\n const setLastCaseSensitive = (t: boolean) => (editor.storage.searchAndReplace.lastCaseSensitive = t)\n const setLastResultIndex = (t: number) => (editor.storage.searchAndReplace.lastResultIndex = t)\n\n return [\n new Plugin({\n key: searchAndReplacePluginKey,\n state: {\n init: () => DecorationSet.empty,\n apply({ doc, docChanged }, oldState) {\n const { searchTerm, lastSearchTerm, caseSensitive, lastCaseSensitive, resultIndex, lastResultIndex } = editor.storage.searchAndReplace\n\n if (!docChanged && lastSearchTerm === searchTerm && lastCaseSensitive === caseSensitive && lastResultIndex === resultIndex)\n return oldState\n\n setLastSearchTerm(searchTerm)\n setLastCaseSensitive(caseSensitive)\n setLastResultIndex(resultIndex)\n\n if (!searchTerm) {\n editor.storage.searchAndReplace.results = []\n return DecorationSet.empty\n }\n\n const { decorationsToReturn, results } = processSearches(\n doc,\n getRegex(searchTerm, disableRegex, caseSensitive),\n searchResultClass,\n resultIndex\n )\n\n editor.storage.searchAndReplace.results = results\n\n return decorationsToReturn\n }\n },\n props: {\n decorations(state) {\n return this.getState(state)\n }\n }\n })\n ]\n }\n})\n\nexport default SearchAndReplace\n","import { EditorContent, EditorContext, useEditor } from '@tiptap/react'\n\n// --- Styles ---\nimport './index.less'\nimport './styles/_keyframe-animations.less'\nimport './styles/_reset.less'\nimport './styles/_variables.less'\n\nimport { Markdown } from 'tiptap-markdown'\n\n// --- Tiptap Core Extensions ---\nimport { Highlight } from '@tiptap/extension-highlight'\nimport { Image } from '@tiptap/extension-image'\nimport { Subscript } from '@tiptap/extension-subscript'\nimport { Superscript } from '@tiptap/extension-superscript'\nimport { TaskItem } from '@tiptap/extension-task-item'\nimport { TaskList } from '@tiptap/extension-task-list'\nimport { TextAlign } from '@tiptap/extension-text-align'\nimport { Typography } from '@tiptap/extension-typography'\nimport { Underline } from '@tiptap/extension-underline'\nimport { StarterKit } from '@tiptap/starter-kit'\n\nimport Table from '@tiptap/extension-table'\nimport TableCell from '@tiptap/extension-table-cell'\nimport TableHeader from '@tiptap/extension-table-header'\nimport TableRow from '@tiptap/extension-table-row'\n// import { Gapcursor } from '@tiptap/extensions'\nimport { BubbleMenu } from '@tiptap/react'\n\n// --- Custom Extensions ---\nimport { Link } from './components/tiptap-extension/link-extension'\nimport { Selection } from './components/tiptap-extension/selection-extension'\nimport { TrailingNode } from './components/tiptap-extension/trailing-node-extension'\n\n// --- UI Primitives ---\nimport { Button } from './components/tiptap-ui-primitive/button'\nimport { Spacer } from './components/tiptap-ui-primitive/spacer'\nimport { Toolbar, ToolbarGroup, ToolbarSeparator } from './components/tiptap-ui-primitive/toolbar'\n\n// --- Tiptap Node ---\nimport './components/tiptap-node/code-block-node/code-block-node.less'\nimport './components/tiptap-node/image-node/image-node.less'\nimport './components/tiptap-node/list-node/list-node.less'\nimport './components/tiptap-node/paragraph-node/paragraph-node.less'\n\n// --- Tiptap UI ---\nimport { HeadingDropdownMenu } from './components/tiptap-ui/heading-dropdown-menu'\nimport { HighlightContent, HighlighterButton, HighlightPopover } from './components/tiptap-ui/highlight-popover'\nimport { LinkButton, LinkContent, LinkPopover } from './components/tiptap-ui/link-popover'\nimport { ListDropdownMenu } from './components/tiptap-ui/list-dropdown-menu'\nimport { MarkButton } from './components/tiptap-ui/mark-button'\nimport { NodeButton } from './components/tiptap-ui/node-button'\nimport { QuoteButton } from './components/tiptap-ui/quote-button'\nimport { TextAlignButton } from './components/tiptap-ui/text-align-button'\nimport { UndoRedoButton } from './components/tiptap-ui/undo-redo-button'\n\n// --- Icons ---\nimport { ArrowLeftIcon } from './components/tiptap-icons/arrow-left-icon'\nimport { HighlighterIcon } from './components/tiptap-icons/highlighter-icon'\nimport { LinkIcon } from './components/tiptap-icons/link-icon'\n\n// --- Hooks ---\nimport classNames from 'classnames'\nimport { ReactNode, useEffect, useRef, useState } from 'react'\nimport { useCursorVisibility } from './hooks/use-cursor-visibility'\nimport { useMobile } from './hooks/use-mobile'\nimport { useWindowSize } from './hooks/use-window-size'\n\nimport { Flex, Tag } from 'antd'\n// import TurndownService from 'turndown'\nimport { useDebounce } from '../../hooks'\nimport PageNoNode from './extensions/pageNoNode'\nimport SearchAndReplace from './extensions/searchAndReplace'\n\n// const turndown = new TurndownService()\nconst MainToolbarContent = ({\n onHighlighterClick,\n onLinkClick,\n onQuote,\n // onSetComment,\n isMobile,\n isBubble\n}: {\n onHighlighterClick: () => void\n onLinkClick: () => void\n onQuote?: MarkdownEditorProps['onQuote']\n // onSetComment: () => void\n isMobile: boolean\n isBubble: boolean\n}) => {\n return (\n <>\n <Spacer />\n {onQuote && (\n <ToolbarGroup>\n <QuoteButton onQuote={onQuote} />\n </ToolbarGroup>\n )}\n {!isBubble && (\n <>\n <ToolbarGroup>\n <UndoRedoButton action=\"undo\" />\n <UndoRedoButton action=\"redo\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n </>\n )}\n {/* <Button onClick={onSetComment}>评论</Button> */}\n\n <ToolbarGroup>\n <HeadingDropdownMenu levels={[1, 2, 3, 4]} />\n <ListDropdownMenu types={['bulletList', 'orderedList', 'taskList']} />\n <NodeButton type=\"codeBlock\" />\n <NodeButton type=\"blockquote\" />\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n <ToolbarGroup>\n <MarkButton type=\"bold\" />\n <MarkButton type=\"italic\" />\n <MarkButton type=\"strike\" />\n <MarkButton type=\"code\" />\n <MarkButton type=\"underline\" />\n {!isMobile ? <HighlightPopover /> : <HighlighterButton onClick={onHighlighterClick} />}\n {!isMobile ? <LinkPopover /> : <LinkButton onClick={onLinkClick} />}\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\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 <Spacer />\n\n {isMobile && <ToolbarSeparator />}\n </>\n )\n}\n\nconst MobileToolbarContent = ({ type, onBack }: { type: 'highlighter' | 'link'; onBack: () => void }) => (\n <>\n <ToolbarGroup>\n <Button data-style=\"ghost\" onClick={onBack}>\n <ArrowLeftIcon className=\"tiptap-button-icon\" />\n {type === 'highlighter' ? <HighlighterIcon className=\"tiptap-button-icon\" /> : <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n </ToolbarGroup>\n\n <ToolbarSeparator />\n\n {type === 'highlighter' ? <HighlightContent /> : <LinkContent />}\n </>\n)\n/**\n * Markdown编辑器组件属性接口\n */\nexport interface MarkdownEditorProps {\n /** 是否禁用编辑器 */\n disabled?: boolean\n /** 搜索关键字 */\n searchValue?: string\n /** 编辑器内容 */\n value?: string\n /** 内容变化回调 */\n onChange?: (value: string) => void\n /** 页面滚动回调 */\n onScrollPage?: (pageIndex: number) => void\n /** 额外导航内容 */\n extraNav?: ReactNode\n /** 是否显示工具栏,默认为true */\n showToolbar?: boolean\n /** 引用文本回调 */\n onQuote?: (text: string) => void\n /** 文件下载回调 */\n onDownloadFile?: (fileContent: string, targetFormat?: string) => Promise<void>\n}\n\n/**\n * Markdown编辑器组件\n * 基于Tiptap构建的富文本编辑器,支持Markdown语法\n * 提供丰富的编辑功能:格式化、链接、图片、表格、高亮等\n * @param props - 组件属性\n */\nexport default ({\n value = '',\n onChange,\n onScrollPage,\n searchValue,\n disabled,\n extraNav,\n showToolbar = true,\n onQuote,\n onDownloadFile\n}: MarkdownEditorProps) => {\n const isMobile = useMobile()\n const windowSize = useWindowSize()\n const lastContentRef = useRef<string>('') // 存储 editor 上一次内容\n const [mobileView, setMobileView] = useState<'main' | 'highlighter' | 'link'>('main')\n const toolbarRef = useRef<HTMLDivElement>(null)\n const editor = useEditor({\n immediatelyRender: false,\n editorProps: {\n attributes: {\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n 'aria-label': 'Main content area, start typing to enter text.'\n }\n },\n extensions: [\n Markdown.configure({\n transformPastedText: true,\n transformCopiedText: true,\n breaks: true\n }),\n StarterKit,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n Underline,\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Image,\n Typography,\n Superscript,\n Subscript,\n Selection,\n TrailingNode,\n Link.configure({ openOnClick: false }),\n\n Table.configure({\n resizable: true // 可选,允许调整表格大小\n }),\n TableHeader,\n TableRow,\n TableCell,\n // Gapcursor,\n SearchAndReplace.configure({\n searchResultClass: 'cube-hl', // class to give to found items. default 'cube-hl'\n disableRegex: false // also no need to explain\n }),\n PageNoNode\n // Comment.configure({\n // HTMLAttributes: {\n // class: 'my-comment'\n // },\n // onCommentActivated: (commentId) => {\n // setActiveCommentId(commentId)\n\n // if (commentId) setTimeout(() => focusCommentWithActiveId(commentId))\n // }\n // })\n ],\n content: '',\n onUpdate: () => {\n // console.log('update 文本改变')\n const markdownOutput = getMarkdown()\n // ✅ 防抖:与上一次一致则不触发(避免无限循环)\n if (markdownOutput === lastContentRef.current) return\n lastContentRef.current = markdownOutput\n onChange?.(markdownOutput)\n }\n })\n\n const getMarkdown = () => {\n if (!editor) return ''\n return editor.storage.markdown.getMarkdown()\n // return turndown.turndown(editor.getHTML())\n }\n // const [comments, setComments] = useState<Comment[]>([])\n\n // const [activeCommentId, setActiveCommentId] = useState<string | null>(null)\n\n // const commentsSectionRef = useRef<HTMLDivElement | null>(null)\n\n // const focusCommentWithActiveId = (id: string) => {\n // if (!commentsSectionRef.current) return\n\n // const commentInput = commentsSectionRef.current.querySelector<HTMLInputElement>(`input#${id}`)\n\n // if (!commentInput) return\n\n // commentInput.scrollIntoView({\n // behavior: 'smooth',\n // block: 'center',\n // inline: 'center'\n // })\n // }\n\n // useEffect(() => {\n // if (!activeCommentId) return\n\n // focusCommentWithActiveId(activeCommentId)\n // }, [activeCommentId])\n // interface Comment {\n // id: string\n // content: string\n // replies: Comment[]\n // createdAt: Date\n // }\n // const getNewComment = (content: string): Comment => {\n // return {\n // id: genNonDuplicateID(),\n // content,\n // replies: [],\n // createdAt: new Date()\n // }\n // }\n // const onSetComment = () => {\n // const newComment = getNewComment('')\n\n // setComments([...comments, newComment])\n\n // editor?.commands.setComment(newComment.id)\n\n // setActiveCommentId(newComment.id)\n\n // setTimeout(focusCommentWithActiveId)\n\n // console.log('comments', comments)\n // }\n\n const bodyRect = useCursorVisibility({\n editor,\n overlayHeight: toolbarRef.current?.getBoundingClientRect().height ?? 0\n })\n\n useEffect(() => {\n if (!isMobile && mobileView !== 'main') {\n setMobileView('main')\n }\n }, [isMobile, mobileView])\n\n useEffect(() => {\n // console.log('value改变')\n if (!editor) return\n // const current = getMarkdown()\n // // ✅ 如果外部 value 和当前 editor 内容一致 → 不更新\n // if (current === value) return\n\n // ✅ 如果外部 value 和内部记录一致 → 不更新\n if (lastContentRef.current === value) return\n\n editor?.commands.setContent(value)\n // ✅ 同步内部历史,避免 onUpdate 再次触发回调\n lastContentRef.current = value\n\n // 监听滚动\n // if (value) {\n // // 获取所有的 page-no 节点\n // const pageNoNodes = editor.view.dom.querySelectorAll('.page-no')\n // if (!pageNoNodes.length) return\n // // 创建 IntersectionObserver 实例\n // const observer = new IntersectionObserver(\n // (entries) => {\n // entries.forEach((entry) => {\n // if (entry.isIntersecting && entry.intersectionRatio > 0) {\n // // 这里可以执行节点进入视口时的逻辑\n // const boundingTop = entry.boundingClientRect.top\n // const rootTop = entry.rootBounds?.top ?? 0\n // console.log('当前页面索引1:', boundingTop, rootTop)\n // if (Math.abs(boundingTop - rootTop) <= 10) {\n // const pageIndex = entry.target.getAttribute('page-no')\n // console.log('当前页面索引:', pageIndex)\n // // onPageChange(pageIndex) // 调用回调并传递 pageIndex\n // }\n // }\n // })\n // },\n // {\n // root: document.querySelector('.content-wrapper'), // 视口\n // rootMargin: '0px 0px -99% 0px',\n // threshold: 0 // 进入视口时触发\n // }\n // )\n\n // // 为每个 page-no 节点添加观察\n // pageNoNodes.forEach((node) => observer.observe(node))\n\n // // 清理: 在组件卸载时停止观察\n // return () => {\n // pageNoNodes.forEach((node) => observer.unobserve(node))\n // }\n // }\n }, [value, editor])\n\n const onPageChange = useDebounce((pageIndex?: string) => {\n // console.log('onPageChange', pageIndex)\n onScrollPage?.(parseInt(pageIndex ?? '0'))\n }, 300)\n useEffect(() => {\n if (!editor) return\n const container = document.querySelector('.content-wrapper')\n if (!container) return\n const handleSelectionUpdate = () => {\n const { from } = editor.state.selection\n const domAtPos = editor.view.domAtPos(from)\n const domNode = domAtPos.node as HTMLElement\n\n // 获取 content DOM\n const contentRoot = editor.view.dom\n\n // 当前节点或父节点查找 page-no\n let el: HTMLElement | null = domNode.nodeType === 1 ? domNode : domNode.parentElement\n let pageNo: string | null = null\n\n while (el && el !== contentRoot) {\n if (el.classList.contains('page-no')) {\n pageNo = el.getAttribute('page-no')\n break\n }\n el = (el.previousElementSibling as HTMLElement) || el.parentElement\n }\n\n if (!pageNo && domNode) {\n // 如果上面找不到,尝试从当前位置向上寻找最近的 page-no\n const allPageNoEls = Array.from(contentRoot.querySelectorAll('.page-no')) as HTMLElement[]\n const scrollTop = domNode.getBoundingClientRect?.()?.top\n\n for (let i = allPageNoEls.length - 1; i >= 0; i--) {\n const elTop = allPageNoEls[i].getBoundingClientRect().top\n if (elTop < scrollTop) {\n pageNo = allPageNoEls[i].getAttribute('page-no')\n break\n }\n }\n }\n\n if (pageNo) {\n // console.log('最近的上一个 page-no:', pageNo)\n onPageChange(pageNo)\n }\n }\n\n const handleScroll = () => {\n const pageNos = Array.from(container.querySelectorAll('.page-no')) as HTMLElement[]\n if (!pageNos.length) return\n\n let closestNode: HTMLElement | null = null\n let closestTopDiff = -Infinity\n const containerTop = container.getBoundingClientRect().top\n pageNos.forEach((node) => {\n const rect = node.getBoundingClientRect()\n const top = rect.top - containerTop\n\n // 优先找 top ≈ 0 的节点(±5px 容差)\n if (Math.abs(top) <= 80) {\n closestNode = node\n closestTopDiff = 0\n }\n\n // 否则找 top < 0 且最大的(离顶部最近但在视口上方)\n else if (top < 0 && top > closestTopDiff) {\n closestNode = node\n closestTopDiff = top\n }\n })\n\n if (closestNode) {\n const pageNo = (closestNode as HTMLElement).getAttribute('page-no')\n // console.log('当前滚动最近 page-no:', pageNo)\n onPageChange(pageNo!)\n }\n }\n\n editor.on('selectionUpdate', handleSelectionUpdate)\n container.addEventListener('scroll', handleScroll)\n\n return () => {\n editor.off('selectionUpdate', handleSelectionUpdate)\n container.removeEventListener('scroll', handleScroll)\n }\n }, [editor])\n\n useEffect(() => {\n editor?.commands.setSearchTerm(searchValue || '')\n }, [searchValue, value, editor])\n\n useEffect(() => {\n editor?.setEditable(!disabled)\n }, [disabled, editor])\n\n const NsToolBar = ({ isBubble = true }: { isBubble?: boolean }) => (\n <>\n <Toolbar\n {...(isBubble\n ? {}\n : {\n ref: toolbarRef,\n style: isMobile\n ? {\n bottom: `calc(100% - ${windowSize.height - bodyRect.y}px)`\n }\n : {}\n })}\n >\n {mobileView === 'main' ? (\n <MainToolbarContent\n isBubble={isBubble}\n // onSetComment={onSetComment}\n onHighlighterClick={() => setMobileView('highlighter')}\n onLinkClick={() => setMobileView('link')}\n onQuote={onQuote}\n isMobile={isMobile}\n />\n ) : (\n <MobileToolbarContent type={mobileView === 'highlighter' ? 'highlighter' : 'link'} onBack={() => setMobileView('main')} />\n )}\n </Toolbar>\n </>\n )\n\n const downloadFile = () => {\n onDownloadFile?.(getMarkdown(), 'docx')\n }\n\n return (\n <div className={classNames('height-full', 'editor-parent')}>\n <EditorContext.Provider value={{ editor }}>\n {showToolbar && (\n <>\n <Flex justify=\"end\" align=\"center\">\n {NsToolBar({ isBubble: false })}\n {extraNav && (\n <Flex align=\"center\" className=\"m-l-16 m-r-16\">\n {onDownloadFile && (\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={downloadFile}>\n 下载\n </Tag>\n )}\n {extraNav}\n </Flex>\n )}\n </Flex>\n {!isMobile && <BubbleMenu editor={editor}>{NsToolBar({ isBubble: true })}</BubbleMenu>}\n </>\n )}\n <div className=\"content-wrapper scroll-fade-in\">\n <EditorContent\n editor={editor}\n role=\"presentation\"\n className={classNames('simple-editor-content ns-markdown', { 'no-toolbar': !showToolbar })}\n />\n </div>\n </EditorContext.Provider>\n </div>\n )\n}\n","import { forwardRef } from 'react'\nimport { isBoolean, isFunction, isNull, isObject } from '../../utils'\n\n/**\n * 渲染控制对象类型\n * 用于控制组件的显示、渲染函数和属性\n */\nexport type RenderControlObj<C, P = ObjectType<any>> = {\n /** 是否可见 */\n visible?: boolean\n /** 渲染函数 */\n render?: (ctx: C) => React.ReactNode\n /** 传递给组件的属性 */\n props?: P\n}\n\n/**\n * 渲染控制类型\n * 支持布尔值或控制对象\n */\nexport type RenderControl<C, P = ObjectType<any>> = boolean | RenderControlObj<C, P>\n\n/**\n * RenderWrapper组件属性接口\n * @param C - 上下文类型\n * @param P - 属性类型\n */\nexport interface RenderWrapperProps<C, P> {\n /** 渲染控制配置 */\n control?: RenderControl<C, P> | null\n /** 上下文数据 */\n ctx?: C\n /** 默认组件或渲染函数 */\n DefaultComponent?: React.ReactNode | ((props: P) => React.ReactNode)\n}\n\n/**\n * 判断节点是否为渲染函数\n * @param node - 要判断的节点\n * @returns 是否为渲染函数\n */\nfunction isRenderFn<P>(node: React.ReactNode | ((props: P) => React.ReactNode)): node is (props: P) => React.ReactNode {\n return isFunction(node) || (isObject(node) && !isNull(node) && '$$typeof' in node && node.$$typeof === Symbol.for('react.forward_ref'))\n}\n\n/**\n * 渲染默认组件\n * @param DefaultComponent - 默认组件\n * @param ref - ref引用\n * @param props - 组件属性\n * @returns 渲染的组件\n */\nfunction renderDefault<P>(DefaultComponent?: React.ReactNode | ((props: P) => React.ReactNode), ref?: any, props?: P) {\n if (!DefaultComponent) return null\n return isRenderFn(DefaultComponent) ? <DefaultComponent ref={ref} {...(props as P)} /> : DefaultComponent\n}\n\n/**\n * 渲染包装器组件\n * 根据控制配置条件性地渲染组件,支持动态渲染函数和属性传递\n *\n * @example\n * // 基本用法\n * <RenderWrapper control={true} DefaultComponent={<div>内容</div>} />\n *\n * // 条件渲染\n * <RenderWrapper control={{ visible: false }} DefaultComponent={<div>不显示</div>} />\n *\n * // 动态渲染\n * <RenderWrapper\n * control={{ render: (ctx) => <div>动态内容: {ctx.value}</div> }}\n * ctx={{ value: 'hello' }}\n * />\n *\n * @param props - 组件属性\n * @returns 渲染的组件或null\n */\nexport default forwardRef(function RenderWrapper<C = any, P = any>({ control = true, ctx, DefaultComponent }: RenderWrapperProps<C, P>, ref) {\n if (control === false || isNull(control)) return null\n\n if (control === true || control === undefined) {\n return renderDefault(DefaultComponent, ref)\n }\n\n const { visible = true, render, props } = control\n if (!visible) return null\n if (render) {\n return typeof render === 'function' ? render(ctx!) : render\n }\n\n // 若 DefaultComponent 是 JSX,props 会被忽略\n return renderDefault(DefaultComponent, ref, props)\n})\n\n/**\n * 判断是否应该渲染组件\n * @param control - 渲染控制配置\n * @returns 是否应该渲染\n */\nexport const shouldRender = (control?: RenderControl<any, any> | null) =>\n control != null && (isBoolean(control) ? control : control?.visible !== false)\n\n/**\n * 合并上级传入的props与当前的props\n * 用于智能地合并组件属性\n *\n * @param control - 渲染控制配置\n * @param props - 要合并的属性\n * @returns 合并后的属性对象或null\n */\nexport function propsMerge(control?: RenderControl<any, any> | null, props?: ObjectType<any>) {\n if (control === true || control === undefined) {\n return {\n props\n }\n }\n if (isObject(control) && (control?.visible === true || control?.visible === undefined)) {\n return {\n props: {\n ...props,\n ...control?.props\n }\n }\n }\n return null\n}\n","import { Avatar } from 'antd'\n\n/**\n * 用户头像组件属性接口\n */\nexport interface UserAvatarProps {\n /** 头像图片地址 */\n avatarSrc?: string\n /** 用户名 */\n userName?: string\n /** 头像尺寸 */\n size?: number\n}\n\n/**\n * 用户头像组件\n * 如果没有头像图片,则显示用户名首字母作为头像\n * @param props - 组件属性\n */\nexport default ({ size, avatarSrc, userName }: UserAvatarProps) => {\n return avatarSrc ? (\n <Avatar size={size} src={avatarSrc} />\n ) : (\n <Avatar size={size} className=\"cursor-pointer\" style={{ backgroundColor: 'var(--ant-color-primary)' }}>\n {userName?.slice(0, 1)?.toLocaleUpperCase()}\n </Avatar>\n )\n}\n"]}
|