@zero-library/common 2.2.13 → 2.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/File/styles.module.less","../src/components/File/AudioPlayer.tsx","../src/utils/is.ts","../src/utils/math.ts","../src/utils/common.ts","../src/utils/date.ts","../src/utils/message.ts","../src/utils/pattern.ts","../src/utils/request.ts","../src/utils/storage.ts","../src/components/File/DocxPreview.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/hooks/iframe/useIframeRelayBridge.ts","../src/hooks/useAutoRefresh.ts","../src/hooks/useCountDown.ts","../src/hooks/useCreateValtioContext.tsx","../src/hooks/useDebounce.ts","../src/hooks/useDeepEffect.ts","../src/hooks/useRefState.ts","../src/hooks/useSpeech.ts","../src/hooks/useSyncInput.ts","../src/hooks/useThrottle.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/SpeechButton/SpeechLoading.tsx","../src/components/SpeechButton/index.tsx","../src/components/UserAvatar/index.tsx"],"names":["nsPreviewImage","nsPreviewPdf","pdfToolbar","nsPreviewVideo","nsPreviewAudio","nsPreviewDocx","docxToolbar","docxContent","jsx","Decimal","isJson","setInterval","message","minus","document","AES","encUtf8","precision","md","MarkdownIt","markdownItTaskLists","markdownItEmoji","markdownItFootnote","markdownItDefList","dayjs","relativeTime","notification","Modal","showError","axios","config","useRef","useState","useEffect","renderAsync","jsxs","classNames","Flex","Button","MinusCircleOutlined","PlusCircleOutlined","RedoOutlined","Icon","useMemo","FileTextOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","VideoCameraOutlined","NotificationOutlined","FileJpgOutlined","FileImageOutlined","FileGifOutlined","FileMarkdownOutlined","FileZipOutlined","FileUnknownOutlined","lazy","Suspense","markdownIt","markdownItKatex","jsonrepair","parse","error","Result","startCount","count","createContext","useContext","useCallback","Form","PasswordStatus","Alert","Input","password","pageNavigationPlugin","thumbnailPlugin","zoomPlugin","Toolbar","pageNo","Worker","Splitter","Viewer","zh_CN","Empty","Image","Drawer","styles_module_default","iframe","forwardRef","Fragment","Spin","TiptapLink","Plugin","getMarkRange","TextSelection","Extension","PluginKey","isNodeSelection","DecorationSet","Decoration","React","useFloating","autoUpdate","offset","flip","shift","useHover","useFocus","useDismiss","useRole","useInteractions","FloatingDelayGroup","TooltipTrigger","useMergeRefs","TooltipContent","FloatingPortal","React2","React3","React4","React5","useCurrentEditor","React6","React7","React8","React9","React10","React11","React12","React13","React14","React15","React16","useClick","useListNavigation","useTypeahead","FloatingList","FloatingFocusManager","useListItem","React17","React18","React19","React20","React21","limitShift","PopoverTrigger","PopoverContent","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","Node","mergeAttributes","useEditor","Markdown","StarterKit","TextAlign","Underline","TaskList","TaskItem","Highlight","Typography","Superscript","Subscript","Table","TableHeader","TableRow","TableCell","downloadFile","EditorContext","Tag","BubbleMenu","EditorContent","AudioMutedOutlined","AudioOutlined","Avatar"],"mappings":"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","file":"index.cjs.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.nsPreviewDocx .docxToolbar {\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 z-index: 1;\n}\n.nsPreviewDocx .docxContent {\n background: gray;\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","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 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 } from 'antd'\nimport AES from 'crypto-js/aes'\nimport encUtf8 from 'crypto-js/enc-utf8'\nimport MarkdownIt from 'markdown-it'\nimport markdownItDefList from 'markdown-it-deflist'\nimport { full as markdownItEmoji } from 'markdown-it-emoji'\nimport markdownItFootnote from 'markdown-it-footnote'\nimport markdownItTaskLists from 'markdown-it-task-lists'\nimport {\n isArray,\n isDate,\n isDef,\n isExternal,\n isFunction,\n isMap,\n isNull,\n isNullOrUnDef,\n isNumberNoNaN,\n isObject,\n isRegExp,\n isScriptSafe,\n isSet,\n isString\n} from './is'\nimport { compareNum, dividedBy, toFixed } from './math'\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 * setInterval函数返回的控制对象类型接口\n * 提供对定时器运行状态的检查和取消操作\n */\nexport interface SetIntervalType {\n /**\n * 检查定时器是否正在运行\n * @returns boolean - true表示正在运行,false表示已停止\n */\n isRun: () => boolean\n /**\n * 取消定时器\n * 调用后将停止后续的函数执行并清理资源\n */\n cancel: () => void\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 const 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 const 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 const 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 const 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\nexport type SizeUnit = 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'\n\nexport interface FormatSizeOptions {\n /** 起始单位,默认 KB */\n from?: SizeUnit\n /** 保留小数位数,默认 2 */\n precision?: number\n /** 是否去除多余的 0,如 1.00 -> 1 */\n trimZero?: boolean\n /** 最大单位限制 */\n maxUnit?: SizeUnit\n}\n/**\n * 格式化文件大小显示\n *\n * 将给定的数值按照指定单位转换为更友好的可读格式(如KB, MB, GB等)\n * 支持从不同单位开始转换,并可自定义精度和最大单位限制\n *\n * @param value - 需要格式化的数值(可以是数字或数字字符串)\n * @param options - 格式化选项\n * @param options.from - 输入数值的单位,默认为 'KB'\n * @param options.precision - 保留的小数位数,默认为 2\n * @param options.trimZero - 是否去除尾部的零,默认为 false\n * @param options.maxUnit - 最大转换单位,超过该单位则不再转换,默认无限制\n *\n * @returns 格式化后的文件大小字符串,如果输入无效则返回原值\n *\n * @example\n * formatSize(1024) // \"1024.00KB\"\n * formatSize(1024, { from: 'B' }) // \"1.00KB\"\n * formatSize(1024, { precision: 0 }) // \"1024KB\"\n * formatSize(1024, { trimZero: true }) // \"1024KB\"\n * formatSize(2048, { maxUnit: 'KB' }) // \"2048.00KB\" (不会转换为MB)\n *\n * @remarks\n * - 支持从 B, KB, MB, GB, TB, PB 等单位开始转换\n */\nexport const formatSize = (value: number | string, options: FormatSizeOptions = {}): number | string => {\n if (isNullOrUnDef(value) || !isNumberNoNaN(Number(value))) return value\n const UNIT_LIST: SizeUnit[] = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']\n const { from = 'KB', precision = 2, trimZero = false, maxUnit } = options\n\n let index = UNIT_LIST.indexOf(from)\n if (index === -1) {\n console.warn(`Invalid from: ${from}`)\n return value\n }\n\n const maxIndex = maxUnit ? UNIT_LIST.indexOf(maxUnit) : UNIT_LIST.length - 1\n\n if (maxIndex === -1) {\n console.warn(`Invalid maxUnit: ${maxUnit}`)\n return value\n }\n let size = value\n while (compareNum(size, 1024, '>=') && index < maxIndex) {\n size = dividedBy(size, 1024)\n index++\n }\n\n return `${toFixed(size, precision, !trimZero)}${UNIT_LIST[index]}`\n}\n\n/**\n * Markdown转纯文本\n * @param markdown - 原始 Markdown 内容\n * @returns 纯文本\n * @description 去除 Markdown 的格式,只保留纯文本 多空白合并成单个空格\n * @example\n * markdownToText('## 标题\\n\\n- 列表项1\\n- 列表项2 <div>123</div>') // '标题 列表项1 列表项2 123'\n */\nexport const markdownToText = (() => {\n const md = new MarkdownIt({\n html: true,\n breaks: true\n })\n .use(markdownItTaskLists)\n .use(markdownItEmoji)\n .use(markdownItFootnote)\n .use(markdownItDefList)\n /**\n * 转换方法\n * @param {string} markdown 原始 Markdown 内容\n * @returns {string} 纯文本\n */\n return (markdown: string) => {\n if (!isString(markdown)) return ''\n\n // 1) 先把 Markdown → HTML\n const html = md.render(markdown)\n\n // 2) 把 HTML 去掉标签 → 纯文本\n // 使用浏览器 DOM 或正则去除 HTML 标签\n const text = html\n .replace(/<[^>]+>/g, ' ') // 去除标签,用空格替代(保持单词分离)\n .replace(/&quot;/g, '\"') // 将 HTML 实体 &quot; 转换回引号\n .replace(/&amp;/g, '&') // 将 HTML 实体 &amp; 转换回 &\n .replace(/&lt;/g, '<') // 将 HTML 实体 &lt; 转换回 <\n .replace(/&gt;/g, '>') // 将 HTML 实体 &gt; 转换回 >\n .replace(/&#39;/g, \"'\") // 将 HTML 实体 &#39; 转换回单引号\n .replace(/\\s+/g, ' ') // 多空白合并成单个空格\n .trim()\n\n return text\n }\n})()\n\nexport interface FindTreeNodesOptions {\n /** 树的id字段名,默认 \"id\" */\n id?: string\n /** 子节点字段名,默认 \"children\" */\n children?: string\n}\n/**\n * 从树结构中查找指定id列表的节点,并以自定义结构返回\n * - 支持跳过某些id(通过formatFn返回null/undefined)\n * - 支持自定义字段名\n *\n * @template T - 树节点类型,必须是键值对对象\n * @template R - 返回节点类型,默认与T相同\n * @param tree - 树结构数组\n * @param ids - 要查找的节点ID列表\n * @param formatFn - 可选的节点格式化函数,用于自定义返回节点的结构\n * @param options - 配置选项\n * @param options.id - ID字段名,默认为 \"id\"\n * @param options.children - 子节点字段名,默认为 \"children\"\n * @returns 符合ID列表的节点数组,按formatFn格式化后返回\n *\n * @example\n * // 基本用法\n * const tree = [\n * { id: 1, name: 'Node 1', children: [{ id: 2, name: 'Node 1-1' }] },\n * { id: 3, name: 'Node 2', children: [] }\n * ]\n * const result = findTreeNodesByIds(tree, [1, 2])\n * // => [{ id: 1, name: 'Node 1' }, { id: 2, name: 'Node 1-1' }]\n *\n * @example\n * // 使用格式化函数\n * const result = findTreeNodesByIds(tree, [1], (node) => ({ label: node.name, value: node.id }))\n * // => [{ label: 'Node 1', value: 1 }]\n *\n * @example\n * // 自定义字段名\n * const treeWithCustomFields = [\n * { key: 'a', title: 'Node A', subItems: [{ key: 'b', title: 'Node B' }] }\n * ]\n * const result = findTreeNodesByIds(\n * treeWithCustomFields,\n * ['a'],\n * undefined,\n * { id: 'key', children: 'subItems' }\n * )\n * // => [{ key: 'a', title: 'Node A', subItems: undefined }]\n */\nexport const findTreeNodesByIds = <T extends Record<string, any>, R = T>(\n tree: T[],\n ids?: T[keyof T][],\n formatFn?: (node: T) => R | null | undefined,\n options: FindTreeNodesOptions = {}\n): R[] => {\n const { id = 'id', children = 'children' } = options\n // 如果ids为空,直接返回空数组\n if (!ids?.length) {\n return []\n }\n const result: R[] = []\n const idSet = new Set(ids)\n\n const dfs = (nodes: T[]) => {\n for (const node of nodes) {\n if (idSet.size === 0) break\n const nodeId = node[id]\n if (idSet.has(nodeId)) {\n idSet.delete(nodeId)\n\n const formatted = formatFn ? formatFn(node) : ({ ...node, [children]: undefined } as R)\n if (!isNullOrUnDef(formatted)) {\n // ✅ 仅在非 null/undefined 时才加入结果\n result.push(formatted as R)\n }\n }\n if (node[children]?.length && idSet.size > 0) {\n dfs(node[children])\n }\n }\n }\n\n dfs(tree)\n return result\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 { 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 * 1. 长度在8到26位之间\n * 2. 必须包含至少一个字母(大小写均可)\n * 3. 必须包含至少一个数字\n * 4. 只能包含字母和数字(不允许特殊字符)\n */\nexport const RegPassword = {\n pattern: /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,26}$/,\n message: '密码为8到26位之间数字与字母组合'\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 // 兼容字符串数据\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 { MinusCircleOutlined, PlusCircleOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { renderAsync } from 'docx-preview'\nimport { useEffect, useRef, useState } from 'react'\nimport { isExternal } from '../../utils'\nimport styles from './styles.module.less'\n\n/** Docx文档预览组件的属性接口 */\nexport interface DocxPreviewProps {\n /** 文档文件的URL地址 */\n fileUrl: string\n /** 缩放比例,默认为1 */\n scale?: number\n}\n/**\n * Docx文档预览组件\n * @param props - 组件属性\n */\nexport default ({ fileUrl, scale = 1 }: DocxPreviewProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [zoomRatio, setZoomRatio] = useState(scale) // 当前缩放比例, TODO 缩放不会改变高度\n\n /** 渲染 docx 文件 */\n useEffect(() => {\n if (!fileUrl || !containerRef.current) return\n containerRef.current.innerHTML = ''\n\n fetch(fileUrl)\n .then((res) => res.arrayBuffer())\n .then(async (arrayBuffer) => {\n await renderAsync(arrayBuffer, containerRef.current!, null, {\n breakPages: true,\n renderHeaders: true,\n renderFooters: true,\n ignoreWidth: false,\n ignoreHeight: false\n })\n // ⭐ 渲染完成后处理 a 标签\n containerRef.current!.querySelectorAll<HTMLAnchorElement>('a[href]').forEach((linkEle) => {\n const href = linkEle.getAttribute('href')\n if (href && isExternal(href)) {\n linkEle.setAttribute('target', '_blank')\n linkEle.setAttribute('rel', 'noopener noreferrer')\n }\n })\n })\n .catch((err) => {\n console.error('docx-preview 渲染失败:', err)\n if (containerRef.current) containerRef.current.innerHTML = '<p class=\"text-center\">文档加载失败</p>'\n })\n }, [fileUrl])\n\n /** 按钮缩放(在自适应基础上 +0.1 / -0.1) */\n const zoomIn = () => setZoomRatio((z) => Math.min(z + 0.1, 3))\n const zoomOut = () => setZoomRatio((z) => Math.max(z - 0.1, 0.3))\n const resetZoom = () => {\n setZoomRatio(1)\n }\n\n return (\n <div className={classNames(styles.nsPreviewDocx, 'height-full', 'width-full')}>\n {/* 缩放控制 */}\n <Flex gap={6} align=\"center\" className={styles.docxToolbar}>\n <Button onClick={zoomOut} icon={<MinusCircleOutlined />} title=\"缩小\" />\n <Button onClick={zoomIn} icon={<PlusCircleOutlined />} title=\"放大\" />\n <Button onClick={resetZoom} icon={<RedoOutlined />} title=\"还原\" />\n </Flex>\n\n {/* 内容容器 */}\n <div className={classNames(styles.docxContent, 'height-full', 'scroll-fade-in')}>\n <div\n ref={containerRef}\n style={{\n transform: `scale(${zoomRatio})`,\n transformOrigin: 'top center'\n }}\n />\n </div>\n </div>\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 'MKV':\n case 'AVI':\n case 'FLV':\n return <VideoCameraOutlined />\n case 'MP3':\n case 'WAV':\n case 'M4A':\n case 'ACC':\n case 'WMA':\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 markdownItKatex from '@traptitech/markdown-it-katex'\nimport parse, { Element } from 'html-react-parser'\nimport { jsonrepair } from 'jsonrepair'\nimport 'katex/dist/katex.min.css'\nimport markdownIt from 'markdown-it'\nimport markdownItDefList from 'markdown-it-deflist'\nimport { full as markdownItEmoji } from 'markdown-it-emoji'\nimport markdownItFootnote from 'markdown-it-footnote'\nimport markdownItTaskLists from 'markdown-it-task-lists'\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 /** 自定义组件映射, 默认会传入loading、data 属性以及透传参数 */\n customComponents?: ComponentMapType\n /** 透传入自定义组件的参数方法 */\n [key: string]: any\n}\n\n// ========================\n// MarkdownIt 基础设置\n// ========================\nconst md = markdownIt({ html: true, breaks: true })\n .use(markdownItTaskLists)\n .use(markdownItEmoji)\n .use(markdownItFootnote)\n .use(markdownItDefList)\n .use(markdownItKatex)\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 * @param content - Markdown文本\n * @returns 过滤后的Markdown文本\n */\nconst filterMarkdown = (content = '') => {\n if (!content) return content\n return content.replace(/<!--[\\s\\S]*?(?:-->|$)/g, '')\n}\n\n/**\n * Markdown渲染组件\n * 将Markdown文本转换为HTML并渲染为React组件\n * 支持自定义组件、搜索高亮等功能\n * @param RenderMarkdownProps - 组件属性\n */\nexport default ({ content = '', searchValue, customComponents, ...rest }: 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(filterMarkdown(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 <LazyComponent key={`${type}${lazyIndex}`} customComponents={customComponents} type={type} data={data} loading={loading} {...rest} />\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 width-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","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 { 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, effect, ...deps]) // 注意:这里用 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 { useCallback, useEffect, useRef, useState } from 'react'\n\nexport type SpeechPermission = 'granted' | 'denied' | 'prompt' | 'unsupported'\nexport type SpeechProps = {\n /**\n * 识别结果回调函数\n */\n onResult: (text: string) => void\n /**\n * 语言,默认为中文\n */\n lang?: string\n}\n/**\n * 语音识别 Hook\n * @param onResult 识别结果回调函数\n * @param lang 语言,默认为中文\n * @returns 返回权限状态、录音状态和控制方法\n */\nexport default ({ onResult, lang = 'zh-CN' }: SpeechProps) => {\n const [permission, setPermission] = useState<SpeechPermission>('prompt')\n const [isRecording, setIsRecording] = useState(false)\n const recognitionRef = useRef<any>(null)\n\n // 初始化 SpeechRecognition\n useEffect(() => {\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition\n if (!SpeechRecognition) {\n setPermission('unsupported')\n return\n }\n const recognition = new SpeechRecognition()\n recognition.continuous = true\n recognition.interimResults = false\n recognition.lang = lang // 设置语言\n recognition.onresult = (event) => {\n let transcript = ''\n for (let i = event.resultIndex; i < event.results.length; i++) {\n transcript += event.results[i][0].transcript\n }\n onResult?.(transcript.trim())\n }\n // 结束时状态重置\n recognition.onend = () => {\n setIsRecording(false)\n }\n recognition.onerror = (error) => {\n setIsRecording(false)\n console.error('Speech recognition error:', error)\n }\n recognitionRef.current = recognition\n\n return () => {\n recognition.stop?.()\n recognition.onresult = null\n recognition.onend = null\n recognition.onerror = null\n }\n }, [lang, onResult])\n\n // 查询权限状态\n useEffect(() => {\n if (!navigator.permissions) return\n\n navigator.permissions.query({ name: 'microphone' as any }).then((status) => {\n setPermission(status.state as any)\n status.onchange = () => setPermission(status.state as any)\n })\n }, [])\n // ——— 主动触发权限请求 ———\n const requestPermission = useCallback(async () => {\n try {\n await navigator.mediaDevices.getUserMedia({ audio: true })\n setPermission('granted')\n } catch {\n setPermission('denied')\n }\n }, [])\n /** 开始语音识别 */\n const start = useCallback(() => {\n if (permission === 'prompt') {\n requestPermission()\n return\n }\n if (permission !== 'granted') return\n\n if (!isRecording) {\n recognitionRef.current?.start()\n setIsRecording(true)\n }\n }, [permission, isRecording, requestPermission])\n // 停止语音识别\n const stop = useCallback(() => {\n try {\n recognitionRef.current?.stop()\n } finally {\n setIsRecording(false)\n }\n }, [])\n\n // 返回权限状态、录音状态和控制方法\n return {\n /**\n * 权限状态\n */\n permission,\n /**\n * 录音状态\n */\n isRecording,\n /** 开始语音识别 */\n start,\n /** 停止语音识别 */\n stop\n }\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 { 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 {\n LoadError,\n PageChangeEvent,\n PasswordStatus,\n PdfJs,\n PluginOnAnnotationLayerRender,\n RenderProtectedViewProps,\n Viewer,\n Worker\n} 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 { isExternal, 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// 插件列表\nconst openLinksNewTabPlugin = () => {\n const onAnnotationLayerRender = (e: PluginOnAnnotationLayerRender) => {\n // ⭐ 渲染完成后处理 a 标签\n e.container.querySelectorAll<HTMLAnchorElement>('.rpv-core__annotation--link a[href]').forEach((linkEle) => {\n const href = linkEle.getAttribute('href')\n if (href && isExternal(href)) {\n linkEle.setAttribute('target', '_blank')\n linkEle.setAttribute('rel', 'noopener noreferrer')\n }\n })\n }\n\n return {\n onAnnotationLayerRender\n }\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 {/* https://cdn.jsdelivr.net/npm/pdfjs-dist@3.2.146/cmaps/ */}\n <Worker workerUrl={`https://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: 'https://logosdata.cn/public/pdf/pdfjs-dist@3.2.146/cmaps/', // 使用可用的源\n cMapPacked: true,\n // 禁用字体子集化,确保完整字体加载\n disableFontFace: false,\n // 启用标准字体支持\n standardFontDataUrl: 'https://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 openLinksNewTabPlugin()\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, EmptyProps, Flex, Image, Result } from 'antd'\nimport { useMemo } from 'react'\nimport VideoPlayer from './VideoPlayer'\n\nimport AudioPlayer from './AudioPlayer'\nimport DocxPreview from './DocxPreview'\nimport MarkdownPreview from './MarkdownPreview'\nimport PdfPreview from './PdfPreview'\nimport styles from './styles.module.less'\n\n/**\n * 文件预览组件属性接口\n */\nexport interface FilePreviewProps {\n emptyProps?: EmptyProps\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** 文件密码 */\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, emptyProps }: 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 {...emptyProps} />\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 'MKV':\n // case 'AVI':\n // case 'FLV':\n return <VideoPlayer fileUrl={fileUrl} />\n\n case 'MP3':\n case 'WAV':\n case 'M4A':\n case 'ACC':\n // case 'WMA':\n return <AudioPlayer fileUrl={fileUrl} />\n\n case 'MD':\n case 'MARKDOWN':\n return <MarkdownPreview fileUrl={fileUrl} searchValue={searchValue} />\n\n case 'DOCX':\n return <DocxPreview fileUrl={fileUrl} />\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, { FilePreviewProps } from './FilePreview'\n\n/**\n * 文件预览抽屉组件属性接口\n */\nexport interface FilePreviewDrawerProps extends FilePreviewProps {\n /** 是否打开抽屉 */\n open: boolean\n /** 关闭抽屉的回调函数 */\n onClose: () => void\n /** 抽屉标题,默认为'文件预览' */\n title?: string\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 ({ open, title = '文件预览', onClose, ...props }: FilePreviewDrawerProps) => {\n return (\n <Drawer\n title={title}\n push={false}\n // 全屏宽度,提供更好的文件预览体验\n width=\"100%\"\n open={open}\n onClose={onClose}\n >\n <FilePreview {...props} />\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","/**\n * 收听icon\n */\nexport default () => (\n <svg color=\"currentColor\" viewBox=\"0 0 1000 1000\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"0\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"286.66666666666663\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.2s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.2s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"573.3333333333333\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.4s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.4s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"859.9999999999999\" y=\"375\">\n <animate\n attributeName=\"height\"\n values=\"250; 500; 250\"\n keyTimes=\"0; 0.5; 1\"\n dur=\"0.8s\"\n begin=\"0.6000000000000001s\"\n repeatCount=\"indefinite\"\n ></animate>\n <animate\n attributeName=\"y\"\n values=\"375; 250; 375\"\n keyTimes=\"0; 0.5; 1\"\n dur=\"0.8s\"\n begin=\"0.6000000000000001s\"\n repeatCount=\"indefinite\"\n ></animate>\n </rect>\n </svg>\n)\n","import Icon, { AudioMutedOutlined, AudioOutlined } from '@ant-design/icons'\nimport { Button } from 'antd'\nimport useSpeech, { SpeechProps } from '../../hooks/useSpeech'\nimport SpeechLoading from './SpeechLoading'\n\n/**\n * 语音按钮\n * @param SpeechProps\n */\nexport default (props: SpeechProps) => {\n const { permission, isRecording, start, stop } = useSpeech(props)\n\n const disabled = permission === 'denied' || permission === 'unsupported'\n const handleClick = () => {\n if (isRecording) {\n stop()\n } else {\n start()\n }\n }\n\n return (\n <Button\n title={\n permission === 'unsupported'\n ? '当前浏览器不支持语音识别'\n : permission === 'denied'\n ? '麦克风权限已拒绝'\n : isRecording\n ? '停止录音'\n : '点击开始录音'\n }\n disabled={disabled}\n color=\"primary\"\n variant=\"text\"\n icon={isRecording ? <Icon style={{ width: 16 }} component={SpeechLoading} /> : disabled ? <AudioMutedOutlined /> : <AudioOutlined />}\n onClick={handleClick}\n />\n )\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/utils/is.ts","../src/utils/math.ts","../src/utils/common.ts","../src/utils/date.ts","../src/utils/message.ts","../src/utils/pattern.ts","../src/utils/request.ts","../src/utils/storage.ts","../src/components/File/DocxPreview.tsx","../src/components/File/FileIcon.tsx","../src/components/File/VideoPlayer.tsx","../src/components/LazyComponent/styles.module.less","../src/components/LazyComponent/index.tsx","../src/components/RenderMarkdown/index.tsx","../src/components/File/MarkdownPreview.tsx","../src/hooks/iframe/iframeRelay.ts","../src/hooks/iframe/useIframeRelayBridge.ts","../src/hooks/useAutoRefresh.ts","../src/hooks/useCountDown.ts","../src/hooks/useCreateValtioContext.tsx","../src/hooks/useDebounce.ts","../src/hooks/useDeepEffect.ts","../src/hooks/useRefState.ts","../src/hooks/useSpeech.ts","../src/hooks/useSyncInput.ts","../src/hooks/useThrottle.ts","../src/hooks/webSocket/useWebSocket.ts","../src/components/File/PdfImagePreview.tsx","../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/styles.module.less","../src/components/MarkdownEditor/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/components/MarkdownEditor/lib/tiptap-utils.ts","../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/hooks/use-menu-navigation.ts","../src/components/MarkdownEditor/hooks/use-composed-ref.ts","../src/components/MarkdownEditor/components/tiptap-ui-primitive/toolbar/toolbar.tsx","../src/components/MarkdownEditor/components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts","../src/components/MarkdownEditor/pageNo/constant.ts","../src/components/MarkdownEditor/pageNo/pageNoMark.ts","../src/components/MarkdownEditor/pageNo/PageNoPlugin.ts","../src/components/MarkdownEditor/hooks/use-tiptap-editor.ts","../src/components/MarkdownEditor/hooks/use-floating-element.ts","../src/components/MarkdownEditor/lib/tiptap-collab-utils.ts","../src/components/MarkdownEditor/components/tiptap-ui-utils/floating-element/floating-element-utils.ts","../src/components/MarkdownEditor/components/tiptap-ui-utils/floating-element/floating-element.tsx","../src/components/MarkdownEditor/components/tiptap-ui-primitive/badge/badge.tsx","../src/components/MarkdownEditor/components/tiptap-ui/blockquote-button/blockquote-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/blockquote-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/blockquote-button/use-blockquote.ts","../src/components/MarkdownEditor/components/tiptap-ui/code-block-button/code-block-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/code-block-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/code-block-button/use-code-block.ts","../src/components/MarkdownEditor/hooks/use-is-breakpoint.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-primitive/card/card.tsx","../src/components/MarkdownEditor/components/tiptap-ui/color-highlight-button/color-highlight-button.tsx","../src/components/MarkdownEditor/components/tiptap-ui/color-highlight-button/use-color-highlight.ts","../src/components/MarkdownEditor/components/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx","../src/components/MarkdownEditor/components/tiptap-icons/chevron-down-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-button/heading-button.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-one-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-two-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-three-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-four-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-five-icon.tsx","../src/components/MarkdownEditor/components/tiptap-icons/heading-six-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-button/use-heading.ts","../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/components/tiptap-icons/heading-icon.tsx","../src/components/MarkdownEditor/components/tiptap-ui/heading-dropdown-menu/use-heading-dropdown-menu.ts","../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-primitive/input/input.tsx","../src/components/MarkdownEditor/components/tiptap-ui/link-popover/link-popover.tsx","../src/components/MarkdownEditor/components/tiptap-ui/link-popover/use-link-popover.ts","../src/components/MarkdownEditor/components/tiptap-ui/list-button/list-button.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/use-list.ts","../src/components/MarkdownEditor/components/tiptap-ui/list-dropdown-menu/use-list-dropdown-menu.ts","../src/components/MarkdownEditor/components/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx","../src/components/MarkdownEditor/components/tiptap-ui/mark-button/mark-button.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/use-mark.ts","../src/components/MarkdownEditor/components/tiptap-ui/text-align-button/text-align-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/use-text-align.ts","../src/components/MarkdownEditor/components/tiptap-ui/undo-redo-button/undo-redo-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/use-undo-redo.ts","../src/components/MarkdownEditor/components/tiptap-icons/arrow-left-icon.tsx","../src/components/MarkdownEditor/hooks/use-unmount.ts","../src/components/MarkdownEditor/hooks/use-throttled-callback.ts","../src/components/MarkdownEditor/hooks/use-element-rect.ts","../src/components/MarkdownEditor/hooks/use-window-size.ts","../src/components/MarkdownEditor/hooks/use-cursor-visibility.ts","../src/components/MarkdownEditor/annotation/AnnotationModal.tsx","../src/components/MarkdownEditor/annotation/constant.ts","../src/components/MarkdownEditor/annotation/styles.module.less","../src/components/MarkdownEditor/annotation/AnnotationSidebar.tsx","../src/components/MarkdownEditor/common/HtmlMark.ts","../src/components/MarkdownEditor/annotation/AnnotationMark.ts","../src/components/MarkdownEditor/common/mark-utils.ts","../src/components/MarkdownEditor/annotation/AnnotationPlugin.ts","../src/components/MarkdownEditor/annotation/use-annotations.ts","../src/components/MarkdownEditor/collection/constant.ts","../src/components/MarkdownEditor/collection/CollectionMark.ts","../src/components/MarkdownEditor/collection/CollectionPlugin.ts","../src/components/MarkdownEditor/collection/styles.module.less","../src/components/MarkdownEditor/collection/collectionSidebar.tsx","../src/components/MarkdownEditor/common/utils.ts","../src/components/MarkdownEditor/collection/use-collections.ts","../src/components/MarkdownEditor/common/select-button.tsx","../src/components/MarkdownEditor/extensions/searchAndReplace.ts","../src/components/MarkdownEditor/quote/quote-icon.tsx","../src/components/MarkdownEditor/index.tsx","../src/components/MarkDrawing/styles.module.less","../src/components/MarkDrawing/index.tsx","../src/components/RenderWrapper/index.tsx","../src/components/SpeechButton/SpeechLoading.tsx","../src/components/SpeechButton/index.tsx","../src/components/UserAvatar/index.tsx"],"names":["nsPreviewImage","nsPreviewPdf","pdfToolbar","nsPreviewPdfImage","pdfImageNav","pdfImageNavItem","pdfImageNavItemImgWrapper","pdfImageNavItemActive","pdfImageNavItemImg","pdfImageNavItemTip","pdfImageBody","pdfImageBodyToolbar","pdfImageBodyItem","pdfImageBodyItemInnerWrapper","pdfImageBodyItemInner","pdfImageBodyItemActive","pdfImageBodyItemImg","nsPreviewVideo","nsPreviewAudio","nsPreviewDocx","docxToolbar","docxContent","jsx","Decimal","isJson","setInterval","message","minus","document","AES","encUtf8","precision","md","MarkdownIt","markdownItTaskLists","markdownItEmoji","markdownItFootnote","markdownItDefList","convert","TurndownService","dayjs","relativeTime","notification","Modal","showError","axios","config","useRef","useState","useEffect","renderAsync","jsxs","classNames","Flex","Button","MinusCircleOutlined","PlusCircleOutlined","RedoOutlined","Icon","useMemo","FileTextOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","VideoCameraOutlined","NotificationOutlined","FileJpgOutlined","FileImageOutlined","FileGifOutlined","FileMarkdownOutlined","FileZipOutlined","FileUnknownOutlined","styles_module_default","skeleton","lazy","Alert","Suspense","Skeleton","Typography","markdownIt","markdownItKatex","jsonrepair","parse","error","Result","startCount","count","createContext","useContext","useCallback","throttle","useVirtualizer","pageNo","Splitter","Form","PasswordStatus","Input","password","pageNavigationPlugin","thumbnailPlugin","zoomPlugin","Toolbar","Worker","Viewer","zh_CN","Empty","Image","Drawer","iframe","forwardRef","Fragment","Spin","editorParent","extraToolbar","editorFloatingToolbar","contentWrapper","simpleEditorContent","noToolbar","extraSidebarParent","useFloating","autoUpdate","offset","flip","shift","useHover","useFocus","useDismiss","useRole","useInteractions","FloatingDelayGroup","TooltipTrigger","isValidElement","version","useMergeRefs","cloneElement","TooltipContent","FloatingPortal","isMac","NodeSelection","state","TextSelection","AllSelection","TiptapHorizontalRule","mergeAttributes","Node","PluginKey","Extension","Plugin","container","useCurrentEditor","useEditorState","useTransitionStyles","isTextSelection","isNodeSelection","CellSelection","posToDOMRect","open","Selection","canToggle","memo","shouldShowButton","PopoverPrimitive","canColorHighlight","useHotkeys","DropdownMenuPrimitive","isEmpty","annotations","annotationItem","annotationItemSelected","TextArea","Card","Space","MessageOutlined","CloseOutlined","List","EditOutlined","Popconfirm","DeleteOutlined","createPortal","Mark","DecorationSet","Decoration","collections","collectionItem","collectionItemSelected","Text","BookOutlined","React","React2","useEditor","Markdown","Mathematics","StarterKit","TextAlign","TaskList","TaskItem","Highlight","Superscript","Subscript","Table","TableHeader","TableRow","TableCell","downloadFile","EditorContext","Tag","EditorContent","rect","score","AudioMutedOutlined","AudioOutlined","Avatar"],"mappings":"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","file":"index.cjs.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.nsPreviewPdfImage {\n width: 100%;\n height: 100%;\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem {\n position: absolute;\n width: 100%;\n padding: 2px 8px;\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem .pdfImageNavItemImgWrapper {\n width: 346px;\n border: 8px solid transparent;\n cursor: pointer;\n transition: all 0.3s ease;\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem .pdfImageNavItemImgWrapper:hover {\n border-color: rgba(0, 0, 0, 0.3);\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem .pdfImageNavItemImgWrapper.pdfImageNavItemActive {\n border-color: rgba(0, 0, 0, 0.3);\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem .pdfImageNavItemImgWrapper .pdfImageNavItemImg {\n height: 100%;\n width: 100%;\n}\n.nsPreviewPdfImage .pdfImageNav .pdfImageNavItem .pdfImageNavItemTip {\n font-size: 12px;\n padding: 8px;\n color: rgba(0, 0, 0, 0.88);\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyToolbar {\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 z-index: 1;\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyItem {\n position: absolute;\n width: 100%;\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyItem .pdfImageBodyItemInnerWrapper {\n margin: 0 auto;\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyItem .pdfImageBodyItemInnerWrapper .pdfImageBodyItemInner {\n height: 100%;\n width: 100%;\n transition: box-shadow 0.3s;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyItem .pdfImageBodyItemInnerWrapper .pdfImageBodyItemInner.pdfImageBodyItemActive {\n box-shadow: 0 0 10px var(--ant-color-primary);\n}\n.nsPreviewPdfImage .pdfImageBody .pdfImageBodyItem .pdfImageBodyItemInnerWrapper .pdfImageBodyItemInner .pdfImageBodyItemImg {\n height: 100%;\n width: 100%;\n}\n.nsPreviewVideo {\n max-width: 100%;\n max-height: 100%;\n}\n.nsPreviewAudio {\n width: 100%;\n max-width: 400px;\n}\n.nsPreviewDocx .docxToolbar {\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 z-index: 1;\n}\n.nsPreviewDocx .docxContent {\n background: gray;\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","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 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 } from 'antd'\nimport AES from 'crypto-js/aes'\nimport encUtf8 from 'crypto-js/enc-utf8'\nimport { convert } from 'html-to-text'\nimport MarkdownIt from 'markdown-it'\nimport markdownItDefList from 'markdown-it-deflist'\nimport { full as markdownItEmoji } from 'markdown-it-emoji'\nimport markdownItFootnote from 'markdown-it-footnote'\nimport markdownItTaskLists from 'markdown-it-task-lists'\nimport TurndownService from 'turndown'\nimport {\n isArray,\n isDate,\n isDef,\n isExternal,\n isFunction,\n isMap,\n isNull,\n isNullOrUnDef,\n isNumberNoNaN,\n isObject,\n isRegExp,\n isScriptSafe,\n isSet,\n isString\n} from './is'\nimport { compareNum, dividedBy, toFixed } from './math'\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 * setInterval函数返回的控制对象类型接口\n * 提供对定时器运行状态的检查和取消操作\n */\nexport interface SetIntervalType {\n /**\n * 检查定时器是否正在运行\n * @returns boolean - true表示正在运行,false表示已停止\n */\n isRun: () => boolean\n /**\n * 取消定时器\n * 调用后将停止后续的函数执行并清理资源\n */\n cancel: () => void\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 = (): string => {\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 const 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 const 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 const 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 const 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\nexport type SizeUnit = 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'\n\nexport interface FormatSizeOptions {\n /** 起始单位,默认 KB */\n from?: SizeUnit\n /** 保留小数位数,默认 2 */\n precision?: number\n /** 是否去除多余的 0,如 1.00 -> 1 */\n trimZero?: boolean\n /** 最大单位限制 */\n maxUnit?: SizeUnit\n}\n/**\n * 格式化文件大小显示\n *\n * 将给定的数值按照指定单位转换为更友好的可读格式(如KB, MB, GB等)\n * 支持从不同单位开始转换,并可自定义精度和最大单位限制\n *\n * @param value - 需要格式化的数值(可以是数字或数字字符串)\n * @param options - 格式化选项\n * @param options.from - 输入数值的单位,默认为 'KB'\n * @param options.precision - 保留的小数位数,默认为 2\n * @param options.trimZero - 是否去除尾部的零,默认为 false\n * @param options.maxUnit - 最大转换单位,超过该单位则不再转换,默认无限制\n *\n * @returns 格式化后的文件大小字符串,如果输入无效则返回原值\n *\n * @example\n * formatSize(1024) // \"1024.00KB\"\n * formatSize(1024, { from: 'B' }) // \"1.00KB\"\n * formatSize(1024, { precision: 0 }) // \"1024KB\"\n * formatSize(1024, { trimZero: true }) // \"1024KB\"\n * formatSize(2048, { maxUnit: 'KB' }) // \"2048.00KB\" (不会转换为MB)\n *\n * @remarks\n * - 支持从 B, KB, MB, GB, TB, PB 等单位开始转换\n */\nexport const formatSize = (value: number | string, options: FormatSizeOptions = {}): number | string => {\n if (isNullOrUnDef(value) || !isNumberNoNaN(Number(value))) return value\n const UNIT_LIST: SizeUnit[] = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']\n const { from = 'KB', precision = 2, trimZero = false, maxUnit } = options\n\n let index = UNIT_LIST.indexOf(from)\n if (index === -1) {\n console.warn(`Invalid from: ${from}`)\n return value\n }\n\n const maxIndex = maxUnit ? UNIT_LIST.indexOf(maxUnit) : UNIT_LIST.length - 1\n\n if (maxIndex === -1) {\n console.warn(`Invalid maxUnit: ${maxUnit}`)\n return value\n }\n let size = value\n while (compareNum(size, 1024, '>=') && index < maxIndex) {\n size = dividedBy(size, 1024)\n index++\n }\n\n return `${toFixed(size, precision, !trimZero)}${UNIT_LIST[index]}`\n}\n\n/**\n * Markdown转纯文本\n * @param markdown - 原始 Markdown 内容\n * @returns 纯文本\n * @description 去除 Markdown 的格式,只保留纯文本 多空白合并成单个空格\n * @example\n * markdownToText('## 标题\\n\\n- 列表项1\\n- 列表项2 <div>123</div>') // '标题 列表项1 列表项2 123'\n */\nexport const markdownToText = (() => {\n const md = new MarkdownIt({\n html: true,\n breaks: true\n })\n .use(markdownItTaskLists)\n .use(markdownItEmoji)\n .use(markdownItFootnote)\n .use(markdownItDefList)\n /**\n * 转换方法\n * @param {string} markdown 原始 Markdown 内容\n * @returns {string} 纯文本\n */\n return (markdown: string) => {\n if (!isString(markdown)) return ''\n // 1) 先把 Markdown → HTML\n const html = md.render(markdown)\n // 2) HTML → 纯文本\n return htmlToText(html)\n }\n})()\n\n/**\n * HTML 转 纯文本\n * @param html - 原始 HTML 内容\n * @returns 纯文本\n * @description 使用 'html-to-text' 库进行转换,相比简单的正则替换,能更好地保留结构(如列表、表格等)。\n * @example\n * htmlToText('<div>标题</div><p>内容</p>') // '标题\\n\\n内容'\n */\nexport const htmlToText = (html: string) => {\n if (!isString(html)) return ''\n try {\n return convert(html, {\n wordwrap: false,\n selectors: [\n { selector: 'img', format: 'skip' },\n { selector: 'a', options: { ignoreHref: true } }\n ]\n })\n } catch (error) {\n console.error('htmlToText conversion error:', error)\n return ''\n }\n}\n\n/**\n * HTML 转 Markdown\n * @param html - 原始 HTML 内容\n * @returns Markdown 内容\n * @description 使用 'turndown' 库进行转换。\n * @example\n * htmlToMarkdown('<h1>标题</h1><p>内容</p>') // '# 标题\\n\\n内容'\n */\nexport const htmlToMarkdown = (() => {\n const turndownService = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced'\n })\n\n return (html: string) => {\n if (!isString(html)) return ''\n try {\n return turndownService.turndown(html)\n } catch (error) {\n console.error('htmlToMarkdown conversion error:', error)\n return '' // 转换失败时返回空字符串\n }\n }\n})()\n\nexport interface FindTreeNodesOptions {\n /** 树的id字段名,默认 \"id\" */\n id?: string\n /** 子节点字段名,默认 \"children\" */\n children?: string\n}\n/**\n * 从树结构中查找指定id列表的节点,并以自定义结构返回\n * - 支持跳过某些id(通过formatFn返回null/undefined)\n * - 支持自定义字段名\n *\n * @template T - 树节点类型,必须是键值对对象\n * @template R - 返回节点类型,默认与T相同\n * @param tree - 树结构数组\n * @param ids - 要查找的节点ID列表\n * @param formatFn - 可选的节点格式化函数,用于自定义返回节点的结构\n * @param options - 配置选项\n * @param options.id - ID字段名,默认为 \"id\"\n * @param options.children - 子节点字段名,默认为 \"children\"\n * @returns 符合ID列表的节点数组,按formatFn格式化后返回\n *\n * @example\n * // 基本用法\n * const tree = [\n * { id: 1, name: 'Node 1', children: [{ id: 2, name: 'Node 1-1' }] },\n * { id: 3, name: 'Node 2', children: [] }\n * ]\n * const result = findTreeNodesByIds(tree, [1, 2])\n * // => [{ id: 1, name: 'Node 1' }, { id: 2, name: 'Node 1-1' }]\n *\n * @example\n * // 使用格式化函数\n * const result = findTreeNodesByIds(tree, [1], (node) => ({ label: node.name, value: node.id }))\n * // => [{ label: 'Node 1', value: 1 }]\n *\n * @example\n * // 自定义字段名\n * const treeWithCustomFields = [\n * { key: 'a', title: 'Node A', subItems: [{ key: 'b', title: 'Node B' }] }\n * ]\n * const result = findTreeNodesByIds(\n * treeWithCustomFields,\n * ['a'],\n * undefined,\n * { id: 'key', children: 'subItems' }\n * )\n * // => [{ key: 'a', title: 'Node A', subItems: undefined }]\n */\nexport const findTreeNodesByIds = <T extends Record<string, any>, R = T>(\n tree: T[],\n ids?: T[keyof T][],\n formatFn?: (node: T) => R | null | undefined,\n options: FindTreeNodesOptions = {}\n): R[] => {\n const { id = 'id', children = 'children' } = options\n // 如果ids为空,直接返回空数组\n if (!ids?.length) {\n return []\n }\n const result: R[] = []\n const idSet = new Set(ids)\n\n const dfs = (nodes: T[]) => {\n for (const node of nodes) {\n if (idSet.size === 0) break\n const nodeId = node[id]\n if (idSet.has(nodeId)) {\n idSet.delete(nodeId)\n\n const formatted = formatFn ? formatFn(node) : ({ ...node, [children]: undefined } as R)\n if (!isNullOrUnDef(formatted)) {\n // ✅ 仅在非 null/undefined 时才加入结果\n result.push(formatted as R)\n }\n }\n if (node[children]?.length && idSet.size > 0) {\n dfs(node[children])\n }\n }\n }\n\n dfs(tree)\n return result\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 { 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 * 1. 长度在8到26位之间\n * 2. 必须包含至少一个字母(大小写均可)\n * 3. 必须包含至少一个数字\n * 4. 只能包含字母和数字(不允许特殊字符)\n */\nexport const RegPassword = {\n pattern: /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,26}$/,\n message: '密码为8到26位之间数字与字母组合'\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 // 兼容字符串数据\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 { MinusCircleOutlined, PlusCircleOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { renderAsync } from 'docx-preview'\nimport { useEffect, useRef, useState } from 'react'\nimport { isExternal } from '../../utils'\nimport styles from './styles.module.less'\n\n/** Docx文档预览组件的属性接口 */\nexport interface DocxPreviewProps {\n /** 文档文件的URL地址 */\n fileUrl: string\n /** 缩放比例,默认为1 */\n scale?: number\n}\n/**\n * Docx文档预览组件\n * @param props - 组件属性\n */\nexport default ({ fileUrl, scale = 1 }: DocxPreviewProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n const [zoomRatio, setZoomRatio] = useState(scale) // 当前缩放比例, TODO 缩放不会改变高度\n\n /** 渲染 docx 文件 */\n useEffect(() => {\n if (!fileUrl || !containerRef.current) return\n containerRef.current.innerHTML = ''\n\n fetch(fileUrl)\n .then((res) => res.arrayBuffer())\n .then(async (arrayBuffer) => {\n await renderAsync(arrayBuffer, containerRef.current!, null, {\n breakPages: true,\n renderHeaders: true,\n renderFooters: true,\n ignoreWidth: false,\n ignoreHeight: false\n })\n // ⭐ 渲染完成后处理 a 标签\n containerRef.current!.querySelectorAll<HTMLAnchorElement>('a[href]').forEach((linkEle) => {\n const href = linkEle.getAttribute('href')\n if (href && isExternal(href)) {\n linkEle.setAttribute('target', '_blank')\n linkEle.setAttribute('rel', 'noopener noreferrer')\n }\n })\n })\n .catch((err) => {\n console.error('docx-preview 渲染失败:', err)\n if (containerRef.current) containerRef.current.innerHTML = '<p class=\"text-center\">文档加载失败</p>'\n })\n }, [fileUrl])\n\n /** 按钮缩放(在自适应基础上 +0.1 / -0.1) */\n const zoomIn = () => setZoomRatio((z) => Math.min(z + 0.1, 3))\n const zoomOut = () => setZoomRatio((z) => Math.max(z - 0.1, 0.3))\n const resetZoom = () => {\n setZoomRatio(1)\n }\n\n return (\n <div className={classNames(styles.nsPreviewDocx, 'height-full', 'width-full')}>\n {/* 缩放控制 */}\n <Flex gap={6} align=\"center\" className={styles.docxToolbar}>\n <Button onClick={zoomOut} icon={<MinusCircleOutlined />} title=\"缩小\" />\n <Button onClick={zoomIn} icon={<PlusCircleOutlined />} title=\"放大\" />\n <Button onClick={resetZoom} icon={<RedoOutlined />} title=\"还原\" />\n </Flex>\n\n {/* 内容容器 */}\n <div className={classNames(styles.docxContent, 'height-full', 'scroll-fade-in')}>\n <div\n ref={containerRef}\n style={{\n transform: `scale(${zoomRatio})`,\n transformOrigin: 'top center'\n }}\n />\n </div>\n </div>\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 'MKV':\n case 'AVI':\n case 'FLV':\n return <VideoCameraOutlined />\n case 'MP3':\n case 'WAV':\n case 'M4A':\n case 'ACC':\n case 'WMA':\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",".skeleton {\n width: 100% !important;\n}\n","import { Alert, Skeleton, Typography } from 'antd'\nimport { Suspense, lazy, useMemo } from 'react'\nimport styles from './styles.module.less'\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 unknownContent?: React.ReactNode\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, unknownContent, ...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 unknownContent || <Alert message={`未知类型:${type}`} type=\"warning\" />\n\n return (\n <Suspense\n fallback={\n <Skeleton.Node active className={styles.skeleton}>\n <Typography.Text type=\"secondary\">组件加载中...</Typography.Text>\n </Skeleton.Node>\n }\n >\n <LazyComponent {...rest} />\n </Suspense>\n )\n}\n","import markdownItKatex from '@traptitech/markdown-it-katex'\nimport parse, { Element } from 'html-react-parser'\nimport { jsonrepair } from 'jsonrepair'\nimport 'katex/dist/katex.min.css'\nimport markdownIt from 'markdown-it'\nimport markdownItDefList from 'markdown-it-deflist'\nimport { full as markdownItEmoji } from 'markdown-it-emoji'\nimport markdownItFootnote from 'markdown-it-footnote'\nimport markdownItTaskLists from 'markdown-it-task-lists'\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 /** 自定义组件映射, 默认会传入loading、data 属性以及透传参数 */\n customComponents?: ComponentMapType\n /** 透传入自定义组件的参数方法 */\n [key: string]: any\n}\n\n// ========================\n// MarkdownIt 基础设置\n// ========================\nconst md = markdownIt({ html: true, breaks: true })\n .use(markdownItTaskLists)\n .use(markdownItEmoji)\n .use(markdownItFootnote)\n .use(markdownItDefList)\n .use(markdownItKatex)\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 * @param content - Markdown文本\n * @returns 过滤后的Markdown文本\n */\nconst filterMarkdown = (content = '') => {\n if (!content) return content\n return content.replace(/<!--[\\s\\S]*?(?:-->|$)/g, '')\n}\n\n/**\n * Markdown渲染组件\n * 将Markdown文本转换为HTML并渲染为React组件\n * 支持自定义组件、搜索高亮等功能\n * @param RenderMarkdownProps - 组件属性\n */\nexport default ({ content = '', searchValue, customComponents, ...rest }: 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(filterMarkdown(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 <LazyComponent key={`${type}${lazyIndex}`} customComponents={customComponents} type={type} data={data} loading={loading} {...rest} />\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 } else {\n setError('Markdown地址错误')\n }\n }\n\n useEffect(() => {\n init()\n }, [fileUrl])\n return error ? (\n <Result status=\"error\" title={error} />\n ) : (\n <div className=\"height-full width-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","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 { 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, effect, ...deps]) // 注意:这里用 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 { useCallback, useEffect, useRef, useState } from 'react'\n\nexport type SpeechPermission = 'granted' | 'denied' | 'prompt' | 'unsupported'\nexport type SpeechProps = {\n /**\n * 识别结果回调函数\n */\n onResult: (text: string) => void\n /**\n * 语言,默认为中文\n */\n lang?: string\n}\n/**\n * 语音识别 Hook\n * @param onResult 识别结果回调函数\n * @param lang 语言,默认为中文\n * @returns 返回权限状态、录音状态和控制方法\n */\nexport default ({ onResult, lang = 'zh-CN' }: SpeechProps) => {\n const [permission, setPermission] = useState<SpeechPermission>('prompt')\n const [isRecording, setIsRecording] = useState(false)\n const recognitionRef = useRef<any>(null)\n\n // 初始化 SpeechRecognition\n useEffect(() => {\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition\n if (!SpeechRecognition) {\n setPermission('unsupported')\n return\n }\n const recognition = new SpeechRecognition()\n recognition.continuous = true\n recognition.interimResults = false\n recognition.lang = lang // 设置语言\n recognition.onresult = (event) => {\n let transcript = ''\n for (let i = event.resultIndex; i < event.results.length; i++) {\n transcript += event.results[i][0].transcript\n }\n onResult?.(transcript.trim())\n }\n // 结束时状态重置\n recognition.onend = () => {\n setIsRecording(false)\n }\n recognition.onerror = (error) => {\n setIsRecording(false)\n console.error('Speech recognition error:', error)\n }\n recognitionRef.current = recognition\n\n return () => {\n recognition.stop?.()\n recognition.onresult = null\n recognition.onend = null\n recognition.onerror = null\n }\n }, [lang, onResult])\n\n // 查询权限状态\n useEffect(() => {\n if (!navigator.permissions) return\n\n navigator.permissions.query({ name: 'microphone' as any }).then((status) => {\n setPermission(status.state as any)\n status.onchange = () => setPermission(status.state as any)\n })\n }, [])\n // ——— 主动触发权限请求 ———\n const requestPermission = useCallback(async () => {\n try {\n await navigator.mediaDevices.getUserMedia({ audio: true })\n setPermission('granted')\n } catch {\n setPermission('denied')\n }\n }, [])\n /** 开始语音识别 */\n const start = useCallback(() => {\n if (permission === 'prompt') {\n requestPermission()\n return\n }\n if (permission !== 'granted') return\n\n if (!isRecording) {\n recognitionRef.current?.start()\n setIsRecording(true)\n }\n }, [permission, isRecording, requestPermission])\n // 停止语音识别\n const stop = useCallback(() => {\n try {\n recognitionRef.current?.stop()\n } finally {\n setIsRecording(false)\n }\n }, [])\n\n // 返回权限状态、录音状态和控制方法\n return {\n /**\n * 权限状态\n */\n permission,\n /**\n * 录音状态\n */\n isRecording,\n /** 开始语音识别 */\n start,\n /** 停止语音识别 */\n stop\n }\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 { 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 { MinusCircleOutlined, PlusCircleOutlined } from '@ant-design/icons'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { Button, Flex, Result, Splitter } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useRef, useState } from 'react'\nimport { useDebounce, useRefState } from '../../hooks'\nimport { isNumber } from '../../utils'\nimport styles from './styles.module.less'\n\ninterface ImageItem {\n imageUrl: string // 原始图片地址\n thumbnail?: string // 缩略图地址\n pageNum: number // 页面索引\n}\n\nexport interface PdfImagePreviewProps {\n /** PDF文件URL地址 */\n fileUrl: string\n /** 当前页码 */\n pageNo?: number\n /** 缩放比例,默认为1 */\n scale?: number\n /** 是否显示缩略图,默认为true */\n isHasThumbnails?: boolean\n /** 页码变化回调 */\n onSetPageNo?: (pageNo: number) => void\n}\n// 常量定义\nconst THUMB_IMG_HEIGHT = 514 // 缩略图高度\nconst MAIN_IMG_HEIGHT = 800 // 主图高度\n\n/**\n * PDF图片预览组件 模仿pdf预览\n * 支持虚拟滚动、缩放、缩略图导航等功能\n * @param props - 组件属性\n * 适用于大量PDF页面的高效展示\n */\nexport default ({ fileUrl, pageNo, scale = 1, isHasThumbnails = true, onSetPageNo }: PdfImagePreviewProps) => {\n // 存储图片数据\n const [images, setImages] = useState<ImageItem[]>([])\n // 当前选中图片的索引\n const [currentIndex, setCurrentIndex, getCurrentIndex] = useRefState(0)\n const [error, setError] = useState<string>('')\n const fetchPdfImages = async () => {\n const res = await fetch(fileUrl)\n\n if (res.status !== 200) {\n throw new Error(`请求失败,状态码: ${res.status}`)\n }\n\n const { data } = await res.json()\n if (!data?.items?.length) {\n throw new Error('返回内容为空')\n }\n setImages(data.items)\n }\n const init = async () => {\n setImages([])\n setError('')\n if (fileUrl) {\n try {\n await fetchPdfImages()\n } catch (error) {\n setError('加载或解析 pdf 失败')\n }\n } else {\n setError('pdf地址错误')\n }\n }\n useEffect(() => {\n init()\n }, [fileUrl])\n\n const handlePageNoChange = useDebounce((index: number) => {\n setCurrentIndex(index)\n onSetPageNo?.(images[index]?.pageNum)\n }, 100)\n const thumbsParentRef = useRef<HTMLDivElement>(null)\n\n // 缩略图虚拟化(每项高度约 140)\n const thumbsVirtualizer = useVirtualizer({\n count: images.length,\n getScrollElement: () => thumbsParentRef.current,\n estimateSize: () => THUMB_IMG_HEIGHT, // 缩略图高度(含 margin)\n overscan: 3\n })\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n // 虚拟列表 - 主体(估算高度为 800,可按需调整)\n const virtualizer = useVirtualizer({\n count: images.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => MAIN_IMG_HEIGHT * zoom,\n overscan: 2\n })\n // 把滚动监听的 \"最近可见页\" 报给 currentIndex(使用 rAF 节流)\n const rAFRef = useRef<number | null>(null)\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n\n const onScroll = () => {\n if (rAFRef.current) cancelAnimationFrame(rAFRef.current)\n rAFRef.current = requestAnimationFrame(() => {\n const rectHeight = el.clientHeight\n const scrollTop = el.scrollTop\n const center = scrollTop + rectHeight / 2\n\n const virtualItems = virtualizer.getVirtualItems()\n if (!virtualItems || virtualItems.length === 0) return\n\n // 找到与 center 最近的 item\n let nearestIdx = virtualItems[0].index\n let nearestDist = Infinity\n for (const vi of virtualItems) {\n const itemCenter = vi.start + (vi.size ?? vi.end - vi.start) / 2\n const dist = Math.abs(itemCenter - center)\n if (dist < nearestDist) {\n nearestDist = dist\n nearestIdx = vi.index\n }\n }\n\n if (nearestIdx !== getCurrentIndex()) {\n handlePageNoChange(nearestIdx)\n thumbsVirtualizer.scrollToIndex(nearestIdx)\n }\n })\n }\n\n el.addEventListener('scroll', onScroll, { passive: true })\n return () => {\n el.removeEventListener('scroll', onScroll)\n if (rAFRef.current) cancelAnimationFrame(rAFRef.current)\n }\n }, [virtualizer, images])\n\n // 根据pageNo或images数组初始化当前页\n const getIndex = (pageNo?: number) => {\n if (!images.length) return 0\n if (isNumber(pageNo)) {\n // 找到对应index的图片\n const index = images.findIndex((img) => img.pageNum === pageNo)\n if (index !== -1) {\n return index\n }\n }\n return 0 // 默认第一页\n }\n useEffect(() => {\n const index = getIndex(pageNo)\n if (index !== getCurrentIndex()) {\n setCurrentIndex(index)\n virtualizer.scrollToIndex(index)\n thumbsVirtualizer.scrollToIndex(index)\n }\n }, [images, pageNo, virtualizer, thumbsVirtualizer])\n\n // 缩放逻辑\n const [zoom, setZoom] = useState(1)\n const zoomIn = () => setZoom((z) => Math.min(z + 0.2, 3))\n const zoomOut = () => setZoom((z) => Math.max(z - 0.2, 0.4))\n\n useEffect(() => {\n if (scale) {\n setZoom(scale)\n }\n }, [scale])\n useEffect(() => {\n if (zoom) {\n virtualizer.measure()\n setTimeout(() => {\n virtualizer.scrollToIndex(getCurrentIndex())\n }, 0)\n }\n }, [zoom, virtualizer])\n\n return error ? (\n <Result status=\"error\" title={error} />\n ) : (\n <Splitter className={classNames(styles.nsPreviewPdfImage)}>\n {/* 缩略图导航 */}\n {isHasThumbnails && (\n <Splitter.Panel resizable={false} min={400} max={400} collapsible>\n <div ref={thumbsParentRef} className={classNames(styles.pdfImageNav, 'height-full', 'scroll-fade-in')}>\n {thumbsVirtualizer.getVirtualItems().map((item) => {\n return (\n <Flex\n vertical\n align=\"center\"\n className={classNames(styles.pdfImageNavItem)}\n key={item.index}\n style={{\n top: item.start,\n height: `${THUMB_IMG_HEIGHT}px`\n }}\n onClick={() => {\n handlePageNoChange(item.index)\n virtualizer.scrollToIndex(item.index)\n }}\n >\n <div\n className={classNames(styles.pdfImageNavItemImgWrapper, 'flex-1', {\n [styles.pdfImageNavItemActive]: item.index === currentIndex\n })}\n >\n <img className={styles.pdfImageNavItemImg} src={images[item.index].thumbnail} />\n </div>\n <div className={styles.pdfImageNavItemTip}>{item.index + 1}</div>\n </Flex>\n )\n })}\n </div>\n </Splitter.Panel>\n )}\n <Splitter.Panel>\n <div className={classNames('height-full', styles.pdfImageBody)}>\n <Flex gap={6} align=\"center\" className={styles.pdfImageBodyToolbar}>\n <Button onClick={zoomOut} icon={<MinusCircleOutlined />} title=\"缩小\" />\n <Button onClick={zoomIn} icon={<PlusCircleOutlined />} title=\"放大\" />\n {/* <Button onClick={() => setZoom(1)} icon={<RedoOutlined />} title=\"还原\" /> */}\n </Flex>\n <div ref={containerRef} className=\"height-full scroll-fade-in\">\n {virtualizer.getVirtualItems().map((item) => {\n return (\n <div\n key={`${item.index}-${images[item.index].pageNum}`}\n className={styles.pdfImageBodyItem}\n style={{\n top: item.start\n }}\n >\n <div\n className={classNames(styles.pdfImageBodyItemInnerWrapper, 'p-8')}\n style={{\n width: `${600 * zoom}px`,\n height: `${MAIN_IMG_HEIGHT * zoom}px`\n }}\n >\n {/* PDF页面样式容器 */}\n <div className={classNames(styles.pdfImageBodyItemInner, { [styles.pdfImageBodyItemActive]: item.index === currentIndex })}>\n <img\n className={classNames(styles.pdfImageBodyItemImg)}\n src={images[item.index].imageUrl}\n loading={item.index === currentIndex ? 'eager' : 'lazy'}\n />\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </Splitter.Panel>\n </Splitter>\n )\n}\n","import {\n LoadError,\n PageChangeEvent,\n PasswordStatus,\n PdfJs,\n PluginOnAnnotationLayerRender,\n RenderProtectedViewProps,\n Viewer,\n Worker\n} 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 { isExternal, 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// 插件列表\nconst openLinksNewTabPlugin = () => {\n const onAnnotationLayerRender = (e: PluginOnAnnotationLayerRender) => {\n // ⭐ 渲染完成后处理 a 标签\n e.container.querySelectorAll<HTMLAnchorElement>('.rpv-core__annotation--link a[href]').forEach((linkEle) => {\n const href = linkEle.getAttribute('href')\n if (href && isExternal(href)) {\n linkEle.setAttribute('target', '_blank')\n linkEle.setAttribute('rel', 'noopener noreferrer')\n }\n })\n }\n\n return {\n onAnnotationLayerRender\n }\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 * TODO 放大缩小会丢失分页\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 {/* https://cdn.jsdelivr.net/npm/pdfjs-dist@3.2.146/cmaps/ */}\n <Worker workerUrl={`https://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: 'https://logosdata.cn/public/pdf/pdfjs-dist@3.2.146/cmaps/', // 使用可用的源\n cMapPacked: true,\n // 禁用字体子集化,确保完整字体加载\n disableFontFace: false,\n // 启用标准字体支持\n standardFontDataUrl: 'https://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 openLinksNewTabPlugin()\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, EmptyProps, Flex, Image, Result } from 'antd'\nimport { useMemo } from 'react'\nimport VideoPlayer from './VideoPlayer'\n\nimport AudioPlayer from './AudioPlayer'\nimport DocxPreview from './DocxPreview'\nimport MarkdownPreview from './MarkdownPreview'\nimport PdfImagePreview from './PdfImagePreview'\nimport PdfPreview from './PdfPreview'\nimport styles from './styles.module.less'\n\n/**\n * 文件预览组件属性接口\n */\nexport interface FilePreviewProps {\n emptyProps?: EmptyProps\n /** 文件URL地址 */\n fileUrl: string\n /** 文件后缀名 */\n suffix?: string\n /** 文件密码 */\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 onSetPassword?: () => void\n}\n\n/**\n * 文件预览组件\n * 支持图片、PDF、视频、音频、Markdown等文件格式的预览\n * @param props - 组件属性\n */\nexport default ({ suffix, fileUrl, pdfParams, password, searchValue, emptyProps, onSetPassword }: FilePreviewProps) => {\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 {...emptyProps} />\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 case 'PDF_IMG':\n return <PdfImagePreview fileUrl={fileUrl} {...pdfParams} />\n\n case 'MP4':\n // case 'MOV':\n // case 'MKV':\n // case 'AVI':\n // case 'FLV':\n return <VideoPlayer fileUrl={fileUrl} />\n\n case 'MP3':\n case 'WAV':\n case 'M4A':\n case 'ACC':\n // case 'WMA':\n return <AudioPlayer fileUrl={fileUrl} />\n\n case 'MD':\n case 'MARKDOWN':\n return <MarkdownPreview fileUrl={fileUrl} searchValue={searchValue} />\n\n case 'DOCX':\n return <DocxPreview fileUrl={fileUrl} />\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, { FilePreviewProps } from './FilePreview'\n\n/**\n * 文件预览抽屉组件属性接口\n */\nexport interface FilePreviewDrawerProps extends FilePreviewProps {\n /** 是否打开抽屉 */\n open: boolean\n /** 关闭抽屉的回调函数 */\n onClose: () => void\n /** 抽屉标题,默认为'文件预览' */\n title?: string\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 ({ open, title = '文件预览', onClose, ...props }: FilePreviewDrawerProps) => {\n return (\n <Drawer\n title={title}\n push={false}\n // 全屏宽度,提供更好的文件预览体验\n width=\"100%\"\n open={open}\n onClose={onClose}\n >\n <FilePreview {...props} />\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","@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes zoomIn {\n from {\n transform: scale(0.95);\n }\n to {\n transform: scale(1);\n }\n}\n@keyframes zoomOut {\n from {\n transform: scale(1);\n }\n to {\n transform: scale(0.95);\n }\n}\n@keyframes zoom {\n 0% {\n opacity: 0;\n transform: scale(0.95);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes slideFromTop {\n from {\n transform: translateY(-0.5rem);\n }\n to {\n transform: translateY(0);\n }\n}\n@keyframes slideFromRight {\n from {\n transform: translateX(0.5rem);\n }\n to {\n transform: translateX(0);\n }\n}\n@keyframes slideFromLeft {\n from {\n transform: translateX(-0.5rem);\n }\n to {\n transform: translateX(0);\n }\n}\n@keyframes slideFromBottom {\n from {\n transform: translateY(0.5rem);\n }\n to {\n transform: translateY(0);\n }\n}\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n:root {\n /****************** \n Basics\n ******************/\n /****************** \n Colors variables\n ******************/\n /* Gray alpha (light mode) */\n --tt-gray-light-a-50: rgba(56, 56, 56, 0.04);\n --tt-gray-light-a-100: rgba(15, 22, 36, 0.05);\n --tt-gray-light-a-200: rgba(37, 39, 45, 0.1);\n --tt-gray-light-a-300: rgba(47, 50, 55, 0.2);\n --tt-gray-light-a-400: rgba(40, 44, 51, 0.42);\n --tt-gray-light-a-500: rgba(52, 55, 60, 0.64);\n --tt-gray-light-a-600: rgba(36, 39, 46, 0.78);\n --tt-gray-light-a-700: rgba(35, 37, 42, 0.87);\n --tt-gray-light-a-800: rgba(30, 32, 36, 0.95);\n --tt-gray-light-a-900: rgba(29, 30, 32, 0.98);\n /* Gray (light mode) */\n --tt-gray-light-50: #fafafa;\n --tt-gray-light-100: #f4f4f5;\n --tt-gray-light-200: #eaeaeb;\n --tt-gray-light-300: #d5d6d7;\n --tt-gray-light-400: #a6a7ab;\n --tt-gray-light-500: #7d7f82;\n --tt-gray-light-600: #53565a;\n --tt-gray-light-700: #404145;\n --tt-gray-light-800: #2c2d30;\n --tt-gray-light-900: #222325;\n /* Gray alpha (dark mode) */\n --tt-gray-dark-a-50: rgba(232, 232, 253, 0.05);\n --tt-gray-dark-a-100: rgba(231, 231, 243, 0.07);\n --tt-gray-dark-a-200: rgba(238, 238, 246, 0.11);\n --tt-gray-dark-a-300: rgba(239, 239, 245, 0.22);\n --tt-gray-dark-a-400: rgba(244, 244, 255, 0.37);\n --tt-gray-dark-a-500: rgba(236, 238, 253, 0.5);\n --tt-gray-dark-a-600: rgba(247, 247, 253, 0.64);\n --tt-gray-dark-a-700: rgba(251, 251, 254, 0.75);\n --tt-gray-dark-a-800: rgba(253, 253, 253, 0.88);\n --tt-gray-dark-a-900: rgba(255, 255, 255, 0.96);\n /* Gray (dark mode) */\n --tt-gray-dark-50: #19191a;\n --tt-gray-dark-100: #202022;\n --tt-gray-dark-200: #2d2d2f;\n --tt-gray-dark-300: #464649;\n --tt-gray-dark-400: #636369;\n --tt-gray-dark-500: #7c7c83;\n --tt-gray-dark-600: #a3a3a8;\n --tt-gray-dark-700: #c0c0c3;\n --tt-gray-dark-800: #e0e0e1;\n --tt-gray-dark-900: #f5f5f5;\n /* Brand colors */\n --tt-brand-color-50: #efeeff;\n --tt-brand-color-100: #dedbff;\n --tt-brand-color-200: #c3bdff;\n --tt-brand-color-300: #9d8aff;\n --tt-brand-color-400: #7a52ff;\n --tt-brand-color-500: #6229ff;\n --tt-brand-color-600: #5400e5;\n --tt-brand-color-700: #4b00cc;\n --tt-brand-color-800: #380099;\n --tt-brand-color-900: #2b1966;\n --tt-brand-color-950: hsl(257, 100%, 9%);\n /* Green */\n --tt-color-green-inc-5: hsl(129, 100%, 97%);\n --tt-color-green-inc-4: hsl(129, 100%, 92%);\n --tt-color-green-inc-3: hsl(131, 100%, 86%);\n --tt-color-green-inc-2: hsl(133, 98%, 78%);\n --tt-color-green-inc-1: hsl(137, 99%, 70%);\n --tt-color-green-base: hsl(147, 99%, 50%);\n --tt-color-green-dec-1: hsl(147, 97%, 41%);\n --tt-color-green-dec-2: hsl(146, 98%, 32%);\n --tt-color-green-dec-3: hsl(146, 100%, 24%);\n --tt-color-green-dec-4: hsl(144, 100%, 16%);\n --tt-color-green-dec-5: hsl(140, 100%, 9%);\n /* Yellow */\n --tt-color-yellow-inc-5: hsl(50, 100%, 97%);\n --tt-color-yellow-inc-4: hsl(50, 100%, 91%);\n --tt-color-yellow-inc-3: hsl(50, 100%, 84%);\n --tt-color-yellow-inc-2: hsl(50, 100%, 77%);\n --tt-color-yellow-inc-1: hsl(50, 100%, 68%);\n --tt-color-yellow-base: hsl(52, 100%, 50%);\n --tt-color-yellow-dec-1: hsl(52, 100%, 41%);\n --tt-color-yellow-dec-2: hsl(52, 100%, 32%);\n --tt-color-yellow-dec-3: hsl(52, 100%, 24%);\n --tt-color-yellow-dec-4: hsl(51, 100%, 16%);\n --tt-color-yellow-dec-5: hsl(50, 100%, 9%);\n /* Red */\n --tt-color-red-inc-5: hsl(11, 100%, 96%);\n --tt-color-red-inc-4: hsl(11, 100%, 88%);\n --tt-color-red-inc-3: hsl(10, 100%, 80%);\n --tt-color-red-inc-2: hsl(9, 100%, 73%);\n --tt-color-red-inc-1: hsl(7, 100%, 64%);\n --tt-color-red-base: hsl(7, 100%, 54%);\n --tt-color-red-dec-1: hsl(7, 100%, 41%);\n --tt-color-red-dec-2: hsl(5, 100%, 32%);\n --tt-color-red-dec-3: hsl(4, 100%, 24%);\n --tt-color-red-dec-4: hsl(3, 100%, 16%);\n --tt-color-red-dec-5: hsl(1, 100%, 9%);\n /* Basic colors */\n --white: #ffffff;\n --black: #0e0e11;\n --transparent: rgba(255, 255, 255, 0);\n /****************** \n Shadow variables\n ******************/\n /* Shadows Light */\n --tt-shadow-elevated-md: 0px 16px 48px 0px rgba(17, 24, 39, 0.04), 0px 12px 24px 0px rgba(17, 24, 39, 0.04), 0px 6px 8px 0px rgba(17, 24, 39, 0.02), 0px 2px 3px 0px rgba(17, 24, 39, 0.02);\n /************************************************** \n Radius variables \n **************************************************/\n --tt-radius-xxs: 0.125rem;\n /* 2px */\n --tt-radius-xs: 0.25rem;\n /* 4px */\n --tt-radius-sm: 0.375rem;\n /* 6px */\n --tt-radius-md: 0.5rem;\n /* 8px */\n --tt-radius-lg: 0.75rem;\n /* 12px */\n --tt-radius-xl: 1rem;\n /* 16px */\n /************************************************** \n Transition variables \n **************************************************/\n --tt-transition-duration-short: 0.1s;\n --tt-transition-duration-default: 0.2s;\n --tt-transition-duration-long: 0.64s;\n --tt-transition-easing-default: cubic-bezier(0.46, 0.03, 0.52, 0.96);\n --tt-transition-easing-cubic: cubic-bezier(0.65, 0.05, 0.36, 1);\n --tt-transition-easing-quart: cubic-bezier(0.77, 0, 0.18, 1);\n --tt-transition-easing-circ: cubic-bezier(0.79, 0.14, 0.15, 0.86);\n --tt-transition-easing-back: cubic-bezier(0.68, -0.55, 0.27, 1.55);\n /****************** \n Contrast variables\n ******************/\n --tt-accent-contrast: 8%;\n --tt-destructive-contrast: 8%;\n --tt-foreground-contrast: 8%;\n}\n:root {\n /************************************************** \n Global colors \n **************************************************/\n /* Global colors - Light mode */\n --tt-bg-color: var(--white);\n --tt-border-color: var(--tt-gray-light-a-200);\n --tt-border-color-tint: var(--tt-gray-light-a-100);\n --tt-sidebar-bg-color: var(--tt-gray-light-100);\n --tt-scrollbar-color: var(--tt-gray-light-a-200);\n --tt-cursor-color: var(--tt-brand-color-500);\n --tt-selection-color: rgba(157, 138, 255, 0.2);\n --tt-card-bg-color: var(--white);\n --tt-card-border-color: var(--tt-gray-light-a-100);\n}\n/* Global colors - Dark mode */\n.dark {\n --tt-bg-color: var(--black);\n --tt-border-color: var(--tt-gray-dark-a-200);\n --tt-border-color-tint: var(--tt-gray-dark-a-100);\n --tt-sidebar-bg-color: var(--tt-gray-dark-100);\n --tt-scrollbar-color: var(--tt-gray-dark-a-200);\n --tt-cursor-color: var(--tt-brand-color-400);\n --tt-selection-color: rgba(122, 82, 255, 0.2);\n --tt-card-bg-color: var(--tt-gray-dark-50);\n --tt-card-border-color: var(--tt-gray-dark-a-50);\n --tt-shadow-elevated-md: 0px 16px 48px 0px rgba(0, 0, 0, 0.5), 0px 12px 24px 0px rgba(0, 0, 0, 0.24), 0px 6px 8px 0px rgba(0, 0, 0, 0.22), 0px 2px 3px 0px rgba(0, 0, 0, 0.12);\n}\n/* Text colors */\n:root {\n --tt-color-text-gray: hsl(45, 2%, 46%);\n --tt-color-text-brown: hsl(19, 31%, 47%);\n --tt-color-text-orange: hsl(30, 89%, 45%);\n --tt-color-text-yellow: hsl(38, 62%, 49%);\n --tt-color-text-green: hsl(148, 32%, 39%);\n --tt-color-text-blue: hsl(202, 54%, 43%);\n --tt-color-text-purple: hsl(274, 32%, 54%);\n --tt-color-text-pink: hsl(328, 49%, 53%);\n --tt-color-text-red: hsl(2, 62%, 55%);\n --tt-color-text-gray-contrast: hsla(39, 26%, 26%, 0.15);\n --tt-color-text-brown-contrast: hsla(18, 43%, 69%, 0.35);\n --tt-color-text-orange-contrast: hsla(24, 73%, 55%, 0.27);\n --tt-color-text-yellow-contrast: hsla(44, 82%, 59%, 0.39);\n --tt-color-text-green-contrast: hsla(126, 29%, 60%, 0.27);\n --tt-color-text-blue-contrast: hsla(202, 54%, 59%, 0.27);\n --tt-color-text-purple-contrast: hsla(274, 37%, 64%, 0.27);\n --tt-color-text-pink-contrast: hsla(331, 60%, 71%, 0.27);\n --tt-color-text-red-contrast: hsla(8, 79%, 79%, 0.4);\n}\n.dark {\n --tt-color-text-gray: hsl(0, 0%, 61%);\n --tt-color-text-brown: hsl(18, 35%, 58%);\n --tt-color-text-orange: hsl(25, 53%, 53%);\n --tt-color-text-yellow: hsl(36, 54%, 55%);\n --tt-color-text-green: hsl(145, 32%, 47%);\n --tt-color-text-blue: hsl(202, 64%, 52%);\n --tt-color-text-purple: hsl(270, 55%, 62%);\n --tt-color-text-pink: hsl(329, 57%, 58%);\n --tt-color-text-red: hsl(1, 69%, 60%);\n --tt-color-text-gray-contrast: hsla(0, 0%, 100%, 0.09);\n --tt-color-text-brown-contrast: hsla(17, 45%, 50%, 0.25);\n --tt-color-text-orange-contrast: hsla(27, 82%, 53%, 0.2);\n --tt-color-text-yellow-contrast: hsla(35, 49%, 47%, 0.2);\n --tt-color-text-green-contrast: hsla(151, 55%, 39%, 0.2);\n --tt-color-text-blue-contrast: hsla(202, 54%, 43%, 0.2);\n --tt-color-text-purple-contrast: hsla(271, 56%, 60%, 0.18);\n --tt-color-text-pink-contrast: hsla(331, 67%, 58%, 0.22);\n --tt-color-text-red-contrast: hsla(0, 67%, 60%, 0.25);\n}\n/* Highlight colors */\n:root {\n --tt-color-highlight-yellow: #fef9c3;\n --tt-color-highlight-green: #dcfce7;\n --tt-color-highlight-blue: #e0f2fe;\n --tt-color-highlight-purple: #f3e8ff;\n --tt-color-highlight-red: #ffe4e6;\n --tt-color-highlight-gray: #f8f8f7;\n --tt-color-highlight-brown: #f4eeee;\n --tt-color-highlight-orange: #fbecdd;\n --tt-color-highlight-pink: #fcf1f6;\n --tt-color-highlight-yellow-contrast: #fbe604;\n --tt-color-highlight-green-contrast: #c7fad8;\n --tt-color-highlight-blue-contrast: #ceeafd;\n --tt-color-highlight-purple-contrast: #e4ccff;\n --tt-color-highlight-red-contrast: #ffccd0;\n --tt-color-highlight-gray-contrast: rgba(84, 72, 49, 0.15);\n --tt-color-highlight-brown-contrast: rgba(210, 162, 141, 0.35);\n --tt-color-highlight-orange-contrast: rgba(224, 124, 57, 0.27);\n --tt-color-highlight-pink-contrast: rgba(225, 136, 179, 0.27);\n}\n.dark {\n --tt-color-highlight-yellow: #6b6524;\n --tt-color-highlight-green: #509568;\n --tt-color-highlight-blue: #6e92aa;\n --tt-color-highlight-purple: #583e74;\n --tt-color-highlight-red: #743e42;\n --tt-color-highlight-gray: #2f2f2f;\n --tt-color-highlight-brown: #4a3228;\n --tt-color-highlight-orange: #5c3b23;\n --tt-color-highlight-pink: #4e2c3c;\n --tt-color-highlight-yellow-contrast: #58531e;\n --tt-color-highlight-green-contrast: #47855d;\n --tt-color-highlight-blue-contrast: #5e86a1;\n --tt-color-highlight-purple-contrast: #4c3564;\n --tt-color-highlight-red-contrast: #643539;\n --tt-color-highlight-gray-contrast: rgba(255, 255, 255, 0.094);\n --tt-color-highlight-brown-contrast: rgba(184, 101, 69, 0.25);\n --tt-color-highlight-orange-contrast: rgba(233, 126, 37, 0.2);\n --tt-color-highlight-pink-contrast: rgba(220, 76, 145, 0.22);\n}\n.editorParent {\n --tt-toolbar-height: 44px;\n --tt-theme-text: var(--tt-gray-light-900);\n}\n.dark .editorParent :global {\n --tt-theme-text: var(--tt-gray-dark-900);\n}\n.editorParent .extraToolbar {\n border-bottom: 1px solid var(--tt-toolbar-border-color);\n min-height: var(--tt-toolbar-height);\n padding: 0 8px;\n}\n.editorParent .editorFloatingToolbar {\n max-width: 350px;\n}\n.editorParent .contentWrapper {\n height: calc(100% - var(--tt-toolbar-height));\n overflow-y: auto;\n}\n.editorParent .contentWrapper .simpleEditorContent {\n max-width: 1000px;\n width: 100%;\n margin: 0 auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-annotation,\n.editorParent .contentWrapper .simpleEditorContent :global .editor-collection {\n display: inline-block;\n transition: all 0.2s ease;\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-annotation {\n border-bottom: 1px dashed #ff9500;\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-annotation:hover {\n background-color: rgba(255, 149, 0, 0.2);\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-annotation .editor-annotation--selected {\n background-color: rgba(255, 149, 0, 0.4);\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-collection {\n border-bottom: 1px dashed #34afbe;\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-collection:hover {\n background-color: rgba(52, 175, 190, 0.2);\n}\n.editorParent .contentWrapper .simpleEditorContent :global .editor-collection .editor-collection--selected {\n background-color: rgba(52, 175, 190, 0.4);\n}\n.editorParent .contentWrapper .simpleEditorContent :global .tiptap.ProseMirror {\n font-family: 'DM Sans', sans-serif;\n padding: 18px;\n flex: 1;\n}\n@media screen and (width <= 480px) {\n .editorParent .contentWrapper .simpleEditorContent :global .tiptap.ProseMirror {\n padding: 1rem 1.5rem;\n }\n}\n.editorParent .contentWrapper .simpleEditorContent.noToolbar :global .tiptap.ProseMirror {\n padding: 0;\n}\n.extraSidebarParent :global .extra-sidebar {\n width: 350px;\n}\n","\"use client\"\n\nimport {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n useState,\n version,\n} from \"react\"\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingPortal,\n type Placement,\n type UseFloatingReturn,\n type ReferenceType,\n FloatingDelayGroup,\n} from \"@floating-ui/react\"\nimport \"./tooltip.less\"\n\ninterface TooltipProviderProps {\n children: React.ReactNode\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n onOpenChange?: (open: boolean) => void\n delay?: number\n closeDelay?: number\n timeout?: number\n useDelayGroup?: boolean\n}\n\ninterface TooltipTriggerProps\n extends Omit<React.HTMLProps<HTMLElement>, \"ref\"> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps\n extends Omit<React.HTMLProps<HTMLDivElement>, \"ref\"> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, \"children\">\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (\n userProps?: React.HTMLProps<HTMLElement>\n ) => Record<string, unknown>\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLDivElement>\n ) => Record<string, unknown>\n}\n\nfunction useTooltip({\n initialOpen = false,\n placement = \"top\",\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n delay = 600,\n closeDelay = 0,\n}: Omit<TooltipProviderProps, \"children\"> = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState<boolean>(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(4),\n flip({\n crossAxis: placement.includes(\"-\"),\n fallbackAxisSideDirection: \"start\",\n padding: 4,\n }),\n shift({ padding: 4 }),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n mouseOnly: true,\n move: false,\n restMs: delay,\n enabled: controlledOpen == null,\n delay: {\n close: closeDelay,\n },\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: \"tooltip\" })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = useContext(TooltipContext)\n\n if (context == null) {\n throw new Error(\"Tooltip components must be wrapped in <TooltipProvider />\")\n }\n\n return context\n}\n\nexport function Tooltip({ children, ...props }: TooltipProviderProps) {\n const tooltip = useTooltip(props)\n\n if (!props.useDelayGroup) {\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n }\n\n return (\n <FloatingDelayGroup\n delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }}\n timeoutMs={props.timeout}\n >\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = forwardRef<HTMLElement, TooltipTriggerProps>(\n function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = isValidElement(children)\n ? parseInt(version, 10) >= 19\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as { props: { ref?: React.Ref<any> } }).props.ref\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n const dataAttributes = {\n \"data-tooltip-state\": context.open ? \"open\" : \"closed\",\n }\n\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === \"object\" ? children.props : {}),\n ...dataAttributes,\n })\n )\n }\n\n return (\n <button\n ref={ref}\n data-tooltip-state={context.open ? \"open\" : \"closed\"}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nexport const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent(\n { style, children, portal = true, portalProps = {}, ...props },\n propRef\n ) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open) return null\n\n const content = (\n <div\n ref={ref}\n style={{\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n className=\"tiptap-tooltip\"\n >\n {children}\n </div>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nTooltip.displayName = \"Tooltip\"\nTooltipTrigger.displayName = \"TooltipTrigger\"\nTooltipContent.displayName = \"TooltipContent\"\n","import type { Node as PMNode } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { AllSelection, NodeSelection, Selection, TextSelection } from '@tiptap/pm/state'\nimport { cellAround, CellSelection } from '@tiptap/pm/tables'\nimport { findParentNodeClosestToPos, type Editor, type NodeWithPos } from '@tiptap/react'\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\n\nexport const MAC_SYMBOLS: Record<string, string> = {\n mod: '⌘',\n command: '⌘',\n meta: '⌘',\n ctrl: '⌃',\n control: '⌃',\n alt: '⌥',\n option: '⌥',\n shift: '⇧',\n backspace: 'Del',\n delete: '⌦',\n enter: '⏎',\n escape: '⎋',\n capslock: '⇪'\n} as const\n\nexport const SR_ONLY = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: '-1px',\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n borderWidth: 0\n} as const\n\nexport function cn(...classes: (string | boolean | undefined | null)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n/**\n * Determines if the current platform is macOS\n * @returns boolean indicating if the current platform is Mac\n */\nexport function isMac(): boolean {\n return typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac')\n}\n\n/**\n * Formats a shortcut key based on the platform (Mac or non-Mac)\n * @param key - The key to format (e.g., \"ctrl\", \"alt\", \"shift\")\n * @param isMac - Boolean indicating if the platform is Mac\n * @param capitalize - Whether to capitalize the key (default: true)\n * @returns Formatted shortcut key symbol\n */\nexport const formatShortcutKey = (key: string, isMac: boolean, capitalize: boolean = true) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || (capitalize ? key.toUpperCase() : key)\n }\n\n return capitalize ? key.charAt(0).toUpperCase() + key.slice(1) : key\n}\n\n/**\n * Parses a shortcut key string into an array of formatted key symbols\n * @param shortcutKeys - The string of shortcut keys (e.g., \"ctrl-alt-shift\")\n * @param delimiter - The delimiter used to split the keys (default: \"-\")\n * @param capitalize - Whether to capitalize the keys (default: true)\n * @returns Array of formatted shortcut key symbols\n */\nexport const parseShortcutKeys = (props: { shortcutKeys: string | undefined; delimiter?: string; capitalize?: boolean }) => {\n const { shortcutKeys, delimiter = '+', capitalize = true } = props\n\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split(delimiter)\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac(), capitalize))\n}\n\n/**\n * Checks if a mark exists in the editor schema\n * @param markName - The name of the mark to check\n * @param editor - The editor instance\n * @returns boolean indicating if the mark exists in the schema\n */\nexport const isMarkInSchema = (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 * Moves the focus to the next node in the editor\n * @param editor - The editor instance\n * @returns boolean indicating if the focus was moved\n */\nexport function focusNextNode(editor: Editor) {\n const { state, view } = editor\n const { doc, selection } = state\n\n const nextSel = Selection.findFrom(selection.$to, 1, true)\n if (nextSel) {\n view.dispatch(state.tr.setSelection(nextSel).scrollIntoView())\n return true\n }\n\n const paragraphType = state.schema.nodes.paragraph\n if (!paragraphType) {\n console.warn('No paragraph node type found in schema.')\n return false\n }\n\n const end = doc.content.size\n const para = paragraphType.create()\n let tr = state.tr.insert(end, para)\n\n // Place the selection inside the new paragraph\n const $inside = tr.doc.resolve(end + 1)\n tr = tr.setSelection(TextSelection.near($inside)).scrollIntoView()\n view.dispatch(tr)\n return true\n}\n\n/**\n * Checks if a value is a valid number (not null, undefined, or NaN)\n * @param value - The value to check\n * @returns boolean indicating if the value is a valid number\n */\nexport function isValidPosition(pos: number | null | undefined): pos is number {\n return typeof pos === 'number' && pos >= 0\n}\n\n/**\n * Checks if one or more extensions are registered in the Tiptap editor.\n * @param editor - The Tiptap editor instance\n * @param extensionNames - A single extension name or an array of names to check\n * @returns True if at least one of the extensions is available, false otherwise\n */\nexport function isExtensionAvailable(editor: Editor | null, extensionNames: string | string[]): boolean {\n if (!editor) return false\n\n const names = Array.isArray(extensionNames) ? extensionNames : [extensionNames]\n\n const found = names.some((name) => editor.extensionManager.extensions.some((ext) => ext.name === name))\n\n if (!found) {\n console.warn(\n `None of the extensions [${names.join(', ')}] were found in the editor schema. Ensure they are included in the editor configuration.`\n )\n }\n\n return found\n}\n\n/**\n * Finds a node at the specified position with error handling\n * @param editor The Tiptap editor instance\n * @param position The position in the document to find the node\n * @returns The node at the specified position, or null if not found\n */\nexport function findNodeAtPosition(editor: Editor, position: number) {\n try {\n const node = editor.state.doc.nodeAt(position)\n if (!node) {\n console.warn(`No node found at position ${position}`)\n return null\n }\n return node\n } catch (error) {\n console.error(`Error getting node at position ${position}:`, error)\n return null\n }\n}\n\n/**\n * Finds the position and instance of a node in the document\n * @param props Object containing editor, node (optional), and nodePos (optional)\n * @param props.editor The Tiptap editor instance\n * @param props.node The node to find (optional if nodePos is provided)\n * @param props.nodePos The position of the node to find (optional if node is provided)\n * @returns An object with the position and node, or null if not found\n */\nexport function findNodePosition(props: {\n editor: Editor | null\n node?: PMNode | null\n nodePos?: number | null\n}): { pos: number; node: PMNode } | null {\n const { editor, node, nodePos } = props\n\n if (!editor || !editor.state?.doc) return null\n\n // Zero is valid position\n const hasValidNode = node !== undefined && node !== null\n const hasValidPos = isValidPosition(nodePos)\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n // First search for the node in the document if we have a node\n if (hasValidNode) {\n let foundPos = -1\n let foundNode: PMNode | null = null\n\n editor.state.doc.descendants((currentNode, pos) => {\n // TODO: Needed?\n // if (currentNode.type && currentNode.type.name === node!.type.name) {\n if (currentNode === node) {\n foundPos = pos\n foundNode = currentNode\n return false\n }\n return true\n })\n\n if (foundPos !== -1 && foundNode !== null) {\n return { pos: foundPos, node: foundNode }\n }\n }\n\n // If we have a valid position, use findNodeAtPosition\n if (hasValidPos) {\n const nodeAtPos = findNodeAtPosition(editor, nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n }\n\n return null\n}\n\n/**\n * Determines whether the current selection contains a node whose type matches\n * any of the provided node type names.\n * @param editor Tiptap editor instance\n * @param nodeTypeNames List of node type names to match against\n * @param checkAncestorNodes Whether to check ancestor node types up the depth chain\n */\nexport function isNodeTypeSelected(editor: Editor | null, nodeTypeNames: string[] = [], checkAncestorNodes: boolean = false): boolean {\n if (!editor || !editor.state.selection) return false\n\n const { selection } = editor.state\n if (selection.empty) return false\n\n // Direct node selection check\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n return selectedNode ? nodeTypeNames.includes(selectedNode.type.name) : false\n }\n\n // Depth-based ancestor node check\n if (checkAncestorNodes) {\n const { $from } = selection\n for (let depth = $from.depth; depth > 0; depth--) {\n const ancestorNode = $from.node(depth)\n if (nodeTypeNames.includes(ancestorNode.type.name)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check whether the current selection is fully within nodes\n * whose type names are in the provided `types` list.\n *\n * - NodeSelection → checks the selected node.\n * - Text/AllSelection → ensures all textblocks within [from, to) are allowed.\n */\nexport function selectionWithinConvertibleTypes(editor: Editor, types: string[] = []): boolean {\n if (!editor || types.length === 0) return false\n\n const { state } = editor\n const { selection } = state\n const allowed = new Set(types)\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node?.type?.name\n return !!nodeType && allowed.has(nodeType)\n }\n\n if (selection instanceof TextSelection || selection instanceof AllSelection) {\n let valid = true\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.isTextblock && !allowed.has(node.type.name)) {\n valid = false\n return false // stop early\n }\n return valid\n })\n return valid\n }\n\n return false\n}\n\n/**\n * Handles image upload with progress tracking and abort capability\n * @param file The file to upload\n * @param onProgress Optional callback for tracking upload progress\n * @param abortSignal Optional AbortSignal for cancelling the upload\n * @returns Promise resolving to the URL of the uploaded image\n */\nexport const handleImageUpload = async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n): Promise<string> => {\n // Validate file\n if (!file) {\n throw new Error('未提供文件')\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(`文件大小超过最大限制 (${MAX_FILE_SIZE / (1024 * 1024)}MB)`)\n }\n\n // For demo/testing: Simulate upload progress. In production, replace the following code\n // with your own upload implementation.\n for (let progress = 0; progress <= 100; progress += 10) {\n if (abortSignal?.aborted) {\n throw new Error('上传已取消')\n }\n await new Promise((resolve) => setTimeout(resolve, 500))\n onProgress?.({ progress })\n }\n\n return '/images/tiptap-ui-placeholder-image.jpg'\n}\n\ntype ProtocolOptions = {\n /**\n * The protocol scheme to be registered.\n * @default '''\n * @example 'ftp'\n * @example 'git'\n */\n scheme: string\n\n /**\n * If enabled, it allows optional slashes after the protocol.\n * @default false\n * @example true\n */\n optionalSlashes?: boolean\n}\n\ntype ProtocolConfig = Array<ProtocolOptions | string>\n\nconst ATTR_WHITESPACE =\n // eslint-disable-next-line no-control-regex\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n\nexport function isAllowedUri(uri: string | undefined, protocols?: ProtocolConfig) {\n const allowedProtocols: string[] = ['http', 'https', 'ftp', 'ftps', 'mailto', 'tel', 'callto', 'sms', 'cid', 'xmpp']\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol = typeof protocol === 'string' ? protocol : protocol.scheme\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol)\n }\n })\n }\n\n return (\n !uri ||\n uri.replace(ATTR_WHITESPACE, '').match(\n new RegExp(\n // eslint-disable-next-line no-useless-escape\n `^(?:(?:${allowedProtocols.join('|')}):|[^a-z]|[a-z0-9+.\\-]+(?:[^a-z+.\\-:]|$))`,\n 'i'\n )\n )\n )\n}\n\nexport function sanitizeUrl(inputUrl: string, baseUrl: string, protocols?: ProtocolConfig): string {\n try {\n const url = new URL(inputUrl, baseUrl)\n\n if (isAllowedUri(url.href, protocols)) {\n return url.href\n }\n } catch {\n // If URL creation fails, it's considered invalid\n }\n return '#'\n}\n\n/**\n * Update a single attribute on multiple nodes.\n *\n * @param tr - The transaction to mutate\n * @param targets - Array of { node, pos }\n * @param attrName - Attribute key to update\n * @param next - New value OR updater function receiving previous value\n * Pass `undefined` to remove the attribute.\n * @returns true if at least one node was updated, false otherwise\n */\nexport function updateNodesAttr<A extends string = string, V = unknown>(\n tr: Transaction,\n targets: readonly NodeWithPos[],\n attrName: A,\n next: V | ((prev: V | undefined) => V | undefined)\n): boolean {\n if (!targets.length) return false\n\n let changed = false\n\n for (const { pos } of targets) {\n // Always re-read from the transaction's current doc\n const currentNode = tr.doc.nodeAt(pos)\n if (!currentNode) continue\n\n const prevValue = (currentNode.attrs as Record<string, unknown>)[attrName] as V | undefined\n const resolvedNext = typeof next === 'function' ? (next as (p: V | undefined) => V | undefined)(prevValue) : next\n\n if (prevValue === resolvedNext) continue\n\n const nextAttrs: Record<string, unknown> = { ...currentNode.attrs }\n if (resolvedNext === undefined) {\n // Remove the key entirely instead of setting null\n delete nextAttrs[attrName]\n } else {\n nextAttrs[attrName] = resolvedNext\n }\n\n tr.setNodeMarkup(pos, undefined, nextAttrs)\n changed = true\n }\n\n return changed\n}\n\n/**\n * Selects the entire content of the current block node if the selection is empty.\n * If the selection is not empty, it does nothing.\n * @param editor The Tiptap editor instance\n */\nexport function selectCurrentBlockContent(editor: Editor) {\n const { selection, doc } = editor.state\n\n if (!selection.empty) return\n\n const $pos = selection.$from\n let blockNode = null\n let blockPos = -1\n\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n const pos = $pos.start(depth)\n\n if (node.isBlock && node.textContent.trim()) {\n blockNode = node\n blockPos = pos\n break\n }\n }\n\n if (blockNode && blockPos >= 0) {\n const from = blockPos\n const to = blockPos + blockNode.nodeSize - 2 // -2 to exclude the closing tag\n\n if (from < to) {\n const $from = doc.resolve(from)\n const $to = doc.resolve(to)\n const newSelection = TextSelection.between($from, $to, 1)\n\n if (newSelection && !selection.eq(newSelection)) {\n editor.view.dispatch(editor.state.tr.setSelection(newSelection))\n }\n }\n }\n}\n\n/**\n * Retrieves all nodes of specified types from the current selection.\n * @param selection The current editor selection\n * @param allowedNodeTypes An array of node type names to look for (e.g., [\"image\", \"table\"])\n * @returns An array of objects containing the node and its position\n */\nexport function getSelectedNodesOfType(selection: Selection, allowedNodeTypes: string[]): NodeWithPos[] {\n const results: NodeWithPos[] = []\n const allowed = new Set(allowedNodeTypes)\n\n if (selection instanceof CellSelection) {\n selection.forEachCell((node: PMNode, pos: number) => {\n if (allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n })\n return results\n }\n\n if (selection instanceof NodeSelection) {\n const { node, from: pos } = selection\n if (node && allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n return results\n }\n\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n const cellNode = selection.$anchor.doc.nodeAt(cell.pos)\n if (cellNode && allowed.has(cellNode.type.name)) {\n results.push({ node: cellNode, pos: cell.pos })\n return results\n }\n }\n\n // Fallback: find parent nodes of allowed types\n const parentNode = findParentNodeClosestToPos($anchor, (node) => allowed.has(node.type.name))\n\n if (parentNode) {\n results.push({ node: parentNode.node, pos: parentNode.pos })\n }\n\n return results\n}\n\nexport function getSelectedBlockNodes(editor: Editor): PMNode[] {\n const { doc } = editor.state\n const { from, to } = editor.state.selection\n\n const blocks: PMNode[] = []\n const seen = new Set<number>()\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isBlock) return\n\n if (!seen.has(pos)) {\n seen.add(pos)\n blocks.push(node)\n }\n\n return false\n })\n\n return blocks\n}\n","import { forwardRef, Fragment, useMemo } from \"react\"\n\n// --- Tiptap UI Primitive ---\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../tooltip\"\n\n// --- Lib ---\nimport { cn, parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\nimport \"./button-colors.less\"\nimport \"./button-group.less\"\nimport \"./button.less\"\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n className?: string\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({\n shortcuts,\n}) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n children,\n tooltip,\n showTooltip = true,\n shortcutKeys,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const shortcuts = useMemo<string[]>(\n () => parseShortcutKeys({ shortcutKeys }),\n [shortcutKeys]\n )\n\n if (!tooltip || !showTooltip) {\n return (\n <button\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </TooltipTrigger>\n <TooltipContent>\n {tooltip}\n <ShortcutDisplay shortcuts={shortcuts} />\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport const ButtonGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, children, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-button-group\", className)}\n data-orientation={orientation}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n )\n})\nButtonGroup.displayName = \"ButtonGroup\"\n\nexport default Button\n","\"use client\"\n\nexport type SpacerOrientation = \"horizontal\" | \"vertical\"\n\nexport interface SpacerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: SpacerOrientation\n size?: string | number\n}\n\nexport function Spacer({\n orientation = \"horizontal\",\n size,\n style = {},\n ...props\n}: SpacerProps) {\n const computedStyle = {\n ...style,\n ...(orientation === \"horizontal\" && !size && { flex: 1 }),\n ...(size && {\n width: orientation === \"vertical\" ? \"1px\" : size,\n height: orientation === \"horizontal\" ? \"1px\" : size,\n }),\n }\n\n return <div {...props} style={computedStyle} />\n}\n","import { forwardRef } from \"react\"\nimport \"./separator.less\"\nimport { cn } from \"../../../lib/tiptap-utils\"\n\nexport type Orientation = \"horizontal\" | \"vertical\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation\n decorative?: boolean\n}\n\nexport const Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ decorative, orientation = \"vertical\", className, ...divProps }, ref) => {\n const ariaOrientation = orientation === \"vertical\" ? orientation : undefined\n const semanticProps = decorative\n ? { role: \"none\" }\n : { \"aria-orientation\": ariaOrientation, role: \"separator\" }\n\n return (\n <div\n className={cn(\"tiptap-separator\", className)}\n data-orientation={orientation}\n {...semanticProps}\n {...divProps}\n ref={ref}\n />\n )\n }\n)\n\nSeparator.displayName = \"Separator\"\n","import type { Editor } from '@tiptap/react'\nimport { useEffect, useState } from 'react'\n\ntype Orientation = 'horizontal' | 'vertical' | 'both'\n\ninterface MenuNavigationOptions<T> {\n /**\n * The Tiptap editor instance, if using with a Tiptap editor.\n */\n editor?: Editor | null\n /**\n * Reference to the container element for handling keyboard events.\n */\n containerRef?: React.RefObject<HTMLElement | null>\n /**\n * Search query that affects the selected item.\n */\n query?: string\n /**\n * Array of items to navigate through.\n */\n items: T[]\n /**\n * Callback fired when an item is selected.\n */\n onSelect?: (item: T) => void\n /**\n * Callback fired when the menu should close.\n */\n onClose?: () => void\n /**\n * The navigation orientation of the menu.\n * @default \"vertical\"\n */\n orientation?: Orientation\n /**\n * Whether to automatically select the first item when the menu opens.\n * @default true\n */\n autoSelectFirstItem?: boolean\n}\n\n/**\n * Hook that implements keyboard navigation for dropdown menus and command palettes.\n *\n * Handles arrow keys, tab, home/end, enter for selection, and escape to close.\n * Works with both Tiptap editors and regular DOM elements.\n *\n * @param options - Configuration options for the menu navigation\n * @returns Object containing the selected index and a setter function\n */\nexport function useMenuNavigation<T>({\n editor,\n containerRef,\n query,\n items,\n onSelect,\n onClose,\n orientation = 'vertical',\n autoSelectFirstItem = true\n}: MenuNavigationOptions<T>) {\n const [selectedIndex, setSelectedIndex] = useState<number>(autoSelectFirstItem ? 0 : -1)\n\n useEffect(() => {\n const handleKeyboardNavigation = (event: KeyboardEvent) => {\n if (!items.length) return false\n\n const moveNext = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return 0\n return (currentIndex + 1) % items.length\n })\n\n const movePrev = () =>\n setSelectedIndex((currentIndex) => {\n if (currentIndex === -1) return items.length - 1\n return (currentIndex - 1 + items.length) % items.length\n })\n\n switch (event.key) {\n case 'ArrowUp': {\n if (orientation === 'horizontal') return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case 'ArrowDown': {\n if (orientation === 'horizontal') return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case 'ArrowLeft': {\n if (orientation === 'vertical') return false\n event.preventDefault()\n movePrev()\n return true\n }\n\n case 'ArrowRight': {\n if (orientation === 'vertical') return false\n event.preventDefault()\n moveNext()\n return true\n }\n\n case 'Tab': {\n event.preventDefault()\n if (event.shiftKey) {\n movePrev()\n } else {\n moveNext()\n }\n return true\n }\n\n case 'Home': {\n event.preventDefault()\n setSelectedIndex(0)\n return true\n }\n\n case 'End': {\n event.preventDefault()\n setSelectedIndex(items.length - 1)\n return true\n }\n\n case 'Enter': {\n if (event.isComposing) return false\n event.preventDefault()\n if (selectedIndex !== -1 && items[selectedIndex]) {\n onSelect?.(items[selectedIndex])\n }\n return true\n }\n\n case 'Escape': {\n event.preventDefault()\n onClose?.()\n return true\n }\n\n default:\n return false\n }\n }\n\n let targetElement: HTMLElement | null = null\n\n if (editor) {\n targetElement = editor.view.dom\n } else if (containerRef?.current) {\n targetElement = containerRef.current\n }\n\n if (targetElement) {\n targetElement.addEventListener('keydown', handleKeyboardNavigation, true)\n\n return () => {\n targetElement?.removeEventListener('keydown', handleKeyboardNavigation, true)\n }\n }\n\n return undefined\n }, [editor, containerRef, items, selectedIndex, onSelect, onClose, orientation])\n\n useEffect(() => {\n if (query) {\n setSelectedIndex(autoSelectFirstItem ? 0 : -1)\n }\n }, [query, autoSelectFirstItem])\n\n return {\n selectedIndex: items.length ? selectedIndex : undefined,\n setSelectedIndex\n }\n}\n","'use client'\n\nimport { useCallback, useRef } from 'react'\n\n// basically Exclude<React.ClassAttributes<T>[\"ref\"], string>\ntype UserRef<T> = ((instance: T | null) => void) | React.RefObject<T | null> | null | undefined\n\nconst updateRef = <T>(ref: NonNullable<UserRef<T>>, value: T | null) => {\n if (typeof ref === 'function') {\n ref(value)\n } else if (ref && typeof ref === 'object' && 'current' in ref) {\n // Safe assignment without MutableRefObject\n ;(ref as { current: T | null }).current = value\n }\n}\n\nexport const useComposedRef = <T extends HTMLElement>(libRef: React.RefObject<T | null>, userRef: UserRef<T>) => {\n const prevUserRef = useRef<UserRef<T>>(null)\n\n return useCallback(\n (instance: T | null) => {\n if (libRef && 'current' in libRef) {\n ;(libRef as { current: T | null }).current = instance\n }\n\n if (prevUserRef.current) {\n updateRef(prevUserRef.current, null)\n }\n\n prevUserRef.current = userRef\n\n if (userRef) {\n updateRef(userRef, instance)\n }\n },\n [libRef, userRef]\n )\n}\n\nexport default useComposedRef\n","import { forwardRef, useCallback, useEffect, useRef, useState } from \"react\"\nimport { Separator } from \"../separator\"\nimport \"./toolbar.less\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation\"\nimport { useComposedRef } from \"../../../hooks/use-composed-ref\"\n\ntype BaseProps = React.HTMLAttributes<HTMLDivElement>\n\ninterface ToolbarProps extends BaseProps {\n variant?: \"floating\" | \"fixed\"\n}\n\nconst useToolbarNavigation = (\n toolbarRef: React.RefObject<HTMLDivElement | null>\n) => {\n const [items, setItems] = useState<HTMLElement[]>([])\n\n const collectItems = useCallback(() => {\n if (!toolbarRef.current) return []\n return Array.from(\n toolbarRef.current.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [role=\"button\"]:not([disabled]), [tabindex=\"0\"]:not([disabled])'\n )\n )\n }, [toolbarRef])\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const updateItems = () => setItems(collectItems())\n\n updateItems()\n const observer = new MutationObserver(updateItems)\n observer.observe(toolbar, { childList: true, subtree: true })\n\n return () => observer.disconnect()\n }, [collectItems, toolbarRef])\n\n const { selectedIndex } = useMenuNavigation<HTMLElement>({\n containerRef: toolbarRef,\n items,\n orientation: \"horizontal\",\n onSelect: (el) => el.click(),\n autoSelectFirstItem: false,\n })\n\n useEffect(() => {\n const toolbar = toolbarRef.current\n if (!toolbar) return\n\n const handleFocus = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target))\n target.setAttribute(\"data-focus-visible\", \"true\")\n }\n\n const handleBlur = (e: FocusEvent) => {\n const target = e.target as HTMLElement\n if (toolbar.contains(target)) target.removeAttribute(\"data-focus-visible\")\n }\n\n toolbar.addEventListener(\"focus\", handleFocus, true)\n toolbar.addEventListener(\"blur\", handleBlur, true)\n\n return () => {\n toolbar.removeEventListener(\"focus\", handleFocus, true)\n toolbar.removeEventListener(\"blur\", handleBlur, true)\n }\n }, [toolbarRef])\n\n useEffect(() => {\n if (selectedIndex !== undefined && items[selectedIndex]) {\n items[selectedIndex].focus()\n }\n }, [selectedIndex, items])\n}\n\nexport const Toolbar = forwardRef<HTMLDivElement, ToolbarProps>(\n ({ children, className, variant = \"fixed\", ...props }, ref) => {\n const toolbarRef = useRef<HTMLDivElement>(null)\n const composedRef = useComposedRef(toolbarRef, ref)\n useToolbarNavigation(toolbarRef)\n\n return (\n <div\n ref={composedRef}\n role=\"toolbar\"\n aria-label=\"toolbar\"\n data-variant={variant}\n className={cn(\"tiptap-toolbar\", className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\nToolbar.displayName = \"Toolbar\"\n\nexport const ToolbarGroup = forwardRef<HTMLDivElement, BaseProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\"tiptap-toolbar-group\", className)}\n {...props}\n >\n {children}\n </div>\n )\n)\nToolbarGroup.displayName = \"ToolbarGroup\"\n\nexport const ToolbarSeparator = forwardRef<HTMLDivElement, BaseProps>(\n ({ ...props }, ref) => (\n <Separator ref={ref} orientation=\"vertical\" decorative {...props} />\n )\n)\nToolbarSeparator.displayName = \"ToolbarSeparator\"\n","import { mergeAttributes } from \"@tiptap/react\"\nimport TiptapHorizontalRule from \"@tiptap/extension-horizontal-rule\"\n\nexport const HorizontalRule = TiptapHorizontalRule.extend({\n renderHTML() {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, { \"data-type\": this.name }),\n [\"hr\"],\n ]\n },\n})\n\nexport default HorizontalRule\n","export const PAGE_NO_TAG = 'page-no'\nexport const PAGE_NO_KEY = 'PageNo'\n","import { mergeAttributes, Node } from '@tiptap/core'\nimport { PAGE_NO_KEY, PAGE_NO_TAG } from './constant'\n\nexport default Node.create({\n name: PAGE_NO_KEY, // 节点名称\n\n group: 'block', // 可以作为块级元素\n // content: 'block+', // 能嵌套多个块级内容(如 heading, paragraph 等)\n\n // defining: true, // 使其在文档结构中稳定,避免被合并\n\n // 自定义渲染HTML\n renderHTML({ node, HTMLAttributes }) {\n // 获取动态的 pageIndex 属性\n const index = node.attrs[PAGE_NO_TAG] || '1' // 如果没有传值,则默认值为 1\n\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n class: PAGE_NO_TAG, // 添加类名\n [PAGE_NO_TAG]: index // 设置动态的 page-no 属性\n })\n // 0\n ]\n },\n\n // 自定义节点的可视化表现\n addAttributes() {\n return {\n [PAGE_NO_TAG]: {\n default: null, // 默认没有值,允许动态传递\n renderHTML: (attributes) => {\n return {\n [PAGE_NO_TAG]: attributes[PAGE_NO_TAG]\n }\n }\n }\n }\n },\n\n // 用于从节点中提取文本内容\n parseHTML() {\n return [\n {\n tag: `div.${PAGE_NO_TAG}`, // 匹配 `.page-no` 类的 div\n getAttrs: (node) => {\n const index = node.getAttribute(PAGE_NO_TAG)\n return { [PAGE_NO_TAG]: index } // 获取 page-no 属性并传递给节点\n }\n }\n ]\n },\n // **🚀 添加 Markdown 渲染规则**\n renderMarkdown: (node) => {\n const index = node.attrs?.[PAGE_NO_TAG] || '1' // 如果没有传值,则默认值为 1\n return `<div ${PAGE_NO_TAG}=\"${index}\" class=\"${PAGE_NO_TAG}\"></div>`\n }\n})\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { PAGE_NO_KEY, PAGE_NO_TAG } from './constant'\n\nexport interface PageNoPluginOptions {\n onPageChange?: (pageNo: number) => void\n containerSelector?: string\n}\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n pageNo: {\n getPageNo: () => any\n }\n }\n}\nexport const pageNoPluginKey = new PluginKey('pageNoPlugin')\n\nexport const PageNoExtension = Extension.create<PageNoPluginOptions>({\n name: 'pageNoPlugin',\n\n addOptions() {\n return {\n onPageChange: () => {},\n containerSelector: ''\n }\n },\n addCommands() {\n return {\n getPageNo:\n () =>\n ({ state }) => {\n const pluginState = pageNoPluginKey.getState(state)\n return pluginState?.currentPageNo\n }\n }\n },\n\n addProseMirrorPlugins() {\n const { onPageChange, containerSelector } = this.options\n return [\n new Plugin({\n key: pageNoPluginKey,\n state: {\n init: () => ({\n currentPageNo: ''\n }),\n apply(tr, prev) {\n const meta = tr.getMeta(pageNoPluginKey)\n // console.log('meta', meta?.currentPageNo)\n if (meta?.currentPageNo) {\n return {\n ...prev,\n currentPageNo: meta.currentPageNo\n }\n }\n return prev\n }\n },\n view(view) {\n const updatePageNo = (pageNo: string) => {\n const state = pageNoPluginKey.getState(view.state)\n if (state?.currentPageNo === pageNo) return\n\n const tr = view.state.tr.setMeta(pageNoPluginKey, {\n currentPageNo: pageNo\n })\n view.dispatch(tr)\n\n onPageChange?.(parseInt(pageNo))\n }\n // const findPageNoFromSelection = () => {\n // const { from } = view.state.selection\n // const domAtPos = view.domAtPos(from)\n // const domNode = domAtPos.node as HTMLElement\n\n // const contentRoot = view.dom\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_TAG)) {\n // pageNo = el.getAttribute(PAGE_NO_TAG)\n // break\n // }\n // el = (el.previousElementSibling as HTMLElement) || el.parentElement\n // }\n\n // if (!pageNo && domNode) {\n // const allPageNoEls = Array.from(contentRoot.querySelectorAll(`.${PAGE_NO_TAG}`)) 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_TAG)\n // break\n // }\n // }\n // }\n\n // if (pageNo) {\n // updatePageNo?.(pageNo)\n // }\n // }\n const findPageNoFromSelection = () => {\n const { state } = view\n const { from } = state.selection\n let pageNo: string | null = null\n state.doc.nodesBetween(0, from, (node) => {\n if (node.type.name === PAGE_NO_KEY) {\n pageNo = node.attrs[PAGE_NO_TAG]\n }\n })\n if (pageNo) {\n updatePageNo(pageNo)\n }\n }\n\n const findPageNoFromScroll = () => {\n const container = document.querySelector(containerSelector)\n if (!container) return\n\n const pageNos = Array.from(container.querySelectorAll(`.${PAGE_NO_TAG}`)) 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\n pageNos.forEach((node) => {\n const rect = node.getBoundingClientRect()\n const top = rect.top - containerTop\n\n if (Math.abs(top) <= 80) {\n closestNode = node\n closestTopDiff = 0\n } else if (top < 0 && top > closestTopDiff) {\n closestNode = node\n closestTopDiff = top\n }\n })\n\n if (closestNode) {\n const pageNo = closestNode.getAttribute(PAGE_NO_TAG)\n if (pageNo) {\n updatePageNo(pageNo)\n }\n }\n }\n\n const container = document.querySelector(containerSelector)\n if (!container) return\n view.dom.addEventListener('click', findPageNoFromSelection)\n container.addEventListener('scroll', findPageNoFromScroll)\n\n return {\n destroy() {\n const container = document.querySelector(containerSelector)\n if (!container) return\n view.dom.removeEventListener('click', findPageNoFromSelection)\n container.removeEventListener('scroll', findPageNoFromScroll)\n }\n }\n }\n })\n ]\n }\n})\n","import type { Editor } from '@tiptap/react'\nimport { useCurrentEditor, useEditorState } from '@tiptap/react'\nimport { useMemo } from 'react'\n\n/**\n * Hook that provides access to a Tiptap editor instance.\n *\n * Accepts an optional editor instance directly, or falls back to retrieving\n * the editor from the Tiptap context if available. This allows components\n * to work both when given an editor directly and when used within a Tiptap\n * editor context.\n *\n * @param providedEditor - Optional editor instance to use instead of the context editor\n * @returns The provided editor or the editor from context, whichever is available\n */\nexport function useTiptapEditor(providedEditor?: Editor | null): {\n editor: Editor | null\n editorState?: Editor['state']\n canCommand?: Editor['can']\n} {\n const { editor: coreEditor } = useCurrentEditor()\n const mainEditor = useMemo(() => providedEditor || coreEditor, [providedEditor, coreEditor])\n\n const editorState = useEditorState({\n editor: mainEditor,\n selector(context) {\n if (!context.editor) {\n return {\n editor: null,\n editorState: undefined,\n canCommand: undefined\n }\n }\n\n return {\n editor: context.editor,\n editorState: context.editor.state,\n canCommand: context.editor.can\n }\n }\n })\n\n return editorState || { editor: null }\n}\n","'use client'\n\nimport type { AutoUpdateOptions, UseDismissProps, UseFloatingOptions } from '@floating-ui/react'\nimport { autoUpdate, useDismiss, useFloating, useInteractions, useTransitionStyles } from '@floating-ui/react'\nimport { useEffect, useMemo } from 'react'\n\ninterface FloatingElementReturn {\n /**\n * Whether the floating element is currently mounted in the DOM.\n */\n isMounted: boolean\n /**\n * Ref function to attach to the floating element DOM node.\n */\n ref: (node: HTMLElement | null) => void\n /**\n * Combined styles for positioning, transitions, and z-index.\n */\n style: React.CSSProperties\n /**\n * Returns props that should be spread onto the floating element.\n */\n getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>\n /**\n * Returns props that should be spread onto the reference element.\n */\n getReferenceProps: (userProps?: React.HTMLProps<Element>) => Record<string, unknown>\n}\n\n/**\n * Custom hook for creating and managing floating elements relative to a reference position\n *\n * @param show - Boolean controlling visibility of the floating element\n * @param referencePos - DOMRect, function returning DOMRect, or null representing the position to anchor the floating element to\n * @param zIndex - Z-index value for the floating element\n * @param options - Additional options to pass to the underlying useFloating hook\n * @returns Object containing properties and methods to control the floating element\n */\nexport function useFloatingElement(\n show: boolean,\n reference: HTMLElement | DOMRect | (() => DOMRect | null) | null,\n zIndex: number,\n options?: Partial<UseFloatingOptions & { dismissOptions?: UseDismissProps }>,\n autoUpdateOptions?: AutoUpdateOptions\n): FloatingElementReturn {\n const { dismissOptions, ...floatingOptions } = options || {}\n\n const { refs, context, floatingStyles } = useFloating({\n open: show,\n whileElementsMounted(referenceEl, floatingEl, update) {\n const cleanup = autoUpdate(referenceEl, floatingEl, update, autoUpdateOptions)\n return cleanup\n },\n ...floatingOptions\n })\n\n const { isMounted, styles } = useTransitionStyles(context)\n\n const dismiss = useDismiss(context, dismissOptions)\n\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss])\n\n useEffect(() => {\n if (reference === null) {\n refs.setReference(null)\n return\n }\n\n // If reference is an actual DOM element, use it directly\n // autoUpdate will automatically observe it for scroll/resize\n if (reference instanceof HTMLElement) {\n refs.setReference(reference)\n\n return\n }\n\n const getBoundingClientRect = () => {\n const rect = typeof reference === 'function' ? reference() : reference\n return rect || new DOMRect()\n }\n\n refs.setReference({\n getBoundingClientRect\n })\n }, [reference, refs])\n\n return useMemo(\n () => ({\n isMounted,\n ref: refs.setFloating,\n style: {\n ...styles,\n ...floatingStyles,\n zIndex\n },\n getFloatingProps,\n getReferenceProps\n }),\n [floatingStyles, isMounted, refs.setFloating, styles, zIndex, getFloatingProps, getReferenceProps]\n )\n}\n","import { type Selection } from '@tiptap/pm/state'\nimport { CellSelection } from '@tiptap/pm/tables'\nimport type { Editor } from '@tiptap/react'\nimport { isNodeSelection, isTextSelection, posToDOMRect } from '@tiptap/react'\n\n/**\n * Checks if the current selection is valid for a given editor\n */\nexport const isSelectionValid = (\n editor: Editor | null,\n selection?: Selection,\n excludedNodeTypes: string[] = ['imageUpload', 'horizontalRule']\n): boolean => {\n if (!editor) return false\n if (!selection) selection = editor.state.selection\n\n const { state } = editor\n const { doc } = state\n const { empty, from, to } = selection\n\n const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(selection)\n const isCodeBlock = selection.$from.parent.type.spec.code || (isNodeSelection(selection) && selection.node.type.spec.code)\n const isExcludedNode = isNodeSelection(selection) && excludedNodeTypes.includes(selection.node.type.name)\n const isTableCell = selection instanceof CellSelection\n\n return !empty && !isEmptyTextBlock && !isCodeBlock && !isExcludedNode && !isTableCell\n}\n\n/**\n * Gets the bounding rect of the current selection in the editor.\n */\nexport const getSelectionBoundingRect = (editor: Editor): DOMRect | null => {\n const { state } = editor.view\n const { selection } = state\n const { ranges } = selection\n\n const from = Math.min(...ranges.map((range) => range.$from.pos))\n const to = Math.max(...ranges.map((range) => range.$to.pos))\n\n if (isNodeSelection(selection)) {\n const node = editor.view.nodeDOM(from) as HTMLElement\n if (node) {\n return node.getBoundingClientRect()\n }\n }\n\n return posToDOMRect(editor.view, from, to)\n}\n","import type { Editor } from \"@tiptap/react\"\n\nexport const isElementWithinEditor = (\n editor: Editor | null,\n element: Node | null\n) => {\n if (!element || !editor) {\n return false\n }\n\n const editorWrapper = editor.view.dom.parentElement\n const editorDom = editor.view.dom\n\n if (!editorWrapper) {\n return false\n }\n\n return (\n editorWrapper === element ||\n editorDom === element ||\n editorWrapper.contains(element)\n )\n}\n","import type { HTMLAttributes } from \"react\"\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport {\n flip,\n offset,\n shift,\n useMergeRefs,\n type UseFloatingOptions,\n} from \"@floating-ui/react\"\nimport { Selection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useFloatingElement } from \"../../../hooks/use-floating-element\"\n\n// --- Lib ---\nimport {\n getSelectionBoundingRect,\n isSelectionValid,\n} from \"../../../lib/tiptap-collab-utils\"\n\nimport { isElementWithinEditor } from \".\"\nimport { isValidPosition } from \"../../../lib/tiptap-utils\"\n\nexport interface FloatingElementProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The Tiptap editor instance to attach to.\n */\n editor?: Editor | null\n /**\n * Controls whether the floating element should be visible.\n * @default undefined\n */\n shouldShow?: boolean\n /**\n * Additional options to pass to the floating UI.\n */\n floatingOptions?: Partial<UseFloatingOptions>\n /**\n * Z-index for the floating element.\n * @default 50\n */\n zIndex?: number\n /**\n * Callback fired when the visibility state changes.\n */\n onOpenChange?: (open: boolean) => void\n /**\n * Reference element to position the floating element relative to.\n * If provided, this takes precedence over getBoundingClientRect.\n */\n referenceElement?: HTMLElement | null\n /**\n * Custom function to determine the position of the floating element.\n * Only used if referenceElement is not provided.\n * @default getSelectionBoundingRect\n */\n getBoundingClientRect?: (editor: Editor) => DOMRect | null\n /**\n * Whether to close the floating element when Escape key is pressed.\n * @default true\n */\n closeOnEscape?: boolean\n /**\n * Whether to reset the text selection when the floating element is closed or clicked outside the editor.\n * @default true\n */\n resetTextSelectionOnClose?: boolean\n}\n\n/**\n * A floating UI element that positions itself relative to the current selection in a Tiptap editor.\n * Used for floating toolbars, menus, and other UI elements that need to appear near the text cursor.\n */\nexport const FloatingElement = forwardRef<HTMLDivElement, FloatingElementProps>(\n (\n {\n editor: providedEditor,\n shouldShow = undefined,\n floatingOptions,\n zIndex = 50,\n onOpenChange,\n referenceElement,\n getBoundingClientRect = getSelectionBoundingRect,\n closeOnEscape = true,\n resetTextSelectionOnClose = true,\n children,\n style: propStyle,\n ...props\n },\n forwardedRef\n ) => {\n const [open, setOpen] = useState<boolean>(\n shouldShow !== undefined ? shouldShow : false\n )\n\n const floatingElementRef = useRef<HTMLDivElement | null>(null)\n const preventHideRef = useRef(false)\n const preventShowRef = useRef(false)\n const editorRef = useRef<Editor | null>(null)\n const getBoundingClientRectRef = useRef(getBoundingClientRect)\n\n const { editor } = useTiptapEditor(providedEditor)\n\n // Keep refs up to date\n useEffect(() => {\n editorRef.current = editor\n getBoundingClientRectRef.current = getBoundingClientRect\n }, [editor, getBoundingClientRect])\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n onOpenChange?.(newOpen)\n setOpen(newOpen)\n },\n [onOpenChange]\n )\n\n const handleFloatingOpenChange = (open: boolean) => {\n if (!open && editor && resetTextSelectionOnClose) {\n // When the floating element closes, reset the selection.\n // This lets the user place the cursor again and ensures the drag handle reappears,\n // as it's intentionally hidden during valid text selections.\n const tr = editor.state.tr.setSelection(\n Selection.near(editor.state.doc.resolve(0))\n )\n editor.view.dispatch(tr)\n }\n\n handleOpenChange(open)\n }\n\n // Use referenceElement if provided, otherwise create dynamic rect function\n const reference = useMemo(() => {\n if (referenceElement) {\n return referenceElement\n }\n\n return () => {\n if (!editorRef.current) return null\n return getBoundingClientRectRef.current(editorRef.current)\n }\n }, [referenceElement])\n\n const { isMounted, ref, style, getFloatingProps } = useFloatingElement(\n open,\n reference,\n zIndex,\n {\n placement: \"top\",\n middleware: [shift(), flip(), offset(4)],\n onOpenChange: handleFloatingOpenChange,\n dismissOptions: {\n enabled: true,\n escapeKey: true,\n outsidePress(event) {\n const relatedTarget = event.target as Node\n if (!relatedTarget) return false\n\n return !isElementWithinEditor(editor, relatedTarget)\n },\n },\n ...floatingOptions,\n }\n )\n\n const updateSelectionState = useCallback(() => {\n if (!editor) return\n\n const newRect = getBoundingClientRect(editor)\n\n if (newRect && shouldShow !== undefined && !preventShowRef.current) {\n handleOpenChange(shouldShow)\n return\n }\n\n const shouldShowResult = isSelectionValid(editor)\n\n if (\n newRect &&\n !preventShowRef.current &&\n (shouldShowResult || preventHideRef.current)\n ) {\n handleOpenChange(true)\n } else if (\n !preventHideRef.current &&\n (!shouldShowResult || preventShowRef.current || !editor.isEditable)\n ) {\n handleOpenChange(false)\n }\n }, [editor, getBoundingClientRect, handleOpenChange, shouldShow])\n\n useEffect(() => {\n if (!editor || !closeOnEscape) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n handleOpenChange(false)\n return true\n }\n return false\n }\n\n editor.view.dom.addEventListener(\"keydown\", handleKeyDown)\n return () => {\n editor.view.dom.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [editor, open, closeOnEscape, handleOpenChange])\n\n useEffect(() => {\n if (!editor) return\n\n const handleBlur = (event: FocusEvent) => {\n if (preventHideRef.current) {\n preventHideRef.current = false\n return\n }\n\n const relatedTarget = event.relatedTarget as Node\n if (!relatedTarget) return\n\n const isWithinEditor = isElementWithinEditor(editor, relatedTarget)\n\n const floatingElement = floatingElementRef.current\n const isWithinFloatingElement =\n floatingElement &&\n (floatingElement === relatedTarget ||\n floatingElement.contains(relatedTarget))\n\n if (!isWithinEditor && !isWithinFloatingElement && open) {\n handleOpenChange(false)\n }\n }\n\n editor.view.dom.addEventListener(\"blur\", handleBlur)\n return () => {\n editor.view.dom.removeEventListener(\"blur\", handleBlur)\n }\n }, [editor, handleOpenChange, open])\n\n useEffect(() => {\n if (!editor) return\n\n const handleDrag = () => {\n if (open) {\n handleOpenChange(false)\n }\n }\n\n editor.view.dom.addEventListener(\"dragstart\", handleDrag)\n editor.view.dom.addEventListener(\"dragover\", handleDrag)\n\n return () => {\n editor.view.dom.removeEventListener(\"dragstart\", handleDrag)\n editor.view.dom.removeEventListener(\"dragover\", handleDrag)\n }\n }, [editor, open, handleOpenChange])\n\n useEffect(() => {\n if (!editor) return\n\n const handleMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) return\n\n preventShowRef.current = true\n\n const { state, view } = editor\n const posCoords = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n\n if (!posCoords || !isValidPosition(posCoords.pos)) return\n\n const $pos = state.doc.resolve(posCoords.pos)\n const nodeBefore = $pos.nodeBefore\n\n if (!nodeBefore || nodeBefore.isBlock) return\n\n const tr = state.tr.setSelection(\n Selection.near(state.doc.resolve(posCoords.pos))\n )\n view.dispatch(tr)\n }\n\n const handleMouseUp = () => {\n if (preventShowRef.current) {\n preventShowRef.current = false\n updateSelectionState()\n }\n }\n\n editor.view.dom.addEventListener(\"mousedown\", handleMouseDown)\n editor.view.root.addEventListener(\"mouseup\", handleMouseUp)\n\n return () => {\n editor.view.dom.removeEventListener(\"mousedown\", handleMouseDown)\n editor.view.root.removeEventListener(\"mouseup\", handleMouseUp)\n }\n }, [editor, updateSelectionState])\n\n useEffect(() => {\n if (!editor) return\n\n editor.on(\"selectionUpdate\", updateSelectionState)\n\n return () => {\n editor.off(\"selectionUpdate\", updateSelectionState)\n }\n }, [editor, updateSelectionState])\n\n useEffect(() => {\n if (!editor) return\n updateSelectionState()\n }, [editor, updateSelectionState])\n\n const finalStyle = useMemo(\n () =>\n propStyle && Object.keys(propStyle).length > 0 ? propStyle : style,\n [propStyle, style]\n )\n const mergedRef = useMergeRefs([ref, forwardedRef, floatingElementRef])\n\n if (!editor || !isMounted || !open) return null\n\n return (\n <div\n ref={mergedRef}\n style={finalStyle}\n {...props}\n {...getFloatingProps()}\n >\n {children}\n </div>\n )\n }\n)\n\nFloatingElement.displayName = \"FloatingElement\"\n","import { forwardRef } from \"react\"\nimport \"./badge-colors.less\"\nimport \"./badge-group.less\"\nimport \"./badge.less\"\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"ghost\" | \"white\" | \"gray\" | \"green\" | \"default\"\n size?: \"default\" | \"small\"\n appearance?: \"default\" | \"subdued\" | \"emphasized\"\n trimText?: boolean\n}\n\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n (\n {\n variant,\n size = \"default\",\n appearance = \"default\",\n trimText = false,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={`tiptap-badge ${className || \"\"}`}\n data-style={variant}\n data-size={size}\n data-appearance={appearance}\n data-text-trim={trimText ? \"on\" : \"off\"}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nBadge.displayName = \"Badge\"\n\nexport default Badge\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Tiptap UI ---\nimport type { UseBlockquoteConfig } from \".\"\nimport {\n BLOCKQUOTE_SHORTCUT_KEY,\n useBlockquote,\n} from \".\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface BlockquoteButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseBlockquoteConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function BlockquoteShortcutBadge({\n shortcutKeys = BLOCKQUOTE_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling blockquote in a Tiptap editor.\n *\n * For custom button implementations, use the `useBlockquote` hook instead.\n */\nexport const BlockquoteButton = forwardRef<\n HTMLButtonElement,\n BlockquoteButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useBlockquote({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"引用块\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <BlockquoteShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nBlockquoteButton.displayName = \"BlockquoteButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BlockquoteIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 6C8 5.44772 8.44772 5 9 5H16C16.5523 5 17 5.44772 17 6C17 6.55228 16.5523 7 16 7H9C8.44772 7 8 6.55228 8 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 3C4.55228 3 5 3.44772 5 4L5 20C5 20.5523 4.55229 21 4 21C3.44772 21 3 20.5523 3 20L3 4C3 3.44772 3.44772 3 4 3Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H20C20.5523 11 21 11.4477 21 12C21 12.5523 20.5523 13 20 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 18C8 17.4477 8.44772 17 9 17H16C16.5523 17 17 17.4477 17 18C17 18.5523 16.5523 19 16 19H9C8.44772 19 8 18.5523 8 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBlockquoteIcon.displayName = \"BlockquoteIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BlockquoteIcon } from \"../../tiptap-icons/blockquote-icon\"\n\n// --- UI Utils ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\nexport const BLOCKQUOTE_SHORTCUT_KEY = \"mod+shift+b\"\n\n/**\n * Configuration for the blockquote functionality\n */\nexport interface UseBlockquoteConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when blockquote is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if blockquote can be toggled in the current editor state\n */\nexport function canToggleBlockquote(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"blockquote\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleWrap(\"blockquote\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can wrap in blockquote directly on the selection,\n // or we can clear formatting/nodes to arrive at a blockquote.\n return editor.can().toggleWrap(\"blockquote\") || editor.can().clearNodes()\n}\n\n/**\n * Toggles blockquote formatting for a specific node or the current selection\n */\nexport function toggleBlockquote(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleBlockquote(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"blockquote\")\n ? chain.lift(\"blockquote\")\n : chain.wrapIn(\"blockquote\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the blockquote button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"blockquote\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleBlockquote(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides blockquote functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleBlockquoteButton() {\n * const { isVisible, handleToggle, isActive } = useBlockquote()\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Blockquote</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedBlockquoteButton() {\n * const { isVisible, handleToggle, label, isActive } = useBlockquote({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Blockquote toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Blockquote\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useBlockquote(config?: UseBlockquoteConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleBlockquote(editor)\n const isActive = editor?.isActive(\"blockquote\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleBlockquote(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: \"引用块\",\n shortcutKeys: BLOCKQUOTE_SHORTCUT_KEY,\n Icon: BlockquoteIcon,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type { UseCodeBlockConfig } from \".\"\nimport {\n CODE_BLOCK_SHORTCUT_KEY,\n useCodeBlock,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface CodeBlockButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseCodeBlockConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function CodeBlockShortcutBadge({\n shortcutKeys = CODE_BLOCK_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling code block in a Tiptap editor.\n *\n * For custom button implementations, use the `useCodeBlock` hook instead.\n */\nexport const CodeBlockButton = forwardRef<\n HTMLButtonElement,\n CodeBlockButtonProps\n>(\n (\n {\n editor: providedEditor,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useCodeBlock({\n editor,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n disabled={!canToggle}\n data-disabled={!canToggle}\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip=\"代码块\"\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <CodeBlockShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nCodeBlockButton.displayName = \"CodeBlockButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CodeBlockIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.70711 2.29289C7.09763 2.68342 7.09763 3.31658 6.70711 3.70711L4.41421 6L6.70711 8.29289C7.09763 8.68342 7.09763 9.31658 6.70711 9.70711C6.31658 10.0976 5.68342 10.0976 5.29289 9.70711L2.29289 6.70711C1.90237 6.31658 1.90237 5.68342 2.29289 5.29289L5.29289 2.29289C5.68342 1.90237 6.31658 1.90237 6.70711 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.2929 2.29289C10.6834 1.90237 11.3166 1.90237 11.7071 2.29289L14.7071 5.29289C15.0976 5.68342 15.0976 6.31658 14.7071 6.70711L11.7071 9.70711C11.3166 10.0976 10.6834 10.0976 10.2929 9.70711C9.90237 9.31658 9.90237 8.68342 10.2929 8.29289L12.5858 6L10.2929 3.70711C9.90237 3.31658 9.90237 2.68342 10.2929 2.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17 4C17 3.44772 17.4477 3 18 3H19C20.6569 3 22 4.34315 22 6V18C22 19.6569 20.6569 21 19 21H5C3.34315 21 2 19.6569 2 18V12C2 11.4477 2.44772 11 3 11C3.55228 11 4 11.4477 4 12V18C4 18.5523 4.44772 19 5 19H19C19.5523 19 20 18.5523 20 18V6C20 5.44772 19.5523 5 19 5H18C17.4477 5 17 4.55228 17 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCodeBlockIcon.displayName = \"CodeBlockIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { CodeBlockIcon } from \"../../tiptap-icons/code-block-icon\"\n\nexport const CODE_BLOCK_SHORTCUT_KEY = \"mod+alt+c\"\n\n/**\n * Configuration for the code block functionality\n */\nexport interface UseCodeBlockConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether the button should hide when code block is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful code block toggle.\n */\n onToggled?: () => void\n}\n\n/**\n * Checks if code block can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"codeBlock\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return editor.can().toggleNode(\"codeBlock\", \"paragraph\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can toggle code block directly on the selection,\n // or we can clear formatting/nodes to arrive at a code block.\n return (\n editor.can().toggleNode(\"codeBlock\", \"paragraph\") ||\n editor.can().clearNodes()\n )\n}\n\n/**\n * Toggles code block in the editor\n */\nexport function toggleCodeBlock(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggle(editor)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const toggle = editor.isActive(\"codeBlock\")\n ? chain.setNode(\"paragraph\")\n : chain.toggleNode(\"codeBlock\", \"paragraph\")\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the code block button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"codeBlock\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggle(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides code block functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage - no params needed\n * function MySimpleCodeBlockButton() {\n * const { isVisible, isActive, handleToggle } = useCodeBlock()\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * Code Block\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedCodeBlockButton() {\n * const { isVisible, isActive, handleToggle, label } = useCodeBlock({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Code block toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle Code Block\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useCodeBlock(config?: UseCodeBlockConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onToggled,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor)\n const isActive = editor?.isActive(\"codeBlock\") || false\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleCodeBlock(editor)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: \"代码块\",\n shortcutKeys: CODE_BLOCK_SHORTCUT_KEY,\n Icon: CodeBlockIcon,\n }\n}\n","import { useEffect, useState } from 'react'\n\ntype BreakpointMode = 'min' | 'max'\n\n/**\n * Hook to detect whether the current viewport matches a given breakpoint rule.\n * Example:\n * useIsBreakpoint(\"max\", 768) // true when width < 768\n * useIsBreakpoint(\"min\", 1024) // true when width >= 1024\n */\nexport function useIsBreakpoint(mode: BreakpointMode = 'max', breakpoint = 768) {\n const [matches, setMatches] = useState<boolean | undefined>(undefined)\n\n useEffect(() => {\n const query = mode === 'min' ? `(min-width: ${breakpoint}px)` : `(max-width: ${breakpoint - 1}px)`\n\n const mql = window.matchMedia(query)\n const onChange = (e: MediaQueryListEvent) => setMatches(e.matches)\n\n // Set initial value\n setMatches(mql.matches)\n\n // Add listener\n mql.addEventListener('change', onChange)\n return () => mql.removeEventListener('change', onChange)\n }, [mode, breakpoint])\n\n return !!matches\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BanIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4.43471 4.01458C4.34773 4.06032 4.26607 4.11977 4.19292 4.19292C4.11977 4.26607 4.06032 4.34773 4.01458 4.43471C2.14611 6.40628 1 9.0693 1 12C1 18.0751 5.92487 23 12 23C14.9306 23 17.5936 21.854 19.5651 19.9856C19.6522 19.9398 19.7339 19.8803 19.8071 19.8071C19.8803 19.7339 19.9398 19.6522 19.9856 19.5651C21.854 17.5936 23 14.9306 23 12C23 5.92487 18.0751 1 12 1C9.0693 1 6.40628 2.14611 4.43471 4.01458ZM6.38231 4.9681C7.92199 3.73647 9.87499 3 12 3C16.9706 3 21 7.02944 21 12C21 14.125 20.2635 16.078 19.0319 17.6177L6.38231 4.9681ZM17.6177 19.0319C16.078 20.2635 14.125 21 12 21C7.02944 21 3 16.9706 3 12C3 9.87499 3.73647 7.92199 4.9681 6.38231L17.6177 19.0319Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBanIcon.displayName = \"BanIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HighlighterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.7072 4.70711C15.0977 4.31658 15.0977 3.68342 14.7072 3.29289C14.3167 2.90237 13.6835 2.90237 13.293 3.29289L8.69294 7.89286L8.68594 7.9C8.13626 8.46079 7.82837 9.21474 7.82837 10C7.82837 10.2306 7.85491 10.4584 7.90631 10.6795L2.29289 16.2929C2.10536 16.4804 2 16.7348 2 17V20C2 20.5523 2.44772 21 3 21H12C12.2652 21 12.5196 20.8946 12.7071 20.7071L15.3205 18.0937C15.5416 18.1452 15.7695 18.1717 16.0001 18.1717C16.7853 18.1717 17.5393 17.8639 18.1001 17.3142L22.7072 12.7071C23.0977 12.3166 23.0977 11.6834 22.7072 11.2929C22.3167 10.9024 21.6835 10.9024 21.293 11.2929L16.6971 15.8887C16.5105 16.0702 16.2605 16.1717 16.0001 16.1717C15.7397 16.1717 15.4897 16.0702 15.303 15.8887L10.1113 10.697C9.92992 10.5104 9.82837 10.2604 9.82837 10C9.82837 9.73963 9.92992 9.48958 10.1113 9.30297L14.7072 4.70711ZM13.5858 17L9.00004 12.4142L4 17.4142V19H11.5858L13.5858 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHighlighterIcon.displayName = \"HighlighterIcon\"\n","import * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./popover.less\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align={align}\n sideOffset={sideOffset}\n className={cn(\"tiptap-popover\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","\"use client\"\n\nimport { forwardRef } from \"react\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./card.less\"\n\nconst Card = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return <div ref={ref} className={cn(\"tiptap-card\", className)} {...props} />\n }\n)\nCard.displayName = \"Card\"\n\nconst CardHeader = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-header\", className)}\n {...props}\n />\n )\n }\n)\nCardHeader.displayName = \"CardHeader\"\n\nconst CardBody = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"tiptap-card-body\", className)} {...props} />\n )\n }\n)\nCardBody.displayName = \"CardBody\"\n\nconst CardItemGroup = forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n orientation?: \"horizontal\" | \"vertical\"\n }\n>(({ className, orientation = \"vertical\", ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-orientation={orientation}\n className={cn(\"tiptap-card-item-group\", className)}\n {...props}\n />\n )\n})\nCardItemGroup.displayName = \"CardItemGroup\"\n\nconst CardGroupLabel = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-group-label\", className)}\n {...props}\n />\n )\n }\n)\nCardGroupLabel.displayName = \"CardGroupLabel\"\n\nconst CardFooter = forwardRef<HTMLDivElement, React.ComponentProps<\"div\">>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\"tiptap-card-footer\", className)}\n {...props}\n />\n )\n }\n)\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardBody, CardItemGroup, CardGroupLabel }\n","import { forwardRef, useCallback, useMemo } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { UseColorHighlightConfig } from \".\"\nimport {\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n useColorHighlight,\n} from \"../color-highlight-button\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\n// --- Styles ---\nimport \"./color-highlight-button.less\"\n\nexport interface ColorHighlightButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseColorHighlightConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ColorHighlightShortcutBadge({\n shortcutKeys = COLOR_HIGHLIGHT_SHORTCUT_KEY,\n}: {\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for applying color highlights in a Tiptap editor.\n *\n * Supports two highlighting modes:\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n *\n * For custom button implementations, use the `useColorHighlight` hook instead.\n *\n * @example\n * ```tsx\n * // Mark-based highlighting (default)\n * <ColorHighlightButton highlightColor=\"yellow\" />\n *\n * // Node-based background coloring\n * <ColorHighlightButton\n * highlightColor=\"var(--tt-color-highlight-blue)\"\n * mode=\"node\"\n * />\n *\n * // With custom callback\n * <ColorHighlightButton\n * highlightColor=\"red\"\n * mode=\"mark\"\n * onApplied={({ color, mode }) => console.log(`Applied ${color} in ${mode} mode`)}\n * />\n * ```\n */\nexport const ColorHighlightButton = forwardRef<\n HTMLButtonElement,\n ColorHighlightButtonProps\n>(\n (\n {\n editor: providedEditor,\n highlightColor,\n text,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n showShortcut = false,\n onClick,\n children,\n style,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canColorHighlight,\n isActive,\n handleColorHighlight,\n label,\n shortcutKeys,\n } = useColorHighlight({\n editor,\n highlightColor,\n label: text || `切换高亮显示 (${highlightColor})`,\n hideWhenUnavailable,\n mode,\n onApplied,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleColorHighlight()\n },\n [handleColorHighlight, onClick]\n )\n\n const buttonStyle = useMemo(\n () =>\n ({\n ...style,\n \"--highlight-color\": highlightColor,\n }) as React.CSSProperties,\n [highlightColor, style]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canColorHighlight}\n data-disabled={!canColorHighlight}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n style={buttonStyle}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <span\n className=\"tiptap-button-highlight\"\n style={\n { \"--highlight-color\": highlightColor } as React.CSSProperties\n }\n />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ColorHighlightShortcutBadge shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nColorHighlightButton.displayName = \"ColorHighlightButton\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { useHotkeys } from \"react-hotkeys-hook\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n isExtensionAvailable,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HighlighterIcon } from \"../../tiptap-icons/highlighter-icon\"\n\nexport const COLOR_HIGHLIGHT_SHORTCUT_KEY = \"mod+shift+h\"\nexport const HIGHLIGHT_COLORS = [\n {\n label: \"默认背景\",\n value: \"var(--tt-bg-color)\",\n border: \"var(--tt-bg-color-contrast)\",\n },\n {\n label: \"灰色背景\",\n value: \"var(--tt-color-highlight-gray)\",\n border: \"var(--tt-color-highlight-gray-contrast)\",\n },\n {\n label: \"棕色背景\",\n value: \"var(--tt-color-highlight-brown)\",\n border: \"var(--tt-color-highlight-brown-contrast)\",\n },\n {\n label: \"橙色背景\",\n value: \"var(--tt-color-highlight-orange)\",\n border: \"var(--tt-color-highlight-orange-contrast)\",\n },\n {\n label: \"黄色背景\",\n value: \"var(--tt-color-highlight-yellow)\",\n border: \"var(--tt-color-highlight-yellow-contrast)\",\n },\n {\n label: \"绿色背景\",\n value: \"var(--tt-color-highlight-green)\",\n border: \"var(--tt-color-highlight-green-contrast)\",\n },\n {\n label: \"蓝色背景\",\n value: \"var(--tt-color-highlight-blue)\",\n border: \"var(--tt-color-highlight-blue-contrast)\",\n },\n {\n label: \"紫色背景\",\n value: \"var(--tt-color-highlight-purple)\",\n border: \"var(--tt-color-highlight-purple-contrast)\",\n },\n {\n label: \"粉色背景\",\n value: \"var(--tt-color-highlight-pink)\",\n border: \"var(--tt-color-highlight-pink-contrast)\",\n },\n {\n label: \"红色背景\",\n value: \"var(--tt-color-highlight-red)\",\n border: \"var(--tt-color-highlight-red-contrast)\",\n },\n]\nexport type HighlightColor = (typeof HIGHLIGHT_COLORS)[number]\n\nexport type HighlightMode = \"mark\" | \"node\"\n\n/**\n * Configuration for the color highlight functionality\n */\nexport interface UseColorHighlightConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The color to apply when toggling the highlight.\n */\n highlightColor?: string\n /**\n * Optional label to display alongside the icon.\n */\n label?: string\n /**\n * Whether the button should hide when the mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * The highlighting mode to use.\n * - \"mark\": Uses the highlight mark extension (default)\n * - \"node\": Uses the node background extension\n * @default \"mark\"\n */\n mode?: HighlightMode\n /**\n * Called when the highlight is applied.\n */\n onApplied?: ({\n color,\n label,\n mode,\n }: {\n color: string\n label: string\n mode: HighlightMode\n }) => void\n}\n\nexport function pickHighlightColorsByValue(values: string[]) {\n const colorMap = new Map(\n HIGHLIGHT_COLORS.map((color) => [color.value, color])\n )\n return values\n .map((value) => colorMap.get(value))\n .filter((color): color is (typeof HIGHLIGHT_COLORS)[number] => !!color)\n}\n\n/**\n * Checks if highlight can be applied based on the mode and current editor state\n */\nexport function canColorHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (\n !isMarkInSchema(\"highlight\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n return editor.can().setMark(\"highlight\")\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n\n try {\n return editor.can().toggleNodeBackgroundColor(\"test\")\n } catch {\n return false\n }\n }\n}\n\n/**\n * Checks if highlight is currently active\n */\nexport function isColorHighlightActive(\n editor: Editor | null,\n highlightColor?: string,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n return highlightColor\n ? editor.isActive(\"highlight\", { color: highlightColor })\n : editor.isActive(\"highlight\")\n } else {\n if (!highlightColor) return false\n\n try {\n const { state } = editor\n const { selection } = state\n\n const $pos = selection.$anchor\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n if (node && node.attrs?.backgroundColor === highlightColor) {\n return true\n }\n }\n return false\n } catch {\n return false\n }\n }\n}\n\n/**\n * Removes highlight based on the mode\n */\nexport function removeHighlight(\n editor: Editor | null,\n mode: HighlightMode = \"mark\"\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canColorHighlight(editor, mode)) return false\n\n if (mode === \"mark\") {\n return editor.chain().focus().unsetMark(\"highlight\").run()\n } else {\n return editor.chain().focus().unsetNodeBackgroundColor().run()\n }\n}\n\n/**\n * Determines if the highlight button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n mode: HighlightMode\n}): boolean {\n const { editor, hideWhenUnavailable, mode } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (mode === \"mark\") {\n if (!isMarkInSchema(\"highlight\", editor)) return false\n } else {\n if (!isExtensionAvailable(editor, [\"nodeBackground\"])) return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canColorHighlight(editor, mode)\n }\n\n return true\n}\n\nexport function useColorHighlight(config: UseColorHighlightConfig) {\n const {\n editor: providedEditor,\n label,\n highlightColor,\n hideWhenUnavailable = false,\n mode = \"mark\",\n onApplied,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const isMobile = useIsBreakpoint()\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canColorHighlightState = canColorHighlight(editor, mode)\n const isActive = isColorHighlightActive(editor, highlightColor, mode)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, mode }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, mode])\n\n const handleColorHighlight = useCallback(() => {\n if (!editor || !canColorHighlightState || !highlightColor || !label)\n return false\n\n if (mode === \"mark\") {\n if (editor.state.storedMarks) {\n const highlightMarkType = editor.schema.marks.highlight\n if (highlightMarkType) {\n editor.view.dispatch(\n editor.state.tr.removeStoredMark(highlightMarkType)\n )\n }\n }\n\n setTimeout(() => {\n const success = editor\n .chain()\n .focus()\n .toggleMark(\"highlight\", { color: highlightColor })\n .run()\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }, 0)\n\n return true\n } else {\n const success = editor\n .chain()\n .focus()\n .toggleNodeBackgroundColor(highlightColor)\n .run()\n\n if (success) {\n onApplied?.({ color: highlightColor, label, mode })\n }\n return success\n }\n }, [canColorHighlightState, highlightColor, editor, label, onApplied, mode])\n\n const handleRemoveHighlight = useCallback(() => {\n const success = removeHighlight(editor, mode)\n if (success) {\n onApplied?.({ color: \"\", label: \"移除背景\", mode })\n }\n return success\n }, [editor, onApplied, mode])\n\n useHotkeys(\n COLOR_HIGHLIGHT_SHORTCUT_KEY,\n (event) => {\n event.preventDefault()\n handleColorHighlight()\n },\n {\n enabled: isVisible && canColorHighlightState,\n enableOnContentEditable: !isMobile,\n enableOnFormTags: true,\n }\n )\n\n return {\n isVisible,\n isActive,\n handleColorHighlight,\n handleRemoveHighlight,\n canColorHighlight: canColorHighlightState,\n label: label || `背景色`,\n shortcutKeys: COLOR_HIGHLIGHT_SHORTCUT_KEY,\n Icon: HighlighterIcon,\n mode,\n }\n}\n","import { forwardRef, useMemo, useRef, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useMenuNavigation } from \"../../../hooks/use-menu-navigation\"\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { BanIcon } from \"../../tiptap-icons/ban-icon\"\nimport { HighlighterIcon } from \"../../tiptap-icons/highlighter-icon\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../../tiptap-ui-primitive/popover\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\n\n// --- Tiptap UI ---\nimport type {\n HighlightColor,\n UseColorHighlightConfig,\n} from \"../color-highlight-button\"\nimport {\n ColorHighlightButton,\n pickHighlightColorsByValue,\n useColorHighlight,\n} from \"../color-highlight-button\"\n\nexport interface ColorHighlightPopoverContentProps {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n}\n\nexport interface ColorHighlightPopoverProps\n extends Omit<ButtonProps, \"type\">,\n Pick<\n UseColorHighlightConfig,\n \"editor\" | \"hideWhenUnavailable\" | \"onApplied\"\n > {\n /**\n * Optional colors to use in the highlight popover.\n * If not provided, defaults to a predefined set of colors.\n */\n colors?: HighlightColor[]\n}\n\nexport const ColorHighlightPopoverButton = forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, children, ...props }, ref) => (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n data-appearance=\"default\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"文本背景色\"\n tooltip=\"背景色\"\n ref={ref}\n {...props}\n >\n {children ?? <HighlighterIcon className=\"tiptap-button-icon\" />}\n </Button>\n))\n\nColorHighlightPopoverButton.displayName = \"ColorHighlightPopoverButton\"\n\nexport function ColorHighlightPopoverContent({\n editor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n}: ColorHighlightPopoverContentProps) {\n const { handleRemoveHighlight } = useColorHighlight({ editor })\n const isMobile = useIsBreakpoint()\n const containerRef = useRef<HTMLDivElement>(null)\n\n const menuItems = useMemo(\n () => [...colors, { label: \"移除高亮\", value: \"none\" }],\n [colors]\n )\n\n const { selectedIndex } = useMenuNavigation({\n containerRef,\n items: menuItems,\n orientation: \"both\",\n onSelect: (item) => {\n if (!containerRef.current) return false\n const highlightedElement = containerRef.current.querySelector(\n '[data-highlighted=\"true\"]'\n ) as HTMLElement\n if (highlightedElement) highlightedElement.click()\n if (item.value === \"none\") handleRemoveHighlight()\n return true\n },\n autoSelectFirstItem: false,\n })\n\n return (\n <Card\n ref={containerRef}\n tabIndex={0}\n style={isMobile ? { boxShadow: \"none\", border: 0 } : {}}\n >\n <CardBody style={isMobile ? { padding: 0 } : {}}>\n <CardItemGroup orientation=\"horizontal\">\n <ButtonGroup orientation=\"horizontal\">\n {colors.map((color, index) => (\n <ColorHighlightButton\n key={color.value}\n editor={editor}\n highlightColor={color.value}\n tooltip={color.label}\n aria-label={`${color.label} highlight color`}\n tabIndex={index === selectedIndex ? 0 : -1}\n data-highlighted={selectedIndex === index}\n />\n ))}\n </ButtonGroup>\n <Separator />\n <ButtonGroup orientation=\"horizontal\">\n <Button\n onClick={handleRemoveHighlight}\n aria-label=\"移除背景\"\n tooltip=\"移除背景\"\n tabIndex={selectedIndex === colors.length ? 0 : -1}\n type=\"button\"\n role=\"menuitem\"\n data-style=\"ghost\"\n data-highlighted={selectedIndex === colors.length}\n >\n <BanIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\nexport function ColorHighlightPopover({\n editor: providedEditor,\n colors = pickHighlightColorsByValue([\n \"var(--tt-color-highlight-green)\",\n \"var(--tt-color-highlight-blue)\",\n \"var(--tt-color-highlight-red)\",\n \"var(--tt-color-highlight-purple)\",\n \"var(--tt-color-highlight-yellow)\",\n ]),\n hideWhenUnavailable = false,\n onApplied,\n ...props\n}: ColorHighlightPopoverProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n const { isVisible, canColorHighlight, isActive, label, Icon } =\n useColorHighlight({\n editor,\n hideWhenUnavailable,\n onApplied,\n })\n\n if (!isVisible) return null\n\n return (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <ColorHighlightPopoverButton\n disabled={!canColorHighlight}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canColorHighlight}\n aria-pressed={isActive}\n aria-label={label}\n tooltip={label}\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n </ColorHighlightPopoverButton>\n </PopoverTrigger>\n <PopoverContent aria-label=\"背景色\">\n <ColorHighlightPopoverContent editor={editor} colors={colors} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default ColorHighlightPopover\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ChevronDownIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.29289 8.29289C5.68342 7.90237 6.31658 7.90237 6.70711 8.29289L12 13.5858L17.2929 8.29289C17.6834 7.90237 18.3166 7.90237 18.7071 8.29289C19.0976 8.68342 19.0976 9.31658 18.7071 9.70711L12.7071 15.7071C12.3166 16.0976 11.6834 16.0976 11.2929 15.7071L5.29289 9.70711C4.90237 9.31658 4.90237 8.68342 5.29289 8.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nChevronDownIcon.displayName = \"ChevronDownIcon\"\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Tiptap UI ---\nimport type {\n Level,\n UseHeadingConfig,\n} from \".\"\nimport {\n HEADING_SHORTCUT_KEYS,\n useHeading,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\nexport interface HeadingButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HeadingShortcutBadge({\n level,\n shortcutKeys = HEADING_SHORTCUT_KEYS[level],\n}: {\n level: Level\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling heading in a Tiptap editor.\n *\n * For custom button implementations, use the `useHeading` hook instead.\n */\nexport const HeadingButton = forwardRef<HTMLButtonElement, HeadingButtonProps>(\n (\n {\n editor: providedEditor,\n level,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n Icon,\n shortcutKeys,\n } = useHeading({\n editor,\n level,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HeadingShortcutBadge level={level} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nHeadingButton.displayName = \"HeadingButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingOneIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M21.0001 10C21.0001 9.63121 20.7971 9.29235 20.472 9.11833C20.1468 8.94431 19.7523 8.96338 19.4454 9.16795L16.4454 11.168C15.9859 11.4743 15.8617 12.0952 16.1681 12.5547C16.4744 13.0142 17.0953 13.1384 17.5548 12.8321L19.0001 11.8685V18C19.0001 18.5523 19.4478 19 20.0001 19C20.5524 19 21.0001 18.5523 21.0001 18V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingOneIcon.displayName = \"HeadingOneIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingTwoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22.0001 12C22.0001 10.7611 21.1663 9.79297 20.0663 9.42632C18.9547 9.05578 17.6171 9.28724 16.4001 10.2C15.9582 10.5314 15.8687 11.1582 16.2001 11.6C16.5314 12.0418 17.1582 12.1314 17.6001 11.8C18.383 11.2128 19.0455 11.1942 19.4338 11.3237C19.8339 11.457 20.0001 11.7389 20.0001 12C20.0001 12.4839 19.8554 12.7379 19.6537 12.9481C19.4275 13.1837 19.1378 13.363 18.7055 13.6307C18.6313 13.6767 18.553 13.7252 18.4701 13.777C17.9572 14.0975 17.3128 14.5261 16.8163 15.2087C16.3007 15.9177 16.0001 16.8183 16.0001 18C16.0001 18.5523 16.4478 19 17.0001 19H21.0001C21.5523 19 22.0001 18.5523 22.0001 18C22.0001 17.4477 21.5523 17 21.0001 17H18.131C18.21 16.742 18.3176 16.5448 18.4338 16.385C18.6873 16.0364 19.0429 15.7775 19.5301 15.473C19.5898 15.4357 19.6536 15.3966 19.7205 15.3556C20.139 15.0992 20.6783 14.7687 21.0964 14.3332C21.6447 13.7621 22.0001 13.0161 22.0001 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingTwoIcon.displayName = \"HeadingTwoIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingThreeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4608 11.2169C19.1135 11.0531 18.5876 11.0204 18.0069 11.3619C17.5309 11.642 16.918 11.4831 16.638 11.007C16.358 10.531 16.5169 9.91809 16.9929 9.63807C18.1123 8.97962 19.3364 8.94691 20.314 9.40808C21.2839 9.86558 21.9999 10.818 21.9999 12C21.9999 12.7957 21.6838 13.5587 21.1212 14.1213C20.5586 14.6839 19.7956 15 18.9999 15C18.4476 15 17.9999 14.5523 17.9999 14C17.9999 13.4477 18.4476 13 18.9999 13C19.2651 13 19.5195 12.8947 19.707 12.7071C19.8946 12.5196 19.9999 12.2652 19.9999 12C19.9999 11.6821 19.8159 11.3844 19.4608 11.2169Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M18.0001 14C18.0001 13.4477 18.4478 13 19.0001 13C19.7957 13 20.5588 13.3161 21.1214 13.8787C21.684 14.4413 22.0001 15.2043 22.0001 16C22.0001 17.2853 21.2767 18.3971 20.1604 18.8994C19.0257 19.41 17.642 19.2315 16.4001 18.3C15.9582 17.9686 15.8687 17.3418 16.2001 16.9C16.5314 16.4582 17.1582 16.3686 17.6001 16.7C18.3581 17.2685 18.9744 17.24 19.3397 17.0756C19.7234 16.9029 20.0001 16.5147 20.0001 16C20.0001 15.7348 19.8947 15.4804 19.7072 15.2929C19.5196 15.1054 19.2653 15 19.0001 15C18.4478 15 18.0001 14.5523 18.0001 14Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingThreeIcon.displayName = \"HeadingThreeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFourIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4 5C4.55228 5 5 5.44772 5 6V11H11V6C11 5.44772 11.4477 5 12 5C12.5523 5 13 5.44772 13 6V18C13 18.5523 12.5523 19 12 19C11.4477 19 11 18.5523 11 18V13H5V18C5 18.5523 4.55228 19 4 19C3.44772 19 3 18.5523 3 18V6C3 5.44772 3.44772 5 4 5Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 9C17.5523 9 18 9.44772 18 10V13H20V10C20 9.44772 20.4477 9 21 9C21.5523 9 22 9.44772 22 10V18C22 18.5523 21.5523 19 21 19C20.4477 19 20 18.5523 20 18V15H17C16.4477 15 16 14.5523 16 14V10C16 9.44772 16.4477 9 17 9Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFourIcon.displayName = \"HeadingFourIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingFiveIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M16 10C16 9.44772 16.4477 9 17 9H21C21.5523 9 22 9.44772 22 10C22 10.5523 21.5523 11 21 11H18V12H18.3C20.2754 12 22 13.4739 22 15.5C22 17.5261 20.2754 19 18.3 19C17.6457 19 17.0925 18.8643 16.5528 18.5944C16.0588 18.3474 15.8586 17.7468 16.1055 17.2528C16.3525 16.7588 16.9532 16.5586 17.4472 16.8056C17.7074 16.9357 17.9542 17 18.3 17C19.3246 17 20 16.2739 20 15.5C20 14.7261 19.3246 14 18.3 14H17C16.4477 14 16 13.5523 16 13L16 12.9928V10Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingFiveIcon.displayName = \"HeadingFiveIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingSixIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5 6C5 5.44772 4.55228 5 4 5C3.44772 5 3 5.44772 3 6V18C3 18.5523 3.44772 19 4 19C4.55228 19 5 18.5523 5 18V13H11V18C11 18.5523 11.4477 19 12 19C12.5523 19 13 18.5523 13 18V6C13 5.44772 12.5523 5 12 5C11.4477 5 11 5.44772 11 6V11H5V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20.7071 9.29289C21.0976 9.68342 21.0976 10.3166 20.7071 10.7071C19.8392 11.575 19.2179 12.2949 18.7889 13.0073C18.8587 13.0025 18.929 13 19 13C20.6569 13 22 14.3431 22 16C22 17.6569 20.6569 19 19 19C17.3431 19 16 17.6569 16 16C16 14.6007 16.2837 13.4368 16.8676 12.3419C17.4384 11.2717 18.2728 10.3129 19.2929 9.29289C19.6834 8.90237 20.3166 8.90237 20.7071 9.29289ZM19 17C18.4477 17 18 16.5523 18 16C18 15.4477 18.4477 15 19 15C19.5523 15 20 15.4477 20 16C20 16.5523 19.5523 17 19 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingSixIcon.displayName = \"HeadingSixIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { HeadingOneIcon } from \"../../tiptap-icons/heading-one-icon\"\nimport { HeadingTwoIcon } from \"../../tiptap-icons/heading-two-icon\"\nimport { HeadingThreeIcon } from \"../../tiptap-icons/heading-three-icon\"\nimport { HeadingFourIcon } from \"../../tiptap-icons/heading-four-icon\"\nimport { HeadingFiveIcon } from \"../../tiptap-icons/heading-five-icon\"\nimport { HeadingSixIcon } from \"../../tiptap-icons/heading-six-icon\"\n\nexport type Level = 1 | 2 | 3 | 4 | 5 | 6\n\n/**\n * Configuration for the heading functionality\n */\nexport interface UseHeadingConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The heading level.\n */\n level: Level\n /**\n * Whether the button should hide when heading is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful heading toggle.\n */\n onToggled?: () => void\n}\n\nexport const headingIcons = {\n 1: HeadingOneIcon,\n 2: HeadingTwoIcon,\n 3: HeadingThreeIcon,\n 4: HeadingFourIcon,\n 5: HeadingFiveIcon,\n 6: HeadingSixIcon,\n}\n\nexport const HEADING_SHORTCUT_KEYS: Record<Level, string> = {\n 1: \"ctrl+alt+1\",\n 2: \"ctrl+alt+2\",\n 3: \"ctrl+alt+3\",\n 4: \"ctrl+alt+4\",\n 5: \"ctrl+alt+5\",\n 6: \"ctrl+alt+6\",\n}\n\n/**\n * Checks if heading can be toggled in the current editor state\n */\nexport function canToggle(\n editor: Editor | null,\n level?: Level,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isNodeInSchema(\"heading\", editor) ||\n isNodeTypeSelected(editor, [\"image\"])\n )\n return false\n\n if (!turnInto) {\n return level\n ? editor.can().setNode(\"heading\", { level })\n : editor.can().setNode(\"heading\")\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set heading directly on the selection,\n // or we can clear formatting/nodes to arrive at a heading.\n return level\n ? editor.can().setNode(\"heading\", { level }) || editor.can().clearNodes()\n : editor.can().setNode(\"heading\") || editor.can().clearNodes()\n}\n\n/**\n * Checks if heading is currently active\n */\nexport function isHeadingActive(\n editor: Editor | null,\n level?: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n if (Array.isArray(level)) {\n return level.some((l) => editor.isActive(\"heading\", { level: l }))\n }\n\n return level\n ? editor.isActive(\"heading\", { level })\n : editor.isActive(\"heading\")\n}\n\n/**\n * Toggles heading in the editor\n */\nexport function toggleHeading(\n editor: Editor | null,\n level: Level | Level[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n\n const levels = Array.isArray(level) ? level : [level]\n const toggleLevel = levels.find((l) => canToggle(editor, l))\n\n if (!toggleLevel) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n const isActive = levels.some((l) =>\n editor.isActive(\"heading\", { level: l })\n )\n\n const toggle = isActive\n ? chain.setNode(\"paragraph\")\n : chain.setNode(\"heading\", { level: toggleLevel })\n\n toggle.run()\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the heading button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n level?: Level | Level[]\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, level, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(\"heading\", editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n if (Array.isArray(level)) {\n return level.some((l) => canToggle(editor, l))\n }\n return canToggle(editor, level)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides heading functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleHeadingButton() {\n * const { isVisible, isActive, handleToggle, Icon } = useHeading({ level: 1 })\n *\n * if (!isVisible) return null\n *\n * return (\n * <button\n * onClick={handleToggle}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Heading 1\n * </button>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingButton() {\n * const { isVisible, isActive, handleToggle, label, Icon } = useHeading({\n * level: 2,\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: (isActive) => console.log('Heading toggled:', isActive)\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * Toggle Heading 2\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useHeading(config: UseHeadingConfig) {\n const {\n editor: providedEditor,\n level,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggleState = canToggle(editor, level)\n const isActive = isHeadingActive(editor, level)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, level, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, level, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleHeading(editor, level)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, level, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle: canToggleState,\n label: `Heading ${level}`,\n shortcutKeys: HEADING_SHORTCUT_KEYS[level],\n Icon: headingIcons[level],\n }\n}\n","import { forwardRef } from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./dropdown-menu.less\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root modal={false} {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal {...props} />\n}\n\nconst DropdownMenuTrigger = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>(({ ...props }, ref) => <DropdownMenuPrimitive.Trigger ref={ref} {...props} />)\nDropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuItem = DropdownMenuPrimitive.Item\n\nconst DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger\n\nconst DropdownMenuSubContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {\n portal?: boolean | React.ComponentProps<typeof DropdownMenuPortal>\n }\n>(({ className, portal = true, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {\n portal?: boolean\n }\n>(({ className, sideOffset = 4, portal = false, ...props }, ref) => {\n const content = (\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n onCloseAutoFocus={(e) => e.preventDefault()}\n className={cn(\"tiptap-dropdown-menu\", className)}\n {...props}\n />\n )\n\n return portal ? (\n <DropdownMenuPortal {...(typeof portal === \"object\" ? portal : {})}>\n {content}\n </DropdownMenuPortal>\n ) : (\n content\n )\n})\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuGroup,\n DropdownMenuSub,\n DropdownMenuPortal,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import { forwardRef, useCallback, useState } from \"react\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"../../tiptap-icons/chevron-down-icon\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport { HeadingButton } from \"../heading-button\"\nimport type { UseHeadingDropdownMenuConfig } from \".\"\nimport { useHeadingDropdownMenu } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"../../tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"../../tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"../../tiptap-ui-primitive/card\"\n\nexport interface HeadingDropdownMenuProps\n extends Omit<ButtonProps, \"type\">,\n UseHeadingDropdownMenuConfig {\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n}\n\n/**\n * Dropdown menu component for selecting heading levels in a Tiptap editor.\n *\n * For custom dropdown implementations, use the `useHeadingDropdownMenu` hook instead.\n */\nexport const HeadingDropdownMenu = forwardRef<\n HTMLButtonElement,\n HeadingDropdownMenuProps\n>(\n (\n {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n portal = false,\n onOpenChange,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState<boolean>(false)\n const { isVisible, isActive, canToggle, Icon } = useHeadingDropdownMenu({\n editor,\n levels,\n hideWhenUnavailable,\n })\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!editor || !canToggle) return\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [canToggle, editor, onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu modal open={isOpen} onOpenChange={handleOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"Format text as heading\"\n aria-pressed={isActive}\n tooltip=\"标题\"\n {...buttonProps}\n ref={ref}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {levels.map((level) => (\n <DropdownMenuItem key={`标题 ${level}`} asChild>\n <HeadingButton\n editor={editor}\n level={level}\n text={`标题 ${level}`}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n)\n\nHeadingDropdownMenu.displayName = \"HeadingDropdownMenu\"\n\nexport default HeadingDropdownMenu\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const HeadingIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M6 3C6.55228 3 7 3.44772 7 4V11H17V4C17 3.44772 17.4477 3 18 3C18.5523 3 19 3.44772 19 4V20C19 20.5523 18.5523 21 18 21C17.4477 21 17 20.5523 17 20V13H7V20C7 20.5523 6.55228 21 6 21C5.44772 21 5 20.5523 5 20V4C5 3.44772 5.44772 3 6 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nHeadingIcon.displayName = \"HeadingIcon\"\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { HeadingIcon } from \"../../tiptap-icons/heading-icon\"\n\n// --- Tiptap UI ---\nimport {\n headingIcons,\n type Level,\n isHeadingActive,\n canToggle,\n shouldShowButton,\n} from \"../../tiptap-ui/heading-button\"\n\n/**\n * Configuration for the heading dropdown menu functionality\n */\nexport interface UseHeadingDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Available heading levels to show in the dropdown\n * @default [1, 2, 3, 4, 5, 6]\n */\n levels?: Level[]\n /**\n * Whether the dropdown should hide when headings are not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * Gets the currently active heading level from the available levels\n */\nexport function getActiveHeadingLevel(\n editor: Editor | null,\n levels: Level[] = [1, 2, 3, 4, 5, 6]\n): Level | undefined {\n if (!editor || !editor.isEditable) return undefined\n return levels.find((level) => isHeadingActive(editor, level))\n}\n\n/**\n * Custom hook that provides heading dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * isAnyHeadingActive,\n * canToggle,\n * levels,\n * } = useHeadingDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedHeadingDropdown() {\n * const {\n * isVisible,\n * activeLevel,\n * } = useHeadingDropdownMenu({\n * editor: myEditor,\n * levels: [1, 2, 3],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useHeadingDropdownMenu(config?: UseHeadingDropdownMenuConfig) {\n const {\n editor: providedEditor,\n levels = [1, 2, 3, 4, 5, 6],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const activeLevel = getActiveHeadingLevel(editor, levels)\n const isActive = isHeadingActive(editor)\n const canToggleState = canToggle(editor)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowButton({ editor, hideWhenUnavailable, level: levels })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, levels])\n\n return {\n isVisible,\n activeLevel,\n isActive,\n canToggle: canToggleState,\n levels,\n label: \"标题\",\n Icon: activeLevel ? headingIcons[activeLevel] : HeadingIcon,\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const CornerDownLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M21 4C21 3.44772 20.5523 3 20 3C19.4477 3 19 3.44772 19 4V11C19 11.7956 18.6839 12.5587 18.1213 13.1213C17.5587 13.6839 16.7956 14 16 14H6.41421L9.70711 10.7071C10.0976 10.3166 10.0976 9.68342 9.70711 9.29289C9.31658 8.90237 8.68342 8.90237 8.29289 9.29289L3.29289 14.2929C2.90237 14.6834 2.90237 15.3166 3.29289 15.7071L8.29289 20.7071C8.68342 21.0976 9.31658 21.0976 9.70711 20.7071C10.0976 20.3166 10.0976 19.6834 9.70711 19.2929L6.41421 16H16C17.3261 16 18.5979 15.4732 19.5355 14.5355C20.4732 13.5979 21 12.3261 21 11V4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCornerDownLeftIcon.displayName = \"CornerDownLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ExternalLinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14 3C14 2.44772 14.4477 2 15 2H21C21.5523 2 22 2.44772 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41421L10.7071 14.7071C10.3166 15.0976 9.68342 15.0976 9.29289 14.7071C8.90237 14.3166 8.90237 13.6834 9.29289 13.2929L18.5858 4H15C14.4477 4 14 3.55228 14 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M4.29289 7.29289C4.48043 7.10536 4.73478 7 5 7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H5C4.20435 5 3.44129 5.31607 2.87868 5.87868C2.31607 6.44129 2 7.20435 2 8V19C2 19.7957 2.31607 20.5587 2.87868 21.1213C3.44129 21.6839 4.20435 22 5 22H16C16.7957 22 17.5587 21.6839 18.1213 21.1213C18.6839 20.5587 19 19.7957 19 19V13C19 12.4477 18.5523 12 18 12C17.4477 12 17 12.4477 17 13V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20H5C4.73478 20 4.48043 19.8946 4.29289 19.7071C4.10536 19.5196 4 19.2652 4 19V8C4 7.73478 4.10536 7.48043 4.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nExternalLinkIcon.displayName = \"ExternalLinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const LinkIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M16.9958 1.06669C15.4226 1.05302 13.907 1.65779 12.7753 2.75074L12.765 2.76086L11.045 4.47086C10.6534 4.86024 10.6515 5.49341 11.0409 5.88507C11.4303 6.27673 12.0634 6.27858 12.4551 5.88919L14.1697 4.18456C14.9236 3.45893 15.9319 3.05752 16.9784 3.06662C18.0272 3.07573 19.0304 3.49641 19.772 4.23804C20.5137 4.97967 20.9344 5.98292 20.9435 7.03171C20.9526 8.07776 20.5515 9.08563 19.8265 9.83941L16.833 12.8329C16.4274 13.2386 15.9393 13.5524 15.4019 13.7529C14.8645 13.9533 14.2903 14.0359 13.7181 13.9949C13.146 13.9539 12.5894 13.7904 12.0861 13.5154C11.5827 13.2404 11.1444 12.8604 10.8008 12.401C10.47 11.9588 9.84333 11.8685 9.40108 12.1993C8.95883 12.5301 8.86849 13.1568 9.1993 13.599C9.71464 14.288 10.3721 14.858 11.1272 15.2705C11.8822 15.683 12.7171 15.9283 13.5753 15.9898C14.4334 16.0513 15.2948 15.9274 16.1009 15.6267C16.907 15.326 17.639 14.8555 18.2473 14.247L21.2472 11.2471L21.2593 11.2347C22.3523 10.1031 22.9571 8.58751 22.9434 7.01433C22.9297 5.44115 22.2987 3.93628 21.1863 2.82383C20.0738 1.71138 18.5689 1.08036 16.9958 1.06669Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10.4247 8.0102C9.56657 7.94874 8.70522 8.07256 7.89911 8.37326C7.09305 8.67395 6.36096 9.14458 5.75272 9.753L2.75285 12.7529L2.74067 12.7653C1.64772 13.8969 1.04295 15.4125 1.05662 16.9857C1.07029 18.5589 1.70131 20.0637 2.81376 21.1762C3.9262 22.2886 5.43108 22.9196 7.00426 22.9333C8.57744 22.947 10.0931 22.3422 11.2247 21.2493L11.2371 21.2371L12.9471 19.5271C13.3376 19.1366 13.3376 18.5034 12.9471 18.1129C12.5565 17.7223 11.9234 17.7223 11.5328 18.1129L9.82932 19.8164C9.07555 20.5414 8.06768 20.9425 7.02164 20.9334C5.97285 20.9243 4.9696 20.5036 4.22797 19.762C3.48634 19.0203 3.06566 18.0171 3.05655 16.9683C3.04746 15.9222 3.44851 14.9144 4.17355 14.1606L7.16719 11.167C7.5727 10.7613 8.06071 10.4476 8.59811 10.2471C9.13552 10.0467 9.70976 9.96412 10.2819 10.0051C10.854 10.0461 11.4106 10.2096 11.9139 10.4846C12.4173 10.7596 12.8556 11.1397 13.1992 11.599C13.53 12.0412 14.1567 12.1316 14.5989 11.8007C15.0412 11.4699 15.1315 10.8433 14.8007 10.401C14.2854 9.71205 13.6279 9.14198 12.8729 8.72948C12.1178 8.31697 11.2829 8.07166 10.4247 8.0102Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nLinkIcon.displayName = \"LinkIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const TrashIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 5V4C7 3.17477 7.40255 2.43324 7.91789 1.91789C8.43324 1.40255 9.17477 1 10 1H14C14.8252 1 15.5668 1.40255 16.0821 1.91789C16.5975 2.43324 17 3.17477 17 4V5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H20V20C20 20.8252 19.5975 21.5668 19.0821 22.0821C18.5668 22.5975 17.8252 23 17 23H7C6.17477 23 5.43324 22.5975 4.91789 22.0821C4.40255 21.5668 4 20.8252 4 20V7H3C2.44772 7 2 6.55228 2 6C2 5.44772 2.44772 5 3 5H7ZM9 4C9 3.82523 9.09745 3.56676 9.33211 3.33211C9.56676 3.09745 9.82523 3 10 3H14C14.1748 3 14.4332 3.09745 14.6679 3.33211C14.9025 3.56676 15 3.82523 15 4V5H9V4ZM6 7V20C6 20.1748 6.09745 20.4332 6.33211 20.6679C6.56676 20.9025 6.82523 21 7 21H17C17.1748 21 17.4332 20.9025 17.6679 20.6679C17.9025 20.4332 18 20.1748 18 20V7H6Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nTrashIcon.displayName = \"TrashIcon\"\n","import { cn } from \"../../../lib/tiptap-utils\"\nimport \"./input.less\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input type={type} className={cn(\"tiptap-input\", className)} {...props} />\n )\n}\n\nfunction InputGroup({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div className={cn(\"tiptap-input-group\", className)} {...props}>\n {children}\n </div>\n )\n}\n\nexport { Input, InputGroup }\n","\"use client\"\n\nimport { forwardRef, useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useIsBreakpoint } from \"../../../hooks/use-is-breakpoint\"\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { CornerDownLeftIcon } from \"../../tiptap-icons/corner-down-left-icon\"\nimport { ExternalLinkIcon } from \"../../tiptap-icons/external-link-icon\"\nimport { LinkIcon } from \"../../tiptap-icons/link-icon\"\nimport { TrashIcon } from \"../../tiptap-icons/trash-icon\"\n\n// --- Tiptap UI ---\nimport type { UseLinkPopoverConfig } from \".\"\nimport { useLinkPopover } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"../../tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../tiptap-ui-primitive/popover\"\nimport { Separator } from \"../../tiptap-ui-primitive/separator\"\nimport {\n Card,\n CardBody,\n CardItemGroup,\n} from \"../../tiptap-ui-primitive/card\"\nimport { Input, InputGroup } from \"../../tiptap-ui-primitive/input\"\n\nexport interface LinkMainProps {\n /**\n * The URL to set for the link.\n */\n url: string\n /**\n * Function to update the URL state.\n */\n setUrl: React.Dispatch<React.SetStateAction<string | null>>\n /**\n * Function to set the link in the editor.\n */\n setLink: () => void\n /**\n * Function to remove the link from the editor.\n */\n removeLink: () => void\n /**\n * Function to open the link.\n */\n openLink: () => void\n /**\n * Whether the link is currently active in the editor.\n */\n isActive: boolean\n}\n\nexport interface LinkPopoverProps\n extends Omit<ButtonProps, \"type\">,\n UseLinkPopoverConfig {\n /**\n * Callback for when the popover opens or closes.\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to automatically open the popover when a link is active.\n * @default true\n */\n autoOpenOnLinkActive?: boolean\n}\n\n/**\n * Link button component for triggering the link popover\n */\nexport const LinkButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <Button\n type=\"button\"\n className={className}\n data-style=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"链接\"\n tooltip=\"链接\"\n ref={ref}\n {...props}\n >\n {children || <LinkIcon className=\"tiptap-button-icon\" />}\n </Button>\n )\n }\n)\n\nLinkButton.displayName = \"LinkButton\"\n\n/**\n * Main content component for the link popover\n */\nconst LinkMain: React.FC<LinkMainProps> = ({\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n isActive,\n}) => {\n const isMobile = useIsBreakpoint()\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault()\n setLink()\n }\n }\n\n return (\n <Card\n style={{\n ...(isMobile ? { boxShadow: \"none\", border: 0 } : {}),\n }}\n >\n <CardBody\n style={{\n ...(isMobile ? { padding: 0 } : {}),\n }}\n >\n <CardItemGroup orientation=\"horizontal\">\n <InputGroup>\n <Input\n type=\"url\"\n placeholder=\"粘贴链接...\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n autoFocus\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n </InputGroup>\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={setLink}\n title=\"应用链接\"\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <CornerDownLeftIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n\n <Separator />\n\n <ButtonGroup orientation=\"horizontal\">\n <Button\n type=\"button\"\n onClick={openLink}\n title=\"在新窗口中打开\"\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <ExternalLinkIcon className=\"tiptap-button-icon\" />\n </Button>\n\n <Button\n type=\"button\"\n onClick={removeLink}\n title=\"移除链接\"\n disabled={!url && !isActive}\n data-style=\"ghost\"\n >\n <TrashIcon className=\"tiptap-button-icon\" />\n </Button>\n </ButtonGroup>\n </CardItemGroup>\n </CardBody>\n </Card>\n )\n}\n\n/**\n * Link content component for standalone use\n */\nexport const LinkContent: React.FC<{\n editor?: Editor | null\n}> = ({ editor }) => {\n const linkPopover = useLinkPopover({\n editor,\n })\n\n return <LinkMain {...linkPopover} />\n}\n\n/**\n * Link popover component for Tiptap editors.\n *\n * For custom popover implementations, use the `useLinkPopover` hook instead.\n */\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n (\n {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n onOpenChange,\n autoOpenOnLinkActive = true,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const {\n isVisible,\n canSet,\n isActive,\n url,\n setUrl,\n setLink,\n removeLink,\n openLink,\n label,\n Icon,\n } = useLinkPopover({\n editor,\n hideWhenUnavailable,\n onSetLink,\n })\n\n const handleOnOpenChange = useCallback(\n (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen)\n onOpenChange?.(nextIsOpen)\n },\n [onOpenChange]\n )\n\n const handleSetLink = useCallback(() => {\n setLink()\n setIsOpen(false)\n }, [setLink])\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n setIsOpen(!isOpen)\n },\n [onClick, isOpen]\n )\n\n useEffect(() => {\n if (autoOpenOnLinkActive && isActive) {\n setIsOpen(true)\n }\n }, [autoOpenOnLinkActive, isActive])\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOnOpenChange}>\n <PopoverTrigger asChild>\n <LinkButton\n disabled={!canSet}\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canSet}\n aria-label={label}\n aria-pressed={isActive}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? <Icon className=\"tiptap-button-icon\" />}\n </LinkButton>\n </PopoverTrigger>\n\n <PopoverContent>\n <LinkMain\n url={url}\n setUrl={setUrl}\n setLink={handleSetLink}\n removeLink={removeLink}\n openLink={openLink}\n isActive={isActive}\n />\n </PopoverContent>\n </Popover>\n )\n }\n)\n\nLinkPopover.displayName = \"LinkPopover\"\n\nexport default LinkPopover\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { LinkIcon } from \"../../tiptap-icons/link-icon\"\n\n// --- Lib ---\nimport {\n isMarkInSchema,\n isNodeTypeSelected,\n sanitizeUrl,\n} from \"../../../lib/tiptap-utils\"\n\n/**\n * Configuration for the link popover functionality\n */\nexport interface UseLinkPopoverConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * Whether to hide the link popover when not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Configuration for the link handler functionality\n */\nexport interface LinkHandlerProps {\n /**\n * The Tiptap editor instance.\n */\n editor: Editor | null\n /**\n * Callback function called when the link is set.\n */\n onSetLink?: () => void\n}\n\n/**\n * Checks if a link can be set in the current editor state\n */\nexport function canSetLink(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n\n // The third argument 'true' checks whether the current selection is inside an image caption, and prevents setting a link there\n // If the selection is inside an image caption, we can't set a link\n if (isNodeTypeSelected(editor, [\"image\"], true)) return false\n return editor.can().setMark(\"link\")\n}\n\n/**\n * Checks if a link is currently active in the editor\n */\nexport function isLinkActive(editor: Editor | null): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(\"link\")\n}\n\n/**\n * Determines if the link button should be shown\n */\nexport function shouldShowLinkButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, hideWhenUnavailable } = props\n\n const linkInSchema = isMarkInSchema(\"link\", editor)\n\n if (!linkInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetLink(editor)\n }\n\n return true\n}\n\n/**\n * Custom hook for handling link operations in a Tiptap editor\n */\nexport function useLinkHandler(props: LinkHandlerProps) {\n const { editor, onSetLink } = props\n const [url, setUrl] = useState<string | null>(null)\n\n useEffect(() => {\n if (!editor) return\n\n // Get URL immediately on mount\n const { href } = editor.getAttributes(\"link\")\n\n if (isLinkActive(editor) && url === null) {\n setUrl(href || \"\")\n }\n }, [editor, url])\n\n useEffect(() => {\n if (!editor) return\n\n const updateLinkState = () => {\n const { href } = editor.getAttributes(\"link\")\n setUrl(href || \"\")\n }\n\n editor.on(\"selectionUpdate\", updateLinkState)\n return () => {\n editor.off(\"selectionUpdate\", updateLinkState)\n }\n }, [editor])\n\n const setLink = useCallback(() => {\n if (!url || !editor) return\n\n const { selection } = editor.state\n const isEmpty = selection.empty\n\n let chain = editor.chain().focus()\n\n chain = chain.extendMarkRange(\"link\").setLink({ href: url })\n\n if (isEmpty) {\n chain = chain.insertContent({ type: \"text\", text: url })\n }\n\n chain.run()\n\n setUrl(null)\n\n onSetLink?.()\n }, [editor, onSetLink, url])\n\n const removeLink = useCallback(() => {\n if (!editor) return\n editor\n .chain()\n .focus()\n .extendMarkRange(\"link\")\n .unsetLink()\n .setMeta(\"preventAutolink\", true)\n .run()\n setUrl(\"\")\n }, [editor])\n\n const openLink = useCallback(\n (target: string = \"_blank\", features: string = \"noopener,noreferrer\") => {\n if (!url) return\n\n const safeUrl = sanitizeUrl(url, window.location.href)\n if (safeUrl !== \"#\") {\n window.open(safeUrl, target, features)\n }\n },\n [url]\n )\n\n return {\n url: url || \"\",\n setUrl,\n setLink,\n removeLink,\n openLink,\n }\n}\n\n/**\n * Custom hook for link popover state management\n */\nexport function useLinkState(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n}) {\n const { editor, hideWhenUnavailable = false } = props\n\n const canSet = canSetLink(editor)\n const isActive = isLinkActive(editor)\n\n const [isVisible, setIsVisible] = useState(true)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowLinkButton({\n editor,\n hideWhenUnavailable,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable])\n\n return {\n isVisible,\n canSet,\n isActive,\n }\n}\n\n/**\n * Main hook that provides link popover functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover()\n *\n * if (!isVisible) return null\n *\n * return <button disabled={!canSet}>Link</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedLinkButton() {\n * const { isVisible, canSet, isActive, Icon, label } = useLinkPopover({\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onSetLink: () => console.log('Link set!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * disabled={!canSet}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * <Icon />\n * {label}\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useLinkPopover(config?: UseLinkPopoverConfig) {\n const {\n editor: providedEditor,\n hideWhenUnavailable = false,\n onSetLink,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n\n const { isVisible, canSet, isActive } = useLinkState({\n editor,\n hideWhenUnavailable,\n })\n\n const linkHandler = useLinkHandler({\n editor,\n onSetLink,\n })\n\n return {\n isVisible,\n canSet,\n isActive,\n label: \"Link\",\n Icon: LinkIcon,\n ...linkHandler,\n }\n}\n","import { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\n// --- Tiptap UI ---\nimport type { ListType, UseListConfig } from \".\"\nimport { LIST_SHORTCUT_KEYS, useList } from \".\"\n\nexport interface ListButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseListConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function ListShortcutBadge({\n type,\n shortcutKeys = LIST_SHORTCUT_KEYS[type],\n}: {\n type: ListType\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling lists in a Tiptap editor.\n *\n * For custom button implementations, use the `useList` hook instead.\n */\nexport const ListButton = forwardRef<HTMLButtonElement, ListButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n canToggle,\n isActive,\n handleToggle,\n label,\n shortcutKeys,\n Icon,\n } = useList({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleToggle()\n },\n [handleToggle, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <ListShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nListButton.displayName = \"ListButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 6C7 5.44772 7.44772 5 8 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H8C7.44772 7 7 6.55228 7 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 12C7 11.4477 7.44772 11 8 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H8C7.44772 13 7 12.5523 7 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 18C7 17.4477 7.44772 17 8 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H8C7.44772 19 7 18.5523 7 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H3.01C3.56228 5 4.01 5.44772 4.01 6C4.01 6.55228 3.56228 7 3.01 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H3.01C3.56228 11 4.01 11.4477 4.01 12C4.01 12.5523 3.56228 13 3.01 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H3.01C3.56228 17 4.01 17.4477 4.01 18C4.01 18.5523 3.56228 19 3.01 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListIcon.displayName = \"ListIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListOrderedIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 6C9 5.44772 9.44772 5 10 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H10C9.44772 7 9 6.55228 9 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 12C9 11.4477 9.44772 11 10 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H10C9.44772 13 9 12.5523 9 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 18C9 17.4477 9.44772 17 10 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H10C9.44772 19 9 18.5523 9 18Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 6C3 5.44772 3.44772 5 4 5H5C5.55228 5 6 5.44772 6 6V10C6 10.5523 5.55228 11 5 11C4.44772 11 4 10.5523 4 10V7C3.44772 7 3 6.55228 3 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 10C3 9.44772 3.44772 9 4 9H6C6.55228 9 7 9.44772 7 10C7 10.5523 6.55228 11 6 11H4C3.44772 11 3 10.5523 3 10Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.82219 13.0431C6.54543 13.4047 6.99997 14.1319 6.99997 15C6.99997 15.5763 6.71806 16.0426 6.48747 16.35C6.31395 16.5814 6.1052 16.8044 5.91309 17H5.99997C6.55226 17 6.99997 17.4477 6.99997 18C6.99997 18.5523 6.55226 19 5.99997 19H3.99997C3.44769 19 2.99997 18.5523 2.99997 18C2.99997 17.4237 3.28189 16.9575 3.51247 16.65C3.74323 16.3424 4.03626 16.0494 4.26965 15.8161C4.27745 15.8083 4.2852 15.8006 4.29287 15.7929C4.55594 15.5298 4.75095 15.3321 4.88748 15.15C4.96287 15.0495 4.99021 14.9922 4.99911 14.9714C4.99535 14.9112 4.9803 14.882 4.9739 14.8715C4.96613 14.8588 4.95382 14.845 4.92776 14.8319C4.87723 14.8067 4.71156 14.7623 4.44719 14.8944C3.95321 15.1414 3.35254 14.9412 3.10555 14.4472C2.85856 13.9533 3.05878 13.3526 3.55276 13.1056C4.28839 12.7378 5.12272 12.6934 5.82219 13.0431Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListOrderedIcon.displayName = \"ListOrderedIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ListTodoIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 4.89543 2.89543 4 4 4H8C9.10457 4 10 4.89543 10 6V10C10 11.1046 9.10457 12 8 12H4C2.89543 12 2 11.1046 2 10V6ZM8 6H4V10H8V6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 14.2929C10.0976 14.6834 10.0976 15.3166 9.70711 15.7071L5.70711 19.7071C5.31658 20.0976 4.68342 20.0976 4.29289 19.7071L2.29289 17.7071C1.90237 17.3166 1.90237 16.6834 2.29289 16.2929C2.68342 15.9024 3.31658 15.9024 3.70711 16.2929L5 17.5858L8.29289 14.2929C8.68342 13.9024 9.31658 13.9024 9.70711 14.2929Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 6C12 5.44772 12.4477 5 13 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H13C12.4477 7 12 6.55228 12 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 12C12 11.4477 12.4477 11 13 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H13C12.4477 13 12 12.5523 12 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 18C12 17.4477 12.4477 17 13 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H13C12.4477 19 12 18.5523 12 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nListTodoIcon.displayName = \"ListTodoIcon\"\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"../../tiptap-icons/list-icon\"\nimport { ListOrderedIcon } from \"../../tiptap-icons/list-ordered-icon\"\nimport { ListTodoIcon } from \"../../tiptap-icons/list-todo-icon\"\n\n// --- Lib ---\nimport {\n findNodePosition,\n isNodeInSchema,\n isNodeTypeSelected,\n isValidPosition,\n selectionWithinConvertibleTypes,\n} from \"../../../lib/tiptap-utils\"\n\nexport type ListType = \"bulletList\" | \"orderedList\" | \"taskList\"\n\n/**\n * Configuration for the list functionality\n */\nexport interface UseListConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of list to toggle.\n */\n type: ListType\n /**\n * Whether the button should hide when list is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful toggle.\n */\n onToggled?: () => void\n}\n\nexport const listIcons = {\n bulletList: ListIcon,\n orderedList: ListOrderedIcon,\n taskList: ListTodoIcon,\n}\n\nexport const listLabels: Record<ListType, string> = {\n bulletList: \"无序列表\",\n orderedList: \"有序列表\",\n taskList: \"任务列表\",\n}\n\nexport const LIST_SHORTCUT_KEYS: Record<ListType, string> = {\n bulletList: \"mod+shift+8\",\n orderedList: \"mod+shift+7\",\n taskList: \"mod+shift+9\",\n}\n\n/**\n * Checks if a list can be toggled in the current editor state\n */\nexport function canToggleList(\n editor: Editor | null,\n type: ListType,\n turnInto: boolean = true\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n if (!turnInto) {\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList()\n case \"orderedList\":\n return editor.can().toggleOrderedList()\n case \"taskList\":\n return editor.can().toggleList(\"taskList\", \"taskItem\")\n default:\n return false\n }\n }\n\n // Ensure selection is in nodes we're allowed to convert\n if (\n !selectionWithinConvertibleTypes(editor, [\n \"paragraph\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"taskList\",\n \"blockquote\",\n \"codeBlock\",\n ])\n )\n return false\n\n // Either we can set list directly on the selection,\n // or we can clear formatting/nodes to arrive at a list.\n switch (type) {\n case \"bulletList\":\n return editor.can().toggleBulletList() || editor.can().clearNodes()\n case \"orderedList\":\n return editor.can().toggleOrderedList() || editor.can().clearNodes()\n case \"taskList\":\n return (\n editor.can().toggleList(\"taskList\", \"taskItem\") ||\n editor.can().clearNodes()\n )\n default:\n return false\n }\n}\n\n/**\n * Checks if list is currently active\n */\nexport function isListActive(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n\n switch (type) {\n case \"bulletList\":\n return editor.isActive(\"bulletList\")\n case \"orderedList\":\n return editor.isActive(\"orderedList\")\n case \"taskList\":\n return editor.isActive(\"taskList\")\n default:\n return false\n }\n}\n\n/**\n * Toggles list in the editor\n */\nexport function toggleList(editor: Editor | null, type: ListType): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleList(editor, type)) return false\n\n try {\n const view = editor.view\n let state = view.state\n let tr = state.tr\n\n // No selection, find the the cursor position\n if (state.selection.empty || state.selection instanceof TextSelection) {\n const pos = findNodePosition({\n editor,\n node: state.selection.$anchor.node(1),\n })?.pos\n if (!isValidPosition(pos)) return false\n\n tr = tr.setSelection(NodeSelection.create(state.doc, pos))\n view.dispatch(tr)\n state = view.state\n }\n\n const selection = state.selection\n\n let chain = editor.chain().focus()\n\n // Handle NodeSelection\n if (selection instanceof NodeSelection) {\n const firstChild = selection.node.firstChild?.firstChild\n const lastChild = selection.node.lastChild?.lastChild\n\n const from = firstChild\n ? selection.from + firstChild.nodeSize\n : selection.from + 1\n\n const to = lastChild\n ? selection.to - lastChild.nodeSize\n : selection.to - 1\n\n const resolvedFrom = state.doc.resolve(from)\n const resolvedTo = state.doc.resolve(to)\n\n chain = chain\n .setTextSelection(TextSelection.between(resolvedFrom, resolvedTo))\n .clearNodes()\n }\n\n if (editor.isActive(type)) {\n // Unwrap list\n chain\n .liftListItem(\"listItem\")\n .lift(\"bulletList\")\n .lift(\"orderedList\")\n .lift(\"taskList\")\n .run()\n } else {\n // Wrap in specific list type\n const toggleMap: Record<ListType, () => typeof chain> = {\n bulletList: () => chain.toggleBulletList(),\n orderedList: () => chain.toggleOrderedList(),\n taskList: () => chain.toggleList(\"taskList\", \"taskItem\"),\n }\n\n const toggle = toggleMap[type]\n if (!toggle) return false\n\n toggle().run()\n }\n\n editor.chain().focus().selectTextblockEnd().run()\n\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Determines if the list button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: ListType\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isNodeInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleList(editor, type)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides list functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleListButton() {\n * const { isVisible, handleToggle, isActive } = useList({ type: \"bulletList\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleToggle}>Bullet List</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListButton() {\n * const { isVisible, handleToggle, label, isActive } = useList({\n * type: \"orderedList\",\n * editor: myEditor,\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('List toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleToggle}\n * aria-label={label}\n * aria-pressed={isActive}\n * >\n * Toggle List\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useList(config: UseListConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleList(editor, type)\n const isActive = isListActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleToggle = useCallback(() => {\n if (!editor) return false\n\n const success = toggleList(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleToggle,\n canToggle,\n label: listLabels[type],\n shortcutKeys: LIST_SHORTCUT_KEYS[type],\n Icon: listIcons[type],\n }\n}\n","\"use client\"\n\nimport { useEffect, useMemo, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ListIcon } from \"../../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// --- Tiptap UI ---\nimport {\n canToggleList,\n isListActive,\n listIcons,\n type ListType,\n} from \"../list-button\"\n\n/**\n * Configuration for the list dropdown menu functionality\n */\nexport interface UseListDropdownMenuConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The list types to display in the dropdown.\n * @default [\"bulletList\", \"orderedList\", \"taskList\"]\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n}\n\nexport interface ListOption {\n label: string\n type: ListType\n icon: React.ElementType\n}\n\nexport const listOptions: ListOption[] = [\n {\n label: \"无序列表\",\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 function canToggleAnyList(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => canToggleList(editor, type))\n}\n\nexport function isAnyListActive(\n editor: Editor | null,\n listTypes: ListType[]\n): boolean {\n if (!editor || !editor.isEditable) return false\n return listTypes.some((type) => isListActive(editor, type))\n}\n\nexport function getFilteredListOptions(\n availableTypes: ListType[]\n): typeof listOptions {\n return listOptions.filter(\n (option) => !option.type || availableTypes.includes(option.type)\n )\n}\n\nexport function shouldShowListDropdown(params: {\n editor: Editor | null\n listTypes: ListType[]\n hideWhenUnavailable: boolean\n listInSchema: boolean\n canToggleAny: boolean\n}): boolean {\n const { editor, hideWhenUnavailable, listInSchema, canToggleAny } = params\n\n if (!listInSchema || !editor) {\n return false\n }\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleAny\n }\n\n return true\n}\n\n/**\n * Gets the currently active list type from the available types\n */\nexport function getActiveListType(\n editor: Editor | null,\n availableTypes: ListType[]\n): ListType | undefined {\n if (!editor || !editor.isEditable) return undefined\n return availableTypes.find((type) => isListActive(editor, type))\n}\n\n/**\n * Custom hook that provides list dropdown menu functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MyListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * isAnyActive,\n * canToggleAny,\n * filteredLists,\n * } = useListDropdownMenu()\n *\n * if (!isVisible) return null\n *\n * return (\n * <DropdownMenu>\n * // dropdown content\n * </DropdownMenu>\n * )\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedListDropdown() {\n * const {\n * isVisible,\n * activeType,\n * } = useListDropdownMenu({\n * editor: myEditor,\n * types: [\"bulletList\", \"orderedList\"],\n * hideWhenUnavailable: true,\n * })\n *\n * // component implementation\n * }\n * ```\n */\nexport function useListDropdownMenu(config?: UseListDropdownMenuConfig) {\n const {\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n } = config || {}\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState(true)\n\n const listInSchema = types.some((type) => isNodeInSchema(type, editor))\n\n const filteredLists = useMemo(() => getFilteredListOptions(types), [types])\n\n const canToggleAny = canToggleAnyList(editor, types)\n const isAnyActive = isAnyListActive(editor, types)\n const activeType = getActiveListType(editor, types)\n const activeList = filteredLists.find((option) => option.type === activeType)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(\n shouldShowListDropdown({\n editor,\n listTypes: types,\n hideWhenUnavailable,\n listInSchema,\n canToggleAny,\n })\n )\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [canToggleAny, editor, hideWhenUnavailable, listInSchema, types])\n\n return {\n isVisible,\n activeType,\n isActive: isAnyActive,\n canToggle: canToggleAny,\n types,\n filteredLists,\n label: \"List\",\n Icon: activeList ? listIcons[activeList.type] : ListIcon,\n }\n}\n","import { useCallback, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Icons ---\nimport { ChevronDownIcon } from \"../../tiptap-icons/chevron-down-icon\"\n\n// --- Tiptap UI ---\nimport { ListButton, type ListType } from \"../list-button\"\n\nimport { useListDropdownMenu } from \"./use-list-dropdown-menu\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button, ButtonGroup } from \"../../tiptap-ui-primitive/button\"\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from \"../../tiptap-ui-primitive/dropdown-menu\"\nimport { Card, CardBody } from \"../../tiptap-ui-primitive/card\"\n\nexport interface ListDropdownMenuProps extends Omit<ButtonProps, \"type\"> {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor\n /**\n * The list types to display in the dropdown.\n */\n types?: ListType[]\n /**\n * Whether the dropdown should be hidden when no list types are available\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback for when the dropdown opens or closes\n */\n onOpenChange?: (isOpen: boolean) => void\n /**\n * Whether to render the dropdown menu in a portal\n * @default false\n */\n portal?: boolean\n}\n\nexport function ListDropdownMenu({\n editor: providedEditor,\n types = [\"bulletList\", \"orderedList\", \"taskList\"],\n hideWhenUnavailable = false,\n onOpenChange,\n portal = false,\n ...props\n}: ListDropdownMenuProps) {\n const { editor } = useTiptapEditor(providedEditor)\n const [isOpen, setIsOpen] = useState(false)\n\n const { filteredLists, canToggle, isActive, isVisible, Icon } =\n useListDropdownMenu({\n editor,\n types,\n hideWhenUnavailable,\n })\n\n const handleOnOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n },\n [onOpenChange]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOnOpenChange}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n role=\"button\"\n tabIndex={-1}\n disabled={!canToggle}\n data-disabled={!canToggle}\n aria-label=\"列表选项\"\n tooltip=\"列表\"\n {...props}\n >\n <Icon className=\"tiptap-button-icon\" />\n <ChevronDownIcon className=\"tiptap-button-dropdown-small\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" portal={portal}>\n <Card>\n <CardBody>\n <ButtonGroup>\n {filteredLists.map((option) => (\n <DropdownMenuItem key={option.type} asChild>\n <ListButton\n editor={editor}\n type={option.type}\n text={option.label}\n showTooltip={false}\n />\n </DropdownMenuItem>\n ))}\n </ButtonGroup>\n </CardBody>\n </Card>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ListDropdownMenu\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type { Mark, UseMarkConfig } from \".\"\nimport { MARK_SHORTCUT_KEYS, useMark } from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface MarkButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseMarkConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function MarkShortcutBadge({\n type,\n shortcutKeys = MARK_SHORTCUT_KEYS[type],\n}: {\n type: Mark\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for toggling marks in a Tiptap editor.\n *\n * For custom button implementations, use the `useMark` hook instead.\n */\nexport const MarkButton = forwardRef<HTMLButtonElement, MarkButtonProps>(\n (\n {\n editor: providedEditor,\n type,\n text,\n hideWhenUnavailable = false,\n onToggled,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleMark,\n label,\n canToggle,\n isActive,\n Icon,\n shortcutKeys,\n } = useMark({\n editor,\n type,\n hideWhenUnavailable,\n onToggled,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleMark()\n },\n [handleMark, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canToggle}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canToggle}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <MarkShortcutBadge type={type} shortcutKeys={shortcutKeys} />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nMarkButton.displayName = \"MarkButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const BoldIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 2.5C5.17157 2.5 4.5 3.17157 4.5 4V20C4.5 20.8284 5.17157 21.5 6 21.5H15C16.4587 21.5 17.8576 20.9205 18.8891 19.8891C19.9205 18.8576 20.5 17.4587 20.5 16C20.5 14.5413 19.9205 13.1424 18.8891 12.1109C18.6781 11.9 18.4518 11.7079 18.2128 11.5359C19.041 10.5492 19.5 9.29829 19.5 8C19.5 6.54131 18.9205 5.14236 17.8891 4.11091C16.8576 3.07946 15.4587 2.5 14 2.5H6ZM14 10.5C14.663 10.5 15.2989 10.2366 15.7678 9.76777C16.2366 9.29893 16.5 8.66304 16.5 8C16.5 7.33696 16.2366 6.70107 15.7678 6.23223C15.2989 5.76339 14.663 5.5 14 5.5H7.5V10.5H14ZM7.5 18.5V13.5H15C15.663 13.5 16.2989 13.7634 16.7678 14.2322C17.2366 14.7011 17.5 15.337 17.5 16C17.5 16.663 17.2366 17.2989 16.7678 17.7678C16.2989 18.2366 15.663 18.5 15 18.5H7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nBoldIcon.displayName = \"BoldIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Code2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.4545 4.2983C15.6192 3.77115 15.3254 3.21028 14.7983 3.04554C14.2712 2.88081 13.7103 3.1746 13.5455 3.70175L8.54554 19.7017C8.38081 20.2289 8.6746 20.7898 9.20175 20.9545C9.72889 21.1192 10.2898 20.8254 10.4545 20.2983L15.4545 4.2983Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6.70711 7.29289C7.09763 7.68342 7.09763 8.31658 6.70711 8.70711L3.41421 12L6.70711 15.2929C7.09763 15.6834 7.09763 16.3166 6.70711 16.7071C6.31658 17.0976 5.68342 17.0976 5.29289 16.7071L1.29289 12.7071C0.902369 12.3166 0.902369 11.6834 1.29289 11.2929L5.29289 7.29289C5.68342 6.90237 6.31658 6.90237 6.70711 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17.2929 7.29289C17.6834 6.90237 18.3166 6.90237 18.7071 7.29289L22.7071 11.2929C23.0976 11.6834 23.0976 12.3166 22.7071 12.7071L18.7071 16.7071C18.3166 17.0976 17.6834 17.0976 17.2929 16.7071C16.9024 16.3166 16.9024 15.6834 17.2929 15.2929L20.5858 12L17.2929 8.70711C16.9024 8.31658 16.9024 7.68342 17.2929 7.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nCode2Icon.displayName = \"Code2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ItalicIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M15.0222 3H19C19.5523 3 20 3.44772 20 4C20 4.55228 19.5523 5 19 5H15.693L10.443 19H14C14.5523 19 15 19.4477 15 20C15 20.5523 14.5523 21 14 21H9.02418C9.00802 21.0004 8.99181 21.0004 8.97557 21H5C4.44772 21 4 20.5523 4 20C4 19.4477 4.44772 19 5 19H8.30704L13.557 5H10C9.44772 5 9 4.55228 9 4C9 3.44772 9.44772 3 10 3H14.9782C14.9928 2.99968 15.0075 2.99967 15.0222 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nItalicIcon.displayName = \"ItalicIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const StrikeIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.00039 3H16.0001C16.5524 3 17.0001 3.44772 17.0001 4C17.0001 4.55229 16.5524 5 16.0001 5H9.00011C8.68006 4.99983 8.36412 5.07648 8.07983 5.22349C7.79555 5.37051 7.55069 5.5836 7.36585 5.84487C7.181 6.10614 7.06155 6.40796 7.01754 6.72497C6.97352 7.04198 7.00623 7.36492 7.11292 7.66667C7.29701 8.18737 7.02414 8.75872 6.50344 8.94281C5.98274 9.1269 5.4114 8.85403 5.2273 8.33333C5.01393 7.72984 4.94851 7.08396 5.03654 6.44994C5.12456 5.81592 5.36346 5.21229 5.73316 4.68974C6.10285 4.1672 6.59256 3.74101 7.16113 3.44698C7.72955 3.15303 8.36047 2.99975 9.00039 3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18 13H20C20.5523 13 21 12.5523 21 12C21 11.4477 20.5523 11 20 11H4C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H14C14.7956 13 15.5587 13.3161 16.1213 13.8787C16.6839 14.4413 17 15.2044 17 16C17 16.7956 16.6839 17.5587 16.1213 18.1213C15.5587 18.6839 14.7956 19 14 19H6C5.44772 19 5 19.4477 5 20C5 20.5523 5.44772 21 6 21H14C15.3261 21 16.5979 20.4732 17.5355 19.5355C18.4732 18.5979 19 17.3261 19 16C19 14.9119 18.6453 13.8604 18 13Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nStrikeIcon.displayName = \"StrikeIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SubscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.4079 14.3995C18.0284 14.0487 18.7506 13.9217 19.4536 14.0397C20.1566 14.1578 20.7977 14.5138 21.2696 15.0481L21.2779 15.0574L21.2778 15.0575C21.7439 15.5988 22 16.2903 22 17C22 18.0823 21.3962 18.8401 20.7744 19.3404C20.194 19.8073 19.4858 20.141 18.9828 20.378C18.9638 20.387 18.9451 20.3958 18.9266 20.4045C18.4473 20.6306 18.2804 20.7817 18.1922 20.918C18.1773 20.9412 18.1619 20.9681 18.1467 21H21C21.5523 21 22 21.4477 22 22C22 22.5523 21.5523 23 21 23H17C16.4477 23 16 22.5523 16 22C16 21.1708 16.1176 20.4431 16.5128 19.832C16.9096 19.2184 17.4928 18.8695 18.0734 18.5956C18.6279 18.334 19.138 18.0901 19.5207 17.7821C19.8838 17.49 20 17.2477 20 17C20 16.7718 19.9176 16.5452 19.7663 16.3672C19.5983 16.1792 19.3712 16.0539 19.1224 16.0121C18.8722 15.9701 18.6152 16.015 18.3942 16.1394C18.1794 16.2628 18.0205 16.4549 17.9422 16.675C17.7572 17.1954 17.1854 17.4673 16.665 17.2822C16.1446 17.0972 15.8728 16.5254 16.0578 16.005C16.2993 15.3259 16.7797 14.7584 17.4039 14.4018L17.4079 14.3995L17.4079 14.3995Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSubscriptIcon.displayName = \"SubscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SuperscriptIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7071 7.29289C13.0976 7.68342 13.0976 8.31658 12.7071 8.70711L4.70711 16.7071C4.31658 17.0976 3.68342 17.0976 3.29289 16.7071C2.90237 16.3166 2.90237 15.6834 3.29289 15.2929L11.2929 7.29289C11.6834 6.90237 12.3166 6.90237 12.7071 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.29289 7.29289C3.68342 6.90237 4.31658 6.90237 4.70711 7.29289L12.7071 15.2929C13.0976 15.6834 13.0976 16.3166 12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L3.29289 8.70711C2.90237 8.31658 2.90237 7.68342 3.29289 7.29289Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.405 1.40657C18.0246 1.05456 18.7463 0.92634 19.4492 1.04344C20.1521 1.16054 20.7933 1.51583 21.2652 2.0497L21.2697 2.05469L21.2696 2.05471C21.7431 2.5975 22 3.28922 22 4.00203C22 5.08579 21.3952 5.84326 20.7727 6.34289C20.1966 6.80531 19.4941 7.13675 18.9941 7.37261C18.9714 7.38332 18.9491 7.39383 18.9273 7.40415C18.4487 7.63034 18.2814 7.78152 18.1927 7.91844C18.1778 7.94155 18.1625 7.96834 18.1473 8.00003H21C21.5523 8.00003 22 8.44774 22 9.00003C22 9.55231 21.5523 10 21 10H17C16.4477 10 16 9.55231 16 9.00003C16 8.17007 16.1183 7.44255 16.5138 6.83161C16.9107 6.21854 17.4934 5.86971 18.0728 5.59591C18.6281 5.33347 19.1376 5.09075 19.5208 4.78316C19.8838 4.49179 20 4.25026 20 4.00203C20 3.77192 19.9178 3.54865 19.7646 3.37182C19.5968 3.18324 19.3696 3.05774 19.1205 3.01625C18.8705 2.97459 18.6137 3.02017 18.3933 3.14533C18.1762 3.26898 18.0191 3.45826 17.9406 3.67557C17.7531 4.19504 17.18 4.46414 16.6605 4.27662C16.141 4.0891 15.8719 3.51596 16.0594 2.99649C16.303 2.3219 16.7817 1.76125 17.4045 1.40689L17.405 1.40657Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nSuperscriptIcon.displayName = \"SuperscriptIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const UnderlineIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7 4C7 3.44772 6.55228 3 6 3C5.44772 3 5 3.44772 5 4V10C5 11.8565 5.7375 13.637 7.05025 14.9497C8.36301 16.2625 10.1435 17 12 17C13.8565 17 15.637 16.2625 16.9497 14.9497C18.2625 13.637 19 11.8565 19 10V4C19 3.44772 18.5523 3 18 3C17.4477 3 17 3.44772 17 4V10C17 11.3261 16.4732 12.5979 15.5355 13.5355C14.5979 14.4732 13.3261 15 12 15C10.6739 15 9.40215 14.4732 8.46447 13.5355C7.52678 12.5979 7 11.3261 7 10V4ZM4 19C3.44772 19 3 19.4477 3 20C3 20.5523 3.44772 21 4 21H20C20.5523 21 21 20.5523 21 20C21 19.4477 20.5523 19 20 19H4Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUnderlineIcon.displayName = \"UnderlineIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isMarkInSchema, isNodeTypeSelected } from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { BoldIcon } from \"../../tiptap-icons/bold-icon\"\nimport { Code2Icon } from \"../../tiptap-icons/code2-icon\"\nimport { ItalicIcon } from \"../../tiptap-icons/italic-icon\"\nimport { StrikeIcon } from \"../../tiptap-icons/strike-icon\"\nimport { SubscriptIcon } from \"../../tiptap-icons/subscript-icon\"\nimport { SuperscriptIcon } from \"../../tiptap-icons/superscript-icon\"\nimport { UnderlineIcon } from \"../../tiptap-icons/underline-icon\"\n\nexport type Mark =\n | \"bold\"\n | \"italic\"\n | \"strike\"\n | \"code\"\n | \"underline\"\n | \"superscript\"\n | \"subscript\"\n\n/**\n * Configuration for the mark functionality\n */\nexport interface UseMarkConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The type of mark to toggle\n */\n type: Mark\n /**\n * Whether the button should hide when mark is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful mark toggle.\n */\n onToggled?: () => void\n}\n\nexport const markIcons = {\n bold: BoldIcon,\n italic: ItalicIcon,\n underline: UnderlineIcon,\n strike: StrikeIcon,\n code: Code2Icon,\n superscript: SuperscriptIcon,\n subscript: SubscriptIcon,\n}\n\nexport const MARK_SHORTCUT_KEYS: Record<Mark, string> = {\n bold: \"mod+b\",\n italic: \"mod+i\",\n underline: \"mod+u\",\n strike: \"mod+shift+s\",\n code: \"mod+e\",\n superscript: \"mod+.\",\n subscript: \"mod+,\",\n}\nexport const MARK_ACTION_LABELS: Partial<Record<Mark, string>> = {\n bold: '粗体',\n italic: '斜体',\n underline: '下划线',\n strike: '删除线',\n code: '代码',\n superscript: '上角标',\n subscript: '下角标'\n}\n\n/**\n * Checks if a mark can be toggled in the current editor state\n */\nexport function canToggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor) || isNodeTypeSelected(editor, [\"image\"]))\n return false\n\n return editor.can().toggleMark(type)\n}\n\n/**\n * Checks if a mark is currently active\n */\nexport function isMarkActive(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive(type)\n}\n\n/**\n * Toggles a mark in the editor\n */\nexport function toggleMark(editor: Editor | null, type: Mark): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canToggleMark(editor, type)) return false\n\n return editor.chain().focus().toggleMark(type).run()\n}\n\n/**\n * Determines if the mark button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n type: Mark\n hideWhenUnavailable: boolean\n}): boolean {\n const { editor, type, hideWhenUnavailable } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isMarkInSchema(type, editor)) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canToggleMark(editor, type)\n }\n\n return true\n}\n\n/**\n * Gets the formatted mark name\n */\nexport function getFormattedMarkName(type: Mark): string {\n return MARK_ACTION_LABELS[type] || type.charAt(0).toUpperCase() + type.slice(1)\n}\n\n/**\n * Custom hook that provides mark functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleBoldButton() {\n * const { isVisible, handleMark } = useMark({ type: \"bold\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleMark}>Bold</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedItalicButton() {\n * const { isVisible, handleMark, label, isActive } = useMark({\n * editor: myEditor,\n * type: \"italic\",\n * hideWhenUnavailable: true,\n * onToggled: () => console.log('Mark toggled!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleMark}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Italic\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useMark(config: UseMarkConfig) {\n const {\n editor: providedEditor,\n type,\n hideWhenUnavailable = false,\n onToggled,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canToggle = canToggleMark(editor, type)\n const isActive = isMarkActive(editor, type)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, type, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, type, hideWhenUnavailable])\n\n const handleMark = useCallback(() => {\n if (!editor) return false\n\n const success = toggleMark(editor, type)\n if (success) {\n onToggled?.()\n }\n return success\n }, [editor, type, onToggled])\n\n return {\n isVisible,\n isActive,\n handleMark,\n canToggle,\n label: getFormattedMarkName(type),\n shortcutKeys: MARK_SHORTCUT_KEYS[type],\n Icon: markIcons[type],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n TextAlign,\n UseTextAlignConfig,\n} from \".\"\nimport {\n TEXT_ALIGN_SHORTCUT_KEYS,\n useTextAlign,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\ntype IconProps = React.SVGProps<SVGSVGElement>\ntype IconComponent = ({ className, ...props }: IconProps) => React.ReactElement\n\nexport interface TextAlignButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseTextAlignConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n /**\n * Optional custom icon component to render instead of the default.\n */\n icon?: React.MemoExoticComponent<IconComponent> | React.FC<IconProps>\n}\n\nexport function TextAlignShortcutBadge({\n align,\n shortcutKeys = TEXT_ALIGN_SHORTCUT_KEYS[align],\n}: {\n align: TextAlign\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for setting text alignment in a Tiptap editor.\n *\n * For custom button implementations, use the `useTextAlign` hook instead.\n */\nexport const TextAlignButton = forwardRef<\n HTMLButtonElement,\n TextAlignButtonProps\n>(\n (\n {\n editor: providedEditor,\n align,\n text,\n hideWhenUnavailable = false,\n onAligned,\n showShortcut = false,\n onClick,\n icon: CustomIcon,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const {\n isVisible,\n handleTextAlign,\n label,\n canAlign,\n isActive,\n Icon,\n shortcutKeys,\n } = useTextAlign({\n editor,\n align,\n hideWhenUnavailable,\n onAligned,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleTextAlign()\n },\n [handleTextAlign, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n const RenderIcon = CustomIcon ?? Icon\n\n return (\n <Button\n type=\"button\"\n disabled={!canAlign}\n data-style=\"ghost\"\n data-active-state={isActive ? \"on\" : \"off\"}\n data-disabled={!canAlign}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n aria-pressed={isActive}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <RenderIcon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <TextAlignShortcutBadge\n align={align}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nTextAlignButton.displayName = \"TextAlignButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignCenterIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 12C6 11.4477 6.44772 11 7 11H17C17.5523 11 18 11.4477 18 12C18 12.5523 17.5523 13 17 13H7C6.44772 13 6 12.5523 6 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M4 18C4 17.4477 4.44772 17 5 17H19C19.5523 17 20 17.4477 20 18C20 18.5523 19.5523 19 19 19H5C4.44772 19 4 18.5523 4 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignCenterIcon.displayName = \"AlignCenterIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignJustifyIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignJustifyIcon.displayName = \"AlignJustifyIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 12C2 11.4477 2.44772 11 3 11H15C15.5523 11 16 11.4477 16 12C16 12.5523 15.5523 13 15 13H3C2.44772 13 2 12.5523 2 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 18C2 17.4477 2.44772 17 3 17H17C17.5523 17 18 17.4477 18 18C18 18.5523 17.5523 19 17 19H3C2.44772 19 2 18.5523 2 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignLeftIcon.displayName = \"AlignLeftIcon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const AlignRightIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2 6C2 5.44772 2.44772 5 3 5H21C21.5523 5 22 5.44772 22 6C22 6.55228 21.5523 7 21 7H3C2.44772 7 2 6.55228 2 6Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 12C8 11.4477 8.44772 11 9 11H21C21.5523 11 22 11.4477 22 12C22 12.5523 21.5523 13 21 13H9C8.44772 13 8 12.5523 8 12Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 18C6 17.4477 6.44772 17 7 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19H7C6.44772 19 6 18.5523 6 18Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nAlignRightIcon.displayName = \"AlignRightIcon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport type { ChainedCommands } from \"@tiptap/react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport {\n isExtensionAvailable,\n isNodeTypeSelected,\n} from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { AlignCenterIcon } from \"../../tiptap-icons/align-center-icon\"\nimport { AlignJustifyIcon } from \"../../tiptap-icons/align-justify-icon\"\nimport { AlignLeftIcon } from \"../../tiptap-icons/align-left-icon\"\nimport { AlignRightIcon } from \"../../tiptap-icons/align-right-icon\"\n\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\"\n\n/**\n * Configuration for the text align functionality\n */\nexport interface UseTextAlignConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The text alignment to apply.\n */\n align: TextAlign\n /**\n * Whether the button should hide when alignment is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful alignment change.\n */\n onAligned?: () => void\n}\n\nexport const TEXT_ALIGN_SHORTCUT_KEYS: Record<TextAlign, string> = {\n left: \"mod+shift+l\",\n center: \"mod+shift+e\",\n right: \"mod+shift+r\",\n justify: \"mod+shift+j\",\n}\n\nexport const textAlignIcons = {\n left: AlignLeftIcon,\n center: AlignCenterIcon,\n right: AlignRightIcon,\n justify: AlignJustifyIcon,\n}\n\nexport const textAlignLabels: Record<TextAlign, string> = {\n left: \"左对齐\",\n center: \"居中对齐\",\n right: \"右对齐\",\n justify: \"两端对齐\",\n}\n\n/**\n * Checks if text alignment can be performed in the current editor state\n */\nexport function canSetTextAlign(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (\n !isExtensionAvailable(editor, \"textAlign\") ||\n isNodeTypeSelected(editor, [\"image\", \"horizontalRule\"])\n )\n return false\n\n return editor.can().setTextAlign(align)\n}\n\nexport function hasSetTextAlign(\n commands: ChainedCommands\n): commands is ChainedCommands & {\n setTextAlign: (align: TextAlign) => ChainedCommands\n} {\n return \"setTextAlign\" in commands\n}\n\n/**\n * Checks if the text alignment is currently active\n */\nexport function isTextAlignActive(\n editor: Editor | null,\n align: TextAlign\n): boolean {\n if (!editor || !editor.isEditable) return false\n return editor.isActive({ textAlign: align })\n}\n\n/**\n * Sets text alignment in the editor\n */\nexport function setTextAlign(editor: Editor | null, align: TextAlign): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canSetTextAlign(editor, align)) return false\n\n const chain = editor.chain().focus()\n if (hasSetTextAlign(chain)) {\n return chain.setTextAlign(align).run()\n }\n\n return false\n}\n\n/**\n * Determines if the text align button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n align: TextAlign\n}): boolean {\n const { editor, hideWhenUnavailable, align } = props\n\n if (!editor || !editor.isEditable) return false\n if (!isExtensionAvailable(editor, \"textAlign\")) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canSetTextAlign(editor, align)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides text align functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleAlignButton() {\n * const { isVisible, handleTextAlign } = useTextAlign({ align: \"center\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleTextAlign}>Align Center</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedAlignButton() {\n * const { isVisible, handleTextAlign, label, isActive } = useTextAlign({\n * editor: myEditor,\n * align: \"right\",\n * hideWhenUnavailable: true,\n * onAligned: () => console.log('Text aligned!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleTextAlign}\n * aria-pressed={isActive}\n * aria-label={label}\n * >\n * Align Right\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useTextAlign(config: UseTextAlignConfig) {\n const {\n editor: providedEditor,\n align,\n hideWhenUnavailable = false,\n onAligned,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canAlign = canSetTextAlign(editor, align)\n const isActive = isTextAlignActive(editor, align)\n\n useEffect(() => {\n if (!editor) return\n\n const handleSelectionUpdate = () => {\n setIsVisible(shouldShowButton({ editor, align, hideWhenUnavailable }))\n }\n\n handleSelectionUpdate()\n\n editor.on(\"selectionUpdate\", handleSelectionUpdate)\n\n return () => {\n editor.off(\"selectionUpdate\", handleSelectionUpdate)\n }\n }, [editor, hideWhenUnavailable, align])\n\n const handleTextAlign = useCallback(() => {\n if (!editor) return false\n\n const success = setTextAlign(editor, align)\n if (success) {\n onAligned?.()\n }\n return success\n }, [editor, align, onAligned])\n\n return {\n isVisible,\n isActive,\n handleTextAlign,\n canAlign,\n label: textAlignLabels[align],\n shortcutKeys: TEXT_ALIGN_SHORTCUT_KEYS[align],\n Icon: textAlignIcons[align],\n }\n}\n","\"use client\"\n\nimport { forwardRef, useCallback } from \"react\"\n\n// --- Lib ---\nimport { parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Tiptap UI ---\nimport type {\n UndoRedoAction,\n UseUndoRedoConfig,\n} from \".\"\nimport {\n UNDO_REDO_SHORTCUT_KEYS,\n useUndoRedo,\n} from \".\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../tiptap-ui-primitive/button\"\nimport { Button } from \"../../tiptap-ui-primitive/button\"\nimport { Badge } from \"../../tiptap-ui-primitive/badge\"\n\nexport interface UndoRedoButtonProps\n extends Omit<ButtonProps, \"type\">,\n UseUndoRedoConfig {\n /**\n * Optional text to display alongside the icon.\n */\n text?: string\n /**\n * Optional show shortcut keys in the button.\n * @default false\n */\n showShortcut?: boolean\n}\n\nexport function HistoryShortcutBadge({\n action,\n shortcutKeys = UNDO_REDO_SHORTCUT_KEYS[action],\n}: {\n action: UndoRedoAction\n shortcutKeys?: string\n}) {\n return <Badge>{parseShortcutKeys({ shortcutKeys })}</Badge>\n}\n\n/**\n * Button component for triggering undo/redo actions in a Tiptap editor.\n *\n * For custom button implementations, use the `useHistory` hook instead.\n */\nexport const UndoRedoButton = forwardRef<\n HTMLButtonElement,\n UndoRedoButtonProps\n>(\n (\n {\n editor: providedEditor,\n action,\n text,\n hideWhenUnavailable = false,\n onExecuted,\n showShortcut = false,\n onClick,\n children,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { isVisible, handleAction, label, canExecute, Icon, shortcutKeys } =\n useUndoRedo({\n editor,\n action,\n hideWhenUnavailable,\n onExecuted,\n })\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n handleAction()\n },\n [handleAction, onClick]\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Button\n type=\"button\"\n disabled={!canExecute}\n data-style=\"ghost\"\n data-disabled={!canExecute}\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n tooltip={label}\n onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children ?? (\n <>\n <Icon className=\"tiptap-button-icon\" />\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n {showShortcut && (\n <HistoryShortcutBadge\n action={action}\n shortcutKeys={shortcutKeys}\n />\n )}\n </>\n )}\n </Button>\n )\n }\n)\n\nUndoRedoButton.displayName = \"UndoRedoButton\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Redo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15.7071 2.29289C15.3166 1.90237 14.6834 1.90237 14.2929 2.29289C13.9024 2.68342 13.9024 3.31658 14.2929 3.70711L17.5858 7H9.5C7.77609 7 6.12279 7.68482 4.90381 8.90381C3.68482 10.1228 3 11.7761 3 13.5C3 14.3536 3.16813 15.1988 3.49478 15.9874C3.82144 16.7761 4.30023 17.4926 4.90381 18.0962C6.12279 19.3152 7.77609 20 9.5 20H13C13.5523 20 14 19.5523 14 19C14 18.4477 13.5523 18 13 18H9.5C8.30653 18 7.16193 17.5259 6.31802 16.682C5.90016 16.2641 5.56869 15.768 5.34254 15.2221C5.1164 14.6761 5 14.0909 5 13.5C5 12.3065 5.47411 11.1619 6.31802 10.318C7.16193 9.47411 8.30653 9 9.5 9H17.5858L14.2929 12.2929C13.9024 12.6834 13.9024 13.3166 14.2929 13.7071C14.6834 14.0976 15.3166 14.0976 15.7071 13.7071L20.7071 8.70711C21.0976 8.31658 21.0976 7.68342 20.7071 7.29289L15.7071 2.29289Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nRedo2Icon.displayName = \"Redo2Icon\"\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const Undo2Icon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.70711 3.70711C10.0976 3.31658 10.0976 2.68342 9.70711 2.29289C9.31658 1.90237 8.68342 1.90237 8.29289 2.29289L3.29289 7.29289C2.90237 7.68342 2.90237 8.31658 3.29289 8.70711L8.29289 13.7071C8.68342 14.0976 9.31658 14.0976 9.70711 13.7071C10.0976 13.3166 10.0976 12.6834 9.70711 12.2929L6.41421 9H14.5C15.0909 9 15.6761 9.1164 16.2221 9.34254C16.768 9.56869 17.2641 9.90016 17.682 10.318C18.0998 10.7359 18.4313 11.232 18.6575 11.7779C18.8836 12.3239 19 12.9091 19 13.5C19 14.0909 18.8836 14.6761 18.6575 15.2221C18.4313 15.768 18.0998 16.2641 17.682 16.682C17.2641 17.0998 16.768 17.4313 16.2221 17.6575C15.6761 17.8836 15.0909 18 14.5 18H11C10.4477 18 10 18.4477 10 19C10 19.5523 10.4477 20 11 20H14.5C15.3536 20 16.1988 19.8319 16.9874 19.5052C17.7761 19.1786 18.4926 18.6998 19.0962 18.0962C19.6998 17.4926 20.1786 16.7761 20.5052 15.9874C20.8319 15.1988 21 14.3536 21 13.5C21 12.6464 20.8319 11.8012 20.5052 11.0126C20.1786 10.2239 19.6998 9.50739 19.0962 8.90381C18.4926 8.30022 17.7761 7.82144 16.9874 7.49478C16.1988 7.16813 15.3536 7 14.5 7H6.41421L9.70711 3.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nUndo2Icon.displayName = \"Undo2Icon\"\n","import { useCallback, useEffect, useState } from \"react\"\nimport { type Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../../hooks/use-tiptap-editor\"\n\n// --- Lib ---\nimport { isNodeTypeSelected } from \"../../../lib/tiptap-utils\"\n\n// --- Icons ---\nimport { Redo2Icon } from \"../../tiptap-icons/redo2-icon\"\nimport { Undo2Icon } from \"../../tiptap-icons/undo2-icon\"\n\nexport type UndoRedoAction = \"undo\" | \"redo\"\n\n/**\n * Configuration for the history functionality\n */\nexport interface UseUndoRedoConfig {\n /**\n * The Tiptap editor instance.\n */\n editor?: Editor | null\n /**\n * The history action to perform (undo or redo).\n */\n action: UndoRedoAction\n /**\n * Whether the button should hide when action is not available.\n * @default false\n */\n hideWhenUnavailable?: boolean\n /**\n * Callback function called after a successful action execution.\n */\n onExecuted?: () => void\n}\n\nexport const UNDO_REDO_SHORTCUT_KEYS: Record<UndoRedoAction, string> = {\n undo: \"mod+z\",\n redo: \"mod+shift+z\",\n}\n\nexport const historyActionLabels: Record<UndoRedoAction, string> = {\n undo: '撤销',\n redo: '重做'\n}\n\nexport const historyIcons = {\n undo: Undo2Icon,\n redo: Redo2Icon,\n}\n\n/**\n * Checks if a history action can be executed\n */\nexport function canExecuteUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (isNodeTypeSelected(editor, [\"image\"])) return false\n\n return action === \"undo\" ? editor.can().undo() : editor.can().redo()\n}\n\n/**\n * Executes a history action on the editor\n */\nexport function executeUndoRedoAction(\n editor: Editor | null,\n action: UndoRedoAction\n): boolean {\n if (!editor || !editor.isEditable) return false\n if (!canExecuteUndoRedoAction(editor, action)) return false\n\n const chain = editor.chain().focus()\n return action === \"undo\" ? chain.undo().run() : chain.redo().run()\n}\n\n/**\n * Determines if the history button should be shown\n */\nexport function shouldShowButton(props: {\n editor: Editor | null\n hideWhenUnavailable: boolean\n action: UndoRedoAction\n}): boolean {\n const { editor, hideWhenUnavailable, action } = props\n\n if (!editor || !editor.isEditable) return false\n\n if (hideWhenUnavailable && !editor.isActive(\"code\")) {\n return canExecuteUndoRedoAction(editor, action)\n }\n\n return true\n}\n\n/**\n * Custom hook that provides history functionality for Tiptap editor\n *\n * @example\n * ```tsx\n * // Simple usage\n * function MySimpleUndoButton() {\n * const { isVisible, handleAction } = useHistory({ action: \"undo\" })\n *\n * if (!isVisible) return null\n *\n * return <button onClick={handleAction}>Undo</button>\n * }\n *\n * // Advanced usage with configuration\n * function MyAdvancedRedoButton() {\n * const { isVisible, handleAction, label } = useHistory({\n * editor: myEditor,\n * action: \"redo\",\n * hideWhenUnavailable: true,\n * onExecuted: () => console.log('Action executed!')\n * })\n *\n * if (!isVisible) return null\n *\n * return (\n * <MyButton\n * onClick={handleAction}\n * aria-label={label}\n * >\n * Redo\n * </MyButton>\n * )\n * }\n * ```\n */\nexport function useUndoRedo(config: UseUndoRedoConfig) {\n const {\n editor: providedEditor,\n action,\n hideWhenUnavailable = false,\n onExecuted,\n } = config\n\n const { editor } = useTiptapEditor(providedEditor)\n const [isVisible, setIsVisible] = useState<boolean>(true)\n const canExecute = canExecuteUndoRedoAction(editor, action)\n\n useEffect(() => {\n if (!editor) return\n\n const handleUpdate = () => {\n setIsVisible(shouldShowButton({ editor, hideWhenUnavailable, action }))\n }\n\n handleUpdate()\n\n editor.on(\"transaction\", handleUpdate)\n\n return () => {\n editor.off(\"transaction\", handleUpdate)\n }\n }, [editor, hideWhenUnavailable, action])\n\n const handleAction = useCallback(() => {\n if (!editor) return false\n\n const success = executeUndoRedoAction(editor, action)\n if (success) {\n onExecuted?.()\n }\n return success\n }, [editor, action, onExecuted])\n\n return {\n isVisible,\n handleAction,\n canExecute,\n label: historyActionLabels[action],\n shortcutKeys: UNDO_REDO_SHORTCUT_KEYS[action],\n Icon: historyIcons[action],\n }\n}\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const ArrowLeftIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M12.7071 5.70711C13.0976 5.31658 13.0976 4.68342 12.7071 4.29289C12.3166 3.90237 11.6834 3.90237 11.2929 4.29289L4.29289 11.2929C3.90237 11.6834 3.90237 12.3166 4.29289 12.7071L11.2929 19.7071C11.6834 20.0976 12.3166 20.0976 12.7071 19.7071C13.0976 19.3166 13.0976 18.6834 12.7071 18.2929L7.41421 13L19 13C19.5523 13 20 12.5523 20 12C20 11.4477 19.5523 11 19 11L7.41421 11L12.7071 5.70711Z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n})\n\nArrowLeftIcon.displayName = \"ArrowLeftIcon\"\n","import { useEffect, useRef } from 'react'\n\n/**\n * Hook that executes a callback when the component unmounts.\n *\n * @param callback Function to be called on component unmount\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useUnmount = (callback: (...args: Array<any>) => any) => {\n const ref = useRef(callback)\n ref.current = callback\n\n useEffect(\n () => () => {\n ref.current()\n },\n []\n )\n}\n\nexport default useUnmount\n","import throttle from 'lodash.throttle'\n\nimport { useMemo } from 'react'\nimport { useUnmount } from './use-unmount'\n\ninterface ThrottleSettings {\n leading?: boolean | undefined\n trailing?: boolean | undefined\n}\n\nconst defaultOptions: ThrottleSettings = {\n leading: false,\n trailing: true\n}\n\n/**\n * A hook that returns a throttled callback function.\n *\n * @param fn The function to throttle\n * @param wait The time in ms to wait before calling the function\n * @param dependencies The dependencies to watch for changes\n * @param options The throttle options\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useThrottledCallback<T extends (...args: any[]) => any>(\n fn: T,\n wait = 250,\n dependencies: React.DependencyList = [],\n options: ThrottleSettings = defaultOptions\n): {\n (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n flush: () => void\n} {\n const handler = useMemo(() => throttle<T>(fn, wait, options), dependencies)\n\n useUnmount(() => {\n handler.cancel()\n })\n\n return handler\n}\n\nexport default useThrottledCallback\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { useThrottledCallback } from './use-throttled-callback'\n\nexport type RectState = Omit<DOMRect, 'toJSON'>\n\nexport interface ElementRectOptions {\n /**\n * The element to track. Can be an Element, ref, or selector string.\n * Defaults to document.body if not provided.\n */\n element?: Element | React.RefObject<Element> | string | null\n /**\n * Whether to enable rect tracking\n */\n enabled?: boolean\n /**\n * Throttle delay in milliseconds for rect updates\n */\n throttleMs?: number\n /**\n * Whether to use ResizeObserver for more accurate tracking\n */\n useResizeObserver?: boolean\n}\n\nconst initialRect: RectState = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n}\n\nconst isSSR = typeof window === 'undefined'\nconst hasResizeObserver = !isSSR && typeof ResizeObserver !== 'undefined'\n\n/**\n * Helper function to check if code is running on client side\n */\nconst isClientSide = (): boolean => !isSSR\n\n/**\n * Custom hook that tracks an element's bounding rectangle and updates on resize, scroll, etc.\n *\n * @param options Configuration options for element rect tracking\n * @returns The current bounding rectangle of the element\n */\nexport function useElementRect({ element, enabled = true, throttleMs = 100, useResizeObserver = true }: ElementRectOptions = {}): RectState {\n const [rect, setRect] = useState<RectState>(initialRect)\n\n const getTargetElement = useCallback((): Element | null => {\n if (!enabled || !isClientSide()) return null\n\n if (!element) {\n return document.body\n }\n\n if (typeof element === 'string') {\n return document.querySelector(element)\n }\n\n if ('current' in element) {\n return element.current\n }\n\n return element\n }, [element, enabled])\n\n const updateRect = useThrottledCallback(\n () => {\n if (!enabled || !isClientSide()) return\n\n const targetElement = getTargetElement()\n if (!targetElement) {\n setRect(initialRect)\n return\n }\n\n const newRect = targetElement.getBoundingClientRect()\n setRect({\n x: newRect.x,\n y: newRect.y,\n width: newRect.width,\n height: newRect.height,\n top: newRect.top,\n right: newRect.right,\n bottom: newRect.bottom,\n left: newRect.left\n })\n },\n throttleMs,\n [enabled, getTargetElement],\n { leading: true, trailing: true }\n )\n\n useEffect(() => {\n if (!enabled || !isClientSide()) {\n setRect(initialRect)\n return\n }\n\n const targetElement = getTargetElement()\n if (!targetElement) return\n\n updateRect()\n\n const cleanup: (() => void)[] = []\n\n if (useResizeObserver && hasResizeObserver) {\n const resizeObserver = new ResizeObserver(() => {\n window.requestAnimationFrame(updateRect)\n })\n resizeObserver.observe(targetElement)\n cleanup.push(() => resizeObserver.disconnect())\n }\n\n const handleUpdate = () => updateRect()\n\n window.addEventListener('scroll', handleUpdate, true)\n window.addEventListener('resize', handleUpdate, true)\n\n cleanup.push(() => {\n window.removeEventListener('scroll', handleUpdate)\n window.removeEventListener('resize', handleUpdate)\n })\n\n return () => {\n cleanup.forEach((fn) => fn())\n setRect(initialRect)\n }\n }, [enabled, getTargetElement, updateRect, useResizeObserver])\n\n return rect\n}\n\n/**\n * Convenience hook for tracking document.body rect\n */\nexport function useBodyRect(options: Omit<ElementRectOptions, 'element'> = {}): RectState {\n return useElementRect({\n ...options,\n element: isClientSide() ? document.body : null\n })\n}\n\n/**\n * Convenience hook for tracking a ref element's rect\n */\nexport function useRefRect<T extends Element>(ref: React.RefObject<T>, options: Omit<ElementRectOptions, 'element'> = {}): RectState {\n return useElementRect({ ...options, element: ref })\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { useThrottledCallback } from './use-throttled-callback'\n\nexport interface WindowSizeState {\n /**\n * The width of the window's visual viewport in pixels.\n */\n width: number\n /**\n * The height of the window's visual viewport in pixels.\n */\n height: number\n /**\n * The distance from the top of the visual viewport to the top of the layout viewport.\n * Particularly useful for handling mobile keyboard appearance.\n */\n offsetTop: number\n /**\n * The distance from the left of the visual viewport to the left of the layout viewport.\n */\n offsetLeft: number\n /**\n * The scale factor of the visual viewport.\n * This is useful for scaling elements based on the current zoom level.\n */\n scale: number\n}\n\n/**\n * Hook that tracks the window's visual viewport dimensions, position, and provides\n * a CSS transform for positioning elements.\n *\n * Uses the Visual Viewport API to get accurate measurements, especially important\n * for mobile devices where virtual keyboards can change the visible area.\n * Only updates state when values actually change to optimize performance.\n *\n * @returns An object containing viewport properties and a CSS transform string\n */\nexport function useWindowSize(): WindowSizeState {\n const [windowSize, setWindowSize] = useState<WindowSizeState>({\n width: 0,\n height: 0,\n offsetTop: 0,\n offsetLeft: 0,\n scale: 0\n })\n\n const handleViewportChange = useThrottledCallback(() => {\n if (typeof window === 'undefined') return\n\n const vp = window.visualViewport\n if (!vp) return\n\n const { width = 0, height = 0, offsetTop = 0, offsetLeft = 0, scale = 0 } = vp\n\n setWindowSize((prevState) => {\n if (\n width === prevState.width &&\n height === prevState.height &&\n offsetTop === prevState.offsetTop &&\n offsetLeft === prevState.offsetLeft &&\n scale === prevState.scale\n ) {\n return prevState\n }\n\n return { width, height, offsetTop, offsetLeft, scale }\n })\n }, 200)\n\n useEffect(() => {\n const visualViewport = window.visualViewport\n if (!visualViewport) return\n\n visualViewport.addEventListener('resize', handleViewportChange)\n\n handleViewportChange()\n\n return () => {\n visualViewport.removeEventListener('resize', handleViewportChange)\n }\n }, [handleViewportChange])\n\n return windowSize\n}\n","import type { Editor } from '@tiptap/react'\nimport { useEffect } from 'react'\nimport { useBodyRect } from './use-element-rect'\nimport { useWindowSize } from './use-window-size'\n\nexport interface CursorVisibilityOptions {\n /**\n * The Tiptap editor instance\n */\n editor?: Editor | null\n /**\n * Reference to the toolbar element that may obscure the cursor\n */\n overlayHeight?: number\n}\n\n/**\n * Custom hook that ensures the cursor remains visible when typing in a Tiptap editor.\n * Automatically scrolls the window when the cursor would be hidden by the toolbar.\n *\n * @param options.editor The Tiptap editor instance\n * @param options.overlayHeight Toolbar height to account for\n * @returns The bounding rect of the body\n */\nexport function useCursorVisibility({ editor, overlayHeight = 0 }: CursorVisibilityOptions) {\n const { height: windowHeight } = useWindowSize()\n const rect = useBodyRect({\n enabled: true,\n throttleMs: 100,\n useResizeObserver: true\n })\n\n useEffect(() => {\n const ensureCursorVisibility = () => {\n if (!editor) return\n\n const { state, view } = editor\n if (!view.hasFocus()) return\n\n // Get current cursor position coordinates\n const { from } = state.selection\n const cursorCoords = view.coordsAtPos(from)\n\n if (windowHeight < rect.height && cursorCoords) {\n const availableSpace = windowHeight - cursorCoords.top\n\n // If the cursor is hidden behind the overlay or offscreen, scroll it into view\n if (availableSpace < overlayHeight) {\n const targetCursorY = Math.max(windowHeight / 2, overlayHeight)\n const currentScrollY = window.scrollY\n const cursorAbsoluteY = cursorCoords.top + currentScrollY\n const newScrollY = cursorAbsoluteY - targetCursorY\n\n window.scrollTo({\n top: Math.max(0, newScrollY),\n behavior: 'smooth'\n })\n }\n }\n }\n\n ensureCursorVisibility()\n }, [editor, overlayHeight, windowHeight, rect.height])\n\n return rect\n}\n","import { Form, Input, Modal } from 'antd'\n\nconst { TextArea } = Input\n\nexport interface AnnotationModalProps {\n visible: boolean\n onCancel: () => void\n onConfirm: (content: string) => void\n}\n\nexport default ({ visible, onCancel, onConfirm }: AnnotationModalProps) => {\n const [form] = Form.useForm()\n // const inputRef = useRef<TextAreaRef>()\n\n const handleOk = async () => {\n const values = await form.validateFields()\n onConfirm(values.content.trim())\n onCancel()\n }\n // useEffect(() => {\n // setTimeout(() => {\n // inputRef.current.focus({\n // cursor: 'end'\n // })\n // }, 0)\n // }, [])\n return (\n <Modal title=\"添加批注\" open={visible} onOk={handleOk} onCancel={onCancel} destroyOnHidden okText=\"确定\" cancelText=\"取消\">\n <Form form={form} layout=\"vertical\">\n <Form.Item\n name=\"content\"\n label=\"批注内容\"\n rules={[\n { whitespace: true, required: true, message: '请输入批注内容' },\n { max: 500, message: '批注内容不能超过500个字符' }\n ]}\n >\n <TextArea rows={4} placeholder=\"请输入您的批注内容...\" showCount maxLength={500} />\n </Form.Item>\n </Form>\n </Modal>\n )\n}\n","export const ANNOTATION_KEY = 'annotation'\n\nexport const ANNOTATION_ATTRS = ['annotation-id', 'user-name', 'user-id', 'update-time', 'content'] as const\n\n/**\n * 批注功能配置\n */\nexport interface AnnotationsProps {\n /** 是否启用批注功能,默认为false */\n enabled: boolean\n /** 当前用户 */\n user: {\n id: string\n name: string\n }\n /** 是否显示批注列表,默认为true */\n showList?: boolean\n /** 受控属性:批注列表是否可见 */\n visible?: boolean\n /** 受控属性:批注列表可见性改变回调 */\n onVisibleChange?: (visible: boolean) => void\n}\n","/* 批注样式 */\n.annotations {\n margin-top: 8px;\n}\n.annotations .annotationItem {\n cursor: pointer;\n padding-left: 20px;\n padding-right: 20px;\n}\n.annotations .annotationItem:hover {\n background-color: #fafafa;\n}\n.annotations .annotationItem.annotationItemSelected {\n background-color: #e6f7ff;\n border-left: 3px solid var(--ant-primary-color);\n}\n","import { CloseOutlined, DeleteOutlined, EditOutlined, MessageOutlined } from '@ant-design/icons'\nimport { Button, Card, Empty, Flex, Form, Input, List, Popconfirm, Space, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { formatDate } from '../../../utils'\nimport { AnnotationType } from './AnnotationPlugin'\nimport { ANNOTATION_ATTRS, AnnotationsProps } from './constant'\nimport styles from './styles.module.less'\n\nconst { TextArea } = Input\nconst { Text } = Typography\n/**\n * 批注功能配置接口\n */\nexport interface AnnotationConfig extends AnnotationsProps {\n getContainer?: () => HTMLElement | null\n}\n\nexport interface AnnotationSidebarProps {\n disabled?: boolean\n annotations: AnnotationType[]\n selectedAnnotationId?: string\n handleSelectAnnotation?: (id?: string) => void\n onEditAnnotation: (id: string, content: string) => void\n onDeleteAnnotation: (id: string) => void\n annotationConfig?: AnnotationConfig\n onClose?: () => void\n}\n\nexport default ({\n disabled,\n annotations,\n selectedAnnotationId,\n handleSelectAnnotation,\n onEditAnnotation,\n onDeleteAnnotation,\n annotationConfig,\n onClose\n}: AnnotationSidebarProps) => {\n const [form] = Form.useForm()\n const [editingId, setEditingId] = useState<string>()\n const itemRefs = useRef<Record<string, HTMLDivElement | null>>({})\n /**\n * 开始编辑批注\n * @param annotation - 要编辑的批注数据\n */\n const handleEdit = (annotation: AnnotationType) => {\n setEditingId(annotation[ANNOTATION_ATTRS[0]])\n form.setFieldsValue({ content: annotation.content })\n }\n\n /**\n * 取消编辑批注\n */\n const handleCancelEdit = () => {\n setEditingId(undefined)\n }\n\n /**\n * 保存编辑的批注内容\n */\n const handleSaveEdit = async () => {\n const values = await form.validateFields()\n onEditAnnotation(editingId, values.content)\n handleCancelEdit()\n }\n useEffect(() => {\n handleCancelEdit()\n if (selectedAnnotationId) {\n const element = itemRefs.current[selectedAnnotationId]\n element?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n }, [selectedAnnotationId])\n const sidebarContent = (\n <Card\n size=\"small\"\n styles={{\n header: {\n height: '44px'\n }\n }}\n className=\"full-card no-padding-card extra-sidebar\"\n title={\n <Flex justify=\"space-between\" align=\"center\">\n <Space>\n <MessageOutlined />\n <span>批注{annotations.length > 0 && `(${annotations.length})`}</span>\n </Space>\n <Button type=\"text\" size=\"small\" icon={<CloseOutlined />} onClick={onClose} />\n </Flex>\n }\n variant=\"borderless\"\n >\n {annotations.length > 0 ? (\n <List\n className={classNames(styles.annotations, 'height-full', 'scroll-fade-in')}\n dataSource={annotations}\n renderItem={(annotation) => (\n <List.Item\n ref={(el) => {\n itemRefs.current[annotation[ANNOTATION_ATTRS[0]]] = el\n }}\n className={classNames(styles.annotationItem, {\n [styles.annotationItemSelected]: annotation[ANNOTATION_ATTRS[0]] === selectedAnnotationId\n })}\n onClick={() => {\n handleSelectAnnotation(annotation[ANNOTATION_ATTRS[0]])\n }}\n >\n <Flex vertical gap={8} flex={1}>\n <Flex gap={8} justify=\"space-between\" className={styles.annotationMeta}>\n <Text strong type=\"secondary\">\n {annotation['user-name']}\n </Text>\n <Text type=\"secondary\">{formatDate(annotation['update-time'])}</Text>\n </Flex>\n\n {!disabled &&\n (editingId === annotation[ANNOTATION_ATTRS[0]] ? (\n <Flex vertical>\n <Form form={form}>\n <Form.Item\n name=\"content\"\n rules={[\n { whitespace: true, required: true, message: '请输入批注内容' },\n { max: 500, message: '批注内容不能超过500个字符' }\n ]}\n >\n <TextArea autoFocus rows={2} placeholder=\"请输入您的批注内容...\" showCount maxLength={500} />\n </Form.Item>\n </Form>\n <Space>\n <Button size=\"small\" type=\"primary\" onClick={handleSaveEdit}>\n 保存\n </Button>\n <Button size=\"small\" onClick={handleCancelEdit}>\n 取消\n </Button>\n </Space>\n </Flex>\n ) : (\n <Flex gap={8} vertical>\n <Text>{annotation.content}</Text>\n {/* 只有当选中该项时才显示编辑删除按钮 */}\n {/* annotation['user-id'] === annotationConfig?.user */}\n {selectedAnnotationId === annotation[ANNOTATION_ATTRS[0]] && (\n <Space>\n <Button\n type=\"text\"\n size=\"small\"\n title=\"编辑批注\"\n icon={<EditOutlined />}\n onClick={(e) => {\n handleEdit(annotation)\n }}\n />\n <Popconfirm\n title=\"提示\"\n okText=\"确定\"\n cancelText=\"取消\"\n description=\"确认删除当前批注吗?\"\n onConfirm={() => onDeleteAnnotation(annotation[ANNOTATION_ATTRS[0]])}\n >\n <Button type=\"text\" size=\"small\" title=\"删除批注\" icon={<DeleteOutlined />} />\n </Popconfirm>\n </Space>\n )}\n </Flex>\n ))}\n </Flex>\n </List.Item>\n )}\n />\n ) : (\n <Empty className=\"m-t-24\" description=\"暂无批注\" />\n )}\n </Card>\n )\n\n // 如果没有指定getContainer,直接返回组件\n const container = annotationConfig?.getContainer?.()\n if (!container) {\n return sidebarContent\n }\n\n return createPortal(sidebarContent, container)\n}\n","import { Mark, mergeAttributes } from '@tiptap/core'\n\nexport const createHtmlMark = (markName: string, ATTRS: readonly string[], classNames: string) => {\n return Mark.create({\n name: markName,\n\n priority: 1000, // 高优先级确保收录不会被其他marks覆盖\n excludes: '', // 允许相同类型 mark 叠加\n inclusive: false, // 让光标到达末尾时也认为 mark 是可激活的\n exitable: true, // 允许光标从 mark 内部移动到 mark 外并保持编辑行为\n spanning: true, // 允许 mark 跨越多个节点\n\n addAttributes() {\n return ATTRS.reduce((acc, key) => ({ ...acc, [key]: { default: null } }), {})\n },\n\n parseHTML() {\n return [\n {\n tag: `div[${ATTRS[0]}]`,\n getAttrs: (dom) => ATTRS.reduce((acc, key) => ({ ...acc, [key]: dom.getAttribute(key) }), {})\n }\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = ATTRS.reduce((acc, key) => ({ ...acc, [key]: HTMLAttributes[key] }), {})\n return [\n 'div',\n mergeAttributes(attrs, {\n class: classNames\n }),\n 0\n ]\n },\n\n renderMarkdown(node, helpers) {\n // console.log('renderMarkdown', node)\n const text = helpers.renderChildren(node.content || [])\n const attrs = ATTRS.reduce((acc, key) => `${acc} ${key}=\"${node.attrs[key]}\"`, '')\n // 输出为div标签(Markdown支持HTML)\n return `<div ${attrs}>${text}</div>`\n }\n })\n}\n","import { createHtmlMark } from '../common/HtmlMark'\nimport { ANNOTATION_ATTRS, ANNOTATION_KEY } from './constant'\n/**\n * 批注Mark扩展\n * 用于在文档中标记批注内容,提供视觉高亮效果\n */\nexport const AnnotationMark = createHtmlMark(ANNOTATION_KEY, ANNOTATION_ATTRS as readonly string[], 'editor-annotation')\n","import { Editor } from '@tiptap/core'\nimport { Mark, Node as ProsemirrorNode } from '@tiptap/pm/model'\n\ninterface MarkRange {\n mark: Mark\n from: number\n to: number\n}\n\n/**\n * 查找文档中所有匹配的 Mark 片段\n * @param doc ProseMirror 文档节点\n * @param markType Mark 类型名称\n * @param predicate 过滤条件\n * @param from 起始位置 (可选)\n * @param to 结束位置 (可选)\n */\nexport function findMarkRanges(doc: ProsemirrorNode, markType: string, predicate: (mark: Mark) => boolean, from?: number, to?: number): MarkRange[] {\n const ranges: MarkRange[] = []\n\n const callback = (node: ProsemirrorNode, pos: number) => {\n node.marks.forEach((mark) => {\n if (mark.type.name === markType && predicate(mark)) {\n ranges.push({ mark, from: pos, to: pos + node.nodeSize })\n }\n })\n }\n\n if (from !== undefined && to !== undefined) {\n doc.nodesBetween(from, to, callback)\n } else {\n doc.descendants(callback)\n }\n\n return ranges\n}\n\n/**\n * 提取 Mark 属性\n */\nfunction getMarkAttributes(mark: Mark, attributes: readonly string[]) {\n return attributes.reduce((acc, key) => ({ ...acc, [key]: mark.attrs[key] }), {} as any)\n}\n\n/**\n * 根据 ID 删除 Mark\n * @param editor Tiptap Editor 实例\n * @param markType Mark 类型名称\n * @param idAttr ID 属性名\n * @param id 要删除的 Mark ID\n * @returns 是否有变更\n */\nexport function removeMarkById(editor: Editor, markType: string, idAttr: string, id: string): boolean {\n if (!editor) return false\n\n const { tr } = editor.state\n const ranges = findMarkRanges(editor.state.doc, markType, (mark) => mark.attrs[idAttr] === id)\n\n if (ranges.length === 0) return false\n\n ranges.forEach(({ from, to, mark }) => {\n tr.removeMark(from, to, mark.type)\n })\n\n editor.view.dispatch(tr)\n return true\n}\n\n/**\n * 根据 ID 更新 Mark 属性\n * @param editor Tiptap Editor 实例\n * @param markType Mark 类型名称\n * @param idAttr ID 属性名\n * @param id 要更新的 Mark ID\n * @param newAttrs 新的属性对象(会与旧属性合并)\n * @returns 是否有变更\n */\nexport function updateMarkById(editor: Editor, markType: string, idAttr: string, id: string, newAttrs: Record<string, any>): boolean {\n if (!editor) return false\n\n const { state, view } = editor\n const tr = state.tr\n const schemaMarkType = state.schema.marks[markType]\n\n if (!schemaMarkType) return false\n\n const ranges = findMarkRanges(state.doc, markType, (mark) => mark.attrs[idAttr] === id)\n\n if (ranges.length === 0) return false\n\n ranges.forEach(({ from, to, mark }) => {\n // 移除旧标记\n tr.removeMark(from, to, schemaMarkType)\n\n // 添加新标记(覆盖属性)\n tr.addMark(\n from,\n to,\n schemaMarkType.create({\n ...mark.attrs,\n ...newAttrs\n })\n )\n })\n\n view.dispatch(tr)\n return true\n}\n\n/**\n * 从文档中查找指定类型的 Mark,并聚合为列表\n * @param doc ProseMirror 文档节点\n * @param markType Mark 类型名称\n * @param attributes 需要提取的属性列表\n * @param idAttributeIndex ID 属性在 attributes 中的索引\n * @returns 聚合后的 Mark 数据列表\n */\nexport function getMarkItems<T extends { from: number; to: number; text?: string }>(\n doc: ProsemirrorNode,\n markType: string,\n attributes: readonly string[],\n idAttributeIndex: number = 0\n): T[] {\n const items: T[] = []\n const spanMap = new Map<string, T>()\n\n const ranges = findMarkRanges(doc, markType, () => true)\n\n ranges.forEach(({ mark, from, to }) => {\n const id = mark.attrs[attributes[idAttributeIndex]]\n\n if (spanMap.has(id)) {\n const existing = spanMap.get(id)!\n // expand range 如果新的片段紧邻或重叠\n existing.from = Math.min(existing.from, from)\n existing.to = Math.max(existing.to, to)\n existing.text = doc.textBetween(existing.from, existing.to)\n } else {\n const attrs = getMarkAttributes(mark, attributes)\n\n spanMap.set(id, {\n ...attrs,\n from,\n to,\n text: doc.textBetween(from, to)\n } as T)\n }\n })\n\n // Map → 数组\n for (const [, data] of spanMap) {\n items.push(data)\n }\n\n return items\n}\n\n/**\n * 在文档中查找指定 ID 的 Mark 的位置\n * @param doc ProseMirror 文档节点\n * @param markType Mark 类型名称\n * @param idAttr ID 属性名\n * @param id 要查找的 ID\n * @returns 找到的起始位置,未找到返回 null\n */\nexport function findMarkPosition(doc: ProsemirrorNode, markType: string, idAttr: string, id: string): number | null {\n let foundFrom: number | null = null\n\n doc.descendants((node, pos) => {\n if (foundFrom !== null) return false // 找到后停止遍历\n\n const mark = node.marks.find((m) => m.type.name === markType && m.attrs[idAttr] === id)\n if (mark) {\n foundFrom = pos\n return false // 找到后停止遍历\n }\n })\n\n return foundFrom\n}\n\n/**\n * 根据选区查找当前选中的 Mark\n * @param doc ProseMirror 文档节点\n * @param from 选区开始位置\n * @param to 选区结束位置\n * @param markType Mark 类型名称\n * @param attributes 需要提取的属性列表\n * @returns 找到的 Mark 数据列表\n */\nexport function findMarksInSelection<T extends { from: number; to: number; text?: string }>(\n doc: ProsemirrorNode,\n from: number,\n to: number,\n markType: string,\n attributes: readonly string[]\n): T[] {\n const ranges = findMarkRanges(doc, markType, () => true, from, to)\n\n return ranges.map(({ mark, from: markFrom, to: markTo }) => {\n const attrs = getMarkAttributes(mark, attributes)\n return {\n ...attrs,\n from: markFrom,\n to: markTo,\n text: doc.textBetween(markFrom, markTo)\n } as T\n })\n}\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport { findMarkPosition, findMarksInSelection, getMarkItems } from '../common/mark-utils'\nimport { ANNOTATION_ATTRS, ANNOTATION_KEY } from './constant'\n\nconst annotationPluginKey = new PluginKey('annotationPlugin')\n\nexport type AnnotationType = {\n from: number\n to: number\n} & {\n [key in (typeof ANNOTATION_ATTRS)[number]]: string\n}\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n annotation: {\n selectAnnotation: (id: string) => any\n moveCursorToAnnotation: (id: string) => any\n }\n }\n}\n/**\n * 批注Plugin Extension\n * 管理文档中所有批注标记的状态和交互\n */\nexport const AnnotationPlugin = Extension.create({\n name: 'annotationPlugin',\n\n addOptions() {\n return {\n onAnnotationsChange: () => {},\n onSelectAnnotation: () => {}\n }\n },\n\n addCommands() {\n return {\n selectAnnotation:\n (id) =>\n ({ state, dispatch }) => {\n // console.log('selectAnnotation', id)\n const tr = state.tr.setMeta(annotationPluginKey, {\n selectedId: id\n })\n dispatch(tr)\n return true\n },\n moveCursorToAnnotation:\n (id) =>\n ({ state, commands, view }) => {\n const foundFrom = findMarkPosition(state.doc, ANNOTATION_KEY, ANNOTATION_ATTRS[0], id)\n\n if (foundFrom) {\n const tr = state.tr.setSelection(TextSelection.create(state.doc, foundFrom))\n\n view.dispatch(tr)\n commands.focus()\n }\n }\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: annotationPluginKey,\n state: {\n init: () => ({ items: [] as AnnotationType[], selectedId: null }),\n apply(tr, prev) {\n const next = { ...prev }\n const meta = tr.getMeta(annotationPluginKey)\n console.log('apply', meta?.selectedId)\n if (meta && 'selectedId' in meta) {\n next.selectedId = meta.selectedId\n }\n\n // 检查文档内容和选区是否发生变化\n if (!tr.docChanged && !tr.selectionSet) return next\n\n next.items = getMarkItems(tr.doc, ANNOTATION_KEY, ANNOTATION_ATTRS, 0)\n return next\n }\n },\n view: () => ({\n update: (view) => {\n const { items } = annotationPluginKey.getState(view.state)\n this.options.onAnnotationsChange(items)\n }\n }),\n props: {\n decorations(state) {\n const pluginState = annotationPluginKey.getState(state)\n const { selectedId, items } = pluginState\n console.log('update', selectedId, items)\n\n if (!selectedId) {\n return DecorationSet.create(state.doc, [])\n }\n\n const decoList: Decoration[] = []\n\n items.forEach((item) => {\n if (item[ANNOTATION_ATTRS[0]] === selectedId) {\n decoList.push(\n Decoration.inline(item.from, item.to, {\n class: 'editor-annotation--selected'\n })\n )\n }\n })\n\n return DecorationSet.create(state.doc, decoList)\n },\n /**\n * 处理文本选择变化,自动选择对应批注\n */\n handleDOMEvents: {\n click: (view) => {\n const { state } = view\n const { from, to } = state.selection\n\n const foundAnnotations = findMarksInSelection<AnnotationType>(state.doc, from, to, ANNOTATION_KEY, ANNOTATION_ATTRS)\n\n if (foundAnnotations.length > 0) {\n this.options.onSelectAnnotation(foundAnnotations[foundAnnotations.length - 1])\n } else {\n this.options.onSelectAnnotation(null)\n }\n return false\n }\n }\n }\n })\n ]\n }\n})\n","import { Editor } from '@tiptap/react'\nimport { useRef, useState } from 'react'\nimport { genNonDuplicateID, getTimestamp, isBoolean } from '../../../utils'\nimport { removeMarkById, updateMarkById } from '../common/mark-utils'\nimport { AnnotationType } from './AnnotationPlugin'\nimport { ANNOTATION_ATTRS, ANNOTATION_KEY, AnnotationsProps } from './constant'\n\n/**\n * 批注功能管理Hook\n * 集中管理所有批注相关的状态和操作\n */\nexport const useAnnotations = (annotationConfig: AnnotationsProps) => {\n const [annotations, setAnnotations] = useState<AnnotationType[]>([])\n const [selectedAnnotationId, setSelectedAnnotationId] = useState<string | null>(null)\n const [showAnnotationModal, setShowAnnotationModal] = useState(false)\n const [internalShowAnnotation, setInternalShowAnnotation] = useState(false)\n\n const isControlled = isBoolean(annotationConfig?.visible)\n const showAnnotation = isControlled ? annotationConfig?.visible : internalShowAnnotation\n\n const setShowAnnotation = (visible: boolean) => {\n if (!isControlled) {\n setInternalShowAnnotation(visible)\n }\n annotationConfig?.onVisibleChange?.(visible)\n }\n\n const editor = useRef<Editor>()\n // const [selectedText, setSelectedText] = useState('')\n const setAnnotationEditor = (newEditor: Editor) => {\n editor.current = newEditor\n }\n /**\n * 创建新批注 - 显示批注对话框\n */\n const onCreateAnnotation = () => {\n if (!editor.current) return\n setShowAnnotationModal(true)\n }\n\n /**\n * 关闭批注对话框\n */\n const closeAnnotationCreateModal = () => {\n setShowAnnotationModal(false)\n }\n /**\n * 处理批注创建确认\n * @param content - 批注内容\n * @returns 创建是否成功\n */\n const onCreateAnnotationConfirm = (content: string) => {\n if (!editor.current || !content.trim()) {\n return\n }\n const id = genNonDuplicateID()\n // 在光标位置添加批注标记\n editor.current\n .chain()\n .focus()\n .setMark(ANNOTATION_KEY, {\n 'annotation-id': id,\n 'user-name': annotationConfig?.user?.name || '未知',\n 'user-id': annotationConfig?.user.id || '0000',\n 'update-time': getTimestamp(),\n content\n })\n .run()\n setShowAnnotation(true)\n handleSelectAnnotation(id, 'sidebar')\n }\n\n /**\n * 删除批注\n * @param id - 批注ID\n */\n const handleDeleteAnnotation = (id: string) => {\n if (!editor.current) {\n return\n }\n removeMarkById(editor.current, ANNOTATION_KEY, ANNOTATION_ATTRS[0], id)\n }\n\n /**\n * 编辑批注\n */\n const handleEditAnnotation = (id: string, newContent: string) => {\n if (!editor.current) return\n\n updateMarkById(editor.current, ANNOTATION_KEY, ANNOTATION_ATTRS[0], id, {\n 'update-time': getTimestamp(),\n content: newContent\n })\n }\n\n /**\n * 选中批注\n */\n const handleSelectAnnotation = (id?: string, source?: 'editor' | 'sidebar') => {\n if (id === selectedAnnotationId) return\n setSelectedAnnotationId(id)\n if (!editor.current) return\n editor.current.commands.selectAnnotation(id)\n if (source === 'sidebar') {\n // 移动光标\n editor.current.commands.moveCursorToAnnotation(id)\n }\n }\n return {\n setAnnotationEditor,\n annotations,\n setAnnotations,\n selectedAnnotationId,\n handleSelectAnnotation,\n showAnnotationModal,\n showAnnotation,\n setShowAnnotation,\n onCreateAnnotation,\n closeAnnotationCreateModal,\n onCreateAnnotationConfirm,\n handleDeleteAnnotation,\n handleEditAnnotation\n }\n}\n","export const COLLECTION_KEY = 'collection'\n\nexport const COLLECTION_ATTRS = ['collection-id', 'user-name', 'user-id', 'update-time', 'page-no'] as const\n\nexport type CollectionType = {\n text: string\n from: number\n to: number\n pageNo?: string\n} & {\n [key in (typeof COLLECTION_ATTRS)[number]]: string\n}\n\n/**\n * 收录功能配置\n */\nexport interface CollectionsProps {\n /** 是否启用批注功能,默认为false */\n enabled: boolean\n /** 当前用户 */\n user: {\n id: string\n name: string\n }\n /** 是否显示收录列表,默认为true */\n showList?: boolean\n /** 受控属性:批注列表是否可见 */\n visible?: boolean\n /** 受控属性:批注列表可见性改变回调 */\n onVisibleChange?: (visible: boolean) => void\n /**\n * 创建收录的回调\n * @param data 收录数据\n * @returns 返回收录ID(如果有),返回Promise\n */\n onBeforeCreate?: (data: { content: string; pageNo?: number }) => Promise<string>\n /**\n * 自定义渲染收录列表项\n * @param props 列表项数据及操作\n * @returns React节点\n */\n renderItem?: (props: { collection: CollectionType; isSelected: boolean; onSelect: () => void; onDelete: () => void }) => React.ReactNode\n}\n","import { createHtmlMark } from '../common/HtmlMark'\nimport { COLLECTION_ATTRS, COLLECTION_KEY } from './constant'\n/**\n * 收录Mark扩展\n * 用于在文档中标记收录内容,提供视觉高亮效果\n */\nexport const CollectionMark = createHtmlMark(COLLECTION_KEY, COLLECTION_ATTRS as readonly string[], 'editor-collection')\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport { findMarkPosition, findMarksInSelection, getMarkItems } from '../common/mark-utils'\nimport { COLLECTION_ATTRS, COLLECTION_KEY, CollectionType } from './constant'\n\nexport const collectionPluginKey = new PluginKey('collectionPlugin')\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n collection: {\n selectCollection: (id: string) => any\n moveCursorToCollection: (id: string) => any\n }\n }\n}\n/**\n * 收录Plugin Extension\n * 管理文档中所有收录标记的状态和交互\n */\nexport const CollectionPlugin = Extension.create({\n name: 'collectionPlugin',\n\n addOptions() {\n return {\n onCollectionsChange: () => {},\n onSelectCollection: () => {}\n }\n },\n\n addCommands() {\n return {\n selectCollection:\n (id) =>\n ({ state, dispatch }) => {\n const tr = state.tr.setMeta(collectionPluginKey, {\n selectedId: id\n })\n dispatch(tr)\n return true\n },\n moveCursorToCollection:\n (id) =>\n ({ state, commands, view }) => {\n const foundFrom = findMarkPosition(state.doc, COLLECTION_KEY, COLLECTION_ATTRS[0], id)\n\n if (foundFrom) {\n const tr = state.tr.setSelection(TextSelection.create(state.doc, foundFrom))\n\n view.dispatch(tr)\n commands.focus()\n }\n }\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: collectionPluginKey,\n state: {\n init: () => ({ items: [] as CollectionType[], selectedId: null }),\n apply(tr, prev) {\n const next = { ...prev }\n const meta = tr.getMeta(collectionPluginKey)\n\n if (meta && 'selectedId' in meta) {\n next.selectedId = meta.selectedId\n }\n\n // 检查文档内容和选区是否发生变化\n if (!tr.docChanged && !tr.selectionSet) return next\n\n next.items = getMarkItems(tr.doc, COLLECTION_KEY, COLLECTION_ATTRS, 0)\n return next\n }\n },\n view: () => ({\n update: (view) => {\n const { items } = collectionPluginKey.getState(view.state)\n this.options.onCollectionsChange(items)\n }\n }),\n props: {\n decorations(state) {\n const pluginState = collectionPluginKey.getState(state)\n const { selectedId, items } = pluginState\n\n if (!selectedId) {\n return DecorationSet.create(state.doc, [])\n }\n\n const decoList: Decoration[] = []\n\n items.forEach((item) => {\n if (item[COLLECTION_ATTRS[0]] === selectedId) {\n decoList.push(\n Decoration.inline(item.from, item.to, {\n class: 'editor-collection--selected'\n })\n )\n }\n })\n\n return DecorationSet.create(state.doc, decoList)\n },\n /**\n * 处理文本选择变化,自动选择对应批注\n */\n handleDOMEvents: {\n click: (view) => {\n const { state } = view\n const { from, to } = state.selection\n\n const foundCollections = findMarksInSelection<CollectionType>(state.doc, from, to, COLLECTION_KEY, COLLECTION_ATTRS)\n\n if (foundCollections.length > 0) {\n this.options.onSelectCollection(foundCollections[foundCollections.length - 1])\n } else {\n this.options.onSelectCollection(null)\n }\n return false\n }\n }\n }\n })\n ]\n }\n})\n","/* 收录样式 */\n.collections {\n margin-top: 8px;\n}\n.collections .collectionItem {\n cursor: pointer;\n padding-left: 20px;\n padding-right: 20px;\n}\n.collections .collectionItem:hover {\n background-color: #fafafa;\n}\n.collections .collectionItem.collectionItemSelected {\n background-color: #e6f7ff;\n border-left: 3px solid var(--ant-primary-color);\n}\n","import { BookOutlined, CloseOutlined, DeleteOutlined } from '@ant-design/icons'\nimport { Button, Card, Empty, Flex, List, Popconfirm, Space, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { formatDate } from '../../../utils'\nimport { COLLECTION_ATTRS, CollectionsProps, CollectionType } from './constant'\nimport styles from './styles.module.less'\n\nconst { Text } = Typography\n/**\n * 收录功能配置接口\n */\nexport interface CollectionConfig extends CollectionsProps {\n getContainer?: () => HTMLElement | null\n}\n\nexport interface CollectionSidebarProps {\n disabled?: boolean\n collections: CollectionType[]\n selectedCollectionId?: string\n handleSelectCollection?: (id?: string) => void\n onDeleteCollection: (id: string) => void\n collectionConfig?: CollectionConfig\n onClose?: () => void\n}\n\nexport default ({\n disabled,\n collections,\n selectedCollectionId,\n handleSelectCollection,\n onDeleteCollection,\n collectionConfig,\n onClose\n}: CollectionSidebarProps) => {\n const itemRefs = useRef<Record<string, HTMLDivElement | null>>({})\n\n useEffect(() => {\n if (selectedCollectionId) {\n const element = itemRefs.current[selectedCollectionId]\n element?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n }, [selectedCollectionId])\n const sidebarContent = (\n <Card\n size=\"small\"\n styles={{\n header: {\n height: '44px'\n }\n }}\n className=\"full-card no-padding-card extra-sidebar\"\n title={\n <Flex justify=\"space-between\" align=\"center\">\n <Space>\n <BookOutlined />\n <span>收录{collections.length > 0 && `(${collections.length})`}</span>\n </Space>\n <Button type=\"text\" size=\"small\" icon={<CloseOutlined />} onClick={onClose} />\n </Flex>\n }\n variant=\"borderless\"\n >\n {collections.length > 0 ? (\n <List\n className={classNames(styles.collections, 'height-full', 'scroll-fade-in')}\n dataSource={collections}\n renderItem={(collection) => {\n if (collectionConfig?.renderItem) {\n return collectionConfig.renderItem({\n collection,\n isSelected: collection[COLLECTION_ATTRS[0]] === selectedCollectionId,\n onSelect: () => handleSelectCollection?.(collection[COLLECTION_ATTRS[0]]),\n onDelete: () => onDeleteCollection(collection[COLLECTION_ATTRS[0]])\n })\n }\n return (\n <List.Item\n ref={(el) => {\n itemRefs.current[collection[COLLECTION_ATTRS[0]]] = el\n }}\n className={classNames(styles.collectionItem, {\n [styles.collectionItemSelected]: collection[COLLECTION_ATTRS[0]] === selectedCollectionId\n })}\n onClick={() => {\n handleSelectCollection?.(collection[COLLECTION_ATTRS[0]])\n }}\n >\n <Flex vertical gap={8} flex={1}>\n <Flex gap={8} justify=\"space-between\" className={styles.collectionMeta}>\n <Text strong type=\"secondary\">\n {collection['user-name']}\n </Text>\n <Text type=\"secondary\">{formatDate(collection['update-time'])}</Text>\n </Flex>\n\n <Flex gap={8} vertical>\n <Text>{collection.text}</Text>\n {/* 只有当选中该项时才显示编辑删除按钮 */}\n {/* collection['user-id'] === collectionConfig?.user */}\n {!disabled && selectedCollectionId === collection[COLLECTION_ATTRS[0]] && (\n <Space>\n <Popconfirm\n title=\"提示\"\n okText=\"确定\"\n cancelText=\"取消\"\n description=\"确认删除当前收录吗?\"\n onConfirm={() => onDeleteCollection(collection[COLLECTION_ATTRS[0]])}\n >\n <Button type=\"text\" size=\"small\" title=\"删除收录\" icon={<DeleteOutlined />} />\n </Popconfirm>\n </Space>\n )}\n </Flex>\n </Flex>\n </List.Item>\n )\n }}\n />\n ) : (\n <Empty className=\"m-t-24\" description=\"暂无收录\" />\n )}\n </Card>\n )\n\n // 如果没有指定getContainer,直接返回组件\n const container = collectionConfig?.getContainer?.()\n if (!container) {\n return sidebarContent\n }\n\n return createPortal(sidebarContent, container)\n}\n","import { Editor } from '@tiptap/core'\n\nexport function selectionHasBlockMath(editor: Editor) {\n if (!editor) return false\n\n const { state } = editor\n const { from, to } = state.selection\n\n let hasBlockMath = false\n\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === 'blockMath') {\n hasBlockMath = true\n return false\n }\n })\n\n return hasBlockMath\n}\n/**\n * 检查是否选中了文本\n */\nexport function hasSelection(editor: Editor | null): boolean {\n if (!editor) return false\n const { from, to } = editor.state.selection\n // 文本选区\n return from < to\n}\n\n/**\n * 获取选中的内容\n * @param editor - Tiptap编辑器实例\n * @returns 选中的文本内容\n */\nexport function getSelectedText(editor: Editor | null): string {\n if (!editor) return ''\n const { from, to } = editor.state.selection\n if (from === to) return ''\n return editor.state.doc.textBetween(from, to, ' ')\n}\n\n// 新增:获取选中 Markdown\nexport function getSelectedMarkdown(editor: Editor | null): string {\n if (!editor) return ''\n\n if (!editor.markdown) {\n console.warn('Markdown extension 未启用')\n return ''\n }\n const { from, to } = editor.state.selection\n // 获取选区的 doc 片段\n // Tiptap/ProseMirror 可以用 doc.cut() 或 ProseMirror 其它方法\n const slice = editor.state.doc.cut(from, to)\n return editor.markdown.serialize({\n type: 'doc',\n content: slice.content.toJSON()\n })\n}\n","import { Editor } from '@tiptap/react'\nimport { useRef, useState } from 'react'\nimport { getTimestamp, isBoolean } from '../../../utils'\nimport { removeMarkById } from '../common/mark-utils'\nimport { getSelectedText } from '../common/utils'\nimport { CollectionType } from './CollectionPlugin'\nimport { COLLECTION_ATTRS, COLLECTION_KEY, CollectionsProps } from './constant'\n\n/**\n * 收录功能管理Hook\n * 集中管理所有收录相关的状态和操作\n */\nexport const useCollections = (collectionConfig: CollectionsProps) => {\n const [collections, setCollections] = useState<CollectionType[]>([])\n const [selectedCollectionId, setSelectedCollectionId] = useState<string | null>(null)\n const [internalShowCollection, setInternalShowCollection] = useState(false)\n\n const isControlled = isBoolean(collectionConfig?.visible)\n const showCollection = isControlled ? collectionConfig?.visible : internalShowCollection\n\n const setShowCollection = (visible: boolean) => {\n if (!isControlled) {\n setInternalShowCollection(visible)\n }\n collectionConfig?.onVisibleChange?.(visible)\n }\n const editor = useRef<Editor>()\n const setCollectionEditor = (newEditor: Editor) => {\n editor.current = newEditor\n }\n /**\n * 处理收录创建确认\n * @param content - 收录内容\n * @returns 创建是否成功\n */\n const onCreateCollection = async () => {\n if (!editor.current) {\n return\n }\n // 获取当前选区信息\n const content = getSelectedText(editor.current)\n const pageIndex = editor.current.commands?.getPageNo?.()\n\n // 如果配置了 onCreate 回调,则调用并等待结果\n const remoteId = await collectionConfig.onBeforeCreate({\n content,\n pageNo: pageIndex\n })\n if (!remoteId) return\n // if (!editor.current) return\n // // 恢复选区(防止异步期间选区丢失)\n // editor.current.commands.setTextSelection({ from, to })\n\n // 在光标位置添加收录标记\n editor.current\n .chain()\n .focus()\n .setMark(COLLECTION_KEY, {\n 'collection-id': remoteId,\n 'user-name': collectionConfig?.user?.name || '未知',\n 'user-id': collectionConfig?.user.id || '0000',\n 'update-time': getTimestamp(),\n 'page-no': pageIndex\n })\n .run()\n setShowCollection(true)\n handleSelectCollection(remoteId, 'sidebar')\n }\n\n /**\n * 删除收录\n * @param id - 收录ID\n */\n const handleDeleteCollection = (id: string) => {\n if (!editor.current) {\n return\n }\n removeMarkById(editor.current, COLLECTION_KEY, COLLECTION_ATTRS[0], id)\n }\n /**\n * 选中收录\n */\n const handleSelectCollection = (id?: string, source?: 'editor' | 'sidebar') => {\n // console.log('selectCollection', id)\n if (id === selectedCollectionId) return\n setSelectedCollectionId(id)\n if (!editor.current) return\n editor.current.commands.selectCollection(id)\n if (source === 'sidebar') {\n // 移动光标\n editor.current.commands.moveCursorToCollection(id)\n }\n }\n return {\n setCollectionEditor,\n collections,\n setCollections,\n selectedCollectionId,\n handleSelectCollection,\n showCollection,\n setShowCollection,\n onCreateCollection,\n handleDeleteCollection\n }\n}\n","import { Editor } from '@tiptap/core'\nimport React from 'react'\nimport { Button, ButtonProps } from '../components/tiptap-ui-primitive/button'\nimport { useTiptapEditor } from '../hooks/use-tiptap-editor'\nimport { getSelectedMarkdown, getSelectedText, hasSelection, selectionHasBlockMath } from './utils'\n\nexport interface SelectButtonProps extends Omit<ButtonProps, 'onClick'> {\n /**\n * The TipTap editor instance.\n */\n editor?: Editor | null\n /**\n * Callback when text is quoted (fires when user clicks while text is selected)\n */\n onClick?: (text?: string, markdown?: string) => void\n /**\n * Optional label text shown next to the icon.\n */\n text?: string\n /**\n * Whether to hide the button if no text is selected.\n * @default false\n */\n hideWhenUnavailable?: boolean\n icon?: React.ReactNode\n}\n\n/**\n * SelectButton Hook\n */\nexport function useSelect(editor: Editor | null, disabled: boolean = false, hideWhenUnavailable: boolean = false) {\n const selectionAvailable = React.useMemo(() => hasSelection(editor), [editor?.state.selection])\n const blockMathSelected = React.useMemo(() => selectionHasBlockMath(editor), [editor?.state.selection])\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 // 如果选区是块级公式,也可以完全隐藏按钮\n if (blockMathSelected) return false\n return true\n }, [editor, hideWhenUnavailable, selectionAvailable, blockMathSelected])\n const getText = React.useCallback(() => getSelectedText(editor), [editor])\n const getMarkdown = React.useCallback(() => getSelectedMarkdown(editor), [editor])\n\n return {\n isDisabled,\n shouldShow,\n getText,\n getMarkdown\n }\n}\n\nexport const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProps>(\n ({ editor: providedEditor, text, className = '', disabled = false, hideWhenUnavailable = false, onClick, children, icon, ...buttonProps }, ref) => {\n const { editor } = useTiptapEditor(providedEditor)\n\n const { isDisabled, shouldShow, getText, getMarkdown } = useSelect(editor, disabled, hideWhenUnavailable)\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (e.defaultPrevented || isDisabled || !editor) return\n\n const selectedText = getText()\n const selectedMarkdown = getMarkdown()\n // if (selectedText || selectedMarkdown) {\n onClick?.(selectedText, selectedMarkdown)\n // } else {\n // console.warn('No text selected for quote.')\n // }\n },\n [onClick, editor, isDisabled, getText, getMarkdown]\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 onClick={handleClick}\n {...buttonProps}\n ref={ref}\n >\n {children || (\n <>\n {icon}\n {text && <span className=\"tiptap-button-text\">{text}</span>}\n </>\n )}\n </Button>\n )\n }\n)\n\nSelectButton.displayName = 'SelectButton'\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 * 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\n 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 { EditorContent, EditorContext, useEditor } from '@tiptap/react'\nimport { ReactNode, useEffect, useRef, useState } from 'react'\n// --- Styles ---\nimport styles from './styles.module.less'\n\n// --- Tiptap Core Extensions ---\nimport { Highlight } from '@tiptap/extension-highlight'\nimport { Image } from '@tiptap/extension-image'\nimport { TaskItem, TaskList } from '@tiptap/extension-list'\nimport { Subscript } from '@tiptap/extension-subscript'\nimport { Superscript } from '@tiptap/extension-superscript'\nimport { TextAlign } from '@tiptap/extension-text-align'\nimport { Typography } from '@tiptap/extension-typography'\nimport { Selection } from '@tiptap/extensions'\nimport { StarterKit } from '@tiptap/starter-kit'\n\nimport { Table, TableCell, TableHeader, TableRow } from '@tiptap/extension-table'\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/blockquote-node/blockquote-node.less'\nimport './components/tiptap-node/code-block-node/code-block-node.less'\nimport './components/tiptap-node/heading-node/heading-node.less'\nimport { HorizontalRule } from './components/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension'\nimport './components/tiptap-node/horizontal-rule-node/horizontal-rule-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// --- PageNoNode ---\nimport PageNoMark from './pageNo/pageNoMark'\nimport { PageNoExtension } from './pageNo/PageNoPlugin'\n\n// --- Tiptap UI ---\nimport { FloatingElement } from './components/tiptap-ui-utils/floating-element/floating-element'\nimport { BlockquoteButton } from './components/tiptap-ui/blockquote-button'\nimport { CodeBlockButton } from './components/tiptap-ui/code-block-button'\nimport { ColorHighlightPopover, ColorHighlightPopoverButton, ColorHighlightPopoverContent } from './components/tiptap-ui/color-highlight-popover'\nimport { HeadingDropdownMenu } from './components/tiptap-ui/heading-dropdown-menu'\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 { 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 { useCursorVisibility } from './hooks/use-cursor-visibility'\nimport { useIsBreakpoint } from './hooks/use-is-breakpoint'\nimport { useWindowSize } from './hooks/use-window-size'\n\n// --- Annotation Components ---\nimport AnnotationModal from './annotation/AnnotationModal'\nimport AnnotationSidebar, { AnnotationConfig } from './annotation/AnnotationSidebar'\n\nimport { Mathematics } from '@tiptap/extension-mathematics'\nimport { Markdown } from '@tiptap/markdown'\nimport 'katex/dist/katex.min.css'\n\nimport { BookOutlined, MessageOutlined } from '@ant-design/icons'\nimport { Flex, Tag } from 'antd'\nimport classNames from 'classnames'\nimport { useDebounce } from '../../hooks'\nimport { AnnotationMark } from './annotation/AnnotationMark'\nimport { AnnotationPlugin } from './annotation/AnnotationPlugin'\nimport { ANNOTATION_ATTRS } from './annotation/constant'\nimport { useAnnotations } from './annotation/use-annotations'\nimport { CollectionMark } from './collection/CollectionMark'\nimport { CollectionPlugin } from './collection/CollectionPlugin'\nimport CollectionSidebar, { CollectionConfig } from './collection/collectionSidebar'\nimport { COLLECTION_ATTRS } from './collection/constant'\nimport { useCollections } from './collection/use-collections'\nimport { SelectButton } from './common/select-button'\nimport SearchAndReplace from './extensions/searchAndReplace'\nimport { QuoteIcon } from './quote/quote-icon'\n\nconst MainToolbarContent = ({\n onHighlighterClick,\n onLinkClick,\n onQuote,\n onCreateAnnotation,\n onCreateCollection,\n isMobile,\n isBubble\n}: {\n onHighlighterClick: () => void\n onLinkClick: () => void\n onQuote?: MarkdownEditorProps['onQuote']\n onCreateAnnotation?: () => void\n onCreateCollection?: () => void\n isMobile: boolean\n isBubble: boolean\n}) => {\n return (\n <>\n <Spacer />\n\n {onQuote && (\n <ToolbarGroup>\n <SelectButton icon={<QuoteIcon className=\"tiptap-button-icon\" />} tooltip=\"引用选中文本\" onClick={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\n {onCreateAnnotation && (\n <ToolbarGroup>\n <SelectButton icon={<MessageOutlined />} tooltip=\"批注\" onClick={onCreateAnnotation} />\n </ToolbarGroup>\n )}\n\n {onCreateCollection && (\n <ToolbarGroup>\n <SelectButton icon={<BookOutlined />} tooltip=\"收录笔记\" onClick={onCreateCollection} />\n </ToolbarGroup>\n )}\n\n <ToolbarGroup>\n <HeadingDropdownMenu levels={[1, 2, 3, 4]} portal={isMobile} />\n <ListDropdownMenu types={['bulletList', 'orderedList', 'taskList']} portal={isMobile} />\n <BlockquoteButton />\n <CodeBlockButton />\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 ? <ColorHighlightPopover /> : <ColorHighlightPopoverButton 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 {/* <ToolbarGroup>\n <ImageUploadButton text=\"Add\" />\n </ToolbarGroup> */}\n\n <Spacer />\n\n {isMobile && <ToolbarSeparator />}\n\n {/* <ToolbarGroup>\n <ThemeToggle />\n </ToolbarGroup> */}\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' ? <ColorHighlightPopoverContent /> : <LinkContent />}\n </>\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 extraNav?: ReactNode\n /** 是否显示工具栏,默认为true */\n showToolbar?: boolean\n /** 引用文本回调 */\n onQuote?: (text?: string, markdown?: string) => void\n /** 文件下载回调 */\n onDownloadFile?: (fileContent: string, targetFormat?: string) => Promise<void>\n /** 批注功能配置对象 */\n annotationConfig?: AnnotationConfig\n /** 收录功能专属配置,不与批注混淆 */\n collectionConfig?: CollectionConfig\n pageNoConfig?: {\n /** 是否启用分页功能,默认为false */\n enabled: boolean\n /** 页面滚动回调 */\n onScrollPage?: (pageIndex: number) => void\n }\n}\n\n/**\n * Markdown编辑器组件\n * 基于Tiptap构建的富文本编辑器,支持Markdown语法\n * 提供丰富的编辑功能:格式化、链接、图片、表格、高亮等\n * @param props - 组件属性\n */\nexport default ({\n value = ``,\n onChange,\n searchValue,\n disabled,\n extraNav,\n showToolbar = true,\n onQuote,\n onDownloadFile,\n annotationConfig,\n collectionConfig,\n pageNoConfig\n}: MarkdownEditorProps) => {\n const isMobile = useIsBreakpoint()\n const { height } = useWindowSize()\n const [mobileView, setMobileView] = useState<'main' | 'highlighter' | 'link'>('main')\n const lastContentRef = useRef<string>('') // 存储 editor 上一次内容\n const toolbarRef = useRef<HTMLDivElement>(null)\n\n const onPageChange = useDebounce((pageIndex?: number) => {\n // console.log('onPageChange', pageIndex)\n pageNoConfig?.onScrollPage?.(pageIndex ?? 0)\n }, 300)\n\n // 使用批注管理 Hook\n const {\n setAnnotationEditor,\n annotations,\n setAnnotations,\n selectedAnnotationId,\n handleSelectAnnotation,\n showAnnotationModal,\n showAnnotation,\n onCreateAnnotation,\n closeAnnotationCreateModal,\n onCreateAnnotationConfirm,\n handleDeleteAnnotation,\n handleEditAnnotation,\n setShowAnnotation\n } = useAnnotations(annotationConfig)\n // 使用收录管理 Hook\n const {\n setCollectionEditor,\n collections,\n setCollections,\n selectedCollectionId,\n handleSelectCollection,\n showCollection,\n setShowCollection,\n onCreateCollection,\n handleDeleteCollection\n } = useCollections(collectionConfig)\n const editor = useEditor({\n immediatelyRender: false,\n editorProps: {\n attributes: {\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n 'aria-label': '主内容区域,开始输入文本...'\n }\n },\n extensions: [\n Markdown,\n Mathematics.configure({\n // 可选:KaTeX 自定义配置\n katexOptions: {\n throwOnError: false\n }\n // 可选:内联公式点击回调\n // inlineOptions: {\n // onClick: (node, pos) => {\n // const newLaTeX = prompt('编辑公式 LaTeX:', node.attrs.latex)\n // if (newLaTeX) {\n // editor?.chain().setNodeSelection(pos).updateInlineMath({ latex: newLaTeX }).run()\n // }\n // }\n // }\n }),\n StarterKit.configure({\n horizontalRule: false,\n link: {\n openOnClick: false,\n enableClickSelection: true\n }\n }),\n HorizontalRule,\n TextAlign.configure({ types: ['heading', 'paragraph'] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Highlight.configure({ multicolor: true }),\n Image,\n Typography,\n Superscript,\n Subscript,\n Selection,\n Table.configure({\n resizable: true // 可选,允许调整表格大小\n }),\n TableHeader,\n TableRow,\n TableCell,\n // ImageUploadNode.configure({\n // accept: 'image/*',\n // maxSize: MAX_FILE_SIZE,\n // limit: 3,\n // upload: handleImageUpload,\n // onError: (error) => console.error('上传失败:', error)\n // }),\n ...(pageNoConfig?.enabled\n ? [\n PageNoMark,\n PageNoExtension.configure({\n onPageChange: onPageChange,\n containerSelector: '#contentWrapper'\n })\n ]\n : []),\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 ...(annotationConfig?.enabled\n ? [\n AnnotationMark,\n AnnotationPlugin.configure({\n onAnnotationsChange: setAnnotations,\n onSelectAnnotation: (annotation) => {\n handleSelectAnnotation(annotation?.[ANNOTATION_ATTRS[0]])\n }\n })\n ]\n : []),\n // 收录功能扩展\n ...(collectionConfig?.enabled\n ? [\n CollectionMark,\n CollectionPlugin.configure({\n onCollectionsChange: setCollections,\n onSelectCollection: (collection) => {\n handleSelectCollection(collection?.[COLLECTION_ATTRS[0]])\n }\n })\n ]\n : [])\n ],\n content: value,\n contentType: 'markdown',\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.getMarkdown()\n }\n\n useEffect(() => {\n if (!editor) return\n setAnnotationEditor(editor)\n setCollectionEditor(editor)\n }, [editor])\n\n const rect = 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, { contentType: 'markdown' })\n editor?.commands.focus('start')\n // ✅ 同步内部历史,避免 onUpdate 再次触发回调\n lastContentRef.current = value\n }, [value, 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% - ${height - rect.y}px)`\n }\n : {}\n })}\n >\n {mobileView === 'main' ? (\n <MainToolbarContent\n isBubble={isBubble}\n onCreateAnnotation={annotationConfig?.enabled ? onCreateAnnotation : undefined}\n onCreateCollection={collectionConfig?.enabled ? onCreateCollection : undefined}\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 <Flex className=\"height-full width-full\">\n <div className={classNames('height-full', 'flex-1', styles.editorParent)}>\n <EditorContext.Provider value={{ editor }}>\n {showToolbar && (\n <>\n <Flex justify=\"end\" align=\"center\">\n {NsToolBar({ isBubble: false })}\n <Flex gap={8} align=\"center\" className={classNames(styles.extraToolbar)}>\n {annotationConfig?.enabled && annotationConfig?.showList !== false && (\n <Tag\n title=\"批注列表\"\n bordered={false}\n color=\"default\"\n className=\"cursor-pointer\"\n onClick={() => setShowAnnotation(!showAnnotation)}\n >\n <MessageOutlined />\n </Tag>\n )}\n {collectionConfig?.enabled && collectionConfig?.showList !== false && (\n <Tag\n title=\"收录列表\"\n bordered={false}\n color=\"default\"\n className=\"cursor-pointer\"\n onClick={() => setShowCollection(!showCollection)}\n >\n <BookOutlined />\n </Tag>\n )}\n {onDownloadFile && (\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={downloadFile}>\n 下载\n </Tag>\n )}\n {extraNav}\n </Flex>\n </Flex>\n {!isMobile && (\n <FloatingElement editor={editor} zIndex={188} resetTextSelectionOnClose={false} className={styles.editorFloatingToolbar}>\n {NsToolBar({ isBubble: true })}\n </FloatingElement>\n )}\n </>\n )}\n <div id=\"contentWrapper\" className={classNames(styles.contentWrapper, 'scroll-fade-in')}>\n <EditorContent\n editor={editor}\n role=\"presentation\"\n className={classNames(styles.simpleEditorContent, 'ns-markdown', { [styles.noToolbar]: !showToolbar })}\n />\n </div>\n </EditorContext.Provider>\n </div>\n {annotationConfig?.enabled && (\n <>\n {showAnnotation && annotationConfig?.showList !== false && (\n <div className={classNames('height-full', styles.extraSidebarParent)}>\n <AnnotationSidebar\n disabled={disabled}\n annotations={annotations}\n selectedAnnotationId={selectedAnnotationId}\n handleSelectAnnotation={(id) => handleSelectAnnotation(id, 'sidebar')}\n onEditAnnotation={handleEditAnnotation}\n onDeleteAnnotation={handleDeleteAnnotation}\n annotationConfig={annotationConfig}\n onClose={() => setShowAnnotation(false)}\n />\n </div>\n )}\n\n {showAnnotationModal && (\n <AnnotationModal visible={showAnnotationModal} onCancel={closeAnnotationCreateModal} onConfirm={onCreateAnnotationConfirm} />\n )}\n </>\n )}\n {collectionConfig?.enabled && showCollection && collectionConfig?.showList !== false && (\n <div className={classNames('height-full', styles.extraSidebarParent)}>\n <CollectionSidebar\n disabled={disabled}\n collections={collections}\n selectedCollectionId={selectedCollectionId}\n handleSelectCollection={(id) => handleSelectCollection(id, 'sidebar')}\n onDeleteCollection={handleDeleteCollection}\n collectionConfig={collectionConfig}\n onClose={() => setShowCollection(false)}\n />\n </div>\n )}\n </Flex>\n )\n}\n",".container {\n position: relative;\n}\n.container .rect {\n position: absolute;\n border: 2px dashed #ff6a00;\n}\n.container .score {\n position: absolute;\n background: #ff6a00;\n color: #fff;\n padding: 2px 4px;\n font-size: 12px;\n font-weight: 600;\n}\n","import React, { ReactNode, useEffect, useRef, useState } from 'react'\nimport styles from './styles.module.less'\n\n// 定义检测结果的数据结构\ninterface Detection {\n bbox: [number, number, number, number] // 边界框坐标 [x1, y1, x2, y2]\n score: number // 检测置信度分数\n}\n\n// 定义尺寸类型\ninterface SizeType {\n width: number // 宽度\n height: number // 高度\n}\n// 组件属性接口\ninterface MarkDrawingProps {\n children: ReactNode // 子元素,通常是待标注的图像或其他内容\n detections: Detection[] // 检测结果数组,包含边界框和置信度\n originalSize: SizeType // 原始尺寸,用于比例计算\n}\n\n/**\n * MarkDrawing组件\n * 在指定内容上绘制检测框,常用于图像标注、物体识别可视化等场景\n * 根据原始尺寸和当前容器尺寸自动计算缩放比例,确保标注框准确显示\n * @param children - 待绘制标注的内容\n * @param detections - 检测结果数组\n * @param originalSize - 原始尺寸信息\n */\nexport default ({ children, detections, originalSize }: MarkDrawingProps) => {\n const containerRef = useRef<HTMLDivElement>(null)\n\n const [containerSize, setContainerSize] = useState<SizeType>({\n width: originalSize.width,\n height: originalSize.height\n })\n\n useEffect(() => {\n const obs = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n const { width, height } = entry.contentRect\n setContainerSize({ width, height })\n }\n })\n if (containerRef.current) obs.observe(containerRef.current)\n return () => obs.disconnect()\n }, [])\n\n const scaleX = containerSize.width / originalSize.width\n const scaleY = containerSize.height / originalSize.height\n\n return (\n <div ref={containerRef} className={styles.container}>\n {children}\n\n {detections.map((det, idx) => {\n const [x1, y1, x2, y2] = det.bbox\n const left = x1 * scaleX\n const top = y1 * scaleY\n const width = (x2 - x1) * scaleX\n const height = (y2 - y1) * scaleY\n\n return (\n <React.Fragment key={idx}>\n {/* 矩形框 */}\n <div\n className={styles.rect}\n style={{\n left,\n top,\n width,\n height\n }}\n />\n\n {/* 分数提示 */}\n <div\n className={styles.score}\n style={{\n left,\n top: Math.max(top - 20, 0)\n }}\n >\n {det.score.toFixed(3)}\n </div>\n </React.Fragment>\n )\n })}\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","/**\n * 收听icon\n */\nexport default () => (\n <svg color=\"currentColor\" viewBox=\"0 0 1000 1000\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"0\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"286.66666666666663\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.2s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.2s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"573.3333333333333\" y=\"375\">\n <animate attributeName=\"height\" values=\"250; 500; 250\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.4s\" repeatCount=\"indefinite\"></animate>\n <animate attributeName=\"y\" values=\"375; 250; 375\" keyTimes=\"0; 0.5; 1\" dur=\"0.8s\" begin=\"0.4s\" repeatCount=\"indefinite\"></animate>\n </rect>\n <rect fill=\"currentColor\" rx=\"70\" ry=\"70\" height=\"250\" width=\"140\" x=\"859.9999999999999\" y=\"375\">\n <animate\n attributeName=\"height\"\n values=\"250; 500; 250\"\n keyTimes=\"0; 0.5; 1\"\n dur=\"0.8s\"\n begin=\"0.6000000000000001s\"\n repeatCount=\"indefinite\"\n ></animate>\n <animate\n attributeName=\"y\"\n values=\"375; 250; 375\"\n keyTimes=\"0; 0.5; 1\"\n dur=\"0.8s\"\n begin=\"0.6000000000000001s\"\n repeatCount=\"indefinite\"\n ></animate>\n </rect>\n </svg>\n)\n","import Icon, { AudioMutedOutlined, AudioOutlined } from '@ant-design/icons'\nimport { Button } from 'antd'\nimport useSpeech, { SpeechProps } from '../../hooks/useSpeech'\nimport SpeechLoading from './SpeechLoading'\n\n/**\n * 语音按钮\n * @param SpeechProps\n */\nexport default (props: SpeechProps) => {\n const { permission, isRecording, start, stop } = useSpeech(props)\n\n const disabled = permission === 'denied' || permission === 'unsupported'\n const handleClick = () => {\n if (isRecording) {\n stop()\n } else {\n start()\n }\n }\n\n return (\n <Button\n title={\n permission === 'unsupported'\n ? '当前浏览器不支持语音识别'\n : permission === 'denied'\n ? '麦克风权限已拒绝'\n : isRecording\n ? '停止录音'\n : '点击开始录音'\n }\n disabled={disabled}\n color=\"primary\"\n variant=\"text\"\n icon={isRecording ? <Icon style={{ width: 16 }} component={SpeechLoading} /> : disabled ? <AudioMutedOutlined /> : <AudioOutlined />}\n onClick={handleClick}\n />\n )\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"]}