@underverse-ui/underverse 2.0.41 → 2.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-reference.json +1 -1
- package/dist/{DatePicker-BYYBKHWH.js → DatePicker-VRS4SBIH.js} +2 -2
- package/dist/{chunk-GKUKLOSO.js → chunk-2ELWYT7Y.js} +17 -14
- package/dist/chunk-2ELWYT7Y.js.map +1 -0
- package/dist/{chunk-TVCZXO6G.js → chunk-4IJ53MI3.js} +208 -208
- package/dist/chunk-4IJ53MI3.js.map +1 -0
- package/dist/{chunk-C2EHPHWH.js → chunk-YNALZEN6.js} +11 -5
- package/dist/chunk-YNALZEN6.js.map +1 -0
- package/dist/index.cjs +241 -222
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/{menu-bar-67LDC7IR.js → menu-bar-SGKLM6IK.js} +2 -2
- package/dist/ueditor.cjs +233 -222
- package/dist/ueditor.cjs.map +1 -1
- package/dist/ueditor.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-C2EHPHWH.js.map +0 -1
- package/dist/chunk-GKUKLOSO.js.map +0 -1
- package/dist/chunk-TVCZXO6G.js.map +0 -1
- /package/dist/{DatePicker-BYYBKHWH.js.map → DatePicker-VRS4SBIH.js.map} +0 -0
- /package/dist/{menu-bar-67LDC7IR.js.map → menu-bar-SGKLM6IK.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/UEditor/prepare-content-for-save.ts","../src/components/UEditor/UEditor.tsx","../src/components/UEditor/extensions.ts","../src/components/UEditor/callout.ts","../src/components/UEditor/CalloutView.tsx","../src/components/UEditor/emoji-picker.tsx","../src/components/UEditor/bookmark.ts","../src/components/UEditor/BookmarkView.tsx","../src/components/UEditor/file-card.ts","../src/components/UEditor/FileCardView.tsx","../src/components/UEditor/form-checkbox.ts","../src/components/UEditor/FormCheckboxView.tsx","../src/components/UEditor/form-radio.ts","../src/components/UEditor/FormRadioView.tsx","../src/components/UEditor/date-picker-node.ts","../src/components/UEditor/DatePickerNodeView.tsx","../src/components/UEditor/slash-command.tsx","../src/components/UEditor/tippy-interop.ts","../src/components/UEditor/emoji-suggestion.tsx","../src/components/UEditor/formula-suggestion.tsx","../src/components/UEditor/placeholder.ts","../src/components/UEditor/resizable-image.tsx","../src/components/UEditor/table-row.ts","../src/components/UEditor/font-family.ts","../src/components/UEditor/font-size.ts","../src/components/UEditor/line-height.ts","../src/components/UEditor/letter-spacing.ts","../src/components/UEditor/indent.ts","../src/components/UEditor/table-align.ts","../src/components/UEditor/CodeBlockView.tsx","../src/components/UEditor/optimized-lowlight.ts","../src/components/UEditor/table-formula-recalculation.ts","../src/components/UEditor/table-formula-commands.ts","../src/components/UEditor/menus.tsx","../src/components/UEditor/table-border-commands.ts","../src/components/UEditor/shared-global-listeners.ts","../src/components/UEditor/CharacterCount.tsx","../src/components/UEditor/table-controls.tsx","../src/components/UEditor/table-hover-state.ts","../src/components/UEditor/table-drag-preview.tsx","../src/components/UEditor/table-add-rails.tsx","../src/components/UEditor/table-control-menu.tsx","../src/components/UEditor/table-axis-handles.tsx","../src/components/UEditor/table-resize-handles.tsx","../src/components/UEditor/use-table-interactions.ts","../src/components/UEditor/use-table-row-resize.ts","../src/components/UEditor/use-formula-coordinate-overlay.ts","../src/components/UEditor/table-formula-range-picker.ts","../src/components/UEditor/table-formula-bar.tsx","../src/components/UEditor/use-editor-output.ts"],"sourcesContent":["import type {\n UEditorPrepareContentForSaveResult,\n UEditorPrepareContentUploadMeta,\n UEditorUploadImageForSave,\n UEditorUploadImageForSaveResult,\n} from \"./types.ts\";\nimport { sanitizeUEditorUrl } from \"./url-safety.ts\";\n\ntype ImgTagMatch = {\n start: number;\n end: number;\n tag: string;\n srcAttr: {\n start: number;\n end: number;\n value: string;\n quote: \"\\\"\" | \"'\" | \"\";\n } | null;\n};\n\ntype Base64Candidate = {\n id: string;\n match: ImgTagMatch;\n index: number;\n src: string;\n};\n\nconst MIME_EXTENSION_MAP: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/webp\": \"webp\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/bmp\": \"bmp\",\n \"image/x-icon\": \"ico\",\n \"image/avif\": \"avif\",\n};\n\nfunction isDataImageUrl(value: string): boolean {\n return /^data:image\\//i.test(value.trim());\n}\n\nfunction parseDataImageUrl(dataUrl: string): { mime: string; base64Data: string } | null {\n const value = dataUrl.trim();\n if (!isDataImageUrl(value)) return null;\n\n const commaIndex = value.indexOf(\",\");\n if (commaIndex < 0) return null;\n\n const header = value.slice(5, commaIndex);\n const base64Data = value.slice(commaIndex + 1).trim();\n if (!/;base64/i.test(header)) return null;\n\n const mime = header.split(\";\")[0]?.trim().toLowerCase();\n if (!mime || !base64Data) return null;\n\n return { mime, base64Data };\n}\n\nfunction decodeBase64ToBytes(base64Data: string): Uint8Array {\n const normalized = base64Data.replace(/\\s+/g, \"\");\n if (typeof Buffer !== \"undefined\") {\n return new Uint8Array(Buffer.from(normalized, \"base64\"));\n }\n const binary = atob(normalized);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction inferFileExtension(mime: string): string {\n return MIME_EXTENSION_MAP[mime] ?? \"bin\";\n}\n\nfunction createFileFromDataImageUrl(dataUrl: string, index: number): File {\n const parsed = parseDataImageUrl(dataUrl);\n if (!parsed) {\n throw new Error(\"Invalid data image URL format.\");\n }\n\n const bytes = decodeBase64ToBytes(parsed.base64Data);\n const extension = inferFileExtension(parsed.mime);\n const name = `ueditor-image-${index + 1}.${extension}`;\n return new File([bytes as unknown as BlobPart], name, { type: parsed.mime });\n}\n\nfunction normalizeUploadResult(\n result: UEditorUploadImageForSaveResult,\n kind: \"image\" | \"file\",\n): { url: string; meta?: UEditorPrepareContentUploadMeta } {\n if (typeof result === \"string\") {\n const url = sanitizeUEditorUrl(result, kind);\n if (!url) throw new Error(\"Upload handler returned an empty URL.\");\n return { url };\n }\n\n if (!result || typeof result !== \"object\") {\n throw new Error(\"Upload handler returned invalid result.\");\n }\n\n const url = typeof result.url === \"string\" ? sanitizeUEditorUrl(result.url, kind) : \"\";\n if (!url) throw new Error(\"Upload handler object result is missing `url`.\");\n\n const { url: _ignoredUrl, ...rest } = result;\n const meta = Object.keys(rest).length > 0 ? rest : undefined;\n return { url, meta };\n}\n\nasync function runWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T) => Promise<R>,\n): Promise<R[]> {\n const limit = Math.max(1, Math.floor(concurrency));\n const results = new Array<R>(items.length);\n let nextIndex = 0;\n\n async function runNext() {\n while (nextIndex < items.length) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n results[currentIndex] = await worker(items[currentIndex]);\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, runNext));\n return results;\n}\n\nfunction getErrorReason(error: unknown): string {\n if (error instanceof Error && error.message) return error.message;\n if (typeof error === \"string\" && error.trim()) return error;\n return \"Unknown upload error.\";\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/"/gi, \"\\\"\")\n .replace(/'/gi, \"'\")\n .replace(/&/gi, \"&\")\n .replace(/</gi, \"<\")\n .replace(/>/gi, \">\")\n .replace(/ /gi, \" \");\n}\n\nexport function normalizeImageUrl(url: string): string {\n const input = decodeHtmlEntities(url.trim());\n if (!input) return \"\";\n if (isDataImageUrl(input)) return input;\n\n const isAbsolute = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(input);\n if (!isAbsolute) {\n return input.split(\"#\")[0] ?? input;\n }\n\n try {\n const parsed = new URL(input);\n parsed.hash = \"\";\n\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n parsed.hostname = parsed.hostname.toLowerCase();\n if ((parsed.protocol === \"http:\" && parsed.port === \"80\") || (parsed.protocol === \"https:\" && parsed.port === \"443\")) {\n parsed.port = \"\";\n }\n if (parsed.pathname.length > 1 && parsed.pathname.endsWith(\"/\")) {\n parsed.pathname = parsed.pathname.slice(0, -1);\n }\n }\n\n return parsed.toString();\n } catch {\n return input.split(\"#\")[0] ?? input;\n }\n}\n\nfunction replaceSrcInTag(match: ImgTagMatch, nextSrc: string): string {\n if (!match.srcAttr) return match.tag;\n\n const { start, end } = match.srcAttr;\n const srcAttr = `src=\"${escapeHtmlAttribute(nextSrc)}\"`;\n return `${match.tag.slice(0, start)}${srcAttr}${match.tag.slice(end)}`;\n}\n\nfunction escapeHtmlAttribute(value: string) {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction collectImgTagMatches(html: string): ImgTagMatch[] {\n const matches: ImgTagMatch[] = [];\n const imgRegex = /<img\\b[^>]*>/gi;\n const srcAttrRegex = /\\bsrc\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+))/i;\n\n let tagMatch: RegExpExecArray | null = imgRegex.exec(html);\n while (tagMatch) {\n const tag = tagMatch[0];\n const start = tagMatch.index;\n const end = start + tag.length;\n\n const srcMatch = srcAttrRegex.exec(tag);\n let srcAttr: ImgTagMatch[\"srcAttr\"] = null;\n\n if (srcMatch) {\n const value = srcMatch[1] ?? srcMatch[2] ?? srcMatch[3] ?? \"\";\n const quote: \"\\\"\" | \"'\" | \"\" = srcMatch[1] !== undefined ? \"\\\"\" : srcMatch[2] !== undefined ? \"'\" : \"\";\n srcAttr = {\n start: srcMatch.index,\n end: srcMatch.index + srcMatch[0].length,\n value,\n quote,\n };\n }\n\n matches.push({ start, end, tag, srcAttr });\n tagMatch = imgRegex.exec(html);\n }\n\n return matches;\n}\n\nexport function extractImageSrcsFromHtml(html: string): string[] {\n if (!html || !html.includes(\"<img\")) return [];\n\n return collectImgTagMatches(html)\n .map((match) => decodeHtmlEntities(match.srcAttr?.value.trim() ?? \"\"))\n .filter(Boolean);\n}\n\nfunction createResult({\n html,\n uploaded,\n inlineUploaded,\n errors,\n}: {\n html: string;\n uploaded: UEditorPrepareContentForSaveResult[\"uploaded\"];\n inlineUploaded: UEditorPrepareContentForSaveResult[\"inlineUploaded\"];\n errors: UEditorPrepareContentForSaveResult[\"errors\"];\n}): UEditorPrepareContentForSaveResult {\n return {\n html,\n uploaded,\n inlineImageUrls: extractImageSrcsFromHtml(html),\n inlineUploaded,\n errors,\n };\n}\n\nexport class UEditorPrepareContentForSaveError extends Error {\n readonly result: UEditorPrepareContentForSaveResult;\n\n constructor(result: UEditorPrepareContentForSaveResult) {\n super(\n `Failed to upload ${result.errors.length} image(s): ${result.errors\n .map((item) => `#${item.index} ${item.reason}`)\n .join(\"; \")}`,\n );\n this.name = \"UEditorPrepareContentForSaveError\";\n this.result = result;\n }\n}\n\nfunction isDataUrl(value: string): boolean {\n return /^data:[^/]+\\/[^;]+;base64,/i.test(value.trim());\n}\n\nfunction parseDataUrl(dataUrl: string): { mime: string; base64Data: string } | null {\n const value = dataUrl.trim();\n if (!/^data:/i.test(value)) return null;\n\n const commaIndex = value.indexOf(\",\");\n if (commaIndex < 0) return null;\n\n const header = value.slice(5, commaIndex);\n const base64Data = value.slice(commaIndex + 1).trim();\n if (!/;base64/i.test(header)) return null;\n\n const mime = header.split(\";\")[0]?.trim().toLowerCase();\n if (!mime || !base64Data) return null;\n\n return { mime, base64Data };\n}\n\nfunction createFileFromDataUrl(dataUrl: string, name: string): File {\n const parsed = parseDataUrl(dataUrl);\n if (!parsed) {\n throw new Error(\"Invalid data URL format.\");\n }\n\n const bytes = decodeBase64ToBytes(parsed.base64Data);\n return new File([bytes as unknown as BlobPart], name || \"attachment.bin\", { type: parsed.mime });\n}\n\ntype FileTagMatch = {\n start: number;\n end: number;\n tag: string;\n hrefAttr: {\n start: number;\n end: number;\n value: string;\n quote: \"\\\"\" | \"'\" | \"\";\n } | null;\n dataSrcAttr: {\n start: number;\n end: number;\n value: string;\n quote: \"\\\"\" | \"'\" | \"\";\n } | null;\n};\n\nfunction collectFileCardMatches(html: string): FileTagMatch[] {\n const matches: FileTagMatch[] = [];\n const tagRegex = /<(div|a)\\b[^>]*data-type=\"file-card\"[^>]*>/gi;\n const hrefAttrRegex = /\\bhref\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+))/i;\n const dataSrcRegex = /\\bdata-src\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+))/i;\n\n let tagMatch: RegExpExecArray | null = tagRegex.exec(html);\n while (tagMatch) {\n const tag = tagMatch[0];\n const start = tagMatch.index;\n const end = start + tag.length;\n\n const hrefMatch = hrefAttrRegex.exec(tag);\n let hrefAttr = null;\n if (hrefMatch) {\n const value = hrefMatch[1] ?? hrefMatch[2] ?? hrefMatch[3] ?? \"\";\n const quote = hrefMatch[1] !== undefined ? \"\\\"\" : hrefMatch[2] !== undefined ? \"'\" : \"\";\n hrefAttr = {\n start: hrefMatch.index,\n end: hrefMatch.index + hrefMatch[0].length,\n value,\n quote: quote as \"\\\"\" | \"'\" | \"\",\n };\n }\n\n const dataSrcMatch = dataSrcRegex.exec(tag);\n let dataSrcAttr = null;\n if (dataSrcMatch) {\n const value = dataSrcMatch[1] ?? dataSrcMatch[2] ?? dataSrcMatch[3] ?? \"\";\n const quote = dataSrcMatch[1] !== undefined ? \"\\\"\" : dataSrcMatch[2] !== undefined ? \"'\" : \"\";\n dataSrcAttr = {\n start: dataSrcMatch.index,\n end: dataSrcMatch.index + dataSrcMatch[0].length,\n value,\n quote: quote as \"\\\"\" | \"'\" | \"\",\n };\n }\n\n matches.push({ start, end, tag, hrefAttr, dataSrcAttr });\n tagMatch = tagRegex.exec(html);\n }\n\n return matches;\n}\n\nfunction replaceFileCardAttrs(tag: string, nextUrl: string): string {\n let result = tag;\n const escapedUrl = escapeHtmlAttribute(nextUrl);\n\n const hrefRegex = /(\\bhref\\s*=\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s\"'=<>`]+)/i;\n const dataSrcRegex = /(\\bdata-src\\s*=\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s\"'=<>`]+)/i;\n\n if (hrefRegex.test(result)) {\n result = result.replace(hrefRegex, `$1\"${escapedUrl}\"`);\n }\n if (dataSrcRegex.test(result)) {\n result = result.replace(dataSrcRegex, `$1\"${escapedUrl}\"`);\n }\n\n return result;\n}\n\nexport async function prepareUEditorContentForSave({\n html,\n uploadImageForSave,\n uploadFileForSave,\n uploadConcurrency = 3,\n}: {\n html: string;\n uploadImageForSave?: UEditorUploadImageForSave;\n uploadFileForSave?: (file: File) => Promise<string | ({ url: string } & Record<string, unknown>)>;\n uploadConcurrency?: number;\n}): Promise<UEditorPrepareContentForSaveResult> {\n const hasImages = html && html.includes(\"<img\");\n const hasFileCards = html && html.includes(\"data-type=\\\"file-card\\\"\");\n\n if (!hasImages && !hasFileCards) {\n return createResult({ html, uploaded: [], inlineUploaded: [], errors: [] });\n }\n\n const imgMatches = hasImages ? collectImgTagMatches(html) : [];\n const fileCardMatches = hasFileCards ? collectFileCardMatches(html) : [];\n\n if (imgMatches.length === 0 && fileCardMatches.length === 0) {\n return createResult({ html, uploaded: [], inlineUploaded: [], errors: [] });\n }\n\n const base64Candidates: Base64Candidate[] = [];\n for (const match of imgMatches) {\n if (!match.srcAttr) continue;\n const src = match.srcAttr.value.trim();\n if (!isDataImageUrl(src)) continue;\n\n base64Candidates.push({\n id: `${match.start}:${match.end}`,\n match,\n index: base64Candidates.length,\n src,\n });\n }\n\n const fileCandidates: { id: string; match: FileTagMatch; index: number; src: string; fileName: string }[] = [];\n for (const match of fileCardMatches) {\n const src = (match.dataSrcAttr?.value || match.hrefAttr?.value || \"\").trim();\n if (!src || !isDataUrl(src)) continue;\n\n const fileNameRegex = /\\bdata-file-name\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+))/i;\n const fileNameMatch = fileNameRegex.exec(match.tag);\n const fileName = fileNameMatch ? (fileNameMatch[1] ?? fileNameMatch[2] ?? fileNameMatch[3] ?? \"attachment.bin\") : \"attachment.bin\";\n\n fileCandidates.push({\n id: `${match.start}:${match.end}`,\n match,\n index: fileCandidates.length,\n src,\n fileName,\n });\n }\n\n if (base64Candidates.length === 0 && fileCandidates.length === 0) {\n return createResult({ html, uploaded: [], inlineUploaded: [], errors: [] });\n }\n\n const uploaded: UEditorPrepareContentForSaveResult[\"uploaded\"] = [];\n const inlineUploaded: UEditorPrepareContentForSaveResult[\"inlineUploaded\"] = [];\n const errors: UEditorPrepareContentForSaveResult[\"errors\"] = [];\n const replacements = new Map<string, string>();\n\n // Process Images\n if (base64Candidates.length > 0) {\n if (!uploadImageForSave) {\n for (const item of base64Candidates) {\n errors.push({\n index: item.index,\n reason: \"`uploadImageForSave` is required to transform base64 images before save.\",\n });\n }\n } else {\n const uploadResults = await runWithConcurrency(\n base64Candidates,\n uploadConcurrency,\n async (candidate) => {\n try {\n const file = createFileFromDataImageUrl(candidate.src, candidate.index);\n const uploadResult = await uploadImageForSave(file);\n const normalized = normalizeUploadResult(uploadResult, \"image\");\n return { candidate, file, ...normalized };\n } catch (error) {\n return { candidate, error: getErrorReason(error) };\n }\n },\n );\n\n for (const item of uploadResults) {\n if (\"error\" in item) {\n errors.push({\n index: item.candidate.index,\n reason: item.error ?? \"Unknown upload error.\",\n });\n continue;\n }\n\n replacements.set(item.candidate.id, item.url);\n uploaded.push({\n url: item.url,\n file: item.file,\n meta: item.meta,\n });\n inlineUploaded.push({\n index: item.candidate.index,\n url: item.url,\n file: item.file,\n meta: item.meta,\n });\n }\n }\n }\n\n // Process File Cards\n if (fileCandidates.length > 0) {\n const uploadFn = uploadFileForSave || uploadImageForSave;\n if (!uploadFn) {\n for (const item of fileCandidates) {\n errors.push({\n index: base64Candidates.length + item.index,\n reason: \"`uploadFileForSave` or `uploadImageForSave` is required to transform base64 files before save.\",\n });\n }\n } else {\n const fileUploadResults = await runWithConcurrency(\n fileCandidates,\n uploadConcurrency,\n async (candidate) => {\n try {\n const file = createFileFromDataUrl(candidate.src, candidate.fileName);\n const uploadResult = await uploadFn(file);\n const normalized = normalizeUploadResult(uploadResult, \"file\");\n return { candidate, file, ...normalized };\n } catch (error) {\n return { candidate, error: getErrorReason(error) };\n }\n },\n );\n\n for (const item of fileUploadResults) {\n if (\"error\" in item) {\n errors.push({\n index: base64Candidates.length + item.candidate.index,\n reason: item.error ?? \"Unknown file upload error.\",\n });\n continue;\n }\n\n replacements.set(item.candidate.id, item.url);\n uploaded.push({\n url: item.url,\n file: item.file,\n meta: item.meta,\n });\n }\n }\n }\n\n // Combine and sort replacements\n const allMatches: ({ type: \"img\"; match: ImgTagMatch } | { type: \"file\"; match: FileTagMatch })[] = [];\n for (const match of imgMatches) {\n allMatches.push({ type: \"img\", match });\n }\n for (const match of fileCardMatches) {\n allMatches.push({ type: \"file\", match });\n }\n allMatches.sort((a, b) => a.match.start - b.match.start);\n\n let transformed = \"\";\n let cursor = 0;\n\n for (const item of allMatches) {\n const match = item.match;\n transformed += html.slice(cursor, match.start);\n\n const replacementKey = `${match.start}:${match.end}`;\n const replacementUrl = replacements.get(replacementKey);\n\n if (item.type === \"img\") {\n const imgMatch = match as ImgTagMatch;\n transformed += replacementUrl ? replaceSrcInTag(imgMatch, replacementUrl) : imgMatch.tag;\n } else {\n const fileMatch = match as FileTagMatch;\n transformed += replacementUrl ? replaceFileCardAttrs(fileMatch.tag, replacementUrl) : fileMatch.tag;\n }\n\n cursor = match.end;\n }\n\n transformed += html.slice(cursor);\n\n return createResult({ html: transformed, uploaded, inlineUploaded, errors });\n}\n","\"use client\";\n\nimport React, { useEffect, useImperativeHandle, useMemo, useRef } from \"react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { useEditor, EditorContent } from \"@tiptap/react\";\nimport { cn } from \"../../utils/cn\";\nimport { buildUEditorExtensions } from \"./extensions\";\nimport type {\n UEditorFontFamilyOption,\n UEditorFontSizeOption,\n UEditorLetterSpacingOption,\n UEditorLineHeightOption,\n UEditorPrepareContentForSaveResult,\n UEditorProps,\n UEditorRef,\n} from \"./types\";\nimport { EditorToolbar, EditorUiRenderStateProvider } from \"./toolbar\";\nimport { CustomBubbleMenu, CustomFloatingMenu } from \"./menus\";\nimport { CharacterCountDisplay } from \"./CharacterCount\";\nimport { prepareUEditorContentForSave, UEditorPrepareContentForSaveError } from \"./prepare-content-for-save\";\nimport { TableControls } from \"./table-controls\";\nimport { UEDITOR_PROSEMIRROR_CLASS_NAME } from \"./editor-styles\";\nimport { resolveEventElement } from \"./table-dom-utils\";\nimport { useUEditorTableInteractions } from \"./use-table-interactions\";\nimport { useFormulaCoordinateOverlay } from \"./use-formula-coordinate-overlay\";\nimport {\n clearSelectedTableCellFormula,\n getSelectedTableFormulaCell,\n isEditingTableFormulaText,\n recalculateActiveTableFormulas,\n recalculateAllTableFormulas,\n UEDITOR_TABLE_FORMULA_RECALCULATE_META,\n} from \"./table-formula-commands\";\nimport {\n beginFormulaRangePick,\n cancelFormulaEditing,\n getFormulaEditingTableContext,\n getFormulaRangePickHighlight,\n updateFormulaRangePick,\n type FormulaRangePickHighlight,\n type FormulaRangePickState,\n} from \"./table-formula-range-picker\";\nimport { isDraftTableFormula } from \"./table-formula\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\nimport { TableFormulaBar } from \"./table-formula-bar\";\nimport { useUEditorOutput } from \"./use-editor-output\";\nimport { UEditorPortalProvider } from \"./portal-context\";\n\nconst LazyMenuBar = React.lazy(async () => {\n const { MenuBar } = await import(\"./menu-bar\");\n return { default: MenuBar };\n});\n\nconst UEditor = React.forwardRef<UEditorRef, UEditorProps>(({\n getPortalContainer,\n content = \"\",\n onChange,\n onHtmlChange,\n onJsonChange,\n outputDebounceMs = 0,\n uploadImage,\n uploadImageForSave,\n uploadImageConcurrency = 3,\n imageInsertMode = \"base64\",\n maxImageFileSize,\n allowedImageMimeTypes,\n fallbackToDataUrl,\n onImageUploadError,\n placeholder,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n className,\n editable = true,\n autofocus = false,\n showToolbar = true,\n showBubbleMenu = true,\n bubbleMenuPlacement = \"auto\",\n showFloatingMenu = false,\n enableAutocomplete = true,\n showCharacterCount = true,\n showFooter = true,\n maxCharacters,\n minHeight = \"200px\",\n maxHeight = \"auto\",\n tableCellHorizontalPadding = 8,\n expandWideTables = true,\n variant = \"default\",\n rounded = true,\n fontFamilies,\n defaultFontFamily = \"Inter\",\n fontSizes,\n lineHeights,\n letterSpacings,\n fetchMetadata,\n uploadFile,\n uploadFileForSave,\n extraExtensions,\n showMenuBar = false,\n showPreviewButton = true,\n onSave,\n onExport,\n onSourceCode,\n onPreview,\n}: UEditorProps, ref) => {\n const t = useSmartTranslations(\"UEditor\");\n const effectivePlaceholder = placeholder ?? t(\"placeholder\");\n const resolvedTableCellHorizontalPadding = Number.isFinite(tableCellHorizontalPadding)\n ? Math.max(0, tableCellHorizontalPadding)\n : 8;\n const inFlightPrepareRef = useRef<{\n html: string;\n promise: Promise<UEditorPrepareContentForSaveResult>;\n } | null>(null);\n const lastAppliedContentRef = useRef(content ?? \"\");\n const scheduledFormulaRecalculateRef = useRef(false);\n const pendingFormulaTextRecalculateRef = useRef(false);\n const editorInstanceRef = useRef<NonNullable<ReturnType<typeof useEditor>> | null>(null);\n const formulaRangePickRef = useRef<FormulaRangePickState | null>(null);\n const formulaRangeSurfaceRef = useRef<HTMLDivElement | null>(null);\n const [formulaRangeHighlight, setFormulaRangeHighlight] = React.useState<FormulaRangePickHighlight | null>(null);\n const [isMenuBarVisible, setIsMenuBarVisible] = React.useState(showMenuBar);\n\n useEffect(() => {\n setIsMenuBarVisible(showMenuBar);\n }, [showMenuBar]);\n const { flushOutputUpdates, scheduleOutputUpdate } = useUEditorOutput({\n onChange,\n onHtmlChange,\n onJsonChange,\n outputDebounceMs,\n });\n const scheduleFormulaRecalculate = React.useCallback((editor: NonNullable<ReturnType<typeof useEditor>>, options?: { force?: boolean }) => {\n if (editor.isDestroyed || scheduledFormulaRecalculateRef.current) return;\n if (!options?.force && isEditingTableFormulaText(editor)) return;\n\n scheduledFormulaRecalculateRef.current = true;\n queueMicrotask(() => {\n scheduledFormulaRecalculateRef.current = false;\n if (!editor.isDestroyed && (options?.force || !isEditingTableFormulaText(editor))) {\n recalculateActiveTableFormulas(editor);\n }\n });\n }, []);\n\n const resolvedUploadFile = useMemo(() => {\n if (uploadFile) return uploadFile;\n if (uploadFileForSave) {\n return async (file: File) => {\n const res = await uploadFileForSave(file);\n return typeof res === \"string\" ? res : res.url;\n };\n }\n return uploadImage;\n }, [uploadFile, uploadFileForSave, uploadImage]);\n\n const extensions = useMemo(\n () => [\n ...buildUEditorExtensions({\n getPortalContainer,\n placeholder: effectivePlaceholder,\n translate: t,\n maxCharacters,\n uploadImage,\n uploadFile: resolvedUploadFile,\n imageInsertMode,\n maxImageFileSize,\n allowedImageMimeTypes,\n fallbackToDataUrl,\n onImageUploadError,\n editable,\n fetchMetadata,\n }),\n ...(extraExtensions ?? []),\n ],\n [getPortalContainer, effectivePlaceholder, t, maxCharacters, uploadImage, resolvedUploadFile, imageInsertMode, maxImageFileSize, allowedImageMimeTypes, fallbackToDataUrl, onImageUploadError, editable, fetchMetadata, extraExtensions],\n );\n\n const syncFormulaRangeHighlight = React.useCallback((pickState: FormulaRangePickState | null) => {\n const container = formulaRangeSurfaceRef.current;\n setFormulaRangeHighlight(container && pickState ? getFormulaRangePickHighlight(container, pickState) : null);\n }, []);\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions,\n content,\n editable,\n autofocus,\n enableInputRules: enableAutocomplete,\n editorProps: {\n handleDOMEvents: {\n mousedown: (view, event) => {\n const MouseEventCtor = view.dom.ownerDocument.defaultView?.MouseEvent;\n if (!MouseEventCtor || !(event instanceof MouseEventCtor)) return false;\n const pickState = beginFormulaRangePick(view, event);\n if (!pickState) return false;\n formulaRangePickRef.current = pickState;\n syncFormulaRangeHighlight(pickState);\n return true;\n },\n mousemove: (view, event) => {\n const MouseEventCtor = view.dom.ownerDocument.defaultView?.MouseEvent;\n if (!MouseEventCtor || !(event instanceof MouseEventCtor)) return false;\n const pickState = formulaRangePickRef.current;\n if (!pickState) return false;\n if (event.buttons === 0) {\n formulaRangePickRef.current = null;\n syncFormulaRangeHighlight(null);\n return false;\n }\n const nextPickState = updateFormulaRangePick(view, pickState, event);\n formulaRangePickRef.current = nextPickState;\n syncFormulaRangeHighlight(nextPickState);\n return true;\n },\n mouseup: (_view, event) => {\n const MouseEventCtor = _view.dom.ownerDocument.defaultView?.MouseEvent;\n if (!MouseEventCtor || !(event instanceof MouseEventCtor)) return false;\n if (!formulaRangePickRef.current) return false;\n formulaRangePickRef.current = null;\n syncFormulaRangeHighlight(null);\n event.preventDefault();\n event.stopPropagation();\n return true;\n },\n keydown: (_view, event) => {\n const KeyboardEventCtor = _view.dom.ownerDocument.defaultView?.KeyboardEvent;\n if (!KeyboardEventCtor || !(event instanceof KeyboardEventCtor)) return false;\n const formulaContext = getFormulaEditingTableContext(_view);\n if (formulaContext && event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n const activeEditor = editorInstanceRef.current;\n if (activeEditor && !isDraftTableFormula(formulaContext.formula)) {\n recalculateActiveTableFormulas(activeEditor);\n }\n return true;\n }\n if (formulaContext && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancelFormulaEditing(_view);\n return true;\n }\n const activeEditor = editorInstanceRef.current;\n if (\n activeEditor &&\n (event.key === \"Backspace\" || event.key === \"Delete\") &&\n getSelectedTableFormulaCell(activeEditor)\n ) {\n event.preventDefault();\n event.stopPropagation();\n clearSelectedTableCellFormula(activeEditor);\n return true;\n }\n return false;\n },\n click: (view, event) => {\n const editorWindow = view.dom.ownerDocument.defaultView;\n if (!editorWindow || !(event instanceof editorWindow.MouseEvent)) return false;\n if (event.button !== 0) return false;\n\n const target = resolveEventElement(event.target);\n const anchor = target?.closest?.(\"a[href]\") as HTMLAnchorElement | null;\n const href = sanitizeUEditorUrl(anchor?.getAttribute(\"href\") ?? \"\", \"link\");\n if (!href) return false;\n\n // If editable, let the bubble menu/floating link preview handle it.\n if (editable) return false;\n\n // Avoid opening while user is selecting text.\n if (!view.state.selection.empty) return false;\n\n event.preventDefault();\n event.stopPropagation();\n editorWindow.open(href, \"_blank\", \"noopener,noreferrer\");\n return true;\n },\n },\n attributes: {\n class: UEDITOR_PROSEMIRROR_CLASS_NAME,\n role: editable ? \"textbox\" : \"document\",\n ...(editable ? { \"aria-multiline\": \"true\" } : { \"aria-readonly\": \"true\" }),\n ...(ariaLabelledBy\n ? { \"aria-labelledby\": ariaLabelledBy }\n : { \"aria-label\": ariaLabel ?? t(\"accessibility.editorLabel\") }),\n ...(ariaDescribedBy ? { \"aria-describedby\": ariaDescribedBy } : null),\n },\n },\n onUpdate: ({ editor, transaction, appendedTransactions }) => {\n const includesFormulaRecalculation = transaction.getMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META)\n || appendedTransactions.some((appendedTransaction) => (\n appendedTransaction.getMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META)\n ));\n if (!includesFormulaRecalculation) {\n if (isEditingTableFormulaText(editor)) {\n pendingFormulaTextRecalculateRef.current = true;\n } else {\n pendingFormulaTextRecalculateRef.current = false;\n }\n }\n\n scheduleOutputUpdate(editor);\n },\n onSelectionUpdate: ({ editor }) => {\n if (pendingFormulaTextRecalculateRef.current && !isEditingTableFormulaText(editor)) {\n pendingFormulaTextRecalculateRef.current = false;\n scheduleFormulaRecalculate(editor);\n }\n },\n onBlur: ({ editor, event }) => {\n const nextTarget = event.relatedTarget;\n const editorWindow = editor.view.dom.ownerDocument.defaultView;\n if (editorWindow && nextTarget instanceof editorWindow.Element && nextTarget.closest(\"[data-ueditor-formula-bar]\")) return;\n const shouldRecalculate = pendingFormulaTextRecalculateRef.current;\n pendingFormulaTextRecalculateRef.current = false;\n if (shouldRecalculate) scheduleFormulaRecalculate(editor, { force: true });\n // Formula recalculation is queued first. Flushing in the following\n // microtask emits the final computed document before focus leaves.\n queueMicrotask(flushOutputUpdates);\n },\n });\n useEffect(() => {\n editorInstanceRef.current = editor;\n return () => {\n if (editorInstanceRef.current === editor) editorInstanceRef.current = null;\n };\n }, [editor]);\n\n const {\n editorContentRef,\n tableColumnGuideRef,\n tableRowGuideRef,\n activeTableCellHighlightRef,\n } = useUEditorTableInteractions(editor, editable);\n const formulaCoordinateOverlayRef = useFormulaCoordinateOverlay(editor, editorContentRef, {\n apply: t(\"tableMenu.apply\"),\n cancel: t(\"imageInput.cancelBtn\"),\n });\n\n useImperativeHandle(\n ref,\n () => ({\n editor,\n prepareContentForSave: async ({ throwOnError = false } = {}) => {\n const htmlSnapshot = editor?.getHTML() ?? content ?? \"\";\n if (!inFlightPrepareRef.current || inFlightPrepareRef.current.html !== htmlSnapshot) {\n let trackedPromise: Promise<UEditorPrepareContentForSaveResult>;\n trackedPromise = prepareUEditorContentForSave({\n html: htmlSnapshot,\n uploadImageForSave,\n uploadFileForSave,\n uploadConcurrency: uploadImageConcurrency,\n }).finally(() => {\n if (inFlightPrepareRef.current?.promise === trackedPromise) {\n inFlightPrepareRef.current = null;\n }\n });\n inFlightPrepareRef.current = { html: htmlSnapshot, promise: trackedPromise };\n }\n\n const result = await inFlightPrepareRef.current.promise;\n if (throwOnError && result.errors.length > 0) {\n throw new UEditorPrepareContentForSaveError(result);\n }\n return result;\n },\n }),\n [content, editor, uploadImageForSave, uploadFileForSave, uploadImageConcurrency],\n );\n\n useEffect(() => {\n if (!editor) return;\n\n queueMicrotask(() => {\n if (!editor.isDestroyed) {\n recalculateAllTableFormulas(editor);\n }\n });\n }, [editor]);\n\n useEffect(() => {\n if (!editor) return;\n\n const nextContent = content ?? \"\";\n if (lastAppliedContentRef.current === nextContent) return;\n\n lastAppliedContentRef.current = nextContent;\n if (editor.getHTML() !== nextContent) {\n // Schedule content update in a microtask to avoid flushSync warning during React rendering/effects phase\n Promise.resolve().then(() => {\n if (!editor.isDestroyed) {\n editor.commands.setContent(nextContent, { emitUpdate: false });\n queueMicrotask(() => {\n if (!editor.isDestroyed) {\n recalculateAllTableFormulas(editor);\n }\n });\n }\n });\n }\n }, [content, editor]);\n\n if (!editor) {\n return (\n <UEditorPortalProvider getPortalContainer={getPortalContainer}>\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\"w-full border bg-background flex items-center justify-center text-muted-foreground\", className)}\n style={{ minHeight }}\n >\n {t(\"loading\")}\n </div>\n </UEditorPortalProvider>\n );\n }\n\n return (\n <UEditorPortalProvider getPortalContainer={getPortalContainer}>\n <div data-ueditor-width-boundary=\"\" className=\"w-full\">\n <div\n className={cn(\n \"group relative flex flex-col text-card-foreground\",\n editable ? [\n \"border border-border/50 bg-card overflow-hidden\",\n \"transition-[transform,box-shadow,border-color,background-color] duration-300 ease-soft\",\n \"shadow-sm focus-within:shadow-md focus-within:border-primary/15\",\n \"backdrop-blur-sm\",\n variant === \"notion\" && \"hover:shadow-md\",\n rounded ? \"rounded-2xl md:rounded-3xl max-md:rounded-xl\" : \"rounded-none\",\n ] : \"rounded-none\",\n className,\n )}\n >\n {editable && (showMenuBar || showToolbar || showBubbleMenu) ? (\n <EditorUiRenderStateProvider editor={editor}>\n {isMenuBarVisible && (\n <React.Suspense fallback={null}>\n <LazyMenuBar\n editor={editor}\n containerRef={editorContentRef}\n uploadImage={uploadImage}\n imageInsertMode={imageInsertMode}\n maxImageFileSize={maxImageFileSize}\n allowedImageMimeTypes={allowedImageMimeTypes}\n onImageUploadError={onImageUploadError}\n fallbackToDataUrl={fallbackToDataUrl}\n onSave={onSave}\n onExport={onExport}\n onSourceCode={onSourceCode}\n onPreview={onPreview}\n showPreviewButton={showPreviewButton}\n />\n </React.Suspense>\n )}\n {showToolbar && (\n <EditorToolbar\n editor={editor}\n variant={variant}\n isMenuBarVisible={isMenuBarVisible}\n onToggleMenuBar={() => setIsMenuBarVisible((visible) => !visible)}\n uploadImage={uploadImage}\n imageInsertMode={imageInsertMode}\n maxImageFileSize={maxImageFileSize}\n allowedImageMimeTypes={allowedImageMimeTypes}\n onImageUploadError={onImageUploadError}\n fallbackToDataUrl={fallbackToDataUrl}\n fontFamilies={fontFamilies as UEditorFontFamilyOption[] | undefined}\n defaultFontFamily={defaultFontFamily}\n fontSizes={fontSizes as UEditorFontSizeOption[] | undefined}\n lineHeights={lineHeights as UEditorLineHeightOption[] | undefined}\n letterSpacings={letterSpacings as UEditorLetterSpacingOption[] | undefined}\n />\n )}\n <TableFormulaBar editor={editor} />\n {showBubbleMenu && (\n <CustomBubbleMenu\n editor={editor}\n placement={bubbleMenuPlacement}\n fontSizes={fontSizes as UEditorFontSizeOption[] | undefined}\n lineHeights={lineHeights as UEditorLineHeightOption[] | undefined}\n />\n )}\n </EditorUiRenderStateProvider>\n ) : editable ? (\n <TableFormulaBar editor={editor} />\n ) : null}\n {editable && showFloatingMenu && <CustomFloatingMenu editor={editor} />}\n <div\n ref={(node) => {\n editorContentRef.current = node;\n formulaRangeSurfaceRef.current = node;\n }}\n className={cn(\n \"relative flex-1 overflow-x-auto overflow-y-auto [scrollbar-width:thin] [scrollbar-color:hsl(var(--border))_transparent]\",\n expandWideTables && \"[&_.tableWrapper]:!overflow-visible [&_.tableWrapper]:!pb-0\",\n )}\n style={{\n fontFamily: defaultFontFamily,\n minHeight: editable ? minHeight : undefined,\n maxHeight,\n \"--ueditor-table-cell-padding-x\": `${resolvedTableCellHorizontalPadding}px`,\n } as React.CSSProperties}\n >\n <span\n ref={tableColumnGuideRef}\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 bg-primary/50 opacity-0 transition-opacity duration-200 delay-100 ease-out\"\n />\n <span\n ref={tableRowGuideRef}\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 bg-primary/50 opacity-0 transition-opacity duration-200 delay-100 ease-out\"\n />\n <span\n ref={activeTableCellHighlightRef}\n aria-hidden=\"true\"\n data-ueditor-active-cell-highlight=\"\"\n className=\"pointer-events-none hidden absolute z-20 rounded-[2px] border border-primary/50 bg-primary/5\"\n />\n <div\n ref={formulaCoordinateOverlayRef}\n data-ueditor-formula-coordinate-overlay=\"\"\n className=\"pointer-events-none absolute inset-0 z-[35] hidden overflow-visible\"\n />\n {formulaRangeHighlight && (\n <span\n aria-hidden=\"true\"\n data-ueditor-formula-range-highlight=\"\"\n data-ueditor-formula-range-blocked={formulaRangeHighlight.blocked ? \"true\" : undefined}\n className={cn(\n \"pointer-events-none absolute z-20 rounded-[2px] border-2\",\n formulaRangeHighlight.blocked\n ? \"border-destructive bg-destructive/15\"\n : \"border-primary bg-primary/10\",\n )}\n style={{\n left: formulaRangeHighlight.left,\n top: formulaRangeHighlight.top,\n width: formulaRangeHighlight.width,\n height: formulaRangeHighlight.height,\n }}\n />\n )}\n {editable && (\n <TableControls\n editor={editor}\n containerRef={editorContentRef}\n showCellInspector={showBubbleMenu}\n />\n )}\n <EditorContent\n editor={editor}\n className=\"min-h-full\"\n />\n </div>\n\n {showFooter && showCharacterCount && <CharacterCountDisplay editor={editor} maxCharacters={maxCharacters} />}\n </div>\n </div>\n </UEditorPortalProvider>\n );\n});\n\nUEditor.displayName = \"UEditor\";\n\nexport default UEditor;\n","import { mergeAttributes } from \"@tiptap/core\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { BulletList } from \"@tiptap/extension-bullet-list\";\nimport { OrderedList } from \"@tiptap/extension-ordered-list\";\nimport { ListItem } from \"@tiptap/extension-list-item\";\nimport { ListKeymap } from \"@tiptap/extension-list\";\nimport { TaskList } from \"@tiptap/extension-task-list\";\nimport { TaskItem } from \"@tiptap/extension-task-item\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { wrappingInputRule } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { Callout } from \"./callout\";\nimport { Bookmark } from \"./bookmark\";\nimport { FileCard } from \"./file-card\";\nimport { FormCheckbox } from \"./form-checkbox\";\nimport { FormRadio } from \"./form-radio\";\nimport { DatePickerNode } from \"./date-picker-node\";\nimport { CodeBlockLowlight } from \"@tiptap/extension-code-block-lowlight\";\nimport { History } from \"@tiptap/extension-history\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { Color } from \"@tiptap/extension-color\";\nimport { Highlight } from \"@tiptap/extension-highlight\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport { CharacterCount } from \"@tiptap/extension-character-count\";\nimport { Typography } from \"@tiptap/extension-typography\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Gapcursor } from \"@tiptap/extension-gapcursor\";\nimport { buildSlashCommandMessages, SlashCommand } from \"./slash-command\";\nimport { ClipboardImages } from \"./clipboard-images\";\nimport { EmojiSuggestion } from \"./emoji-suggestion\";\nimport { FormulaSuggestion } from \"./formula-suggestion\";\nimport { UEditorPlaceholder } from \"./placeholder\";\nimport ResizableImage from \"./resizable-image\";\nimport UEditorTableRow from \"./table-row\";\nimport FontFamily from \"./font-family\";\nimport FontSize from \"./font-size\";\nimport LineHeight from \"./line-height\";\nimport LetterSpacing from \"./letter-spacing\";\nimport Indent from \"./indent\";\nimport UEditorTable from \"./table-align\";\nimport { isSafeUEditorUrl } from \"./url-safety\";\nimport { CodeBlockView } from \"./CodeBlockView\";\nimport { createOptimizedLowlightPlugin, type LowlightInstance } from \"./optimized-lowlight\";\nimport { TableFormulaRecalculation } from \"./table-formula-recalculation\";\nimport type { UEditorPortalContainerGetter } from \"./portal-context\";\n\nfunction getFormulaStateAttributes(attributes: Record<string, unknown>) {\n const formula = attributes[\"data-formula\"];\n if (!formula) {\n return {};\n }\n\n const computedValue = String(attributes[\"data-computed-value\"] ?? \"\");\n return {\n \"data-formula-state\": computedValue.startsWith(\"#\") ? \"error\" : \"computed\",\n };\n}\n\ntype TableCellTextWrap = \"wrap\" | \"nowrap\";\n\nfunction normalizeTableCellTextWrap(value: unknown): TableCellTextWrap {\n return value === \"nowrap\" ? \"nowrap\" : \"wrap\";\n}\n\nfunction parseTableCellTextWrap(element: HTMLElement): TableCellTextWrap {\n if (element.getAttribute(\"data-text-wrap\") === \"nowrap\" || element.style.whiteSpace === \"nowrap\") {\n return \"nowrap\";\n }\n\n return \"wrap\";\n}\n\nfunction renderTableCellTextWrap(attributes: Record<string, unknown>) {\n return normalizeTableCellTextWrap(attributes.textWrap) === \"nowrap\"\n ? { \"data-text-wrap\": \"nowrap\" }\n : {};\n}\n\nfunction getTableCellTextWrapStyle(value: unknown) {\n return normalizeTableCellTextWrap(value) === \"nowrap\"\n ? \"white-space: nowrap; overflow-wrap: normal; word-break: normal\"\n : \"white-space: normal; overflow-wrap: anywhere; word-break: normal\";\n}\n\nexport const CustomTableCell = TableCell.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n backgroundColor: {\n default: null,\n parseHTML: (element) => element.style.backgroundColor || element.getAttribute(\"data-background-color\") || null,\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n return {\n \"data-background-color\": attributes.backgroundColor,\n };\n },\n },\n borderColor: {\n default: null,\n parseHTML: (element) => element.style.borderColor || element.getAttribute(\"data-border-color\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderColor) return {};\n return {\n \"data-border-color\": attributes.borderColor,\n };\n },\n },\n borderStyle: {\n default: null,\n parseHTML: (element) => element.style.borderStyle || element.getAttribute(\"data-border-style\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderStyle) return {};\n return {\n \"data-border-style\": attributes.borderStyle,\n };\n },\n },\n borderWidth: {\n default: null,\n parseHTML: (element) => element.style.borderWidth || element.getAttribute(\"data-border-width\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) return {};\n return {\n \"data-border-width\": attributes.borderWidth,\n };\n },\n },\n cellId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-cell-id\") || null,\n renderHTML: (attributes) => {\n if (!attributes.cellId) return {};\n return {\n \"data-cell-id\": attributes.cellId,\n };\n },\n },\n numberFormat: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-number-format\") || null,\n renderHTML: (attributes) => {\n if (!attributes.numberFormat) return {};\n return {\n \"data-number-format\": attributes.numberFormat,\n };\n },\n },\n formula: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-formula\") || null,\n renderHTML: (attributes) => {\n if (!attributes.formula) return {};\n return {\n \"data-formula\": attributes.formula,\n };\n },\n },\n computedValue: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-computed-value\") || null,\n renderHTML: (attributes) => {\n if (!attributes.computedValue) return {};\n return {\n \"data-computed-value\": attributes.computedValue,\n };\n },\n },\n verticalAlign: {\n default: null,\n parseHTML: (element) => element.style.verticalAlign || element.getAttribute(\"data-vertical-align\") || null,\n renderHTML: (attributes) => {\n if (!attributes.verticalAlign) return {};\n return {\n \"data-vertical-align\": attributes.verticalAlign,\n };\n },\n },\n textDirection: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute(\"data-text-direction\") === \"vertical\" || [\"sideways-lr\", \"vertical-lr\", \"vertical-rl\"].includes(element.style.writingMode)\n ? \"vertical\"\n : null,\n renderHTML: (attributes) => attributes.textDirection === \"vertical\" ? { \"data-text-direction\": \"vertical\" } : {},\n },\n textWrap: {\n default: \"wrap\",\n parseHTML: parseTableCellTextWrap,\n renderHTML: renderTableCellTextWrap,\n },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const style = HTMLAttributes.style || \"\";\n const bg = HTMLAttributes[\"data-background-color\"];\n const borderColor = HTMLAttributes[\"data-border-color\"];\n const borderStyle = HTMLAttributes[\"data-border-style\"];\n const borderWidth = HTMLAttributes[\"data-border-width\"];\n const verticalAlign = HTMLAttributes[\"data-vertical-align\"];\n const textDirection = HTMLAttributes[\"data-text-direction\"];\n const textWrap = HTMLAttributes[\"data-text-wrap\"];\n\n let mergedStyle = style;\n if (bg) mergedStyle += `; background-color: ${bg}`;\n if (borderColor) mergedStyle += `; border-color: ${borderColor}`;\n if (borderStyle) mergedStyle += `; border-style: ${borderStyle}`;\n if (borderWidth) mergedStyle += `; border-width: ${borderWidth}`;\n if (verticalAlign) mergedStyle += `; vertical-align: ${verticalAlign}`;\n if (textDirection === \"vertical\") mergedStyle += \"; writing-mode: sideways-lr; text-orientation: mixed\";\n mergedStyle += `; ${getTableCellTextWrapStyle(textWrap)}`;\n mergedStyle = mergedStyle.replace(/^;/, \"\").trim();\n\n return [\n \"td\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, getFormulaStateAttributes(HTMLAttributes), mergedStyle ? { style: mergedStyle } : {}),\n 0,\n ];\n },\n});\n\nexport const CustomTableHeader = TableHeader.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n backgroundColor: {\n default: null,\n parseHTML: (element) => element.style.backgroundColor || element.getAttribute(\"data-background-color\") || null,\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) {\n return {};\n }\n return {\n \"data-background-color\": attributes.backgroundColor,\n };\n },\n },\n borderColor: {\n default: null,\n parseHTML: (element) => element.style.borderColor || element.getAttribute(\"data-border-color\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderColor) return {};\n return {\n \"data-border-color\": attributes.borderColor,\n };\n },\n },\n borderStyle: {\n default: null,\n parseHTML: (element) => element.style.borderStyle || element.getAttribute(\"data-border-style\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderStyle) return {};\n return {\n \"data-border-style\": attributes.borderStyle,\n };\n },\n },\n borderWidth: {\n default: null,\n parseHTML: (element) => element.style.borderWidth || element.getAttribute(\"data-border-width\") || null,\n renderHTML: (attributes) => {\n if (!attributes.borderWidth) return {};\n return {\n \"data-border-width\": attributes.borderWidth,\n };\n },\n },\n cellId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-cell-id\") || null,\n renderHTML: (attributes) => {\n if (!attributes.cellId) return {};\n return {\n \"data-cell-id\": attributes.cellId,\n };\n },\n },\n numberFormat: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-number-format\") || null,\n renderHTML: (attributes) => {\n if (!attributes.numberFormat) return {};\n return {\n \"data-number-format\": attributes.numberFormat,\n };\n },\n },\n formula: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-formula\") || null,\n renderHTML: (attributes) => {\n if (!attributes.formula) return {};\n return {\n \"data-formula\": attributes.formula,\n };\n },\n },\n computedValue: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-computed-value\") || null,\n renderHTML: (attributes) => {\n if (!attributes.computedValue) return {};\n return {\n \"data-computed-value\": attributes.computedValue,\n };\n },\n },\n verticalAlign: {\n default: null,\n parseHTML: (element) => element.style.verticalAlign || element.getAttribute(\"data-vertical-align\") || null,\n renderHTML: (attributes) => {\n if (!attributes.verticalAlign) return {};\n return {\n \"data-vertical-align\": attributes.verticalAlign,\n };\n },\n },\n textDirection: {\n default: null,\n parseHTML: (element) =>\n element.getAttribute(\"data-text-direction\") === \"vertical\" || [\"sideways-lr\", \"vertical-lr\", \"vertical-rl\"].includes(element.style.writingMode)\n ? \"vertical\"\n : null,\n renderHTML: (attributes) => attributes.textDirection === \"vertical\" ? { \"data-text-direction\": \"vertical\" } : {},\n },\n textWrap: {\n default: \"wrap\",\n parseHTML: parseTableCellTextWrap,\n renderHTML: renderTableCellTextWrap,\n },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n const style = HTMLAttributes.style || \"\";\n const bg = HTMLAttributes[\"data-background-color\"];\n const borderColor = HTMLAttributes[\"data-border-color\"];\n const borderStyle = HTMLAttributes[\"data-border-style\"];\n const borderWidth = HTMLAttributes[\"data-border-width\"];\n const verticalAlign = HTMLAttributes[\"data-vertical-align\"];\n const textDirection = HTMLAttributes[\"data-text-direction\"];\n const textWrap = HTMLAttributes[\"data-text-wrap\"];\n\n let mergedStyle = style;\n if (bg) mergedStyle += `; background-color: ${bg}`;\n if (borderColor) mergedStyle += `; border-color: ${borderColor}`;\n if (borderStyle) mergedStyle += `; border-style: ${borderStyle}`;\n if (borderWidth) mergedStyle += `; border-width: ${borderWidth}`;\n if (verticalAlign) mergedStyle += `; vertical-align: ${verticalAlign}`;\n if (textDirection === \"vertical\") mergedStyle += \"; writing-mode: sideways-lr; text-orientation: mixed\";\n mergedStyle += `; ${getTableCellTextWrapStyle(textWrap)}`;\n mergedStyle = mergedStyle.replace(/^;/, \"\").trim();\n\n return [\n \"th\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, getFormulaStateAttributes(HTMLAttributes), mergedStyle ? { style: mergedStyle } : {}),\n 0,\n ];\n },\n});\n\nexport type UEditorBulletStyle = \"disc\" | \"dash\" | \"circle\" | \"square\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n bulletListStyle: {\n setBulletListStyle: (style: UEditorBulletStyle) => ReturnType;\n toggleBulletListStyle: (style: UEditorBulletStyle) => ReturnType;\n };\n }\n}\n\nexport function parseBulletStyle(value: string | null | undefined): UEditorBulletStyle {\n if (!value) return \"disc\";\n const val = String(value).trim().toLowerCase();\n if (val === \"dash\" || val === \"'- '\" || val === \"'-'\") return \"dash\";\n if (val === \"circle\") return \"circle\";\n if (val === \"square\") return \"square\";\n return \"disc\";\n}\n\nexport function getBulletStyleCss(style: UEditorBulletStyle): string {\n switch (style) {\n case \"dash\":\n return \"list-style-type: '- ';\";\n case \"circle\":\n return \"list-style-type: circle;\";\n case \"square\":\n return \"list-style-type: square;\";\n case \"disc\":\n default:\n return \"list-style-type: disc;\";\n }\n}\n\nexport const CustomBulletList = BulletList.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n bulletStyle: {\n default: \"disc\",\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement)) return \"disc\";\n const dataStyle = element.getAttribute(\"data-bullet-style\");\n if (dataStyle) return parseBulletStyle(dataStyle);\n const style = element.style.listStyleType;\n return parseBulletStyle(style);\n },\n renderHTML: (attributes) => {\n const style = parseBulletStyle(attributes.bulletStyle);\n return {\n \"data-bullet-style\": style,\n style: getBulletStyleCss(style),\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n setBulletListStyle: (style: UEditorBulletStyle) => ({ commands }) => {\n return commands.updateAttributes(this.name, { bulletStyle: style });\n },\n toggleBulletListStyle: (style: UEditorBulletStyle) => ({ editor, commands }) => {\n if (editor.isActive(this.name, { bulletStyle: style })) {\n return commands.toggleList(this.name, \"listItem\");\n }\n if (editor.isActive(this.name)) {\n return commands.updateAttributes(this.name, { bulletStyle: style });\n }\n return commands.toggleList(this.name, \"listItem\", undefined, { bulletStyle: style });\n },\n };\n },\n\n addInputRules() {\n return [\n wrappingInputRule({\n find: /^\\s*(-)\\s$/,\n type: this.type,\n getAttributes: () => ({ bulletStyle: \"dash\" }),\n }),\n wrappingInputRule({\n find: /^\\s*(\\*)\\s$/,\n type: this.type,\n getAttributes: () => ({ bulletStyle: \"disc\" }),\n }),\n wrappingInputRule({\n find: /^\\s*(\\+)\\s$/,\n type: this.type,\n getAttributes: () => ({ bulletStyle: \"circle\" }),\n }),\n ];\n },\n});\n\nconst CustomTaskList = TaskList.extend({\n addInputRules() {\n return [\n wrappingInputRule({\n find: /^\\s*(\\[ \\]|\\[\\])\\s$/,\n type: this.type,\n }),\n wrappingInputRule({\n find: /^\\s*(-\\s*\\[ \\]|-\\s*\\[\\])\\s$/,\n type: this.type,\n }),\n wrappingInputRule({\n find: /^\\s*(\\*\\s*\\[ \\]|-\\s*\\[\\])\\s$/,\n type: this.type,\n }),\n ];\n },\n});\n\ntype CommonLowlightRuntime = ReturnType<(typeof import(\"./lowlight-runtime\"))[\"createCommonLowlightRuntime\"]>;\n\nlet commonLowlightRuntime: CommonLowlightRuntime | null = null;\nlet commonLowlightLanguagesPromise: Promise<void> | null = null;\n\nconst lazyLowlight: LowlightInstance = {\n highlight: (language, code) => commonLowlightRuntime?.highlight(language, code) ?? {\n children: [{ value: code }],\n },\n highlightAuto: (code) => commonLowlightRuntime?.highlightAuto(code) ?? {\n children: [{ value: code }],\n },\n listLanguages: () => commonLowlightRuntime?.listLanguages() ?? [],\n registered: (language) => commonLowlightRuntime?.registered(language) ?? false,\n};\n\nfunction ensureCommonLowlightLanguages() {\n if (commonLowlightRuntime) return Promise.resolve();\n\n commonLowlightLanguagesPromise ??= import(\"./lowlight-runtime\")\n .then(({ createCommonLowlightRuntime }) => {\n commonLowlightRuntime = createCommonLowlightRuntime();\n })\n .catch((error) => {\n commonLowlightLanguagesPromise = null;\n throw error;\n });\n\n return commonLowlightLanguagesPromise;\n}\n\nconst CustomCodeBlockLowlight = CodeBlockLowlight.extend({\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlockView);\n },\n\n addProseMirrorPlugins() {\n const parentPlugins = this.parent?.() ?? [];\n return [\n ...parentPlugins.filter((plugin) => {\n const key = (plugin.spec.key as unknown as { key?: string } | undefined)?.key;\n return !key?.startsWith(\"lowlight$\");\n }),\n createOptimizedLowlightPlugin({\n defaultLanguage: this.options.defaultLanguage,\n ensureLanguages: ensureCommonLowlightLanguages,\n lowlight: this.options.lowlight,\n nodeName: this.name,\n }),\n ];\n },\n});\n\nexport function buildUEditorExtensions({\n getPortalContainer,\n placeholder,\n translate,\n maxCharacters,\n uploadImage,\n uploadFile,\n imageInsertMode = \"base64\",\n maxImageFileSize,\n allowedImageMimeTypes,\n fallbackToDataUrl,\n onImageUploadError,\n editable = true,\n fetchMetadata,\n}: {\n getPortalContainer?: UEditorPortalContainerGetter;\n placeholder: string;\n translate: (key: string) => string;\n maxCharacters?: number;\n uploadImage?: (file: File) => Promise<string> | string;\n uploadFile?: (file: File) => Promise<string> | string;\n imageInsertMode?: \"base64\" | \"upload\";\n maxImageFileSize?: number;\n allowedImageMimeTypes?: string[];\n fallbackToDataUrl?: boolean;\n onImageUploadError?: (error: Error, file: File) => void;\n editable?: boolean;\n fetchMetadata?: (url: string) => Promise<{ title?: string; description?: string; image?: string; publisher?: string }>;\n}) {\n return [\n Document,\n Paragraph,\n Text,\n Bold,\n Italic,\n Strike,\n Underline,\n Subscript,\n Superscript,\n Heading.configure({\n levels: [1, 2, 3],\n }),\n CustomBulletList.configure({\n HTMLAttributes: {\n class: \"pl-6 my-2 space-y-1\",\n },\n }),\n OrderedList.configure({\n HTMLAttributes: {\n class: \"list-decimal pl-6 my-2 space-y-1\",\n },\n }),\n ListItem.configure({\n HTMLAttributes: {\n class: \"pl-1\",\n },\n }),\n ListKeymap,\n CustomTaskList,\n TaskItem.configure({\n nested: true,\n }),\n Blockquote.configure({\n HTMLAttributes: {\n class: \"border-l-4 border-primary pl-4 py-2 my-4 bg-muted/30 rounded-r-lg italic text-muted-foreground\",\n },\n }),\n Code.configure({\n HTMLAttributes: {\n class: \"px-1.5 py-0.5 rounded bg-muted font-mono text-sm\",\n },\n }),\n CustomCodeBlockLowlight.configure({\n lowlight: lazyLowlight as CommonLowlightRuntime,\n HTMLAttributes: {\n class: \"rounded-lg border border-border/60 bg-muted/40 text-foreground p-4 font-mono text-sm overflow-x-auto\",\n },\n }),\n HorizontalRule,\n Gapcursor,\n Link.configure({\n openOnClick: false,\n isAllowedUri: (url) => isSafeUEditorUrl(url ?? \"\", \"link\"),\n HTMLAttributes: {\n class: \"text-primary underline underline-offset-2 hover:text-primary/80 cursor-pointer\",\n },\n }),\n ResizableImage,\n ClipboardImages.configure({\n upload: uploadImage,\n insertMode: imageInsertMode,\n ...(maxImageFileSize !== undefined ? { maxFileSize: maxImageFileSize } : {}),\n ...(allowedImageMimeTypes ? { allowedMimeTypes: allowedImageMimeTypes } : {}),\n ...(fallbackToDataUrl !== undefined ? { fallbackToDataUrl } : {}),\n onError: onImageUploadError,\n }),\n TextStyle,\n FontFamily,\n FontSize,\n LineHeight,\n LetterSpacing,\n Indent,\n Color,\n Highlight.configure({\n multicolor: true,\n }),\n TextAlign.configure({\n types: [\"heading\", \"paragraph\", \"image\"],\n }),\n UEditorTable.configure({\n resizable: editable,\n handleWidth: 10,\n allowTableNodeSelection: true,\n HTMLAttributes: {\n class: \"border-collapse my-4\",\n style: \"table-layout: fixed;\",\n },\n }),\n UEditorTableRow,\n CustomTableCell.configure({\n HTMLAttributes: {\n class: \"border border-black px-2 py-0 min-w-25\",\n },\n }),\n CustomTableHeader.configure({\n HTMLAttributes: {\n class: \"border border-black px-2 py-0 bg-muted font-semibold min-w-25\",\n },\n }),\n TableFormulaRecalculation,\n CharacterCount.configure({\n limit: maxCharacters,\n }),\n Typography,\n History,\n UEditorPlaceholder.configure({\n placeholder,\n emptyEditorClass: \"is-editor-empty\",\n emptyNodeClass: \"is-empty\",\n shouldShow: ({ editor, node, hasTable, isEmptyDoc }) => {\n const nodeName = node.type.name;\n\n if (!isEmptyDoc || editor.state.doc.childCount !== 1) {\n return false;\n }\n\n if (nodeName === \"table\" || nodeName === \"tableCell\" || nodeName === \"tableHeader\") {\n return false;\n }\n\n if (hasTable) {\n return false;\n }\n\n return true;\n },\n }),\n SlashCommand.configure({\n messages: buildSlashCommandMessages(translate),\n getPortalContainer,\n }),\n FormulaSuggestion.configure({ getPortalContainer }),\n EmojiSuggestion.configure({ getPortalContainer }),\n Callout,\n Bookmark.configure({\n fetchMetadata,\n }),\n FileCard.configure({\n upload: uploadFile,\n }),\n FormCheckbox,\n FormRadio,\n DatePickerNode,\n ];\n}\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { CalloutView } from \"./CalloutView\";\n\nexport interface CalloutOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n callout: {\n /**\n * Set a callout block\n */\n setCallout: (attributes?: { emoji?: string; backgroundColor?: string }) => ReturnType;\n }\n }\n}\n\nexport const Callout = Node.create<CalloutOptions>({\n name: \"callout\",\n\n group: \"block\",\n\n content: \"block+\",\n\n defining: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n emoji: {\n default: \"💡\",\n parseHTML: (element) => element.getAttribute(\"data-emoji\") || \"💡\",\n renderHTML: (attributes) => ({\n \"data-emoji\": attributes.emoji,\n }),\n },\n backgroundColor: {\n default: \"var(--muted)\",\n parseHTML: (element) => element.getAttribute(\"data-background-color\") || element.style.backgroundColor || \"var(--muted)\",\n renderHTML: (attributes) => ({\n \"data-background-color\": attributes.backgroundColor,\n style: `background-color: ${attributes.backgroundColor}`,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"callout\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": \"callout\" }),\n 0,\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CalloutView);\n },\n\n addCommands() {\n return {\n setCallout:\n (attributes) =>\n ({ commands }) => {\n return commands.wrapIn(this.name, attributes);\n },\n };\n },\n});\n","\"use client\";\n\nimport React from \"react\";\nimport { NodeViewWrapper, NodeViewContent } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { Popover } from \"../Popover\";\nimport { EmojiPicker } from \"./emoji-picker\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { cn } from \"../../utils/cn\";\n\nconst CALLOUT_COLORS = [\n { name: \"Gray\", color: \"var(--muted)\" },\n { name: \"Blue\", color: \"color-mix(in oklch, var(--info) 15%, transparent)\" },\n { name: \"Green\", color: \"color-mix(in oklch, var(--success) 15%, transparent)\" },\n { name: \"Yellow\", color: \"color-mix(in oklch, var(--warning) 15%, transparent)\" },\n { name: \"Red\", color: \"color-mix(in oklch, var(--destructive) 15%, transparent)\" },\n];\n\nexport const CalloutView: React.FC<NodeViewProps> = ({ node, updateAttributes, selected }) => {\n const t = useSmartTranslations(\"UEditor\");\n const currentEmoji = node.attrs.emoji ?? \"💡\";\n const currentBgColor = node.attrs.backgroundColor ?? \"var(--muted)\";\n\n return (\n <NodeViewWrapper\n className={cn(\n \"flex items-start gap-4 rounded-xl border p-4 my-4 transition-all duration-200 border-border/50\",\n selected && \"ring-2 ring-primary/45 border-primary/20 shadow-sm\"\n )}\n style={{ backgroundColor: currentBgColor }}\n >\n <div className=\"flex items-center justify-center select-none\" contentEditable={false}>\n <Popover\n placement=\"bottom-start\"\n trigger={\n <button\n type=\"button\"\n aria-label={t(\"callout.selectEmoji\")}\n className=\"flex items-center justify-center text-2xl h-9 w-9 hover:bg-muted-foreground/10 active:scale-95 rounded-lg transition-[background-color,transform] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none\"\n >\n {currentEmoji}\n </button>\n }\n >\n <div className=\"flex flex-col gap-3 w-64 max-h-90 overflow-y-auto p-1\">\n <div className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-1\">\n {t(\"callout.selectEmoji\")}\n </div>\n <div className=\"h-44 overflow-y-auto border border-border/40 rounded-lg\">\n <EmojiPicker onSelect={(emoji) => updateAttributes({ emoji })} />\n </div>\n <div className=\"border-t border-border/50 pt-2 mt-1\">\n <div className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-1 mb-2\">\n {t(\"callout.backgroundColor\")}\n </div>\n <div className=\"flex flex-wrap gap-2 px-1\">\n {CALLOUT_COLORS.map((col) => (\n <button\n key={col.name}\n type=\"button\"\n title={col.name}\n aria-label={`${t(\"callout.backgroundColor\")}: ${col.name}`}\n aria-pressed={currentBgColor === col.color}\n onClick={() => updateAttributes({ backgroundColor: col.color })}\n className={cn(\n \"h-6 w-6 rounded-full border transition-[transform,border-color,box-shadow] active:scale-90 hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none\",\n currentBgColor === col.color ? \"border-primary ring-2 ring-primary/30\" : \"border-border/60\"\n )}\n style={{ backgroundColor: col.color }}\n />\n ))}\n </div>\n </div>\n </div>\n </Popover>\n </div>\n <NodeViewContent className=\"min-w-0 flex-1 outline-none\" />\n </NodeViewWrapper>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\n\nconst LazyBaseEmojiPicker = React.lazy(async () => {\n const { EmojiPicker } = await import(\"../EmojiPicker\");\n return { default: EmojiPicker };\n});\n\n/** Public props for the `EmojiPicker` component. */\ninterface EmojiPickerProps {\n onSelect: (emoji: string) => void;\n onClose?: () => void;\n}\n\nexport const EmojiPicker: React.FC<EmojiPickerProps> = ({ onSelect }) => {\n return (\n <React.Suspense fallback={<div className=\"h-44 animate-pulse rounded-lg bg-muted/30\" />}>\n <LazyBaseEmojiPicker onEmojiSelect={onSelect} chrome=\"embedded\" />\n </React.Suspense>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { BookmarkView } from \"./BookmarkView\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\n\nexport interface BookmarkOptions {\n fetchMetadata?: (url: string) => Promise<{ title?: string; description?: string; image?: string; publisher?: string }>;\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n bookmark: {\n /**\n * Insert a bookmark card\n */\n setBookmark: (attributes: { url: string; title?: string; description?: string; image?: string; publisher?: string }) => ReturnType;\n }\n }\n}\n\nconst URL_REGEX = /^(https?:\\/\\/[^\\s]+)$/i;\n\nexport const Bookmark = Node.create<BookmarkOptions>({\n name: \"bookmark\",\n\n group: \"block\",\n\n atom: true,\n\n addOptions() {\n return {\n fetchMetadata: undefined,\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n url: {\n default: \"\",\n parseHTML: (element) => sanitizeUEditorUrl(element.getAttribute(\"href\") || element.getAttribute(\"data-url\") || \"\", \"link\"),\n renderHTML: (attributes) => {\n const url = sanitizeUEditorUrl(String(attributes.url ?? \"\"), \"link\");\n return url ? { href: url, \"data-url\": url } : {};\n },\n },\n title: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-title\") || \"\",\n renderHTML: (attributes) => ({\n \"data-title\": attributes.title,\n }),\n },\n description: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-description\") || \"\",\n renderHTML: (attributes) => ({\n \"data-description\": attributes.description,\n }),\n },\n image: {\n default: \"\",\n parseHTML: (element) => sanitizeUEditorUrl(element.getAttribute(\"data-image\") || \"\", \"image\"),\n renderHTML: (attributes) => {\n const image = sanitizeUEditorUrl(String(attributes.image ?? \"\"), \"image\");\n return image ? { \"data-image\": image } : {};\n },\n },\n publisher: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-publisher\") || \"\",\n renderHTML: (attributes) => ({\n \"data-publisher\": attributes.publisher,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"bookmark\"]',\n },\n {\n tag: 'a[data-type=\"bookmark\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": \"bookmark\" }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(BookmarkView);\n },\n\n addCommands() {\n return {\n setBookmark:\n (attributes) =>\n ({ commands }) => {\n const url = sanitizeUEditorUrl(attributes.url, \"link\");\n if (!url) return false;\n const image = attributes.image ? sanitizeUEditorUrl(attributes.image, \"image\") : \"\";\n return commands.insertContent({\n type: this.name,\n attrs: { ...attributes, url, image },\n });\n },\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n\n return [\n new Plugin({\n key: new PluginKey(\"bookmarkPaste\"),\n props: {\n handlePaste(view, event) {\n if (!event || !event.clipboardData) return false;\n const text = event.clipboardData.getData(\"text/plain\")?.trim();\n if (!text || !URL_REGEX.test(text)) return false;\n\n const { selection } = view.state;\n const parent = selection.$from.parent;\n const isEmptyParagraph = parent.type.name === \"paragraph\" && parent.content.size === 0;\n\n if (isEmptyParagraph) {\n event.preventDefault();\n editor\n .chain()\n .focus()\n .insertContent({\n type: \"bookmark\",\n attrs: { url: text },\n })\n .run();\n return true;\n }\n\n return false;\n },\n },\n }),\n ];\n },\n});\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { AlertCircle, ExternalLink, Globe, RefreshCw } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\n\nexport const BookmarkView: React.FC<NodeViewProps> = ({ node, updateAttributes, selected, editor }) => {\n const t = useSmartTranslations(\"UEditor\");\n const { url, title, description, image, publisher } = node.attrs;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const [retryToken, setRetryToken] = useState(0);\n const lastFetchKeyRef = React.useRef(\"\");\n const fetchRequestIdRef = React.useRef(0);\n const safeUrl = sanitizeUEditorUrl(String(url ?? \"\"), \"link\");\n const safeImage = sanitizeUEditorUrl(String(image ?? \"\"), \"image\");\n const clickToOpenNewTabMessage = t(\"bookmark.clickToOpenNewTab\");\n const clickToOpenLinkMessage = t(\"bookmark.clickToOpenLink\");\n const noDescriptionMessage = t(\"bookmark.noDescription\");\n\n useEffect(() => {\n // If we already have a title, we don't need to fetch metadata again unless the user explicitly retries.\n if (title && retryToken === 0) return;\n if (!safeUrl) return;\n const fetchKey = `${safeUrl}\\u0000${retryToken}`;\n if (lastFetchKeyRef.current === fetchKey) return;\n lastFetchKeyRef.current = fetchKey;\n\n const requestId = fetchRequestIdRef.current + 1;\n fetchRequestIdRef.current = requestId;\n let active = true;\n\n const safeUpdateAttributes = (attrs: Record<string, unknown>) => {\n Promise.resolve().then(() => {\n if (active && fetchRequestIdRef.current === requestId && editor && !editor.isDestroyed) {\n updateAttributes(attrs);\n }\n });\n };\n\n // Look for fetchMetadata option in the extension\n const extension = editor.extensionManager.extensions.find((e) => e.name === \"bookmark\");\n const fetchMetadata = extension?.options?.fetchMetadata;\n\n if (!fetchMetadata) {\n // Fallback if no fetchMetadata is provided\n try {\n const hostname = new URL(safeUrl).hostname;\n safeUpdateAttributes({\n title: hostname || safeUrl,\n description: clickToOpenNewTabMessage,\n publisher: hostname,\n });\n } catch {\n safeUpdateAttributes({\n title: safeUrl,\n description: clickToOpenLinkMessage,\n publisher: \"\",\n });\n }\n return () => {\n active = false;\n };\n }\n\n queueMicrotask(() => {\n if (!active) return;\n setLoading(true);\n setError(false);\n });\n\n fetchMetadata(safeUrl)\n .then((meta: { title?: string; description?: string; image?: string; publisher?: string }) => {\n if (!active || fetchRequestIdRef.current !== requestId) return;\n const hostname = (() => {\n try {\n return new URL(safeUrl).hostname;\n } catch {\n return \"\";\n }\n })();\n safeUpdateAttributes({\n title: meta.title || hostname || safeUrl,\n description: meta.description || noDescriptionMessage,\n image: meta.image ? sanitizeUEditorUrl(meta.image, \"image\") : \"\",\n publisher: meta.publisher || hostname,\n });\n setLoading(false);\n })\n .catch(() => {\n if (!active || fetchRequestIdRef.current !== requestId) return;\n setError(true);\n setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [\n safeUrl,\n title,\n editor,\n updateAttributes,\n retryToken,\n clickToOpenNewTabMessage,\n clickToOpenLinkMessage,\n noDescriptionMessage,\n ]);\n\n const openLink = () => {\n if (safeUrl) window.open(safeUrl, \"_blank\", \"noopener,noreferrer\");\n };\n\n const handleOpenLink = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n openLink();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n event.stopPropagation();\n openLink();\n };\n\n const handleRetryPreview = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setRetryToken((value) => value + 1);\n };\n\n const displayPublisher = publisher || (() => {\n try {\n return safeUrl ? new URL(safeUrl).hostname : \"\";\n } catch {\n return \"\";\n }\n })();\n\n return (\n <NodeViewWrapper\n className={cn(\n \"my-4 block overflow-hidden rounded-xl border border-border/60 bg-muted/20 hover:bg-muted/30 transition-all duration-200 cursor-pointer select-none\",\n selected && \"ring-2 ring-primary/45 border-primary/20 shadow-sm\"\n )}\n onClick={handleOpenLink}\n onKeyDown={handleKeyDown}\n role=\"link\"\n tabIndex={safeUrl ? 0 : -1}\n aria-disabled={!safeUrl}\n >\n {loading ? (\n <div className=\"flex items-center justify-between p-4 gap-4 animate-pulse\">\n <div className=\"flex-1 flex flex-col gap-2\">\n <div className=\"h-4 w-1/3 bg-muted-foreground/20 rounded\" />\n <div className=\"h-5 w-3/4 bg-muted-foreground/20 rounded\" />\n <div className=\"h-4 w-5/6 bg-muted-foreground/20 rounded\" />\n </div>\n <div className=\"h-20 w-32 bg-muted-foreground/20 rounded-lg flex-shrink-0\" />\n </div>\n ) : (\n <div className=\"flex flex-col sm:flex-row items-stretch justify-between min-h-25\">\n <div className=\"flex-1 p-4 flex flex-col justify-between gap-1 min-w-0\">\n <div className=\"flex flex-col gap-1 min-w-0\">\n <span className=\"text-xs text-muted-foreground font-medium flex items-center gap-1.5 truncate\">\n <Globe className=\"h-3 w-3 flex-shrink-0\" />\n {displayPublisher}\n </span>\n <h4 className=\"text-sm font-semibold text-foreground line-clamp-1 break-all\">\n {title || safeUrl || String(url ?? \"\")}\n </h4>\n <p className=\"text-xs text-muted-foreground line-clamp-2 leading-relaxed\">\n {description}\n </p>\n </div>\n <span className=\"text-[11px] text-primary/80 font-mono mt-2 truncate flex items-center gap-1\">\n {safeUrl || String(url ?? \"\")}\n <ExternalLink className=\"h-3 w-3 flex-shrink-0\" />\n </span>\n {error && (\n <div className=\"mt-2 flex flex-wrap items-center gap-2 text-xs text-destructive\">\n <span className=\"inline-flex items-center gap-1\">\n <AlertCircle className=\"h-3.5 w-3.5\" />\n {t(\"bookmark.previewFailed\")}\n </span>\n <button\n type=\"button\"\n onClick={handleRetryPreview}\n className=\"inline-flex items-center gap-1 rounded-md border border-destructive/30 px-2 py-0.5 font-medium hover:bg-destructive/10\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n {t(\"bookmark.retryPreview\")}\n </button>\n </div>\n )}\n </div>\n\n {safeImage && (\n <div className=\"relative w-full sm:w-44 h-32 sm:h-auto flex-shrink-0 bg-muted overflow-hidden border-t sm:border-t-0 sm:border-l border-border/50\">\n <img\n src={safeImage}\n alt={title || \"Link preview image\"}\n className=\"absolute inset-0 w-full h-full object-cover transition-opacity duration-300\"\n onError={(e) => {\n (e.currentTarget as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n )}\n </div>\n )}\n </NodeViewWrapper>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { FileCardView } from \"./FileCardView\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\n\nexport interface FileCardOptions {\n HTMLAttributes: Record<string, unknown>;\n upload?: (file: File) => Promise<string> | string;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fileCard: {\n /**\n * Insert a file card\n */\n setFileCard: (attributes: { src: string; fileName: string; fileSize?: number; fileType?: string }) => ReturnType;\n }\n }\n}\n\nexport const FileCard = Node.create<FileCardOptions>({\n name: \"fileCard\",\n\n group: \"block\",\n\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n upload: undefined,\n };\n },\n\n addAttributes() {\n return {\n src: {\n default: \"\",\n parseHTML: (element) => sanitizeUEditorUrl(element.getAttribute(\"href\") || element.getAttribute(\"data-src\") || \"\", \"file\"),\n renderHTML: (attributes) => {\n const src = sanitizeUEditorUrl(String(attributes.src ?? \"\"), \"file\");\n return src ? { href: src, \"data-src\": src } : {};\n },\n },\n fileName: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-file-name\") || \"\",\n renderHTML: (attributes) => ({\n \"data-file-name\": attributes.fileName,\n }),\n },\n fileSize: {\n default: null,\n parseHTML: (element) => {\n const rawValue = element.getAttribute(\"data-file-size\");\n const value = rawValue ? Number(rawValue) : Number.NaN;\n return Number.isFinite(value) && value >= 0 ? value : null;\n },\n renderHTML: (attributes) => {\n const fileSize = Number(attributes.fileSize);\n if (!Number.isFinite(fileSize) || fileSize < 0) return {};\n return {\n \"data-file-size\": fileSize,\n };\n },\n },\n fileType: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-file-type\") || \"\",\n renderHTML: (attributes) => ({\n \"data-file-type\": attributes.fileType,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"file-card\"]',\n },\n {\n tag: 'a[data-type=\"file-card\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"div\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": \"file-card\" }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FileCardView);\n },\n\n addCommands() {\n return {\n setFileCard:\n (attributes) =>\n ({ commands }) => {\n const src = sanitizeUEditorUrl(attributes.src, \"file\");\n if (!src) return false;\n const fileSize = Number(attributes.fileSize);\n return commands.insertContent({\n type: this.name,\n attrs: {\n ...attributes,\n src,\n fileSize: Number.isFinite(fileSize) && fileSize >= 0 ? fileSize : null,\n },\n });\n },\n };\n },\n});\n","\"use client\";\n\nimport React, { useEffect, useState, useRef } from \"react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { Download, File as LucideFile, FileText, Image, Music, RefreshCw, Video } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\n\nfunction formatBytes(bytes: number, decimals = 1) {\n if (!Number.isFinite(bytes) || bytes <= 0) return \"0 Bytes\";\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\nfunction getFileIcon(type: string) {\n const mime = String(type || \"\").toLowerCase();\n if (mime.includes(\"pdf\")) return FileText;\n if (mime.startsWith(\"image/\")) return Image;\n if (mime.startsWith(\"audio/\")) return Music;\n if (mime.startsWith(\"video/\")) return Video;\n return LucideFile;\n}\n\nfunction dataURLtoFile(dataurl: string, filename: string, mimeType?: string): File | null {\n try {\n const arr = dataurl.split(\",\");\n if (arr.length < 2) return null;\n const mimeMatch = arr[0].match(/:(.*?);/);\n const mime = mimeMatch ? mimeMatch[1] : (mimeType || \"application/octet-stream\");\n\n const base64Data = arr[arr.length - 1].replace(/\\s+/g, \"\");\n let bytes: Uint8Array;\n if (typeof Buffer !== \"undefined\") {\n bytes = new Uint8Array(Buffer.from(base64Data, \"base64\"));\n } else {\n const binaryString = atob(base64Data);\n const len = binaryString.length;\n bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n }\n return new File([bytes as unknown as BlobPart], filename, { type: mime });\n } catch {\n return null;\n }\n}\n\nfunction getErrorMessage(error: unknown) {\n return error instanceof Error && error.message ? error.message : \"Upload failed\";\n}\n\nexport const FileCardView: React.FC<NodeViewProps> = ({ node, selected, editor, updateAttributes }) => {\n const t = useSmartTranslations(\"UEditor\");\n const { src, fileName, fileSize, fileType } = node.attrs;\n const FileIcon = getFileIcon(fileType);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [retryToken, setRetryToken] = useState(0);\n const uploadAttemptedRef = useRef(false);\n const lastUploadSrcRef = useRef(\"\");\n const uploadRequestIdRef = useRef(0);\n const safeSrc = sanitizeUEditorUrl(String(src ?? \"\"), \"file\");\n const extension = editor?.extensionManager?.extensions?.find((item) => item.name === \"fileCard\");\n const uploadFn = extension?.options?.upload as ((file: File) => Promise<string> | string) | undefined;\n\n useEffect(() => {\n if (lastUploadSrcRef.current !== safeSrc) {\n lastUploadSrcRef.current = safeSrc;\n uploadAttemptedRef.current = false;\n }\n\n if (!safeSrc || !safeSrc.startsWith(\"data:\") || !uploadFn) {\n return;\n }\n\n if (uploadAttemptedRef.current || !updateAttributes) {\n return;\n }\n\n uploadAttemptedRef.current = true;\n setUploadError(null);\n const requestId = uploadRequestIdRef.current + 1;\n uploadRequestIdRef.current = requestId;\n let active = true;\n\n const runUpload = async () => {\n try {\n const file = dataURLtoFile(safeSrc, fileName || \"file\", fileType);\n if (!file) {\n throw new Error(\"Failed to parse file data\");\n }\n\n const resolvedUrl = await uploadFn(file);\n const nextSrc = sanitizeUEditorUrl(String(resolvedUrl ?? \"\"), \"file\");\n if (!nextSrc) throw new Error(\"Upload handler returned an unsafe URL\");\n\n Promise.resolve().then(() => {\n if (active && uploadRequestIdRef.current === requestId && editor && !editor.isDestroyed) {\n updateAttributes({ src: nextSrc });\n }\n });\n } catch (error: unknown) {\n if (!active || uploadRequestIdRef.current !== requestId) return;\n setUploadError(getErrorMessage(error));\n uploadAttemptedRef.current = false;\n }\n };\n\n void runUpload();\n\n return () => {\n active = false;\n };\n }, [safeSrc, fileName, fileType, editor, updateAttributes, uploadFn, retryToken]);\n\n const handleDownload = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!safeSrc) return;\n\n const ownerDocument = editor.view.dom.ownerDocument;\n const link = ownerDocument.createElement(\"a\");\n link.href = safeSrc;\n link.download = fileName || \"download\";\n ownerDocument.body.appendChild(link);\n link.click();\n ownerDocument.body.removeChild(link);\n };\n\n const hasInlineUpload = safeSrc.startsWith(\"data:\") && Boolean(uploadFn);\n const handleRetryUpload = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n uploadAttemptedRef.current = false;\n setUploadError(null);\n setRetryToken((value) => value + 1);\n };\n\n return (\n <NodeViewWrapper\n className={cn(\n \"my-4 flex items-center justify-between rounded-xl border border-border/60 bg-card p-4 hover:bg-muted/15 transition-[background-color,border-color,box-shadow] duration-200 select-none\",\n selected && \"ring-2 ring-primary/45 border-primary/20 shadow-sm\"\n )}\n role=\"group\"\n aria-label={fileName || t(\"fileCard.unnamed\")}\n >\n <div className=\"flex items-center gap-3.5 min-w-0\">\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-primary/10 text-primary flex-shrink-0\">\n <FileIcon aria-hidden=\"true\" className=\"h-6 w-6\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"text-sm font-semibold text-foreground truncate break-all\">\n {fileName || t(\"fileCard.unnamed\")}\n </div>\n <div className=\"text-xs text-muted-foreground flex items-center gap-2 mt-0.5\">\n {fileSize ? <span>{formatBytes(fileSize)}</span> : null}\n {hasInlineUpload && (\n <span aria-live=\"polite\" className={cn(\n \"font-medium truncate max-w-50\",\n uploadError ? \"text-destructive\" : \"text-primary animate-pulse\"\n )}>\n {uploadError ? `${t(\"fileCard.uploadFailed\") || \"Tải lên thất bại\"}: ${uploadError}` : t(\"fileCard.uploading\")}\n </span>\n )}\n {hasInlineUpload && uploadError && (\n <button\n type=\"button\"\n onClick={handleRetryUpload}\n className=\"inline-flex items-center gap-1 rounded-md border border-destructive/30 px-1.5 py-0.5 text-[11px] font-medium text-destructive hover:bg-destructive/10\"\n >\n <RefreshCw aria-hidden=\"true\" className=\"h-3 w-3\" />\n {t(\"fileCard.retryUpload\")}\n </button>\n )}\n </div>\n </div>\n </div>\n\n {safeSrc && (\n <button\n type=\"button\"\n onClick={handleDownload}\n aria-label={t(\"fileCard.download\").replace(\"{name}\", fileName || t(\"fileCard.unnamed\"))}\n className=\"flex h-8 w-8 items-center justify-center rounded-lg border border-border bg-background text-muted-foreground hover:text-foreground hover:bg-muted active:scale-95 transition-[color,background-color,transform] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Download aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n )}\n </NodeViewWrapper>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { FormCheckboxView } from \"./FormCheckboxView\";\n\nexport interface FormCheckboxOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport type FormCheckboxVariant = \"square\" | \"circle\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n formCheckbox: {\n /**\n * Insert a form checkbox node\n */\n setFormCheckbox: (attributes?: { checked?: boolean; id?: string; name?: string; variant?: FormCheckboxVariant }) => ReturnType;\n }\n }\n}\n\nexport const FormCheckbox = Node.create<FormCheckboxOptions>({\n name: \"formCheckbox\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n checked: {\n default: false,\n parseHTML: (element) => {\n const checked = element.getAttribute(\"data-checked\") || element.getAttribute(\"checked\");\n if (checked === \"true\" || checked === \"\") return true;\n if (element instanceof HTMLInputElement) {\n return element.checked;\n }\n return false;\n },\n renderHTML: (attributes) => {\n if (!attributes.checked) return {};\n return {\n \"data-checked\": \"true\",\n checked: \"checked\",\n };\n },\n },\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\") || element.getAttribute(\"id\") || `chk-${Math.random().toString(36).substring(2, 9)}`,\n renderHTML: (attributes) => {\n if (!attributes.id) return {};\n return {\n \"data-id\": attributes.id,\n id: attributes.id,\n };\n },\n },\n name: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"name\") || \"\",\n renderHTML: (attributes) => {\n if (!attributes.name) return {};\n return {\n name: attributes.name,\n };\n },\n },\n variant: {\n default: \"square\",\n parseHTML: (element) => element.getAttribute(\"data-variant\") === \"circle\" ? \"circle\" : \"square\",\n renderHTML: (attributes) => attributes.variant === \"circle\" ? { \"data-variant\": \"circle\" } : {},\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'input[type=\"checkbox\"][data-type=\"form-checkbox\"]',\n },\n {\n tag: 'span[data-type=\"form-checkbox\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"input\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n type: \"checkbox\",\n \"data-type\": \"form-checkbox\",\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FormCheckboxView);\n },\n\n addCommands() {\n return {\n setFormCheckbox:\n (attributes) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: attributes,\n });\n },\n };\n },\n});\n","\"use client\";\n\nimport React from \"react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { cn } from \"../../utils/cn\";\nimport { Check } from \"lucide-react\";\n\nexport const FormCheckboxView: React.FC<NodeViewProps> = ({ node, updateAttributes, editor, selected }) => {\n const isChecked = !!node.attrs.checked;\n const isCircle = node.attrs.variant === \"circle\";\n const isEditable = editor.isEditable;\n\n const handleToggle = (e: React.MouseEvent | React.KeyboardEvent) => {\n if (!isEditable) return;\n e.preventDefault();\n e.stopPropagation();\n updateAttributes({ checked: !isChecked });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n handleToggle(e);\n }\n };\n\n return (\n <NodeViewWrapper\n as=\"span\"\n className={cn(\n \"inline-flex items-center justify-center align-middle mx-1\",\n isEditable ? \"cursor-pointer select-none\" : \"cursor-default\"\n )}\n >\n <span\n role=\"checkbox\"\n aria-checked={isChecked}\n tabIndex={isEditable ? 0 : -1}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={cn(\n \"flex items-center justify-center w-5 h-5 border text-primary-foreground transition-all duration-200 outline-none\",\n isCircle ? \"rounded-full\" : \"rounded-md\",\n isChecked\n ? \"bg-primary border-primary scale-100\"\n : \"bg-background border-border/70 hover:border-primary/50\",\n selected && \"ring-2 ring-primary/30 ring-offset-1\",\n isEditable && \"focus-visible:ring-2 focus-visible:ring-primary/45 focus-visible:ring-offset-1 focus-visible:border-primary\"\n )}\n >\n <span\n className={cn(\n \"transition-transform duration-200 ease-out-back\",\n isChecked ? \"scale-100 opacity-100\" : \"scale-50 opacity-0\"\n )}\n >\n <Check className=\"w-3.5 h-3.5 stroke-[3px]\" />\n </span>\n </span>\n </NodeViewWrapper>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { FormRadioView } from \"./FormRadioView\";\n\nexport interface FormRadioOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n formRadio: {\n /**\n * Insert a form radio button node\n */\n setFormRadio: (attributes?: { checked?: boolean; id?: string; name?: string; value?: string }) => ReturnType;\n /**\n * Check a specific radio button by ID and uncheck others in the same group\n */\n checkFormRadio: (id: string) => ReturnType;\n }\n }\n}\n\nlet formRadioIdSequence = 0;\n\nfunction createFormRadioId() {\n formRadioIdSequence += 1;\n const randomId = globalThis.crypto?.randomUUID?.();\n return randomId ? `rad-${randomId}` : `rad-${Date.now().toString(36)}-${formRadioIdSequence.toString(36)}`;\n}\n\nexport const FormRadio = Node.create<FormRadioOptions>({\n name: \"formRadio\",\n\n group: \"inline\",\n\n inline: true,\n\n atom: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n checked: {\n default: false,\n parseHTML: (element) => {\n const checked = element.getAttribute(\"data-checked\") || element.getAttribute(\"checked\");\n if (checked === \"true\" || checked === \"\") return true;\n if (element instanceof HTMLInputElement) {\n return element.checked;\n }\n return false;\n },\n renderHTML: (attributes) => {\n if (!attributes.checked) return {};\n return {\n \"data-checked\": \"true\",\n checked: \"checked\",\n };\n },\n },\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\") || element.getAttribute(\"id\") || createFormRadioId(),\n renderHTML: (attributes) => {\n if (!attributes.id) return {};\n return {\n \"data-id\": attributes.id,\n id: attributes.id,\n };\n },\n },\n name: {\n default: \"radio-group\",\n parseHTML: (element) => element.getAttribute(\"name\") || element.getAttribute(\"data-group\") || \"radio-group\",\n renderHTML: (attributes) => {\n if (!attributes.name) return {};\n return {\n name: attributes.name,\n \"data-group\": attributes.name,\n };\n },\n },\n value: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"value\") || \"\",\n renderHTML: (attributes) => {\n if (!attributes.value) return {};\n return {\n value: attributes.value,\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'input[type=\"radio\"][data-type=\"form-radio\"]',\n },\n {\n tag: 'span[data-type=\"form-radio\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"input\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n type: \"radio\",\n \"data-type\": \"form-radio\",\n }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FormRadioView);\n },\n\n addCommands() {\n return {\n setFormRadio:\n (attributes) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n ...attributes,\n id: attributes?.id || createFormRadioId(),\n name: attributes?.name || \"radio-group\",\n },\n });\n },\n\n checkFormRadio:\n (id) =>\n ({ tr, dispatch }) => {\n if (!id) return false;\n if (!dispatch) return true;\n\n let targetGroupName = \"\";\n let targetPos = -1;\n\n // Find the group name of the clicked radio button\n tr.doc.descendants((node, pos) => {\n if (node.type.name === \"formRadio\" && node.attrs.id === id) {\n targetGroupName = node.attrs.name;\n targetPos = pos;\n return false; // stop scanning\n }\n return true;\n });\n\n if (targetPos === -1) return false;\n\n // Check the clicked one, uncheck other radios in the same group name\n tr.doc.descendants((node, pos) => {\n if (node.type.name === \"formRadio\") {\n if (pos === targetPos) {\n if (!node.attrs.checked) {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, checked: true });\n }\n } else if (node.attrs.name === targetGroupName && node.attrs.checked) {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, checked: false });\n }\n }\n return true;\n });\n\n return true;\n },\n };\n },\n});\n","\"use client\";\n\nimport React, { useId } from \"react\";\nimport { NodeViewWrapper } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { cn } from \"../../utils/cn\";\nimport { Popover } from \"../Popover\";\nimport { Settings } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { formControlOutlineClass } from \"../../constants/form-control-size\";\n\nexport const FormRadioView: React.FC<NodeViewProps> = ({ node, updateAttributes, editor, selected }) => {\n const t = useSmartTranslations(\"UEditor\");\n const isChecked = !!node.attrs.checked;\n const isEditable = editor.isEditable;\n const groupName = node.attrs.name || \"radio-group\";\n const groupInputId = useId();\n const radioLabel = `${t(\"menubar.formRadio\")} — ${node.attrs.value || groupName}`;\n\n const handleSelect = (e: React.MouseEvent | React.KeyboardEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isEditable) return;\n editor.commands.checkFormRadio(node.attrs.id);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n handleSelect(e);\n }\n };\n\n return (\n <NodeViewWrapper\n as=\"span\"\n className={cn(\n \"inline-flex items-center justify-center align-middle mx-1 select-none\",\n isEditable ? \"cursor-pointer\" : \"cursor-default\"\n )}\n >\n <span\n role=\"radio\"\n aria-checked={isChecked}\n aria-label={radioLabel}\n tabIndex={isEditable ? 0 : -1}\n onClick={handleSelect}\n onKeyDown={handleKeyDown}\n className={cn(\n \"flex items-center justify-center w-5 h-5 rounded-full border bg-background transition-all duration-200 outline-none\",\n isChecked ? \"border-primary scale-100\" : \"border-border/70 hover:border-primary/50\",\n selected && \"ring-2 ring-primary/30 ring-offset-1\",\n isEditable && \"focus-visible:ring-2 focus-visible:ring-primary/45 focus-visible:ring-offset-1 focus-visible:border-primary\"\n )}\n >\n <span\n className={cn(\n \"w-2.5 h-2.5 rounded-full bg-primary transition-all duration-200 ease-out-back\",\n isChecked ? \"scale-100 opacity-100\" : \"scale-50 opacity-0\"\n )}\n />\n </span>\n\n {isEditable && selected && (\n <span className=\"inline-flex items-center ml-0.5\" contentEditable={false}>\n <Popover\n placement=\"bottom-start\"\n trigger={\n <button\n type=\"button\"\n aria-label={t(\"radio.editGroup\") || \"Edit Group\"}\n className=\"p-0.5 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors outline-none cursor-pointer\"\n title={t(\"radio.editGroup\") || \"Edit Group\"}\n >\n <Settings className=\"w-3.5 h-3.5\" />\n </button>\n }\n >\n <div className=\"p-3 w-52 flex flex-col gap-2 bg-card border rounded-xl shadow-lg text-card-foreground\">\n <label htmlFor={groupInputId} className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {t(\"radio.groupName\") || \"Group Name\"}\n </label>\n <input\n type=\"text\"\n id={groupInputId}\n name=\"radio-group-name\"\n autoComplete=\"off\"\n value={groupName}\n onChange={(e) => updateAttributes({ name: e.target.value })}\n className={`w-full rounded-lg bg-background px-2 py-1.5 text-sm text-foreground ${formControlOutlineClass}`}\n />\n </div>\n </Popover>\n </span>\n )}\n </NodeViewWrapper>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\nimport { DatePickerNodeView } from \"./DatePickerNodeView\";\n\nexport interface DatePickerNodeOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n datePicker: {\n /** Insert an inline calendar control. */\n setDatePicker: (attributes?: { date?: string }) => ReturnType;\n }\n }\n}\n\nexport const DatePickerNode = Node.create<DatePickerNodeOptions>({\n name: \"datePicker\",\n group: \"inline\",\n inline: true,\n atom: true,\n\n addOptions() {\n return { HTMLAttributes: {} };\n },\n\n addAttributes() {\n return {\n date: {\n default: \"\",\n parseHTML: (element) => element.getAttribute(\"data-date\") || \"\",\n renderHTML: (attributes) => attributes.date ? { \"data-date\": attributes.date } : {},\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-type=\"date-picker\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"span\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": \"date-picker\" }),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(DatePickerNodeView);\n },\n\n addCommands() {\n return {\n setDatePicker:\n (attributes) =>\n ({ commands }) => commands.insertContent({ type: this.name, attrs: attributes }),\n };\n },\n});\n","\"use client\";\n\nimport React from \"react\";\nimport { Calendar } from \"lucide-react\";\nimport { NodeViewWrapper, type NodeViewProps } from \"@tiptap/react\";\n\nconst LazyDatePicker = React.lazy(async () => {\n const { DatePicker } = await import(\"../DatePicker\");\n return { default: DatePicker };\n});\n\nfunction isDateValue(value: unknown): value is string {\n return typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(value);\n}\n\nfunction parseDateValue(value: string): Date | undefined {\n if (!isDateValue(value)) return undefined;\n const [year, month, day] = value.split(\"-\").map(Number);\n return new Date(year, month - 1, day);\n}\n\nfunction formatDateValue(value: Date): string {\n const year = value.getFullYear();\n const month = String(value.getMonth() + 1).padStart(2, \"0\");\n const day = String(value.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nexport const DatePickerNodeView: React.FC<NodeViewProps> = ({ node, updateAttributes, editor, selected }) => {\n const date = isDateValue(node.attrs.date) ? node.attrs.date : \"\";\n const isEditable = editor.isEditable;\n\n return (\n <NodeViewWrapper\n as=\"span\"\n data-type=\"date-picker\"\n data-date={date || undefined}\n data-ueditor-date-picker=\"true\"\n className={selected ? \"inline-flex items-center align-middle mx-1 rounded ring-2 ring-primary/30\" : \"inline-flex items-center align-middle mx-1\"}\n >\n <span contentEditable={false}>\n <React.Suspense fallback={<Calendar className=\"h-4 w-4\" aria-hidden=\"true\" />}>\n <LazyDatePicker\n iconOnly\n iconOnlyDateFormat=\"year-month-day\"\n value={parseDateValue(date)}\n disabled={!isEditable}\n getPortalContainer={() => editor.view.dom.ownerDocument.body}\n onChange={(value) => updateAttributes({ date: value ? formatDateValue(value) : \"\" })}\n />\n </React.Suspense>\n </span>\n </NodeViewWrapper>\n );\n};\n","\"use client\";\n\nimport { Extension } from \"@tiptap/core\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport { Suggestion } from \"@tiptap/suggestion\";\nimport type { SuggestionProps } from \"@tiptap/suggestion\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef } from \"react\";\nimport {\n FileCode,\n Heading1,\n Heading2,\n Heading3,\n List,\n ListOrdered,\n ListTodo,\n Minus,\n Quote,\n Table,\n Type,\n Info,\n Bookmark as BookmarkIcon,\n Paperclip,\n CheckSquare,\n CircleCheckBig,\n CircleDot,\n CalendarDays,\n} from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { destroyTippyInstance, getFirstTippyInstance, hideTippyInstance, setTippyReferenceClientRect, tippy, type TippyInstanceResult } from \"./tippy-interop\";\nimport { resolveUEditorPortalContainer, type UEditorPortalContainerGetter } from \"./portal-context\";\n\nexport type SlashCommandMessages = {\n noResults: string;\n basicBlocks: string;\n text: string;\n textDesc: string;\n heading1: string;\n heading1Desc: string;\n heading2: string;\n heading2Desc: string;\n heading3: string;\n heading3Desc: string;\n bulletList: string;\n bulletListDesc: string;\n orderedList: string;\n orderedListDesc: string;\n todoList: string;\n todoListDesc: string;\n quote: string;\n quoteDesc: string;\n codeBlock: string;\n codeBlockDesc: string;\n divider: string;\n dividerDesc: string;\n date: string;\n dateDesc: string;\n table: string;\n tableDesc: string;\n callout: string;\n calloutDesc: string;\n bookmark: string;\n bookmarkDesc: string;\n fileCard: string;\n fileCardDesc: string;\n formCheckbox: string;\n formCheckboxDesc: string;\n roundCheckbox: string;\n roundCheckboxDesc: string;\n formRadio: string;\n formRadioDesc: string;\n};\n\nconst DEFAULT_MESSAGES: SlashCommandMessages = {\n noResults: \"No results\",\n basicBlocks: \"Basic Blocks\",\n text: \"Text\",\n textDesc: \"Start writing with plain text\",\n heading1: \"Heading 1\",\n heading1Desc: \"Large section heading\",\n heading2: \"Heading 2\",\n heading2Desc: \"Medium section heading\",\n heading3: \"Heading 3\",\n heading3Desc: \"Small section heading\",\n bulletList: \"Bullet List\",\n bulletListDesc: \"Create a simple bullet list\",\n orderedList: \"Numbered List\",\n orderedListDesc: \"Create a list with numbering\",\n todoList: \"Todo List\",\n todoListDesc: \"Track tasks with a todo list\",\n quote: \"Quote\",\n quoteDesc: \"Capture a quote\",\n codeBlock: \"Code Block\",\n codeBlockDesc: \"Display code with syntax highlighting\",\n divider: \"Divider\",\n dividerDesc: \"Visually divide blocks\",\n date: \"Date\",\n dateDesc: \"Insert a date from the calendar\",\n table: \"Table\",\n tableDesc: \"Insert a table\",\n callout: \"Callout\",\n calloutDesc: \"Highlight key info with a callout block\",\n bookmark: \"Bookmark Card\",\n bookmarkDesc: \"Embed a link as a bookmark card\",\n fileCard: \"File Attachment\",\n fileCardDesc: \"Upload a file card attachment\",\n formCheckbox: \"Form Checkbox\",\n formCheckboxDesc: \"Insert an interactive checkbox field\",\n roundCheckbox: \"Round Checkbox\",\n roundCheckboxDesc: \"Insert a circular interactive checkbox\",\n formRadio: \"Form Radio Button\",\n formRadioDesc: \"Insert an interactive radio button field\",\n};\n\nexport type SlashCommandExecutionContext = {\n editor: Editor;\n range?: Range | null;\n};\n\nexport type SlashCommandItem = {\n icon: React.ComponentType<{ className?: string }>;\n title: string;\n description: string;\n searchTerms?: string[];\n command: (ctx: SlashCommandExecutionContext) => void;\n};\n\n/** Public props for the `SlashCommandList` component. */\ntype SlashCommandListProps = {\n items: SlashCommandItem[];\n command: (item: SlashCommandItem) => void;\n messages: SlashCommandMessages;\n};\n\nexport type SlashCommandListRef = {\n onKeyDown: (props: { event: KeyboardEvent }) => boolean;\n};\n\nfunction useResettingIndex(resetToken: unknown) {\n const [state, setState] = React.useState<{ resetToken: unknown; index: number }>({ resetToken, index: 0 });\n const selectedIndex = Object.is(state.resetToken, resetToken) ? state.index : 0;\n\n const setSelectedIndex = React.useCallback((nextIndex: React.SetStateAction<number>) => {\n setState((prev) => {\n const prevIndex = Object.is(prev.resetToken, resetToken) ? prev.index : 0;\n return {\n resetToken,\n index: typeof nextIndex === \"function\" ? (nextIndex as (value: number) => number)(prevIndex) : nextIndex,\n };\n });\n }, [resetToken]);\n\n return [selectedIndex, setSelectedIndex] as const;\n}\n\nfunction getCommandChain(editor: Editor, range?: Range | null) {\n const chain = editor.chain().focus();\n return range ? chain.deleteRange(range) : chain;\n}\n\nexport function buildSlashCommandMessages(translate: (key: string) => string): SlashCommandMessages {\n return {\n noResults: translate(\"slashCommand.noResults\"),\n basicBlocks: translate(\"slashCommand.basicBlocks\"),\n text: translate(\"slashCommand.text\"),\n textDesc: translate(\"slashCommand.textDesc\"),\n heading1: translate(\"slashCommand.heading1\"),\n heading1Desc: translate(\"slashCommand.heading1Desc\"),\n heading2: translate(\"slashCommand.heading2\"),\n heading2Desc: translate(\"slashCommand.heading2Desc\"),\n heading3: translate(\"slashCommand.heading3\"),\n heading3Desc: translate(\"slashCommand.heading3Desc\"),\n bulletList: translate(\"slashCommand.bulletList\"),\n bulletListDesc: translate(\"slashCommand.bulletListDesc\"),\n orderedList: translate(\"slashCommand.orderedList\"),\n orderedListDesc: translate(\"slashCommand.orderedListDesc\"),\n todoList: translate(\"slashCommand.todoList\"),\n todoListDesc: translate(\"slashCommand.todoListDesc\"),\n quote: translate(\"slashCommand.quote\"),\n quoteDesc: translate(\"slashCommand.quoteDesc\"),\n codeBlock: translate(\"slashCommand.codeBlock\"),\n codeBlockDesc: translate(\"slashCommand.codeBlockDesc\"),\n divider: translate(\"slashCommand.divider\") || \"Divider\",\n dividerDesc: translate(\"slashCommand.dividerDesc\") || \"Visually divide blocks\",\n date: translate(\"slashCommand.date\") || \"Date\",\n dateDesc: translate(\"slashCommand.dateDesc\") || \"Insert a date from the calendar\",\n table: translate(\"slashCommand.table\") || \"Table\",\n tableDesc: translate(\"slashCommand.tableDesc\") || \"Insert a table\",\n callout: translate(\"slashCommand.callout\") || \"Callout\",\n calloutDesc: translate(\"slashCommand.calloutDesc\") || \"Highlight key info with a callout block\",\n bookmark: translate(\"slashCommand.bookmark\") || \"Bookmark Card\",\n bookmarkDesc: translate(\"slashCommand.bookmarkDesc\") || \"Embed a link as a bookmark card\",\n fileCard: translate(\"slashCommand.fileCard\") || \"File Attachment\",\n fileCardDesc: translate(\"slashCommand.fileCardDesc\") || \"Upload a file card attachment\",\n formCheckbox: translate(\"slashCommand.formCheckbox\") || \"Form Checkbox\",\n formCheckboxDesc: translate(\"slashCommand.formCheckboxDesc\") || \"Insert an interactive checkbox field\",\n roundCheckbox: translate(\"slashCommand.roundCheckbox\") || \"Round Checkbox\",\n roundCheckboxDesc: translate(\"slashCommand.roundCheckboxDesc\") || \"Insert a circular interactive checkbox\",\n formRadio: translate(\"slashCommand.formRadio\") || \"Form Radio Button\",\n formRadioDesc: translate(\"slashCommand.formRadioDesc\") || \"Insert an interactive radio button field\",\n };\n}\n\nexport function buildSlashCommandItems({\n query,\n messages,\n}: {\n query: string;\n messages: SlashCommandMessages;\n}): SlashCommandItem[] {\n const run = (handler: (ctx: SlashCommandExecutionContext) => void) => handler;\n\n return [\n {\n icon: Type,\n title: messages.text,\n description: messages.textDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setParagraph().run();\n }),\n },\n {\n icon: Heading1,\n title: messages.heading1,\n description: messages.heading1Desc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setNode(\"heading\", { level: 1 }).run();\n }),\n },\n {\n icon: Heading2,\n title: messages.heading2,\n description: messages.heading2Desc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setNode(\"heading\", { level: 2 }).run();\n }),\n },\n {\n icon: Heading3,\n title: messages.heading3,\n description: messages.heading3Desc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setNode(\"heading\", { level: 3 }).run();\n }),\n },\n {\n icon: List,\n title: messages.bulletList,\n description: messages.bulletListDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).toggleBulletList().run();\n }),\n },\n {\n icon: ListOrdered,\n title: messages.orderedList,\n description: messages.orderedListDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).toggleOrderedList().run();\n }),\n },\n {\n icon: ListTodo,\n title: messages.todoList,\n description: messages.todoListDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).toggleTaskList().run();\n }),\n },\n {\n icon: Quote,\n title: messages.quote,\n description: messages.quoteDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).toggleBlockquote().run();\n }),\n },\n {\n icon: FileCode,\n title: messages.codeBlock,\n description: messages.codeBlockDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).toggleCodeBlock().run();\n }),\n },\n {\n icon: Minus,\n title: messages.divider,\n description: messages.dividerDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setHorizontalRule().run();\n }),\n },\n {\n icon: CalendarDays,\n title: messages.date,\n description: messages.dateDesc,\n searchTerms: [\"calendar\", \"date\"],\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setDatePicker().run();\n }),\n },\n {\n icon: Table,\n title: messages.table,\n description: messages.tableDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n }),\n },\n {\n icon: Info,\n title: messages.callout || \"Callout\",\n description: messages.calloutDesc || \"Highlight key info with a callout block\",\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setCallout().run();\n }),\n },\n {\n icon: BookmarkIcon,\n title: messages.bookmark || \"Bookmark Card\",\n description: messages.bookmarkDesc || \"Embed a link as a bookmark card\",\n command: run(({ editor, range }) => {\n const url = window.prompt(\"Enter URL for bookmark:\");\n if (url) {\n getCommandChain(editor, range).setBookmark({ url }).run();\n }\n }),\n },\n {\n icon: Paperclip,\n title: messages.fileCard || \"File Attachment\",\n description: messages.fileCardDesc || \"Upload a file card attachment\",\n command: run(({ editor, range }) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n getCommandChain(editor, range).setFileCard({\n src: dataUrl,\n fileName: file.name,\n fileSize: file.size,\n fileType: file.type,\n }).run();\n };\n reader.readAsDataURL(file);\n };\n input.click();\n }),\n },\n {\n icon: CheckSquare,\n title: messages.formCheckbox,\n description: messages.formCheckboxDesc,\n searchTerms: [\"checkbox\", \"square checkbox\"],\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setFormCheckbox().run();\n }),\n },\n {\n icon: CircleCheckBig,\n title: messages.roundCheckbox,\n description: messages.roundCheckboxDesc,\n searchTerms: [\"roundcheckbox\", \"round checkbox\", \"circle checkbox\"],\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setFormCheckbox({ variant: \"circle\" }).run();\n }),\n },\n {\n icon: CircleDot,\n title: messages.formRadio,\n description: messages.formRadioDesc,\n command: run(({ editor, range }) => {\n getCommandChain(editor, range).setFormRadio().run();\n }),\n },\n ].filter((item) => {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return true;\n\n return [item.title, item.description, ...(item.searchTerms ?? [])]\n .some((value) => value.toLowerCase().includes(normalizedQuery));\n });\n}\n\nexport const SlashCommandList = forwardRef<SlashCommandListRef, SlashCommandListProps>((props, ref) => {\n const [selectedIndex, setSelectedIndex] = useResettingIndex(props.items);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = React.useId();\n\n useEffect(() => {\n const selectedElement = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${selectedIndex}\"]`);\n selectedElement?.scrollIntoView({ block: \"nearest\" });\n }, [selectedIndex, props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: (keyProps: { event: KeyboardEvent }) => {\n if (!keyProps || !keyProps.event) return false;\n const { event } = keyProps;\n if (props.items.length === 0) {\n return false;\n }\n\n if (event.key === \"ArrowUp\") {\n setSelectedIndex((prev) => (prev + props.items.length - 1) % props.items.length);\n return true;\n }\n if (event.key === \"ArrowDown\") {\n setSelectedIndex((prev) => (prev + 1) % props.items.length);\n return true;\n }\n if (event.key === \"Enter\") {\n const item = props.items[selectedIndex];\n if (item) {\n props.command(item);\n }\n return true;\n }\n return false;\n },\n }));\n\n if (props.items.length === 0) {\n return <div role=\"status\" className=\"w-72 p-4 text-center text-sm text-muted-foreground\">{props.messages.noResults}</div>;\n }\n\n return (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label={props.messages.basicBlocks}\n aria-activedescendant={`${listId}-option-${selectedIndex}`}\n className=\"w-72 max-h-80 overflow-y-auto bg-card border border-border/50 rounded-2xl shadow-lg\"\n >\n <div className=\"px-3 py-2 border-b\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">{props.messages.basicBlocks}</span>\n </div>\n <div className=\"p-1\">\n {props.items.map((item, index) => (\n <button\n key={item.title}\n type=\"button\"\n id={`${listId}-option-${index}`}\n role=\"option\"\n aria-selected={selectedIndex === index}\n tabIndex={-1}\n data-index={index}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => props.command(item)}\n className={cn(\n \"flex items-center w-full px-3 py-2.5 rounded-lg transition-colors group\",\n selectedIndex === index ? \"bg-accent\" : \"hover:bg-accent/50\",\n )}\n >\n <div\n className={cn(\n \"flex items-center justify-center w-10 h-10 rounded-lg mr-3 transition-colors\",\n selectedIndex === index ? \"bg-primary/10\" : \"bg-muted/50 group-hover:bg-muted\",\n )}\n >\n <item.icon aria-hidden=\"true\" className={cn(\"w-5 h-5\", selectedIndex === index ? \"text-primary\" : \"text-muted-foreground\")} />\n </div>\n <div className=\"text-left\">\n <div className={cn(\"text-sm font-medium\", selectedIndex === index && \"text-primary\")}>{item.title}</div>\n <div className=\"text-xs text-muted-foreground\">{item.description}</div>\n </div>\n </button>\n ))}\n </div>\n </div>\n );\n});\n\nSlashCommandList.displayName = \"SlashCommandList\";\n\nexport const SlashCommand = Extension.create<{\n messages: SlashCommandMessages;\n getPortalContainer?: UEditorPortalContainerGetter;\n}>({\n name: \"slashCommand\",\n\n addOptions() {\n return {\n messages: DEFAULT_MESSAGES,\n getPortalContainer: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const messages = this.options.messages;\n\n return [\n Suggestion({\n editor: this.editor,\n char: \"/\",\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: SlashCommandItem }) => {\n props.command({ editor, range });\n },\n items: ({ query }) => buildSlashCommandItems({ query, messages }),\n render: () => {\n let component: ReactRenderer<SlashCommandListRef, SlashCommandListProps> | undefined;\n let popup: TippyInstanceResult | undefined;\n\n return {\n onStart: (props: SuggestionProps<SlashCommandItem>) => {\n component = new ReactRenderer(SlashCommandList, {\n props: {\n ...props,\n messages,\n },\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n const portalContainer = resolveUEditorPortalContainer(this.options.getPortalContainer);\n if (!portalContainer) return;\n popup = tippy(portalContainer, {\n getReferenceClientRect: props.clientRect as () => DOMRect,\n appendTo: () => portalContainer,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n zIndex: 99999,\n });\n },\n onUpdate(props: SuggestionProps<SlashCommandItem>) {\n component?.updateProps({\n ...props,\n messages,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n setTippyReferenceClientRect(getFirstTippyInstance(popup), props.clientRect as () => DOMRect);\n },\n onKeyDown(props: { event: KeyboardEvent }) {\n if (!props || !props.event) return false;\n const popupInstance = getFirstTippyInstance(popup);\n if (props.event.key === \"Escape\") {\n hideTippyInstance(popupInstance);\n return true;\n }\n\n return component?.ref?.onKeyDown(props) ?? false;\n },\n onExit() {\n destroyTippyInstance(getFirstTippyInstance(popup));\n component?.destroy();\n },\n };\n },\n }),\n ];\n },\n});\n","\"use client\";\n\nimport tippyModule, { type Instance as TippyInstance } from \"tippy.js\";\n\ntype TippyFn = typeof import(\"tippy.js\")[\"default\"];\n\nconst maybeNestedDefault = tippyModule as unknown as { default?: unknown };\nconst unsupportedTippyModule = (() => {\n throw new TypeError(\"tippy.js did not resolve to a callable function\");\n}) as unknown as TippyFn;\n\nexport const tippy: TippyFn =\n typeof tippyModule === \"function\"\n ? tippyModule\n : typeof maybeNestedDefault.default === \"function\"\n ? (maybeNestedDefault.default as TippyFn)\n : unsupportedTippyModule;\n\nexport type TippyInstanceResult = TippyInstance | TippyInstance[];\n\nexport function getFirstTippyInstance(instances?: TippyInstanceResult) {\n return Array.isArray(instances) ? instances[0] : instances;\n}\n\nexport function hideTippyInstance(instance?: TippyInstance) {\n if (!instance || instance.state.isDestroyed) return;\n instance.hide();\n}\n\nexport function destroyTippyInstance(instance?: TippyInstance) {\n if (!instance || instance.state.isDestroyed) return;\n instance.destroy();\n}\n\nexport function setTippyReferenceClientRect(instance: TippyInstance | undefined, clientRect: () => DOMRect) {\n if (!instance || instance.state.isDestroyed) return;\n instance.setProps({ getReferenceClientRect: clientRect });\n}\n\nexport type { TippyInstance };\n","\"use client\";\n\nimport { Extension } from \"@tiptap/core\";\nimport { Suggestion } from \"@tiptap/suggestion\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport React, { forwardRef, useImperativeHandle } from \"react\";\nimport type { Editor, Range } from \"@tiptap/core\";\nimport type { SuggestionProps } from \"@tiptap/suggestion\";\nimport { Smile } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { EmojiGridButton, formatEmojiCountLabel } from \"../emoji-ui\";\nimport { destroyTippyInstance, getFirstTippyInstance, hideTippyInstance, setTippyReferenceClientRect, tippy, type TippyInstanceResult } from \"./tippy-interop\";\nimport { resolveUEditorPortalContainer, type UEditorPortalContainerGetter } from \"./portal-context\";\n\ntype EmojiItem = {\n emoji: string;\n name: string;\n};\n\n/** Public props for the `EmojiList` component. */\ntype EmojiListProps = {\n items: EmojiItem[];\n command: (item: EmojiItem) => void;\n};\n\ntype EmojiListRef = {\n onKeyDown: (props: { event: KeyboardEvent }) => boolean;\n};\n\nfunction useResettingIndex(resetToken: unknown) {\n const [state, setState] = React.useState<{ resetToken: unknown; index: number }>({ resetToken, index: 0 });\n const selectedIndex = Object.is(state.resetToken, resetToken) ? state.index : 0;\n\n const setSelectedIndex = React.useCallback((nextIndex: React.SetStateAction<number>) => {\n setState((prev) => {\n const prevIndex = Object.is(prev.resetToken, resetToken) ? prev.index : 0;\n return {\n resetToken,\n index: typeof nextIndex === \"function\" ? (nextIndex as (value: number) => number)(prevIndex) : nextIndex,\n };\n });\n }, [resetToken]);\n\n return [selectedIndex, setSelectedIndex] as const;\n}\n\nconst EmojiList = forwardRef<EmojiListRef, EmojiListProps>((props, ref) => {\n const t = useSmartTranslations(\"UEditor\");\n const [selectedIndex, setSelectedIndex] = useResettingIndex(props.items);\n const listId = React.useId();\n const showingCountLabel = formatEmojiCountLabel(t(\"emojiSuggestion.showingCount\"), 64, props.items.length);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: (keyProps: { event: KeyboardEvent }) => {\n if (!keyProps || !keyProps.event) return false;\n const { event } = keyProps;\n if (event.key === \"ArrowUp\") {\n setSelectedIndex((prev) => (prev + props.items.length - 1) % props.items.length);\n return true;\n }\n if (event.key === \"ArrowDown\") {\n setSelectedIndex((prev) => (prev + 1) % props.items.length);\n return true;\n }\n if (event.key === \"ArrowLeft\") {\n setSelectedIndex((prev) => Math.max(0, prev - 8));\n return true;\n }\n if (event.key === \"ArrowRight\") {\n setSelectedIndex((prev) => Math.min(props.items.length - 1, prev + 8));\n return true;\n }\n if (event.key === \"Enter\") {\n const item = props.items[selectedIndex];\n if (item) {\n props.command(item);\n }\n return true;\n }\n return false;\n },\n }));\n\n if (props.items.length === 0) {\n return (\n <div role=\"status\" className=\"w-80 p-4 text-center text-sm text-muted-foreground bg-card border border-border/50 rounded-2xl shadow-lg\">\n {t(\"emojiSuggestion.noResults\")}\n </div>\n );\n }\n\n return (\n <div\n id={listId}\n role=\"listbox\"\n aria-label={t(\"emojiSuggestion.title\")}\n aria-activedescendant={`${listId}-option-${selectedIndex}`}\n className=\"w-80 max-h-80 overflow-y-auto bg-card border border-border/50 rounded-2xl shadow-lg\"\n >\n <div className=\"px-3 py-2 border-b bg-muted/30\">\n <div className=\"flex items-center gap-2\">\n <Smile className=\"w-4 h-4 text-primary\" />\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">{t(\"emojiSuggestion.title\")}</span>\n </div>\n </div>\n <div className=\"p-3\">\n <div className=\"grid grid-cols-8 gap-1\">\n {props.items.slice(0, 64).map((item, index) => (\n <EmojiGridButton\n key={item.name}\n id={`${listId}-option-${index}`}\n role=\"option\"\n aria-selected={selectedIndex === index}\n tabIndex={-1}\n emoji={item.emoji}\n name={item.name}\n onClick={() => props.command(item)}\n active={selectedIndex === index}\n className=\"text-xl\"\n />\n ))}\n </div>\n {props.items.length > 64 && (\n <div className=\"mt-2 text-xs text-center text-muted-foreground\">\n {showingCountLabel}\n </div>\n )}\n </div>\n </div>\n );\n});\n\nEmojiList.displayName = \"EmojiList\";\n\nlet allEmojiItemsPromise: Promise<EmojiItem[]> | null = null;\n\nfunction loadAllEmojiItems() {\n allEmojiItemsPromise ??= import(\"./emojis\").then(({ EMOJI_LIST }) => (\n EMOJI_LIST.flatMap((category) => category.emojis)\n ));\n return allEmojiItemsPromise;\n}\n\nconst getEmojiSuggestionItems = async ({ query }: { query: string }): Promise<EmojiItem[]> => {\n const allEmojis = await loadAllEmojiItems();\n\n if (!query.trim()) {\n // Return popular emojis when no query\n return allEmojis.slice(0, 64);\n }\n\n const searchQuery = query.toLowerCase();\n return allEmojis.filter(\n (emoji) =>\n emoji.name.toLowerCase().includes(searchQuery) ||\n emoji.emoji.includes(query)\n );\n};\n\nexport const EmojiSuggestion = Extension.create<{ getPortalContainer?: UEditorPortalContainerGetter }>({\n name: \"emojiSuggestion\",\n\n addOptions() {\n return { getPortalContainer: undefined };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: \":\",\n pluginKey: new PluginKey(\"emojiSuggestion\"),\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: EmojiItem }) => {\n editor.chain().focus().deleteRange(range).insertContent(props.emoji).run();\n },\n items: getEmojiSuggestionItems,\n render: () => {\n let component: ReactRenderer<EmojiListRef, EmojiListProps> | undefined;\n let popup: TippyInstanceResult | undefined;\n\n return {\n onStart: (props: SuggestionProps<EmojiItem>) => {\n component = new ReactRenderer(EmojiList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n const portalContainer = resolveUEditorPortalContainer(this.options.getPortalContainer);\n if (!portalContainer) return;\n popup = tippy(portalContainer, {\n getReferenceClientRect: props.clientRect as () => DOMRect,\n appendTo: () => portalContainer,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n zIndex: 99999,\n });\n },\n onUpdate(props: SuggestionProps<EmojiItem>) {\n component?.updateProps(props);\n\n if (!props.clientRect) {\n return;\n }\n\n setTippyReferenceClientRect(getFirstTippyInstance(popup), props.clientRect as () => DOMRect);\n },\n onKeyDown(props: { event: KeyboardEvent }) {\n if (!props || !props.event) return false;\n const popupInstance = getFirstTippyInstance(popup);\n if (props.event.key === \"Escape\") {\n hideTippyInstance(popupInstance);\n return true;\n }\n\n return component?.ref?.onKeyDown(props) ?? false;\n },\n onExit() {\n destroyTippyInstance(getFirstTippyInstance(popup));\n component?.destroy();\n },\n };\n },\n }),\n ];\n },\n});\n","\"use client\";\n\nimport { Extension, type Editor, type Range } from \"@tiptap/core\";\nimport { Suggestion } from \"@tiptap/suggestion\";\nimport { ReactRenderer } from \"@tiptap/react\";\nimport { PluginKey } from \"@tiptap/pm/state\";\nimport React, { forwardRef, useImperativeHandle } from \"react\";\nimport type { SuggestionProps } from \"@tiptap/suggestion\";\nimport { Sigma } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport {\n destroyTippyInstance,\n getFirstTippyInstance,\n hideTippyInstance,\n setTippyReferenceClientRect,\n tippy,\n type TippyInstanceResult,\n} from \"./tippy-interop\";\nimport { resolveUEditorPortalContainer, type UEditorPortalContainerGetter } from \"./portal-context\";\n\nexport type FormulaSuggestionItem = {\n name: string;\n signature: string;\n descriptionKey: string;\n};\n\ntype FormulaSuggestionListProps = {\n items: FormulaSuggestionItem[];\n command: (item: FormulaSuggestionItem) => void;\n};\n\nexport type FormulaSuggestionListRef = {\n onKeyDown: (props: { event: KeyboardEvent }) => boolean;\n};\n\nconst FORMULA_FUNCTIONS: FormulaSuggestionItem[] = [\n {\n name: \"SUM\",\n signature: \"SUM(range)\",\n descriptionKey: \"formulaSuggestion.sum\",\n },\n {\n name: \"AVG\",\n signature: \"AVG(range)\",\n descriptionKey: \"formulaSuggestion.avg\",\n },\n {\n name: \"MIN\",\n signature: \"MIN(range)\",\n descriptionKey: \"formulaSuggestion.min\",\n },\n {\n name: \"MAX\",\n signature: \"MAX(range)\",\n descriptionKey: \"formulaSuggestion.max\",\n },\n {\n name: \"COUNT\",\n signature: \"COUNT(range)\",\n descriptionKey: \"formulaSuggestion.count\",\n },\n];\n\nfunction isInTableCell(editor: Editor) {\n const { $from } = editor.state.selection;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const nodeName = $from.node(depth).type.name;\n if (nodeName === \"tableCell\" || nodeName === \"tableHeader\") {\n return true;\n }\n }\n\n return false;\n}\n\nexport function buildFormulaSuggestionItems({ query }: { query: string }): FormulaSuggestionItem[] {\n const normalizedQuery = query.trim().toUpperCase();\n\n if (!isFormulaFunctionSuggestionQuery(normalizedQuery)) {\n return [];\n }\n\n if (!normalizedQuery) {\n return FORMULA_FUNCTIONS;\n }\n\n return FORMULA_FUNCTIONS.filter((item) => item.name.startsWith(normalizedQuery));\n}\n\nexport function isFormulaFunctionSuggestionQuery(query: string) {\n return /^[A-Z]*$/i.test(query.trim());\n}\n\nconst FormulaSuggestionList = forwardRef<FormulaSuggestionListRef, FormulaSuggestionListProps>((props, ref) => {\n const t = useSmartTranslations(\"UEditor\");\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const listId = React.useId();\n\n React.useEffect(() => {\n setSelectedIndex(0);\n }, [props.items]);\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (props.items.length === 0) return false;\n\n if (event.key === \"ArrowUp\") {\n setSelectedIndex((prev) => (prev + props.items.length - 1) % props.items.length);\n return true;\n }\n\n if (event.key === \"ArrowDown\") {\n setSelectedIndex((prev) => (prev + 1) % props.items.length);\n return true;\n }\n\n if (event.key === \"Tab\") {\n const item = props.items[selectedIndex];\n if (item) {\n props.command(item);\n }\n return true;\n }\n\n return false;\n },\n }));\n\n if (props.items.length === 0) {\n return (\n <div role=\"status\" className=\"w-72 p-3 text-sm text-muted-foreground bg-card border border-border/50 rounded-lg shadow-lg\">\n {t(\"formulaSuggestion.noResults\")}\n </div>\n );\n }\n\n return (\n <div\n id={listId}\n role=\"listbox\"\n aria-label={t(\"formulaSuggestion.title\")}\n aria-activedescendant={`${listId}-option-${selectedIndex}`}\n className=\"w-72 max-h-80 overflow-y-auto bg-card border border-border/50 rounded-lg shadow-lg\"\n >\n <div className=\"px-3 py-2 border-b bg-muted/30\">\n <div className=\"flex items-center gap-2\">\n <Sigma className=\"w-4 h-4 text-primary\" />\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">{t(\"formulaSuggestion.title\")}</span>\n </div>\n </div>\n <div className=\"p-1.5\">\n {props.items.map((item, index) => (\n <button\n key={item.name}\n type=\"button\"\n id={`${listId}-option-${index}`}\n role=\"option\"\n aria-selected={selectedIndex === index}\n tabIndex={-1}\n className={`w-full rounded-md px-2.5 py-2 text-left transition-colors ${\n selectedIndex === index ? \"bg-primary/10 text-primary\" : \"text-foreground hover:bg-muted\"\n }`}\n onMouseEnter={() => setSelectedIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => props.command(item)}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"font-mono text-sm font-semibold\">{item.name}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{item.signature}</span>\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">{t(item.descriptionKey)}</div>\n </button>\n ))}\n </div>\n </div>\n );\n});\n\nFormulaSuggestionList.displayName = \"FormulaSuggestionList\";\n\nfunction insertFormulaFunction(editor: Editor, range: Range, item: FormulaSuggestionItem) {\n const insertedText = `=${item.name}()`;\n const cursorPosition = range.from + item.name.length + 2;\n\n editor.chain().focus().deleteRange(range).insertContent(insertedText).run();\n editor.commands.setTextSelection(cursorPosition);\n}\n\nexport const FormulaSuggestion = Extension.create<{ getPortalContainer?: UEditorPortalContainerGetter }>({\n name: \"formulaSuggestion\",\n\n addOptions() {\n return { getPortalContainer: undefined };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: \"=\",\n pluginKey: new PluginKey(\"formulaSuggestion\"),\n allow: ({ editor, range }) => {\n if (!isInTableCell(editor)) return false;\n const suggestionText = editor.state.doc.textBetween(range.from, range.to, \"\", \"\");\n return suggestionText.startsWith(\"=\") && isFormulaFunctionSuggestionQuery(suggestionText.slice(1));\n },\n command: ({ editor, range, props }: { editor: Editor; range: Range; props: FormulaSuggestionItem }) => {\n insertFormulaFunction(editor, range, props);\n },\n items: buildFormulaSuggestionItems,\n render: () => {\n let component: ReactRenderer<FormulaSuggestionListRef, FormulaSuggestionListProps> | undefined;\n let popup: TippyInstanceResult | undefined;\n\n return {\n onStart: (props: SuggestionProps<FormulaSuggestionItem>) => {\n component = new ReactRenderer(FormulaSuggestionList, {\n props,\n editor: props.editor,\n });\n\n if (!props.clientRect) {\n return;\n }\n\n const portalContainer = resolveUEditorPortalContainer(this.options.getPortalContainer);\n if (!portalContainer) return;\n popup = tippy(portalContainer, {\n getReferenceClientRect: props.clientRect as () => DOMRect,\n appendTo: () => portalContainer,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: \"manual\",\n placement: \"bottom-start\",\n zIndex: 99999,\n });\n },\n onUpdate(props: SuggestionProps<FormulaSuggestionItem>) {\n component?.updateProps(props);\n\n if (!props.clientRect) {\n return;\n }\n\n setTippyReferenceClientRect(getFirstTippyInstance(popup), props.clientRect as () => DOMRect);\n },\n onKeyDown(props: { event: KeyboardEvent }) {\n const popupInstance = getFirstTippyInstance(popup);\n if (props.event.key === \"Escape\") {\n hideTippyInstance(popupInstance);\n return true;\n }\n\n return component?.ref?.onKeyDown(props) ?? false;\n },\n onExit() {\n destroyTippyInstance(getFirstTippyInstance(popup));\n component?.destroy();\n },\n };\n },\n }),\n ];\n },\n});\n","import type { Editor } from \"@tiptap/core\";\nimport { Extension, isNodeEmpty } from \"@tiptap/core\";\nimport type { Node as ProsemirrorNode } from \"@tiptap/pm/model\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\n\nexport interface UEditorPlaceholderOptions {\n emptyEditorClass: string;\n emptyNodeClass: string;\n dataAttribute: string;\n placeholder:\n | ((props: { editor: Editor; node: ProsemirrorNode; pos: number; hasAnchor: boolean }) => string)\n | string;\n showOnlyWhenEditable: boolean;\n showOnlyCurrent: boolean;\n includeChildren: boolean;\n shouldShow: (props: {\n editor: Editor;\n node: ProsemirrorNode;\n pos: number;\n hasAnchor: boolean;\n isEmptyDoc: boolean;\n hasTable: boolean;\n }) => boolean;\n}\n\ntype PlaceholderCandidate = {\n hasAnchor: boolean;\n node: ProsemirrorNode;\n pos: number;\n};\n\nfunction documentHasTable(doc: ProsemirrorNode) {\n let hasTable = false;\n\n doc.descendants((node) => {\n if (node.type.name !== \"table\") return true;\n hasTable = true;\n return false;\n });\n\n return hasTable;\n}\n\nfunction getCurrentPlaceholderCandidates(selection: EditorState[\"selection\"], includeChildren: boolean): PlaceholderCandidate[] {\n const { $anchor } = selection;\n if ($anchor.depth < 1) return [];\n\n const firstDepth = 1;\n const lastDepth = includeChildren ? $anchor.depth : 1;\n const candidates: PlaceholderCandidate[] = [];\n\n for (let depth = firstDepth; depth <= lastDepth; depth += 1) {\n const node = $anchor.node(depth);\n candidates.push({\n hasAnchor: true,\n node,\n pos: $anchor.before(depth),\n });\n }\n\n return candidates;\n}\n\nexport const UEditorPlaceholder = Extension.create<UEditorPlaceholderOptions>({\n name: \"placeholder\",\n\n addOptions() {\n return {\n emptyEditorClass: \"is-editor-empty\",\n emptyNodeClass: \"is-empty\",\n dataAttribute: \"placeholder\",\n placeholder: \"Write something...\",\n showOnlyWhenEditable: true,\n showOnlyCurrent: true,\n includeChildren: false,\n shouldShow: () => true,\n };\n },\n\n addProseMirrorPlugins() {\n const dataAttribute = `data-${this.options.dataAttribute}`;\n\n return [\n new Plugin({\n key: new PluginKey(\"placeholder\"),\n props: {\n decorations: ({ doc, selection }) => {\n const active = this.editor.isEditable || !this.options.showOnlyWhenEditable;\n const { anchor } = selection;\n const decorations: Decoration[] = [];\n let hasTable = false;\n\n if (!active) {\n return null;\n }\n\n const isEmptyDoc = this.editor.isEmpty;\n\n const addDecoration = ({ hasAnchor, node, pos }: PlaceholderCandidate) => {\n const placeholderValue = typeof this.options.placeholder === \"function\"\n ? this.options.placeholder({ editor: this.editor, node, pos, hasAnchor })\n : this.options.placeholder;\n\n if (!placeholderValue) return;\n\n const classes = [this.options.emptyNodeClass];\n if (isEmptyDoc) classes.push(this.options.emptyEditorClass);\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: classes.join(\" \"),\n [dataAttribute]: placeholderValue,\n }),\n );\n };\n\n if (this.options.showOnlyCurrent) {\n const candidates = getCurrentPlaceholderCandidates(\n selection,\n this.options.includeChildren,\n );\n\n for (const candidate of candidates) {\n const assumedHasTable = candidate.node.type.name === \"table\";\n if (!this.options.shouldShow({\n editor: this.editor,\n ...candidate,\n isEmptyDoc,\n hasTable: assumedHasTable,\n })) {\n continue;\n }\n\n if (candidate.node.isLeaf || !isNodeEmpty(candidate.node)) continue;\n\n const hasTable = assumedHasTable || documentHasTable(doc);\n if (hasTable !== assumedHasTable && !this.options.shouldShow({\n editor: this.editor,\n ...candidate,\n isEmptyDoc,\n hasTable,\n })) {\n continue;\n }\n\n addDecoration(candidate);\n }\n\n return DecorationSet.create(doc, decorations) as any;\n }\n\n hasTable = documentHasTable(doc);\n\n doc.descendants((node, pos) => {\n const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;\n const isEmpty = !node.isLeaf && isNodeEmpty(node);\n\n if (!((hasAnchor || !this.options.showOnlyCurrent) && isEmpty)) {\n return this.options.includeChildren;\n }\n\n if (!this.options.shouldShow({ editor: this.editor, node, pos, hasAnchor, isEmptyDoc, hasTable })) {\n return this.options.includeChildren;\n }\n\n addDecoration({ hasAnchor, node, pos });\n\n return this.options.includeChildren;\n });\n\n // In this monorepo, ProseMirror types can be resolved from both the\n // root app and the package workspace, producing structurally equal\n // but nominally distinct DecorationSet types. Runtime is unaffected.\n return DecorationSet.create(doc, decorations) as any;\n },\n },\n }),\n ];\n },\n});\n\nexport default UEditorPlaceholder;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { mergeAttributes } from \"@tiptap/core\";\nimport { NodeViewWrapper, ReactNodeViewRenderer, type NodeViewProps } from \"@tiptap/react\";\nimport { UEDITOR_TABLE_LAYOUT_CHANGE_EVENT } from \"./table-dom-utils\";\n\nconst MIN_IMAGE_SIZE_PX = 40;\nconst IMAGE_LAYOUTS = new Set([\"block\", \"left\", \"right\"] as const);\nconst IMAGE_WIDTH_PRESETS = new Set([\"sm\", \"md\", \"lg\"] as const);\ntype ImageLayout = \"block\" | \"left\" | \"right\";\ntype ImageWidthPreset = \"sm\" | \"md\" | \"lg\";\n\nfunction toNullableNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction parseImageLayout(value: unknown): ImageLayout {\n if (typeof value === \"string\" && IMAGE_LAYOUTS.has(value as ImageLayout)) {\n return value as ImageLayout;\n }\n return \"block\";\n}\n\nfunction parseImageWidthPreset(value: unknown): ImageWidthPreset | null {\n if (typeof value === \"string\" && IMAGE_WIDTH_PRESETS.has(value as ImageWidthPreset)) {\n return value as ImageWidthPreset;\n }\n return null;\n}\n\nfunction getImageLayoutStyles(layout: ImageLayout) {\n if (layout === \"left\") {\n return {\n \"data-image-layout\": \"left\",\n style: \"float:left;display:block;margin:0.25rem 1rem 0.75rem 0;\",\n };\n }\n\n if (layout === \"right\") {\n return {\n \"data-image-layout\": \"right\",\n style: \"float:right;display:block;margin:0.25rem 0 0.75rem 1rem;\",\n };\n }\n\n return {};\n}\n\nfunction getAspectRatio({\n img,\n widthAttr,\n heightAttr,\n fallbackWidth,\n fallbackHeight,\n}: {\n img: HTMLImageElement;\n widthAttr: number | null;\n heightAttr: number | null;\n fallbackWidth: number;\n fallbackHeight: number;\n}) {\n if (widthAttr && heightAttr) return widthAttr / heightAttr;\n if (img.naturalWidth > 0 && img.naturalHeight > 0) return img.naturalWidth / img.naturalHeight;\n if (fallbackWidth > 0 && fallbackHeight > 0) return fallbackWidth / fallbackHeight;\n return 1;\n}\n\nfunction sizeFromWidth(width: number, aspect: number, maxWidth: number) {\n let nextW = clamp(width, MIN_IMAGE_SIZE_PX, maxWidth);\n let nextH = nextW / aspect;\n\n if (nextH < MIN_IMAGE_SIZE_PX) {\n nextH = MIN_IMAGE_SIZE_PX;\n nextW = clamp(nextH * aspect, MIN_IMAGE_SIZE_PX, maxWidth);\n nextH = nextW / aspect;\n }\n\n return { width: nextW, height: nextH };\n}\n\nfunction sizeFromHeight(height: number, aspect: number, maxWidth: number) {\n let nextH = Math.max(MIN_IMAGE_SIZE_PX, height);\n let nextW = nextH * aspect;\n\n if (nextW > maxWidth) {\n nextW = maxWidth;\n nextH = nextW / aspect;\n }\n\n if (nextW < MIN_IMAGE_SIZE_PX) {\n nextW = MIN_IMAGE_SIZE_PX;\n nextH = nextW / aspect;\n }\n\n return { width: nextW, height: nextH };\n}\n\nfunction ResizableImageNodeView(props: NodeViewProps) {\n const { node, selected, updateAttributes, editor, getPos } = props;\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n const resizePreviewRef = useRef<HTMLDivElement | null>(null);\n const [isHovered, setIsHovered] = useState(false);\n const [isResizing, setIsResizing] = useState(false);\n\n const widthAttr = toNullableNumber((node.attrs as Record<string, unknown>)[\"width\"]);\n const heightAttr = toNullableNumber((node.attrs as Record<string, unknown>)[\"height\"]);\n const textAlign = String((node.attrs as Record<string, unknown>)[\"textAlign\"] ?? \"\");\n const imageLayout = parseImageLayout((node.attrs as Record<string, unknown>)[\"imageLayout\"]);\n\n const dragStateRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n startW: number;\n startH: number;\n aspect: number;\n maxW: number;\n previewBaseW: number;\n previewBaseH: number;\n pendingW: number;\n pendingH: number;\n frameId: number | null;\n } | null>(null);\n\n const dispatchTableLayoutChange = () => {\n editor.view.dom.dispatchEvent(new CustomEvent(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, { bubbles: true }));\n };\n\n const getImageDisplayStyle = (width: number | null, height: number | null): React.CSSProperties => ({\n width: width ? `${width}px` : undefined,\n height: width && height ? \"auto\" : height ? `${height}px` : undefined,\n aspectRatio: width && height ? `${width} / ${height}` : undefined,\n });\n\n const setResizePreviewStyle = (width: number, height: number, visible: boolean, resetBase = false) => {\n const preview = resizePreviewRef.current;\n if (!preview) return;\n\n const drag = dragStateRef.current;\n const baseW = resetBase || !drag ? Math.max(MIN_IMAGE_SIZE_PX, Math.round(width)) : drag.previewBaseW;\n const baseH = resetBase || !drag ? Math.max(MIN_IMAGE_SIZE_PX, Math.round(height)) : drag.previewBaseH;\n const scaleX = width / baseW;\n const scaleY = height / baseH;\n\n if (resetBase) {\n preview.style.width = `${baseW}px`;\n preview.style.height = `${baseH}px`;\n }\n\n preview.style.maxWidth = \"none\";\n preview.style.maxHeight = \"none\";\n preview.style.transform = visible ? `translateZ(0) scale(${scaleX}, ${scaleY})` : \"translateZ(0) scale(1)\";\n preview.style.display = visible ? \"block\" : \"none\";\n };\n\n const applyPendingResizeFrame = () => {\n const drag = dragStateRef.current;\n if (!drag) return;\n\n drag.frameId = null;\n setResizePreviewStyle(drag.pendingW, drag.pendingH, true);\n };\n\n const scheduleResizeFrame = () => {\n const drag = dragStateRef.current;\n if (!drag || drag.frameId !== null) return;\n\n drag.frameId = window.requestAnimationFrame(applyPendingResizeFrame);\n };\n\n useEffect(() => {\n return () => {\n const drag = dragStateRef.current;\n if (drag && drag.frameId !== null) {\n window.cancelAnimationFrame(drag.frameId);\n }\n dragStateRef.current = null;\n document.body.style.cursor = \"\";\n };\n }, []);\n\n useEffect(() => {\n const img = imgRef.current;\n if (!img) return;\n const displayStyle = getImageDisplayStyle(widthAttr, heightAttr);\n img.style.width = typeof displayStyle.width === \"string\" ? displayStyle.width : \"\";\n img.style.height = typeof displayStyle.height === \"string\" ? displayStyle.height : \"\";\n img.style.aspectRatio = typeof displayStyle.aspectRatio === \"string\" ? displayStyle.aspectRatio : \"\";\n }, [widthAttr, heightAttr]);\n\n const selectNode = () => {\n const pos = typeof getPos === \"function\" ? getPos() : null;\n if (typeof pos === \"number\") editor.commands.setNodeSelection(pos);\n };\n\n const onResizePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n const img = imgRef.current;\n const wrapper = wrapperRef.current;\n if (!img || !wrapper) return;\n\n selectNode();\n\n const rect = img.getBoundingClientRect();\n const editorEl = wrapper.closest(\".ProseMirror\") as HTMLElement | null;\n const maxW = editorEl ? editorEl.getBoundingClientRect().width : Number.POSITIVE_INFINITY;\n\n const startW = Math.max(MIN_IMAGE_SIZE_PX, rect.width);\n const startH = Math.max(MIN_IMAGE_SIZE_PX, rect.height);\n const aspect = getAspectRatio({\n img,\n widthAttr,\n heightAttr,\n fallbackWidth: startW,\n fallbackHeight: startH,\n });\n\n dragStateRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n startW,\n startH,\n aspect,\n maxW: Math.max(MIN_IMAGE_SIZE_PX, maxW),\n previewBaseW: Math.max(MIN_IMAGE_SIZE_PX, Math.round(startW)),\n previewBaseH: Math.max(MIN_IMAGE_SIZE_PX, Math.round(startH)),\n pendingW: startW,\n pendingH: startH,\n frameId: null,\n };\n\n setIsResizing(true);\n setResizePreviewStyle(startW, startH, true, true);\n document.body.style.cursor = \"nwse-resize\";\n (event.currentTarget as HTMLDivElement).setPointerCapture(event.pointerId);\n };\n\n const onResizePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragStateRef.current;\n const img = imgRef.current;\n if (!drag || !img) return;\n if (event.pointerId !== drag.pointerId) return;\n\n const dx = event.clientX - drag.startX;\n const dy = event.clientY - drag.startY;\n\n const nextSize = Math.abs(dx) >= Math.abs(dy)\n ? sizeFromWidth(drag.startW + dx, drag.aspect, drag.maxW)\n : sizeFromHeight(drag.startH + dy, drag.aspect, drag.maxW);\n const nextW = nextSize.width;\n const nextH = nextSize.height;\n\n drag.pendingW = nextW;\n drag.pendingH = nextH;\n scheduleResizeFrame();\n };\n\n const finishResize = () => {\n const drag = dragStateRef.current;\n dragStateRef.current = null;\n setIsResizing(false);\n document.body.style.cursor = \"\";\n if (!drag) return;\n\n if (drag.frameId !== null) {\n window.cancelAnimationFrame(drag.frameId);\n drag.frameId = null;\n }\n\n const img = imgRef.current;\n const nextW = Math.round(drag.pendingW);\n const nextH = Math.round(drag.pendingH);\n setResizePreviewStyle(nextW, nextH, false);\n if (img) {\n img.style.width = `${nextW}px`;\n img.style.height = \"auto\";\n img.style.aspectRatio = `${nextW} / ${nextH}`;\n }\n dispatchTableLayoutChange();\n\n updateAttributes({\n width: nextW,\n height: nextH,\n imageWidthPreset: null,\n });\n };\n\n const onResizePointerUp = (event: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragStateRef.current;\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishResize();\n };\n\n const onResizePointerCancel = (event: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragStateRef.current;\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.preventDefault();\n event.stopPropagation();\n finishResize();\n };\n\n const showHandle = selected || isHovered || isResizing;\n const wrapperAlignClass =\n imageLayout === \"block\"\n ? textAlign === \"center\"\n ? \"mx-auto\"\n : textAlign === \"right\"\n ? \"ml-auto\"\n : textAlign === \"justify\"\n ? \"mx-auto\"\n : \"\"\n : \"\";\n const wrapperLayoutClass =\n imageLayout === \"left\"\n ? \"float-left mr-4 mb-3 mt-1 clear-none max-w-[min(45%,20rem)]\"\n : imageLayout === \"right\"\n ? \"float-right ml-4 mb-3 mt-1 clear-none max-w-[min(45%,20rem)]\"\n : \"w-fit\";\n\n return (\n <NodeViewWrapper\n as=\"div\"\n ref={wrapperRef}\n data-image-layout={imageLayout}\n className={[\"relative block align-middle max-w-full my-4\", wrapperLayoutClass, wrapperAlignClass].filter(Boolean).join(\" \")}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n selectNode();\n }}\n contentEditable={false}\n >\n <img\n ref={imgRef}\n src={String((node.attrs as Record<string, unknown>)[\"src\"] ?? \"\")}\n alt={String((node.attrs as Record<string, unknown>)[\"alt\"] ?? \"\")}\n title={String((node.attrs as Record<string, unknown>)[\"title\"] ?? \"\")}\n draggable=\"true\"\n className={[\n \"block rounded-lg max-w-full\",\n selected ? \"ring-2 ring-primary/60 ring-offset-2 ring-offset-background\" : \"\",\n isResizing ? \"select-none\" : \"\",\n ].join(\" \")}\n style={getImageDisplayStyle(widthAttr, heightAttr)}\n />\n\n <div\n ref={resizePreviewRef}\n aria-hidden=\"true\"\n data-ueditor-image-resize-preview=\"\"\n className={[\n \"pointer-events-none absolute left-0 top-0 z-20 hidden rounded-lg\",\n \"border border-primary/70 bg-background/30 bg-center bg-no-repeat bg-[length:100%_100%]\",\n \"opacity-45 shadow-md ring-2 ring-primary/25 will-change-transform\",\n \"select-none\",\n ].join(\" \")}\n style={{\n width: widthAttr ? `${widthAttr}px` : undefined,\n height: heightAttr ? `${heightAttr}px` : undefined,\n maxWidth: \"none\",\n maxHeight: \"none\",\n backgroundImage: `url(\"${String((node.attrs as Record<string, unknown>)[\"src\"] ?? \"\").replace(/\"/g, \"%22\")}\")`,\n transform: \"translateZ(0) scale(1)\",\n transformOrigin: \"top left\",\n display: isResizing ? \"block\" : \"none\",\n }}\n />\n\n {showHandle && (\n <div\n aria-hidden=\"true\"\n data-ueditor-image-resize-handle=\"\"\n onPointerDown={onResizePointerDown}\n onPointerMove={onResizePointerMove}\n onPointerUp={onResizePointerUp}\n onPointerCancel={onResizePointerCancel}\n className={[\n \"absolute -right-1 -bottom-1 h-3 w-3 rounded-sm\",\n \"bg-primary border border-background shadow-sm\",\n \"cursor-nwse-resize\",\n \"opacity-90 hover:opacity-100\",\n ].join(\" \")}\n />\n )}\n </NodeViewWrapper>\n );\n}\n\nconst ResizableImage = Image.extend({\n addAttributes() {\n const parentAttrs = this.parent?.() ?? {};\n return {\n ...parentAttrs,\n width: {\n default: null,\n parseHTML: (element) => {\n const raw = element.getAttribute(\"width\") || (element as HTMLElement).style.width || \"\";\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) ? parsed : null;\n },\n renderHTML: (attrs) => (typeof attrs.width === \"number\" ? { width: attrs.width } : {}),\n },\n height: {\n default: null,\n parseHTML: (element) => {\n const raw = element.getAttribute(\"height\") || (element as HTMLElement).style.height || \"\";\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) ? parsed : null;\n },\n renderHTML: (attrs) => (typeof attrs.height === \"number\" ? { height: attrs.height } : {}),\n },\n imageLayout: {\n default: \"block\",\n parseHTML: (element) => {\n const explicit = element.getAttribute(\"data-image-layout\");\n if (explicit) return parseImageLayout(explicit);\n\n const floatValue = (element as HTMLElement).style.float;\n if (floatValue === \"left\" || floatValue === \"right\") return floatValue;\n\n return \"block\";\n },\n renderHTML: (attrs) => getImageLayoutStyles(parseImageLayout(attrs.imageLayout)),\n },\n imageWidthPreset: {\n default: null,\n parseHTML: (element) => parseImageWidthPreset(element.getAttribute(\"data-image-size\")),\n renderHTML: (attrs) => {\n const preset = parseImageWidthPreset(attrs.imageWidthPreset);\n return preset ? { \"data-image-size\": preset } : {};\n },\n },\n };\n },\n renderHTML({ HTMLAttributes }) {\n // Keep compatibility: if width/height come from style, allow them to be parsed back.\n return [\"img\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n },\n addNodeView() {\n return ReactNodeViewRenderer(ResizableImageNodeView);\n },\n}).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: \"rounded-lg max-w-full my-4\",\n },\n});\n\nexport default ResizableImage;\n","import { TableRow } from \"@tiptap/extension-table-row\";\nimport { DEFAULT_TABLE_ROW_HEIGHT, MIN_TABLE_ROW_HEIGHT } from \"./table-dom-utils\";\n\nfunction parseRowHeight(value: string | null | undefined) {\n if (!value) return null;\n const match = String(value).match(/(\\d+(?:\\.\\d+)?)/);\n if (!match) return null;\n const parsed = Number.parseFloat(match[1]);\n return normalizeRowHeight(parsed);\n}\n\nfunction normalizeRowHeight(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.max(MIN_TABLE_ROW_HEIGHT, Math.round(value))\n : null;\n}\n\nconst UEditorTableRow = TableRow.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n rowHeight: {\n default: DEFAULT_TABLE_ROW_HEIGHT,\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement)) return null;\n return (\n parseRowHeight(element.getAttribute(\"data-row-height\"))\n ?? parseRowHeight(element.style.height)\n );\n },\n renderHTML: (attributes) => {\n const rowHeight = normalizeRowHeight(attributes.rowHeight);\n if (!rowHeight) {\n return {};\n }\n\n return {\n \"data-row-height\": String(rowHeight),\n style: `height: ${rowHeight}px; min-height: ${rowHeight}px;`,\n };\n },\n },\n };\n },\n});\n\nexport default UEditorTableRow;\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontFamily: {\n setFontFamily: (fontFamily: string) => ReturnType;\n unsetFontFamily: () => ReturnType;\n };\n }\n}\n\nconst FontFamily = Extension.create({\n name: \"fontFamily\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontFamily: {\n default: null,\n parseHTML: (element: HTMLElement) => element.style.fontFamily || null,\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontFamily = typeof attributes.fontFamily === \"string\" ? attributes.fontFamily.trim() : \"\";\n if (!fontFamily) return {};\n return { style: `font-family: ${fontFamily}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontFamily:\n (fontFamily: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontFamily }).run(),\n unsetFontFamily:\n () =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontFamily: null }).removeEmptyTextStyle().run(),\n };\n },\n});\n\nexport default FontFamily;\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n fontSize: {\n setFontSize: (fontSize: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n };\n }\n}\n\nconst FontSize = Extension.create({\n name: \"fontSize\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: (element: HTMLElement) => element.style.fontSize || null,\n renderHTML: (attributes: Record<string, unknown>) => {\n const fontSize = typeof attributes.fontSize === \"string\" ? attributes.fontSize.trim() : \"\";\n if (!fontSize) return {};\n return { style: `font-size: ${fontSize}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontSize }).run(),\n unsetFontSize:\n () =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { fontSize: null }).removeEmptyTextStyle().run(),\n };\n },\n});\n\nexport default FontSize;\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType;\n unsetLineHeight: () => ReturnType;\n };\n }\n}\n\nconst LineHeight = Extension.create({\n name: \"lineHeight\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element: HTMLElement) => element.style.lineHeight || null,\n renderHTML: (attributes: Record<string, unknown>) => {\n const lineHeight = typeof attributes.lineHeight === \"string\" ? attributes.lineHeight.trim() : \"\";\n if (!lineHeight) return {};\n return { style: `line-height: ${lineHeight}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { lineHeight }).run(),\n unsetLineHeight:\n () =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { lineHeight: null }).removeEmptyTextStyle().run(),\n };\n },\n});\n\nexport default LineHeight;\n","import { Extension } from \"@tiptap/core\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n letterSpacing: {\n setLetterSpacing: (letterSpacing: string) => ReturnType;\n unsetLetterSpacing: () => ReturnType;\n };\n }\n}\n\nconst LetterSpacing = Extension.create({\n name: \"letterSpacing\",\n\n addOptions() {\n return {\n types: [\"textStyle\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n letterSpacing: {\n default: null,\n parseHTML: (element: HTMLElement) => element.style.letterSpacing || null,\n renderHTML: (attributes: Record<string, unknown>) => {\n const letterSpacing = typeof attributes.letterSpacing === \"string\" ? attributes.letterSpacing.trim() : \"\";\n if (!letterSpacing) return {};\n return { style: `letter-spacing: ${letterSpacing}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLetterSpacing:\n (letterSpacing: string) =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { letterSpacing }).run(),\n unsetLetterSpacing:\n () =>\n ({ chain }) =>\n chain().setMark(\"textStyle\", { letterSpacing: null }).removeEmptyTextStyle().run(),\n };\n },\n});\n\nexport default LetterSpacing;\n","import { Extension } from \"@tiptap/core\";\nimport type { EditorState } from \"@tiptap/pm/state\";\nimport type { Node as ProseMirrorNode, ResolvedPos } from \"@tiptap/pm/model\";\nimport { closeHistory } from \"@tiptap/pm/history\";\nimport { isInTable } from \"@tiptap/pm/tables\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n indent: {\n increaseIndent: () => ReturnType;\n decreaseIndent: () => ReturnType;\n };\n }\n}\n\ntype IndentOptions = {\n maxLevel: number;\n minLevel: number;\n stepRem: number;\n types: string[];\n};\n\ntype IndentTarget = {\n node: ProseMirrorNode;\n pos: number;\n};\n\nconst DEFAULT_MAX_LEVEL = 6;\nconst DEFAULT_MIN_LEVEL = 0;\nconst DEFAULT_STEP_REM = 2;\nconst INLINE_TAB_SPACES = \"\\u00a0\".repeat(4);\nconst LIST_ITEM_TYPES = new Set([\"listItem\", \"taskItem\"]);\nconst TABLE_CELL_TYPES = new Set([\"tableCell\", \"tableHeader\"]);\n\nfunction clampIndentLevel(value: unknown, minLevel: number, maxLevel: number) {\n const numericValue = typeof value === \"number\" ? value : Number.parseInt(String(value ?? \"\"), 10);\n if (!Number.isFinite(numericValue)) return minLevel;\n return Math.min(maxLevel, Math.max(minLevel, Math.round(numericValue)));\n}\n\nfunction parseIndentLevel(element: HTMLElement, options: IndentOptions) {\n const dataIndent = element.getAttribute(\"data-indent\");\n if (dataIndent !== null) {\n return clampIndentLevel(dataIndent, options.minLevel, options.maxLevel);\n }\n\n const marginLeft = element.style.marginLeft.trim();\n const match = marginLeft.match(/^(-?\\d+(?:\\.\\d+)?)(rem|em|px)$/i);\n if (!match) return options.minLevel;\n\n const value = Number.parseFloat(match[1] ?? \"0\");\n const unit = match[2]?.toLowerCase();\n const remValue = unit === \"px\" ? value / 16 : value;\n return clampIndentLevel(remValue / options.stepRem, options.minLevel, options.maxLevel);\n}\n\nfunction getNodePos($pos: ResolvedPos, depth: number) {\n return depth > 0 ? $pos.before(depth) : 0;\n}\n\nfunction getIndentTargetAt($pos: ResolvedPos, indentTypes: Set<string>): IndentTarget | null {\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const nodeName = $pos.node(depth).type.name;\n if (LIST_ITEM_TYPES.has(nodeName) || TABLE_CELL_TYPES.has(nodeName)) return null;\n }\n\n // A blockquote is the visual block that should move. Indenting its inner\n // paragraph would move only the text and leave the quote border behind.\n if (indentTypes.has(\"blockquote\")) {\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth);\n if (node.type.name === \"blockquote\") {\n return { node, pos: getNodePos($pos, depth) };\n }\n }\n }\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth);\n if (indentTypes.has(node.type.name)) {\n return { node, pos: getNodePos($pos, depth) };\n }\n }\n\n return null;\n}\n\nfunction getIndentTargets(state: EditorState, types: string[]) {\n if (isInTable(state)) return [];\n\n const indentTypes = new Set(types);\n const targets = new Map<number, IndentTarget>();\n const addTarget = (target: IndentTarget | null) => {\n if (target) targets.set(target.pos, target);\n };\n\n addTarget(getIndentTargetAt(state.selection.$from, indentTypes));\n addTarget(getIndentTargetAt(state.selection.$to, indentTypes));\n\n if (!state.selection.empty) {\n state.doc.nodesBetween(state.selection.from, state.selection.to, (node, pos) => {\n if (!indentTypes.has(node.type.name)) return true;\n\n const resolvedPos = state.doc.resolve(Math.min(pos + 1, state.doc.content.size));\n addTarget(getIndentTargetAt(resolvedPos, indentTypes));\n return node.type.name !== \"blockquote\";\n });\n }\n\n return Array.from(targets.values()).sort((a, b) => a.pos - b.pos);\n}\n\nfunction updateBlockIndent({\n state,\n dispatch,\n options,\n delta,\n separateHistory = false,\n}: {\n state: EditorState;\n dispatch: ((transaction: EditorState[\"tr\"]) => void) | undefined;\n options: IndentOptions;\n delta: -1 | 1;\n separateHistory?: boolean;\n}) {\n const targets = getIndentTargets(state, options.types);\n let transaction = state.tr;\n let changed = false;\n\n for (const target of targets) {\n const currentLevel = clampIndentLevel(target.node.attrs.indent, options.minLevel, options.maxLevel);\n const nextLevel = clampIndentLevel(currentLevel + delta, options.minLevel, options.maxLevel);\n if (nextLevel === currentLevel) continue;\n\n transaction = transaction.setNodeMarkup(target.pos, undefined, {\n ...target.node.attrs,\n indent: nextLevel,\n });\n changed = true;\n }\n\n if (changed && dispatch) {\n dispatch((separateHistory ? closeHistory(transaction) : transaction).scrollIntoView());\n }\n return changed;\n}\n\nfunction insertTabAtCursor(state: EditorState, dispatch?: (transaction: EditorState[\"tr\"]) => void) {\n if (!state.selection.empty) return false;\n\n if (dispatch) {\n dispatch(state.tr.insertText(INLINE_TAB_SPACES, state.selection.from).scrollIntoView());\n }\n\n return true;\n}\n\nfunction removeTabBeforeCursor(state: EditorState, dispatch?: (transaction: EditorState[\"tr\"]) => void) {\n if (!state.selection.empty || state.selection.$from.parentOffset < INLINE_TAB_SPACES.length) return false;\n\n const cursorPos = state.selection.from;\n const tabStartPos = cursorPos - INLINE_TAB_SPACES.length;\n if (state.doc.textBetween(tabStartPos, cursorPos) !== INLINE_TAB_SPACES) return false;\n\n if (dispatch) {\n dispatch(closeHistory(state.tr.delete(tabStartPos, cursorPos)).scrollIntoView());\n }\n\n return true;\n}\n\nfunction removeTabAfterCursor(state: EditorState, dispatch?: (transaction: EditorState[\"tr\"]) => void) {\n if (\n !state.selection.empty ||\n state.selection.$from.parentOffset + INLINE_TAB_SPACES.length > state.selection.$from.parent.content.size\n ) {\n return false;\n }\n\n const cursorPos = state.selection.from;\n const tabEndPos = cursorPos + INLINE_TAB_SPACES.length;\n if (state.doc.textBetween(cursorPos, tabEndPos) !== INLINE_TAB_SPACES) return false;\n\n if (dispatch) {\n dispatch(closeHistory(state.tr.delete(cursorPos, tabEndPos)).scrollIntoView());\n }\n\n return true;\n}\n\nconst Indent = Extension.create<IndentOptions>({\n name: \"indent\",\n\n addOptions() {\n return {\n maxLevel: DEFAULT_MAX_LEVEL,\n minLevel: DEFAULT_MIN_LEVEL,\n stepRem: DEFAULT_STEP_REM,\n types: [\"paragraph\", \"blockquote\"],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: this.options.minLevel,\n parseHTML: (element: HTMLElement) => parseIndentLevel(element, this.options),\n renderHTML: (attributes: Record<string, unknown>) => {\n const level = clampIndentLevel(attributes.indent, this.options.minLevel, this.options.maxLevel);\n if (level <= this.options.minLevel) return {};\n\n return {\n \"data-indent\": String(level),\n style: `margin-left: ${level * this.options.stepRem}rem`,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n increaseIndent:\n () =>\n ({ editor, commands, state, dispatch }) => {\n if (editor.isActive(\"taskItem\")) return commands.sinkListItem(\"taskItem\");\n if (editor.isActive(\"listItem\")) return commands.sinkListItem(\"listItem\");\n\n return updateBlockIndent({\n state,\n dispatch,\n options: this.options,\n delta: 1,\n });\n },\n decreaseIndent:\n () =>\n ({ editor, commands, state, dispatch }) => {\n if (editor.isActive(\"taskItem\")) return commands.liftListItem(\"taskItem\");\n if (editor.isActive(\"listItem\")) return commands.liftListItem(\"listItem\");\n\n return updateBlockIndent({\n state,\n dispatch,\n options: this.options,\n delta: -1,\n });\n },\n };\n },\n\n addKeyboardShortcuts() {\n const dispatch = (transaction: EditorState[\"tr\"]) => this.editor.view.dispatch(transaction);\n\n const handleBlockIndent = (delta: -1 | 1) => {\n const { state } = this.editor;\n const hasBlockTarget = getIndentTargets(state, this.options.types).length > 0;\n if (!hasBlockTarget) {\n return delta > 0\n ? this.editor.commands.increaseIndent()\n : this.editor.commands.decreaseIndent();\n }\n\n // A collapsed cursor inside text behaves like a word processor: Tab is\n // inserted at the caret instead of shifting the entire paragraph. Block\n // indentation remains available at the start of a block and for ranges.\n if (state.selection.empty && state.selection.$from.parentOffset > 0) {\n if (delta > 0) {\n return insertTabAtCursor(state, dispatch);\n }\n\n removeTabBeforeCursor(state, dispatch);\n // Keep focus in the editor when there is no preceding tab to remove.\n return true;\n }\n\n if (delta > 0) {\n this.editor.commands.increaseIndent();\n } else {\n this.editor.commands.decreaseIndent();\n }\n\n // Keep focus inside the editor even at the min/max boundary.\n return true;\n };\n\n const handleBackspace = () => {\n const { state } = this.editor;\n if (isInTable(state) || !state.selection.empty) return false;\n\n const targets = getIndentTargets(state, this.options.types);\n if (targets.length === 0) return false;\n\n if (state.selection.$from.parentOffset > 0) {\n // Tabs inserted by this extension are one logical unit even though\n // their backward-compatible HTML representation uses four NBSPs.\n return removeTabBeforeCursor(state, dispatch);\n }\n\n // Match word-processor behavior: at the start of an indented block,\n // remove one indent level before allowing ProseMirror to merge blocks.\n return updateBlockIndent({\n state,\n dispatch,\n options: this.options,\n delta: -1,\n separateHistory: true,\n });\n };\n\n const handleDelete = () => {\n const { state } = this.editor;\n if (isInTable(state) || !state.selection.empty) return false;\n if (getIndentTargets(state, this.options.types).length === 0) return false;\n\n return removeTabAfterCursor(state, dispatch);\n };\n\n return {\n Tab: () => handleBlockIndent(1),\n \"Shift-Tab\": () => handleBlockIndent(-1),\n Backspace: handleBackspace,\n Delete: handleDelete,\n };\n },\n});\n\nexport default Indent;\n","import { mergeAttributes } from \"@tiptap/core\";\nimport { Table } from \"@tiptap/extension-table\";\nimport type { DOMOutputSpec, Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey, TextSelection, type Command, type EditorState, type Transaction } from \"@tiptap/pm/state\";\nimport {\n addColumnAfter as addColumnAfterCommand,\n addColumnBefore as addColumnBeforeCommand,\n addRowAfter as addRowAfterCommand,\n addRowBefore as addRowBeforeCommand,\n deleteColumn as deleteColumnCommand,\n deleteRow as deleteRowCommand,\n selectedRect,\n tableEditing,\n tableNodeTypes,\n} from \"@tiptap/pm/tables\";\nimport {\n DEFAULT_TABLE_COLUMN_WIDTH,\n MIN_RESIZED_TABLE_COLUMN_WIDTH,\n dynamicColumnResizing,\n} from \"./table-column-resize\";\nimport { findTableNodeInfoFromState } from \"./table-align-utils\";\nimport { isCrossRealmHTMLElement, isRowResizeHotspot, isRowResizingGlobal, resolveEventElement } from \"./table-dom-utils\";\nimport {\n DEFAULT_RESPONSIVE_TABLE_WIDTH_BP,\n clampResponsiveTableWidthBp,\n formatBasisPointsAsPercentage,\n deleteResponsiveColumnLayout,\n getLegacyTableColumnWeights,\n getLogicalTableColumnCount,\n getResponsiveTableOffsetBp,\n getResponsiveTableWidthBp,\n getTableColumnRatios,\n normalizeColumnRatios,\n normalizeTableWidthMode,\n parseColumnRatios,\n parsePercentageToBasisPoints,\n resolveResponsiveTableOffsetBp,\n insertResponsiveColumnLayout,\n type ResponsiveTableWidthLayout,\n type UEditorTableWidthMode,\n} from \"./table-width-model\";\nimport {\n rewriteTableNodeFormulaReferencesForDeletion,\n rewriteTableNodeFormulaReferencesForInsertion,\n} from \"./table-formula-references\";\n\nexport type UEditorTableAlign = \"left\" | \"center\" | \"right\";\nexport type { UEditorTableWidthMode } from \"./table-width-model\";\n\nfunction normalizeTableAlign(value: unknown): UEditorTableAlign | null {\n if (value === \"left\" || value === \"center\" || value === \"right\") {\n return value;\n }\n\n return null;\n}\n\nfunction parseTableAlign(element: HTMLElement) {\n const dataAlign = normalizeTableAlign(element.getAttribute(\"data-table-align\"));\n if (dataAlign) return dataAlign;\n\n const marginLeft = element.style.marginLeft?.trim();\n const marginRight = element.style.marginRight?.trim();\n\n if (marginLeft === \"auto\" && marginRight === \"auto\") return \"center\";\n if (marginLeft === \"auto\" && (marginRight === \"0px\" || marginRight === \"0\")) return \"right\";\n if ((marginLeft === \"0px\" || marginLeft === \"0\") && marginRight === \"auto\") return \"left\";\n\n return null;\n}\n\nfunction renderFixedTableAlignStyle(tableAlign: UEditorTableAlign | null) {\n switch (tableAlign) {\n case \"center\":\n return \"table-layout: fixed; margin-left: auto; margin-right: auto;\";\n case \"right\":\n return \"table-layout: fixed; margin-left: auto; margin-right: 0;\";\n case \"left\":\n return \"table-layout: fixed; margin-left: 0; margin-right: auto;\";\n default:\n return \"\";\n }\n}\n\nfunction parseTableWidthMode(element: HTMLElement): UEditorTableWidthMode {\n const storedMode = element.getAttribute(\"data-table-width-mode\");\n if (storedMode === \"responsive\" || storedMode === \"full\" || parsePercentageToBasisPoints(element.style.width) !== null) {\n return \"responsive\";\n }\n\n return \"fixed\";\n}\n\nfunction createUEditorColGroup(node: ProseMirrorNode, widthMode: UEditorTableWidthMode) {\n const columnWidths = getLegacyTableColumnWeights(node, DEFAULT_TABLE_COLUMN_WIDTH)\n .map((width) => Math.max(MIN_RESIZED_TABLE_COLUMN_WIDTH, Math.round(width)));\n const columnRatios = getTableColumnRatios(node);\n const totalWidth = columnWidths.reduce((sum, width) => sum + width, 0);\n const columns = columnWidths.map((width, index) => [\"col\", {\n style: widthMode === \"responsive\"\n ? `width: ${formatBasisPointsAsPercentage(columnRatios[index])};`\n : `width: ${width}px; min-width: ${width}px;`,\n width: String(width),\n }] as DOMOutputSpec);\n\n return {\n colgroup: [\"colgroup\", {}, ...columns] as DOMOutputSpec,\n columnCount: columns.length,\n tableWidth: totalWidth > 0 ? `${totalWidth}px` : \"\",\n };\n}\n\nfunction runResponsiveColumnStructureCommand(\n state: EditorState,\n dispatch: ((transaction: Transaction) => void) | undefined,\n command: Command,\n updateLayout: (\n layout: ResponsiveTableWidthLayout,\n rect: ReturnType<typeof selectedRect>,\n ) => ResponsiveTableWidthLayout,\n rewriteFormulas: (tableNode: ProseMirrorNode, rect: ReturnType<typeof selectedRect>) => ProseMirrorNode,\n) {\n const tableInfo = findTableNodeInfoFromState(state);\n if (!tableInfo) {\n return command(state, dispatch);\n }\n\n let rect: ReturnType<typeof selectedRect>;\n try {\n rect = selectedRect(state);\n } catch {\n return false;\n }\n const responsive = normalizeTableWidthMode(tableInfo.node.attrs.widthMode) === \"responsive\";\n const nextLayout = responsive\n ? updateLayout({\n widthBp: getResponsiveTableWidthBp(tableInfo.node),\n columnRatios: getTableColumnRatios(tableInfo.node),\n }, rect)\n : null;\n return command(state, dispatch\n ? (transaction) => {\n let nextTable = transaction.doc.nodeAt(tableInfo.pos);\n if (nextTable?.type.name === \"table\" && nextLayout && nextLayout.columnRatios.length > 0) {\n const widthBp = clampResponsiveTableWidthBp(nextLayout.widthBp);\n const tableAlign = normalizeTableAlign(nextTable.attrs.textAlign);\n const offsetBp = resolveResponsiveTableOffsetBp(\n widthBp,\n tableAlign,\n getResponsiveTableOffsetBp(tableInfo.node),\n );\n transaction.setNodeMarkup(tableInfo.pos, undefined, {\n ...nextTable.attrs,\n widthMode: \"responsive\",\n widthBp,\n offsetBp,\n columnRatios: normalizeColumnRatios(\n nextLayout.columnRatios,\n getLogicalTableColumnCount(nextTable),\n ),\n });\n nextTable = transaction.doc.nodeAt(tableInfo.pos);\n }\n if (nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteFormulas(nextTable, rect);\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n dispatch(transaction);\n }\n : undefined);\n}\n\nfunction runRowStructureCommand(\n state: EditorState,\n dispatch: ((transaction: Transaction) => void) | undefined,\n command: Command,\n rewriteFormulas: (tableNode: ProseMirrorNode, rect: ReturnType<typeof selectedRect>) => ProseMirrorNode,\n) {\n const tableInfo = findTableNodeInfoFromState(state);\n if (!tableInfo) return command(state, dispatch);\n\n let rect: ReturnType<typeof selectedRect>;\n try {\n rect = selectedRect(state);\n } catch {\n return false;\n }\n\n return command(state, dispatch\n ? (transaction) => {\n const nextTable = transaction.doc.nodeAt(tableInfo.pos);\n if (nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteFormulas(nextTable, rect);\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n dispatch(transaction);\n }\n : undefined);\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n tableAlign: {\n setTableAlign: (tableAlign: UEditorTableAlign) => ReturnType;\n unsetTableAlign: () => ReturnType;\n };\n }\n}\n\nconst UEditorTable = Table.extend({\n addGlobalAttributes() {\n return [\n ...(this.parent?.() ?? []),\n {\n types: [\"table\"],\n attributes: {\n textAlign: {\n default: null,\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement)) return null;\n return parseTableAlign(element);\n },\n renderHTML: (attributes) => {\n const tableAlign = normalizeTableAlign(attributes.textAlign);\n if (!tableAlign) return {};\n\n return {\n \"data-table-align\": tableAlign,\n };\n },\n },\n widthMode: {\n default: \"fixed\",\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement)) return \"fixed\";\n return parseTableWidthMode(element);\n },\n renderHTML: (attributes) => {\n if (normalizeTableWidthMode(attributes.widthMode) !== \"responsive\") return {};\n\n return {\n \"data-table-width-mode\": \"responsive\",\n };\n },\n },\n widthBp: {\n default: null,\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement) || parseTableWidthMode(element) !== \"responsive\") return null;\n const stored = Number(element.getAttribute(\"data-table-width-bp\"));\n if (Number.isFinite(stored) && stored > 0) return clampResponsiveTableWidthBp(stored);\n return parsePercentageToBasisPoints(element.getAttribute(\"data-table-width\") ?? element.style.width)\n ?? DEFAULT_RESPONSIVE_TABLE_WIDTH_BP;\n },\n renderHTML: () => ({}),\n },\n offsetBp: {\n default: null,\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement) || parseTableWidthMode(element) !== \"responsive\") return null;\n const storedValue = element.getAttribute(\"data-table-offset-bp\");\n const stored = Number(storedValue);\n if (storedValue !== null && Number.isFinite(stored) && stored >= 0) return Math.round(stored);\n const explicitOffset = parsePercentageToBasisPoints(\n element.getAttribute(\"data-table-offset\") ?? element.style.marginLeft,\n );\n if (explicitOffset !== null) return explicitOffset;\n\n const widthBp = parsePercentageToBasisPoints(\n element.getAttribute(\"data-table-width\") ?? element.style.width,\n ) ?? DEFAULT_RESPONSIVE_TABLE_WIDTH_BP;\n const tableAlign = parseTableAlign(element);\n return resolveResponsiveTableOffsetBp(widthBp, tableAlign);\n },\n renderHTML: () => ({}),\n },\n columnRatios: {\n default: null,\n parseHTML: (element) => {\n if (!(element instanceof HTMLElement)) return null;\n const storedRatios = parseColumnRatios(\n element.getAttribute(\"data-table-column-ratios\")\n ?? element.getAttribute(\"data-column-ratios\"),\n );\n if (storedRatios) return storedRatios;\n\n const columnPercentages = Array.from(element.querySelectorAll(\"colgroup > col\"))\n .map((column) => parsePercentageToBasisPoints((column as HTMLElement).style.width));\n return columnPercentages.length > 0 && columnPercentages.every((ratio) => ratio !== null)\n ? normalizeColumnRatios(columnPercentages as number[], columnPercentages.length)\n : null;\n },\n renderHTML: () => ({}),\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n insertTable:\n ({ rows = 3, cols = 3, withHeaderRow = true } = {}) =>\n ({ tr, dispatch, editor }) => {\n const types = tableNodeTypes(editor.schema);\n const rowCount = Math.max(1, Math.floor(rows));\n const columnCount = Math.max(1, Math.floor(cols));\n const createCells = (type: typeof types.cell) => Array.from({ length: columnCount }, () => type.createAndFill())\n .filter((cell): cell is ProseMirrorNode => cell !== null);\n const bodyCells = createCells(types.cell);\n const headerCells = withHeaderRow ? createCells(types.header_cell) : bodyCells;\n const tableRows = Array.from({ length: rowCount }, (_, index) => types.row.createChecked(\n null,\n withHeaderRow && index === 0 ? headerCells : bodyCells,\n ));\n const table = types.table.createChecked(\n {\n widthMode: \"responsive\",\n widthBp: DEFAULT_RESPONSIVE_TABLE_WIDTH_BP,\n offsetBp: 0,\n columnRatios: normalizeColumnRatios(null, columnCount),\n },\n tableRows,\n );\n\n if (dispatch) {\n const offset = tr.selection.from + 1;\n tr.replaceSelectionWith(table)\n .scrollIntoView()\n .setSelection(TextSelection.near(tr.doc.resolve(offset)));\n }\n\n return true;\n },\n addColumnBefore:\n () =>\n ({ state, dispatch }) => {\n return runResponsiveColumnStructureCommand(\n state,\n dispatch,\n addColumnBeforeCommand,\n (layout, rect) => insertResponsiveColumnLayout(\n layout.widthBp,\n layout.columnRatios,\n rect.left,\n rect.left,\n ),\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForInsertion(tableNode, \"column\", rect.left),\n );\n },\n addColumnAfter:\n () =>\n ({ state, dispatch }) => {\n return runResponsiveColumnStructureCommand(\n state,\n dispatch,\n addColumnAfterCommand,\n (layout, rect) => insertResponsiveColumnLayout(\n layout.widthBp,\n layout.columnRatios,\n rect.right,\n rect.right - 1,\n ),\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForInsertion(tableNode, \"column\", rect.right),\n );\n },\n deleteColumn:\n () =>\n ({ state, dispatch }) => {\n return runResponsiveColumnStructureCommand(\n state,\n dispatch,\n deleteColumnCommand,\n (layout, rect) => {\n let nextLayout = layout;\n for (let index = rect.right - 1; index >= rect.left; index -= 1) {\n nextLayout = deleteResponsiveColumnLayout(\n nextLayout.widthBp,\n nextLayout.columnRatios,\n index,\n );\n }\n return nextLayout;\n },\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForDeletion(\n tableNode,\n \"column\",\n rect.left,\n rect.right - rect.left,\n ),\n );\n },\n addRowBefore:\n () =>\n ({ state, dispatch }) => runRowStructureCommand(\n state,\n dispatch,\n addRowBeforeCommand,\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForInsertion(tableNode, \"row\", rect.top),\n ),\n addRowAfter:\n () =>\n ({ state, dispatch }) => runRowStructureCommand(\n state,\n dispatch,\n addRowAfterCommand,\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForInsertion(tableNode, \"row\", rect.bottom),\n ),\n deleteRow:\n () =>\n ({ state, dispatch }) => runRowStructureCommand(\n state,\n dispatch,\n deleteRowCommand,\n (tableNode, rect) => rewriteTableNodeFormulaReferencesForDeletion(\n tableNode,\n \"row\",\n rect.top,\n rect.bottom - rect.top,\n ),\n ),\n setTableAlign:\n (tableAlign: UEditorTableAlign) =>\n ({ state, dispatch }) => {\n const tableInfo = findTableNodeInfoFromState(state);\n if (!tableInfo) return false;\n const widthBp = getResponsiveTableWidthBp(tableInfo.node);\n const offsetBp = resolveResponsiveTableOffsetBp(widthBp, tableAlign);\n\n dispatch?.(\n state.tr.setNodeMarkup(tableInfo.pos, tableInfo.node.type, {\n ...tableInfo.node.attrs,\n textAlign: tableAlign,\n ...(normalizeTableWidthMode(tableInfo.node.attrs.widthMode) === \"responsive\" ? { offsetBp } : null),\n }),\n );\n\n return true;\n },\n unsetTableAlign:\n () =>\n ({ state, dispatch }) => {\n const tableInfo = findTableNodeInfoFromState(state);\n if (!tableInfo) return false;\n\n dispatch?.(\n state.tr.setNodeMarkup(tableInfo.pos, tableInfo.node.type, {\n ...tableInfo.node.attrs,\n textAlign: null,\n }),\n );\n\n return true;\n },\n };\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const widthMode = normalizeTableWidthMode(node.attrs.widthMode);\n const { colgroup, columnCount, tableWidth } = createUEditorColGroup(node, widthMode);\n const tableAlign = normalizeTableAlign(node.attrs.textAlign);\n const widthBp = getResponsiveTableWidthBp(node);\n const offsetBp = getResponsiveTableOffsetBp(node);\n const columnRatios = getTableColumnRatios(node);\n const tableStyle = widthMode === \"responsive\"\n ? [\n `width: ${formatBasisPointsAsPercentage(widthBp)}`,\n `margin-left: ${formatBasisPointsAsPercentage(offsetBp)}`,\n \"margin-right: auto\",\n `min-width: ${Math.max(1, columnCount) * MIN_RESIZED_TABLE_COLUMN_WIDTH}px`,\n \"table-layout: fixed\",\n ].join(\"; \") + \";\"\n : tableWidth\n ? `width: ${tableWidth}; ${renderFixedTableAlignStyle(tableAlign)}`\n : `table-layout: fixed; ${renderFixedTableAlignStyle(tableAlign)}`;\n const table: DOMOutputSpec = [\n \"table\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n ...(widthMode === \"responsive\"\n ? {\n \"data-table-width-mode\": \"responsive\",\n \"data-table-width\": formatBasisPointsAsPercentage(widthBp),\n \"data-table-width-bp\": String(widthBp),\n \"data-table-offset\": formatBasisPointsAsPercentage(offsetBp),\n \"data-table-offset-bp\": String(offsetBp),\n \"data-table-column-ratios\": columnRatios.join(\",\"),\n }\n : null),\n style: tableStyle,\n }),\n colgroup,\n [\"tbody\", 0],\n ];\n\n return this.options.renderWrapper\n ? [\"div\", { class: \"tableWrapper\" }, table] as DOMOutputSpec\n : table;\n },\n\n addProseMirrorPlugins() {\n const isResizable = this.options.resizable && this.editor.isEditable;\n\n return [\n ...(isResizable\n ? [\n dynamicColumnResizing({\n handleWidth: this.options.handleWidth,\n cellMinWidth: this.options.cellMinWidth,\n defaultCellMinWidth: DEFAULT_TABLE_COLUMN_WIDTH,\n lastColumnResizable: this.options.lastColumnResizable,\n }),\n ]\n : []),\n new Plugin({\n key: new PluginKey(\"tableRowResizeInterceptor\"),\n props: {\n handleDOMEvents: {\n mousedown(view, event) {\n if (event.button !== 0) return false;\n const target = resolveEventElement(event.target);\n const cell = target?.closest(\"th,td\");\n if (cell instanceof HTMLElement && isRowResizeHotspot(cell, event.clientX, event.clientY)) {\n isRowResizingGlobal.active = true;\n return true;\n }\n return false;\n },\n mousemove(_view, event) {\n if (isRowResizingGlobal.active) {\n if (event.buttons === 0) {\n isRowResizingGlobal.active = false;\n return false;\n }\n event.preventDefault();\n return true;\n }\n return false;\n },\n mouseup() {\n isRowResizingGlobal.active = false;\n return false;\n },\n },\n },\n }),\n tableEditing({\n allowTableNodeSelection: this.options.allowTableNodeSelection,\n }),\n new Plugin({\n key: new PluginKey(\"responsiveTableLayoutNormalizer\"),\n appendTransaction(transactions, _oldState, newState) {\n if (!transactions.some((transaction) => transaction.docChanged)) return null;\n\n // Structural table commands leave their selection inside the table.\n // Inspect only that ancestor so ordinary typing stays O(selection depth)\n // instead of walking the full document on every keystroke.\n const tableInfo = findTableNodeInfoFromState(newState);\n const node = tableInfo?.node;\n if (!tableInfo || !node || normalizeTableWidthMode(node.attrs.widthMode) !== \"responsive\") return null;\n\n const columnCount = getLogicalTableColumnCount(node);\n const columnRatios = getTableColumnRatios(node);\n const widthBp = getResponsiveTableWidthBp(node);\n const offsetBp = getResponsiveTableOffsetBp(node);\n const storedRatios = parseColumnRatios(node.attrs.columnRatios);\n const ratiosMatch = storedRatios?.length === columnCount\n && storedRatios.every((ratio, index) => Math.round(ratio) === columnRatios[index]);\n if (\n ratiosMatch\n && node.attrs.widthBp === widthBp\n && node.attrs.offsetBp === offsetBp\n && node.attrs.widthMode === \"responsive\"\n ) {\n return null;\n }\n\n return newState.tr.setNodeMarkup(tableInfo.pos, undefined, {\n ...node.attrs,\n widthMode: \"responsive\",\n widthBp,\n offsetBp,\n columnRatios,\n });\n },\n }),\n new Plugin({\n appendTransaction(_transactions, _oldState, newState) {\n const { doc, schema } = newState;\n const paragraphType = schema.nodes.paragraph;\n if (!paragraphType) return null;\n\n const needsLeading = doc.firstChild?.type.name === \"table\";\n const needsTrailing = doc.lastChild?.type.name === \"table\";\n\n if (!needsLeading && !needsTrailing) return null;\n\n const tr = newState.tr;\n if (needsTrailing) tr.insert(doc.content.size, paragraphType.create());\n // Insert at 0 after trailing so positions don't shift\n if (needsLeading) tr.insert(0, paragraphType.create());\n return tr;\n },\n }),\n ];\n },\n});\n\nexport default UEditorTable;\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { NodeViewWrapper, NodeViewContent } from \"@tiptap/react\";\nimport type { NodeViewProps } from \"@tiptap/react\";\nimport { Check, Copy, ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\n\nconst LANGUAGES = [\n { label: \"Plain Text\", value: \"text\" },\n { label: \"JavaScript\", value: \"javascript\" },\n { label: \"TypeScript\", value: \"typescript\" },\n { label: \"HTML\", value: \"html\" },\n { label: \"CSS\", value: \"css\" },\n { label: \"Python\", value: \"python\" },\n { label: \"Go\", value: \"go\" },\n { label: \"Rust\", value: \"rust\" },\n { label: \"C++\", value: \"cpp\" },\n { label: \"Java\", value: \"java\" },\n { label: \"SQL\", value: \"sql\" },\n { label: \"JSON\", value: \"json\" },\n { label: \"YAML\", value: \"yaml\" },\n { label: \"Shell\", value: \"bash\" },\n];\n\nexport const CodeBlockView: React.FC<NodeViewProps> = ({\n node,\n updateAttributes,\n extension,\n}) => {\n const [copied, setCopied] = useState(false);\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n const t = useSmartTranslations(\"UEditor\");\n\n const currentLangValue = node.attrs.language || \"text\";\n const currentLangLabel =\n LANGUAGES.find((lang) => lang.value === currentLangValue)?.label || \"Plain Text\";\n\n React.useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(node.textContent);\n setCopied(true);\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 2000);\n } catch (err) {\n console.error(\"Failed to copy code text: \", err);\n }\n };\n\n return (\n <NodeViewWrapper className=\"group/code relative my-4 rounded-xl border border-border/60 bg-muted/40 p-4 font-mono text-sm shadow-sm overflow-visible\">\n <div\n className=\"absolute right-3 top-3 z-10 flex items-center gap-1.5 opacity-0 group-hover/code:opacity-100 focus-within:opacity-100 transition-opacity duration-200 select-none\"\n contentEditable={false}\n >\n {/* Language Selector */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setIsDropdownOpen(!isDropdownOpen)}\n aria-haspopup=\"listbox\"\n aria-expanded={isDropdownOpen}\n className=\"flex items-center gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1 text-xs text-muted-foreground hover:text-foreground hover:bg-muted active:scale-95 transition-[color,background-color,transform] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {currentLangLabel}\n <ChevronDown aria-hidden=\"true\" className=\"h-3 w-3\" />\n </button>\n\n {isDropdownOpen && (\n <>\n <div\n className=\"fixed inset-0 z-20\"\n onClick={() => setIsDropdownOpen(false)}\n />\n <div role=\"listbox\" aria-label={currentLangLabel} className=\"absolute right-0 mt-1 max-h-56 w-36 overflow-y-auto rounded-lg border border-border/50 bg-popover p-1 shadow-lg z-30 [scrollbar-width:thin] animate-in fade-in-0 zoom-in-95 motion-reduce:animate-none\">\n {LANGUAGES.map((lang) => (\n <button\n key={lang.value}\n type=\"button\"\n role=\"option\"\n aria-selected={currentLangValue === lang.value}\n onClick={() => {\n updateAttributes({ language: lang.value });\n setIsDropdownOpen(false);\n }}\n className={cn(\n \"w-full rounded-md px-2 py-1.5 text-left text-xs transition-colors focus:outline-none\",\n currentLangValue === lang.value\n ? \"bg-primary/10 text-primary font-semibold\"\n : \"text-foreground hover:bg-muted\"\n )}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n\n {/* Copy Button */}\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={t(\"menubar.copy\")}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg border border-border bg-background text-muted-foreground hover:text-foreground hover:bg-muted active:scale-95 transition-[color,background-color,transform] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n title={t(\"menubar.copy\")}\n >\n {copied ? (\n <Check aria-hidden=\"true\" className=\"h-3.5 w-3.5 text-success animate-in fade-in-0 zoom-in-75 motion-reduce:animate-none\" />\n ) : (\n <Copy aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n\n <pre className=\"m-0 overflow-x-auto [scrollbar-width:thin] pt-4 sm:pt-0\">\n <code className=\"bg-transparent! text-foreground!\">\n <NodeViewContent />\n </code>\n </pre>\n </NodeViewWrapper>\n );\n};\n","import { findChildren } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey, type Transaction } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\n\ntype LowlightNode = {\n children?: unknown[];\n properties?: { className?: unknown };\n value?: unknown;\n};\n\ntype LowlightResult = {\n children?: unknown[];\n value?: unknown[];\n};\n\nexport type LowlightInstance = {\n highlight: (language: string, code: string) => LowlightResult;\n highlightAuto: (code: string) => LowlightResult;\n listLanguages: () => string[];\n registered?: (language: string) => boolean;\n};\n\ntype EnsureLowlightLanguages = () => Promise<void>;\n\nfunction parseHighlightNodes(nodes: unknown[], inheritedClasses: string[] = []) {\n return nodes.flatMap((value): Array<{ classes: string[]; text: string }> => {\n if (!value || typeof value !== \"object\") return [];\n const node = value as LowlightNode;\n const ownClasses = Array.isArray(node.properties?.className)\n ? node.properties.className.filter((className): className is string => typeof className === \"string\")\n : [];\n const classes = [...inheritedClasses, ...ownClasses];\n if (node.children) return parseHighlightNodes(node.children, classes);\n\n return [{\n classes,\n text: typeof node.value === \"string\" ? node.value : \"\",\n }];\n });\n}\n\nfunction getHighlightNodes(result: LowlightResult) {\n return result.value ?? result.children ?? [];\n}\n\nfunction highlightCode(lowlight: LowlightInstance, language: string | null | undefined, code: string) {\n if (language) {\n try {\n const isRegistered = lowlight.registered\n ? lowlight.registered(language)\n : lowlight.listLanguages().includes(language);\n if (isRegistered) {\n return lowlight.highlight(language, code);\n }\n } catch {\n // Invalid or unregistered aliases fall back to automatic detection.\n }\n }\n\n return lowlight.highlightAuto(code);\n}\n\nfunction documentContainsNode(doc: ProseMirrorNode, nodeName: string) {\n let found = false;\n doc.descendants((node) => {\n if (node.type.name !== nodeName) return true;\n found = true;\n return false;\n });\n return found;\n}\n\nfunction buildLowlightDecorations({\n defaultLanguage,\n doc,\n lowlight,\n nodeName,\n}: {\n defaultLanguage: string | null | undefined;\n doc: ProseMirrorNode;\n lowlight: LowlightInstance;\n nodeName: string;\n}) {\n const decorations: Decoration[] = [];\n\n for (const block of findChildren(doc, (node) => node.type.name === nodeName)) {\n let from = block.pos + 1;\n const language = block.node.attrs.language || defaultLanguage;\n const result = highlightCode(lowlight, language, block.node.textContent);\n\n for (const highlightedNode of parseHighlightNodes(getHighlightNodes(result))) {\n const to = from + highlightedNode.text.length;\n if (highlightedNode.classes.length > 0) {\n decorations.push(Decoration.inline(from, to, {\n class: highlightedNode.classes.join(\" \"),\n }));\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decorations);\n}\n\nfunction positionTouchesNode(doc: ProseMirrorNode, position: number, nodeName: string) {\n const safePosition = Math.max(0, Math.min(position, doc.content.size));\n const $position = doc.resolve(safePosition);\n\n for (let depth = $position.depth; depth > 0; depth -= 1) {\n if ($position.node(depth).type.name === nodeName) return true;\n }\n\n return $position.nodeBefore?.type.name === nodeName\n || $position.nodeAfter?.type.name === nodeName\n || doc.nodeAt(safePosition)?.type.name === nodeName;\n}\n\nfunction rangeContainsNode(doc: ProseMirrorNode, from: number, to: number, nodeName: string) {\n const safeFrom = Math.max(0, Math.min(from, doc.content.size));\n const safeTo = Math.max(safeFrom, Math.min(to, doc.content.size));\n if (safeFrom === safeTo) return positionTouchesNode(doc, safeFrom, nodeName);\n\n let found = false;\n doc.nodesBetween(safeFrom, safeTo, (node) => {\n if (node.type.name === nodeName) {\n found = true;\n return false;\n }\n return !found;\n });\n return found;\n}\n\nfunction fragmentContainsNode(fragment: { descendants?: (callback: (node: ProseMirrorNode) => boolean) => void } | undefined, nodeName: string) {\n if (!fragment?.descendants) return false;\n\n let found = false;\n fragment.descendants((node) => {\n if (node.type.name !== nodeName) return true;\n found = true;\n return false;\n });\n return found;\n}\n\nfunction transactionTouchesNode(transaction: Transaction, oldDoc: ProseMirrorNode, newDoc: ProseMirrorNode, nodeName: string) {\n if (!transaction.docChanged) return false;\n if (transaction.selection.$head.parent.type.name === nodeName) return true;\n\n const oldSelectionParent = transaction.before.resolve(\n Math.min(transaction.before.content.size, transaction.selection.from),\n ).parent;\n if (oldSelectionParent.type.name === nodeName) return true;\n\n for (const step of transaction.steps) {\n const structuralStep = step as unknown as {\n from?: number;\n pos?: number;\n slice?: { content?: { descendants?: (callback: (node: ProseMirrorNode) => boolean) => void } };\n to?: number;\n };\n\n if (fragmentContainsNode(structuralStep.slice?.content, nodeName)) return true;\n\n const from = structuralStep.from ?? structuralStep.pos;\n const to = structuralStep.to ?? structuralStep.pos;\n if (from === undefined || to === undefined) return true;\n if (rangeContainsNode(oldDoc, from, to, nodeName)) return true;\n\n const mappedFrom = transaction.mapping.map(from, -1);\n const mappedTo = transaction.mapping.map(to, 1);\n if (rangeContainsNode(newDoc, Math.min(mappedFrom, mappedTo), Math.max(mappedFrom, mappedTo), nodeName)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createOptimizedLowlightPlugin({\n defaultLanguage,\n ensureLanguages,\n lowlight,\n nodeName,\n}: {\n defaultLanguage: string | null | undefined;\n ensureLanguages?: EnsureLowlightLanguages;\n lowlight: LowlightInstance;\n nodeName: string;\n}) {\n type LowlightPluginState = {\n decorations: DecorationSet;\n hasCodeBlock: boolean;\n };\n\n const pluginKey = new PluginKey<LowlightPluginState>(\"ueditorLowlight\");\n const createDecorations = (doc: ProseMirrorNode) => buildLowlightDecorations({\n defaultLanguage,\n doc,\n lowlight,\n nodeName,\n });\n\n return new Plugin<LowlightPluginState>({\n key: pluginKey,\n state: {\n init: (_, state) => ({\n decorations: createDecorations(state.doc),\n hasCodeBlock: documentContainsNode(state.doc, nodeName),\n }),\n apply: (transaction, pluginState, oldState, newState) => {\n if (transaction.getMeta(pluginKey) === \"rehighlight\") {\n return {\n ...pluginState,\n decorations: createDecorations(newState.doc),\n };\n }\n\n if (transactionTouchesNode(transaction, oldState.doc, newState.doc, nodeName)) {\n return {\n decorations: createDecorations(newState.doc),\n hasCodeBlock: documentContainsNode(newState.doc, nodeName),\n };\n }\n\n return {\n ...pluginState,\n decorations: pluginState.decorations.map(transaction.mapping, newState.doc),\n };\n },\n },\n props: {\n decorations: (state) => pluginKey.getState(state)?.decorations ?? null,\n },\n view: ensureLanguages\n ? (view) => {\n let destroyed = false;\n let loadRequested = false;\n\n const requestLanguagesWhenNeeded = () => {\n if (loadRequested || !pluginKey.getState(view.state)?.hasCodeBlock) return;\n loadRequested = true;\n\n void ensureLanguages()\n .then(() => {\n if (destroyed || view.isDestroyed) return;\n view.dispatch(\n view.state.tr\n .setMeta(pluginKey, \"rehighlight\")\n .setMeta(\"addToHistory\", false),\n );\n })\n .catch(() => {\n // Keep plain code rendering functional and allow a later edit\n // to retry loading the optional language registry.\n loadRequested = false;\n });\n };\n\n requestLanguagesWhenNeeded();\n\n return {\n update: (_nextView, previousState) => {\n if (view.state.doc !== previousState.doc) requestLanguagesWhenNeeded();\n },\n destroy: () => {\n destroyed = true;\n },\n };\n }\n : undefined,\n });\n}\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport {\n createActiveTableFormulaRecalculationTransaction,\n getChangedActiveTableCellLabels,\n getSingleChangedActiveTableCellLabel,\n UEDITOR_TABLE_FORMULA_RECALCULATE_META,\n} from \"./table-formula-commands\";\n\nexport const TableFormulaRecalculation = Extension.create({\n name: \"tableFormulaRecalculation\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n appendTransaction: (transactions, oldState, newState) => {\n if (!transactions.some((transaction) => transaction.docChanged)) return null;\n if (transactions.some((transaction) => transaction.getMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META))) {\n return null;\n }\n\n const singleCellLabel = getSingleChangedActiveTableCellLabel(transactions, oldState, newState);\n const changedLabels = singleCellLabel\n ? new Set([singleCellLabel])\n : getChangedActiveTableCellLabels(oldState, newState);\n if (changedLabels?.size === 0) return null;\n\n return createActiveTableFormulaRecalculationTransaction(newState, { changedLabels });\n },\n }),\n ];\n },\n});\n","import type { Editor } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { TextSelection, type EditorState, type Transaction } from \"@tiptap/pm/state\";\nimport { selectedRect, setCellAttr, TableMap } from \"@tiptap/pm/tables\";\nimport { dispatchTableLayoutChange } from \"./table-cell-commands\";\nimport {\n buildTableFormulaDependencyGraph,\n evaluateBasicTableFormula,\n getAffectedTableFormulaLabels,\n formatFormulaError,\n formatTableFormulaDisplayValue,\n getTableFormulaRecalculationOrder,\n indexToColumnName,\n isDraftTableFormula,\n normalizeTableFormula,\n} from \"./table-formula\";\n\nexport const UEDITOR_TABLE_FORMULA_RECALCULATE_META = \"ueditorTableFormulaRecalculate\";\nconst TABLE_FORMULA_PLAN_CACHE_LIMIT = 50;\n\ntype TableFormulaPlan = {\n circular: Set<string>;\n graph: ReturnType<typeof buildTableFormulaDependencyGraph>;\n order: string[];\n};\n\nconst tableFormulaPlanCache = new Map<string, TableFormulaPlan>();\n\ntype CellEntry = {\n node: ProseMirrorNode;\n relativePos: number;\n};\n\ntype RelativeTableCellReplacement = {\n node: ProseMirrorNode;\n previousNode: ProseMirrorNode;\n relativePos: number;\n};\n\ntype TableCellReplacement = {\n from: number;\n node: ProseMirrorNode;\n to: number;\n};\n\nfunction getTableFormulaPlan(cells: Array<{ formula: string; label: string }>) {\n const cacheKey = JSON.stringify(cells);\n const cached = tableFormulaPlanCache.get(cacheKey);\n if (cached) {\n tableFormulaPlanCache.delete(cacheKey);\n tableFormulaPlanCache.set(cacheKey, cached);\n return cached;\n }\n\n const graph = buildTableFormulaDependencyGraph(cells);\n const { order, circular } = getTableFormulaRecalculationOrder(graph);\n const plan = { circular, graph, order };\n tableFormulaPlanCache.set(cacheKey, plan);\n\n if (tableFormulaPlanCache.size > TABLE_FORMULA_PLAN_CACHE_LIMIT) {\n const oldestKey = tableFormulaPlanCache.keys().next().value;\n if (oldestKey !== undefined) tableFormulaPlanCache.delete(oldestKey);\n }\n\n return plan;\n}\n\nfunction getTableRows(tableNode: ProseMirrorNode) {\n const rows: Array<{ cells: CellEntry[] }> = [];\n\n tableNode.forEach((rowNode, rowOffset) => {\n const cells: CellEntry[] = [];\n\n rowNode.forEach((cellNode, cellOffset) => {\n cells.push({\n node: cellNode,\n relativePos: rowOffset + 1 + cellOffset,\n });\n });\n\n rows.push({ cells });\n });\n\n return rows;\n}\n\nfunction safeFindCell(map: TableMap, relativePos: number) {\n try {\n return map.findCell(relativePos);\n } catch {\n return null;\n }\n}\n\nfunction buildTableCellLabelIndex(map: TableMap) {\n const labels = new Map<number, string>();\n\n for (let row = 0; row < map.height; row += 1) {\n const rowOffset = row * map.width;\n for (let column = 0; column < map.width; column += 1) {\n const relativePos = map.map[rowOffset + column];\n if (relativePos === undefined || labels.has(relativePos)) continue;\n labels.set(relativePos, `${indexToColumnName(column)}${row + 1}`);\n }\n }\n\n return labels;\n}\n\nfunction getTableCellsByLabel(tableNode: ProseMirrorNode) {\n const map = TableMap.get(tableNode);\n const cells = new Map<string, ProseMirrorNode>();\n\n for (const [relativePos, label] of buildTableCellLabelIndex(map)) {\n const cell = tableNode.nodeAt(relativePos);\n if (cell) cells.set(label, cell);\n }\n\n return { cells, map };\n}\n\nfunction getCellText(cellNode: ProseMirrorNode) {\n return cellNode.textBetween(0, cellNode.content.size, \"\\n\").trim();\n}\n\nfunction getSelectionTableCellNodeFromState(state: EditorState) {\n const { $from } = state.selection;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\") {\n return node;\n }\n }\n\n return null;\n}\n\nfunction getSelectionTableCellNode(editor: Editor) {\n return getSelectionTableCellNodeFromState(editor.state);\n}\n\nfunction getSelectionTableCellPos(editor: Editor) {\n const cellSelection = editor.state.selection as { $anchorCell?: { pos?: unknown } };\n const anchorCellPos = cellSelection.$anchorCell?.pos;\n if (typeof anchorCellPos === \"number\") {\n const node = editor.state.doc.nodeAt(anchorCellPos);\n if (node?.type.name === \"tableCell\" || node?.type.name === \"tableHeader\") {\n return anchorCellPos;\n }\n }\n\n const { $from } = editor.state.selection;\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\") {\n return $from.before(depth);\n }\n }\n\n return null;\n}\n\ntype TableCellSelectionAnchor = {\n column: number;\n row: number;\n tablePos: number;\n};\n\nfunction getSelectionTableCellAnchor(editor: Editor) {\n const cellPos = getSelectionTableCellPos(editor);\n if (cellPos == null) return null;\n\n const node = editor.state.doc.nodeAt(cellPos);\n if (!node || (node.type.name !== \"tableCell\" && node.type.name !== \"tableHeader\")) return null;\n\n const $cell = editor.state.doc.resolve(Math.min(cellPos + 1, editor.state.doc.content.size));\n for (let depth = $cell.depth; depth > 0; depth -= 1) {\n const tableNode = $cell.node(depth);\n if (tableNode.type.name !== \"table\") continue;\n\n const tableStart = $cell.start(depth);\n const rect = safeFindCell(TableMap.get(tableNode), cellPos - tableStart);\n if (!rect) return null;\n\n return {\n cellPos,\n column: rect.left,\n label: `${indexToColumnName(rect.left)}${rect.top + 1}`,\n node,\n row: rect.top,\n tablePos: tableStart - 1,\n };\n }\n\n return null;\n}\n\nfunction restoreSelectionAtTableCell(editor: Editor, anchor: TableCellSelectionAnchor) {\n const tableNode = editor.state.doc.nodeAt(anchor.tablePos);\n if (!tableNode || tableNode.type.name !== \"table\") return false;\n\n const map = TableMap.get(tableNode);\n if (anchor.row >= map.height || anchor.column >= map.width) return false;\n\n const relativeCellPos = map.positionAt(anchor.row, anchor.column, tableNode);\n const cellPos = anchor.tablePos + 1 + relativeCellPos;\n const cellNode = editor.state.doc.nodeAt(cellPos);\n if (!cellNode || (cellNode.type.name !== \"tableCell\" && cellNode.type.name !== \"tableHeader\")) return false;\n\n const selectionPos = Math.min(cellPos + 2, editor.state.doc.content.size);\n editor.view.dispatch(\n editor.state.tr\n .setSelection(TextSelection.near(editor.state.doc.resolve(selectionPos)))\n .setMeta(\"addToHistory\", false),\n );\n return true;\n}\n\nexport type SelectedTableFormulaCell = {\n cellPos: number;\n computedValue: string;\n formula: string;\n formulaState: \"computed\" | \"error\";\n label: string;\n node: ProseMirrorNode;\n column: number;\n row: number;\n tablePos: number;\n};\n\nexport function getSelectedTableFormulaCell(editor: Editor): SelectedTableFormulaCell | null {\n const selectedCell = getSelectionTableCellAnchor(editor);\n if (!selectedCell) return null;\n\n const formula = typeof selectedCell.node.attrs.formula === \"string\" ? selectedCell.node.attrs.formula.trim() : \"\";\n if (!formula) return null;\n\n const computedValue = typeof selectedCell.node.attrs.computedValue === \"string\" ? selectedCell.node.attrs.computedValue : \"\";\n return {\n ...selectedCell,\n computedValue,\n formula,\n formulaState: computedValue.startsWith(\"#\") ? \"error\" : \"computed\",\n };\n}\n\nfunction getSelectionTableInfoFromState(state: EditorState) {\n const { $from } = state.selection;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name === \"table\") {\n return {\n node,\n pos: $from.before(depth),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Returns the logical labels changed inside the selected table. A `null`\n * result means its structure changed, so callers must conservatively\n * recalculate every formula in that table.\n */\nexport function getChangedActiveTableCellLabels(oldState: EditorState, newState: EditorState) {\n const oldTable = getSelectionTableInfoFromState(oldState)?.node;\n const newTable = getSelectionTableInfoFromState(newState)?.node;\n if (!oldTable || !newTable) return null;\n if (oldTable === newTable) return new Set<string>();\n\n const oldIndex = getTableCellsByLabel(oldTable);\n const newIndex = getTableCellsByLabel(newTable);\n if (\n oldIndex.map.width !== newIndex.map.width\n || oldIndex.map.height !== newIndex.map.height\n || oldIndex.cells.size !== newIndex.cells.size\n ) {\n return null;\n }\n\n const changedLabels = new Set<string>();\n for (const [label, newCell] of newIndex.cells) {\n const oldCell = oldIndex.cells.get(label);\n if (!oldCell) return null;\n if (!oldCell.eq(newCell)) changedLabels.add(label);\n }\n\n return changedLabels;\n}\n\nfunction getSelectionTableInfo(editor: Editor) {\n return getSelectionTableInfoFromState(editor.state);\n}\n\nfunction getSelectionTableCellLabelFromState(state: EditorState) {\n const { $from } = state.selection;\n let cellDepth = -1;\n let tableDepth = -1;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (cellDepth < 0 && (node.type.name === \"tableCell\" || node.type.name === \"tableHeader\")) {\n cellDepth = depth;\n }\n if (node.type.name === \"table\") {\n tableDepth = depth;\n break;\n }\n }\n\n if (cellDepth < 0 || tableDepth < 0) return null;\n\n const tableNode = $from.node(tableDepth);\n const tableStart = $from.start(tableDepth);\n const relativeCellPos = $from.before(cellDepth) - tableStart;\n const rect = safeFindCell(TableMap.get(tableNode), relativeCellPos);\n if (!rect) return null;\n\n return `${indexToColumnName(rect.left)}${rect.top + 1}`;\n}\n\nfunction getSelectionTableCellBoundsFromState(state: EditorState) {\n const { $from } = state.selection;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name !== \"tableCell\" && node.type.name !== \"tableHeader\") continue;\n const from = $from.before(depth);\n return {\n from,\n to: from + node.nodeSize,\n };\n }\n\n return null;\n}\n\n/** Fast path for the overwhelmingly common single-cell text transaction. */\nexport function getSingleChangedActiveTableCellLabel(\n transactions: readonly Transaction[],\n oldState: EditorState,\n newState: EditorState,\n) {\n const changedTransactions = transactions.filter((transaction) => transaction.docChanged);\n if (changedTransactions.length !== 1 || changedTransactions[0].steps.length !== 1) return null;\n\n const oldLabel = getSelectionTableCellLabelFromState(oldState);\n const newLabel = getSelectionTableCellLabelFromState(newState);\n if (!oldLabel || oldLabel !== newLabel) return null;\n\n const bounds = getSelectionTableCellBoundsFromState(oldState);\n const step = changedTransactions[0].steps[0] as unknown as { from?: number; to?: number };\n if (!bounds || typeof step.from !== \"number\" || typeof step.to !== \"number\") return null;\n if (step.from < bounds.from + 1 || step.to > bounds.to - 1) return null;\n\n return oldLabel;\n}\n\nfunction getSelectionTableCellLabel(editor: Editor) {\n return getSelectionTableCellLabelFromState(editor.state);\n}\n\nexport function isEditingTableFormulaText(editor: Editor) {\n const cellNode = getSelectionTableCellNode(editor);\n return Boolean(cellNode && getCellText(cellNode).startsWith(\"=\"));\n}\n\nfunction isEditingTableFormulaTextInState(state: EditorState) {\n const cellNode = getSelectionTableCellNodeFromState(state);\n return Boolean(cellNode && getCellText(cellNode).startsWith(\"=\"));\n}\n\nfunction createCellDisplayContent(cellNode: ProseMirrorNode, displayValue: string) {\n const paragraphType = cellNode.type.schema.nodes.paragraph;\n\n if (!paragraphType || !displayValue) {\n return paragraphType ? [paragraphType.create()] : cellNode.content;\n }\n\n return [paragraphType.create(null, cellNode.type.schema.text(displayValue))];\n}\n\nfunction removeSelectedTableCellFormula(editor: Editor, clearContent: boolean) {\n const selectedCell = getSelectedTableFormulaCell(editor);\n if (!selectedCell) return false;\n\n const nextCell = selectedCell.node.type.create(\n {\n ...selectedCell.node.attrs,\n formula: null,\n computedValue: null,\n },\n clearContent ? createCellDisplayContent(selectedCell.node, \"\") : selectedCell.node.content,\n selectedCell.node.marks,\n );\n\n let transaction = editor.state.tr\n .replaceWith(selectedCell.cellPos, selectedCell.cellPos + selectedCell.node.nodeSize, nextCell)\n .setMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META, true);\n const selectionPos = Math.min(selectedCell.cellPos + 2, transaction.doc.content.size);\n transaction = transaction.setSelection(TextSelection.near(transaction.doc.resolve(selectionPos)));\n editor.view.dispatch(transaction);\n\n recalculateActiveTableFormulas(editor);\n restoreSelectionAtTableCell(editor, selectedCell);\n editor.view.focus();\n dispatchTableLayoutChange(editor);\n return true;\n}\n\nexport function normalizeFormulaInput(formula: string) {\n const trimmed = formula.trim();\n if (!trimmed) return \"\";\n return trimmed.startsWith(\"=\") ? trimmed : `=${trimmed}`;\n}\n\nexport function setSelectedTableCellFormula(editor: Editor, formula: string) {\n const normalized = normalizeFormulaInput(formula);\n const { state, view } = editor;\n const selectionAnchor = getSelectionTableCellAnchor(editor);\n\n if (!normalized) {\n return clearSelectedTableCellFormula(editor);\n }\n\n const appliedFormula = setCellAttr(\"formula\", normalized)(state, view.dispatch.bind(view));\n const clearedValue = setCellAttr(\"computedValue\", null)(editor.state, view.dispatch.bind(view));\n\n if (appliedFormula || clearedValue) {\n recalculateActiveTableFormulas(editor);\n if (selectionAnchor) restoreSelectionAtTableCell(editor, selectionAnchor);\n view.focus();\n dispatchTableLayoutChange(editor);\n return true;\n }\n\n return false;\n}\n\nexport function clearSelectedTableCellFormula(editor: Editor) {\n return removeSelectedTableCellFormula(editor, true);\n}\n\nexport function convertSelectedTableCellFormulaToValue(editor: Editor) {\n return removeSelectedTableCellFormula(editor, false);\n}\n\nexport function setSelectedTableCellNumberFormat(editor: Editor, numberFormat: string | null) {\n const value = numberFormat && numberFormat !== \"text\" ? numberFormat : null;\n const { state, view } = editor;\n const applied = setCellAttr(\"numberFormat\", value)(state, view.dispatch.bind(view));\n if (!applied) return false;\n\n recalculateSelectedTable(editor);\n view.focus();\n dispatchTableLayoutChange(editor);\n return true;\n}\n\nfunction getPromotedFormulaCell(cellNode: ProseMirrorNode) {\n const text = getCellText(cellNode);\n const existingFormula = typeof cellNode.attrs.formula === \"string\" ? cellNode.attrs.formula.trim() : \"\";\n const existingComputedValue = typeof cellNode.attrs.computedValue === \"string\" ? cellNode.attrs.computedValue.trim() : \"\";\n\n if (text.startsWith(\"=\")) {\n if (!normalizeTableFormula(text)) {\n if (!existingFormula && !existingComputedValue) return cellNode;\n\n return cellNode.type.create(\n {\n ...cellNode.attrs,\n formula: null,\n computedValue: null,\n },\n text === formatFormulaError(\"empty\") ? createCellDisplayContent(cellNode, \"\") : cellNode.content,\n cellNode.marks,\n );\n }\n\n if (isDraftTableFormula(text)) return cellNode;\n\n const formula = normalizeFormulaInput(text);\n if (cellNode.attrs.formula === formula) return cellNode;\n\n return cellNode.type.create(\n {\n ...cellNode.attrs,\n formula,\n computedValue: null,\n },\n cellNode.content,\n cellNode.marks,\n );\n }\n\n if (!existingFormula || normalizeTableFormula(existingFormula)) return cellNode;\n\n return cellNode.type.create(\n {\n ...cellNode.attrs,\n formula: null,\n computedValue: null,\n },\n text === formatFormulaError(\"empty\") ? createCellDisplayContent(cellNode, \"\") : cellNode.content,\n cellNode.marks,\n );\n}\n\nfunction recalculateTableCells(\n tableNode: ProseMirrorNode,\n options?: { changedLabels?: Iterable<string> | null },\n): RelativeTableCellReplacement[] {\n const map = TableMap.get(tableNode);\n const labelsByRelativePos = buildTableCellLabelIndex(map);\n const values = new Map<string, string | number>();\n const formulaEntries = new Map<string, {\n formula: string;\n node: ProseMirrorNode;\n relativePos: number;\n }>();\n const replacementsByRelativePos = new Map<number, RelativeTableCellReplacement>();\n\n for (const rowInfo of getTableRows(tableNode)) {\n for (const entry of rowInfo.cells) {\n const label = labelsByRelativePos.get(entry.relativePos);\n if (!label) continue;\n\n const node = getPromotedFormulaCell(entry.node);\n if (node !== entry.node) {\n replacementsByRelativePos.set(entry.relativePos, {\n node,\n previousNode: entry.node,\n relativePos: entry.relativePos,\n });\n }\n\n const computedValue = node.attrs.computedValue;\n values.set(label, typeof computedValue === \"string\" && computedValue.trim() ? computedValue : getCellText(node));\n\n const formula = typeof node.attrs.formula === \"string\" ? node.attrs.formula.trim() : \"\";\n if (!formula) continue;\n formulaEntries.set(label, {\n formula,\n node,\n relativePos: entry.relativePos,\n });\n }\n }\n\n const { circular, graph, order } = getTableFormulaPlan(\n Array.from(formulaEntries, ([label, entry]) => ({\n label,\n formula: entry.formula,\n })),\n );\n const affectedLabels = options?.changedLabels\n ? getAffectedTableFormulaLabels(graph, options.changedLabels)\n : null;\n const getCellValue = (label: string) => values.get(label.toUpperCase());\n\n for (const label of circular) {\n if (affectedLabels && !affectedLabels.has(label)) continue;\n values.set(label, formatFormulaError(\"circular-reference\"));\n }\n\n for (const label of order) {\n if (affectedLabels && !affectedLabels.has(label)) continue;\n const entry = formulaEntries.get(label);\n if (!entry) continue;\n const result = evaluateBasicTableFormula(entry.formula, getCellValue);\n const computedValue = result.error ? formatFormulaError(result.error) : String(result.value);\n values.set(label, computedValue);\n }\n\n for (const [label, entry] of formulaEntries) {\n if (affectedLabels && !affectedLabels.has(label)) continue;\n const computedValue = values.get(label);\n if (computedValue == null) continue;\n\n const currentNode = replacementsByRelativePos.get(entry.relativePos)?.node ?? entry.node;\n const normalizedComputedValue = String(computedValue);\n const displayValue = formatTableFormulaDisplayValue(normalizedComputedValue, currentNode.attrs.numberFormat);\n const contentMatchesComputedValue = getCellText(currentNode) === displayValue;\n if (currentNode.attrs.computedValue === normalizedComputedValue && contentMatchesComputedValue) continue;\n\n replacementsByRelativePos.set(entry.relativePos, {\n node: currentNode.type.create(\n {\n ...currentNode.attrs,\n computedValue: normalizedComputedValue,\n },\n createCellDisplayContent(currentNode, displayValue),\n currentNode.marks,\n ),\n previousNode: replacementsByRelativePos.get(entry.relativePos)?.previousNode ?? entry.node,\n relativePos: entry.relativePos,\n });\n }\n\n return Array.from(replacementsByRelativePos.values());\n}\n\nfunction resolveTableCellReplacements(\n tablePos: number,\n replacements: RelativeTableCellReplacement[],\n): TableCellReplacement[] {\n return replacements.map((replacement) => {\n const from = tablePos + 1 + replacement.relativePos;\n return {\n from,\n node: replacement.node,\n to: from + replacement.previousNode.nodeSize,\n };\n });\n}\n\nfunction applyTableCellReplacements(transaction: Transaction, replacements: TableCellReplacement[]) {\n for (const replacement of [...replacements].sort((left, right) => right.from - left.from)) {\n transaction = transaction.replaceWith(replacement.from, replacement.to, replacement.node);\n }\n\n return transaction;\n}\n\nfunction dispatchTableCellReplacements(editor: Editor, replacements: TableCellReplacement[]) {\n if (replacements.length === 0) return false;\n\n editor.view.dispatch(\n applyTableCellReplacements(editor.state.tr, replacements)\n .setMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META, true),\n );\n dispatchTableLayoutChange(editor);\n return true;\n}\n\nexport function createActiveTableFormulaRecalculationTransaction(\n state: EditorState,\n options?: { changedLabels?: Iterable<string> | null },\n) {\n if (isEditingTableFormulaTextInState(state)) return null;\n\n const tableInfo = getSelectionTableInfoFromState(state);\n if (!tableInfo) return null;\n\n const activeCellLabel = getSelectionTableCellLabelFromState(state);\n const replacements = resolveTableCellReplacements(\n tableInfo.pos,\n recalculateTableCells(tableInfo.node, {\n changedLabels: options && \"changedLabels\" in options\n ? options.changedLabels\n : activeCellLabel\n ? [activeCellLabel]\n : null,\n }),\n );\n if (replacements.length === 0) return null;\n\n return applyTableCellReplacements(state.tr, replacements)\n .setMeta(UEDITOR_TABLE_FORMULA_RECALCULATE_META, true);\n}\n\nexport function recalculateSelectedTable(editor: Editor) {\n const rect = selectedRect(editor.state);\n const tableNode = rect.table;\n\n return dispatchTableCellReplacements(\n editor,\n resolveTableCellReplacements(rect.tableStart - 1, recalculateTableCells(tableNode)),\n );\n}\n\nexport function recalculateActiveTableFormulas(editor: Editor) {\n const tableInfo = getSelectionTableInfo(editor);\n if (!tableInfo) {\n return recalculateAllTableFormulas(editor);\n }\n\n const activeCellLabel = getSelectionTableCellLabel(editor);\n return dispatchTableCellReplacements(\n editor,\n resolveTableCellReplacements(\n tableInfo.pos,\n recalculateTableCells(tableInfo.node, {\n changedLabels: activeCellLabel ? [activeCellLabel] : null,\n }),\n ),\n );\n}\n\nexport function recalculateAllTableFormulas(editor: Editor) {\n const replacements: TableCellReplacement[] = [];\n\n editor.state.doc.descendants((node, pos) => {\n if (node.type.name !== \"table\") return true;\n\n replacements.push(...resolveTableCellReplacements(pos, recalculateTableCells(node)));\n\n return false;\n });\n\n if (replacements.length === 0) return false;\n\n return dispatchTableCellReplacements(editor, replacements);\n}\n","\"use client\";\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { CellSelection, isInTable as isSelectionInTable, setCellAttr } from \"@tiptap/pm/tables\";\nimport { createPortal } from \"react-dom\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n Bold as BoldIcon,\n ChevronDown,\n Code as CodeIcon,\n Italic as ItalicIcon,\n Link as LinkIcon,\n Plus,\n RotateCcw,\n Subscript as SubscriptIcon,\n Superscript as SuperscriptIcon,\n TableCellsMerge,\n Trash2,\n Type,\n Underline as UnderlineIcon,\n Strikethrough as StrikethroughIcon,\n Edit2,\n Eraser,\n Unlink,\n ExternalLink,\n Grid,\n Sigma,\n ArrowDown,\n ArrowRight,\n WrapText,\n} from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { formControlGroupOutlineClass } from \"../../constants/form-control-size\";\nimport { ToolbarButton, useSharedEditorUiRenderState } from \"./toolbar\";\nimport { LinkInput } from \"./inputs\";\nimport { applyEditorLink } from \"./link-commands\";\nimport { DropdownMenu, DropdownMenuItem } from \"../DropdownMenu\";\nimport { CellBgColorIcon, CellBorderIcon, EditorColorPalette, HighlightColorIcon, TextColorIcon, useEditorColors } from \"./colors\";\nimport { applyImageLayout, applyImageWidthPreset, deleteSelectedImage, resetImageSize, type UEditorImageWidthPreset } from \"./image-commands\";\nimport { buildSlashCommandItems, buildSlashCommandMessages, SlashCommandList, type SlashCommandListRef } from \"./slash-command\";\nimport { mergeTableCellsPreservingColumnWidths } from \"./table-cell-commands\";\nimport { applyTableCellBorders, type TableBorderPosition } from \"./table-border-commands\";\nimport { clearSelectedTableCellFormula, recalculateSelectedTable, setSelectedTableCellFormula, setSelectedTableCellNumberFormat } from \"./table-formula-commands\";\nimport type { UEditorBubbleMenuPlacement, UEditorFontSizeOption, UEditorLineHeightOption } from \"./types\";\nimport { getDefaultFontSizes, getDefaultLineHeights, normalizeStyleValue } from \"./typography-options\";\nimport { sanitizeUEditorUrl } from \"./url-safety\";\nimport { subscribeSharedGlobalEvent } from \"./shared-global-listeners\";\nimport { resolveUEditorPortalContainer, useUEditorPortalContainerGetter } from \"./portal-context\";\nimport { TableVerticalAlignBottomIcon, TableVerticalAlignMiddleIcon, TableVerticalAlignTopIcon } from \"./table-vertical-align-icons\";\n\nconst FloatingSlashCommandMenu = ({ editor, onClose }: { editor: Editor; onClose: () => void }) => {\n const t = useSmartTranslations(\"UEditor\");\n const messages = useMemo(() => buildSlashCommandMessages(t), [t]);\n const items = useMemo(() => buildSlashCommandItems({ query: \"\", messages }), [messages]);\n const listRef = useRef<SlashCommandListRef>(null);\n const getPortalContainer = useUEditorPortalContainerGetter();\n const portalDocument = resolveUEditorPortalContainer(getPortalContainer)?.ownerDocument;\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n return;\n }\n\n const handled = listRef.current?.onKeyDown({ event }) ?? false;\n if (handled) {\n event.preventDefault();\n }\n };\n\n if (!portalDocument) return;\n return subscribeSharedGlobalEvent(portalDocument, \"keydown\", handleKeyDown as EventListener);\n }, [onClose, portalDocument]);\n\n return (\n <SlashCommandList\n ref={listRef}\n items={items}\n messages={messages}\n command={(item) => {\n item.command({ editor });\n onClose();\n }}\n />\n );\n};\n\nconst FloatingMenuContent = ({ editor }: { editor: Editor }) => {\n const t = useSmartTranslations(\"UEditor\");\n const [showCommands, setShowCommands] = useState(false);\n\n if (showCommands) {\n return <FloatingSlashCommandMenu editor={editor} onClose={() => setShowCommands(false)} />;\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => setShowCommands(true)}\n className=\"group flex items-center gap-1 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30\"\n >\n <Plus className=\"w-4 h-4 text-muted-foreground group-hover:text-foreground\" />\n <span className=\"text-sm text-muted-foreground group-hover:text-foreground\">{t(\"floatingMenu.addBlock\")}</span>\n </button>\n );\n};\n\nfunction applyTableCellBackground(editor: Editor, color: string, options: { focus?: boolean } = {}) {\n const shouldFocus = options.focus ?? true;\n const value = color || null;\n const { state, view } = editor;\n const applied = setCellAttr(\"backgroundColor\", value)(state, view.dispatch.bind(view));\n\n if (applied) {\n if (shouldFocus) view.focus();\n return;\n }\n\n const chain = editor.chain();\n if (shouldFocus) chain.focus();\n chain.setCellAttribute(\"backgroundColor\", value).run();\n}\n\nfunction applyTableCellAttribute(editor: Editor, name: string, value: string | null, options: { focus?: boolean } = {}) {\n const shouldFocus = options.focus ?? true;\n const { state, view } = editor;\n const applied = setCellAttr(name, value)(state, view.dispatch.bind(view));\n\n if (applied) {\n if (shouldFocus) view.focus();\n return;\n }\n\n const chain = editor.chain();\n if (shouldFocus) chain.focus();\n chain.setCellAttribute(name, value).run();\n}\n\ntype BorderStyleOption = \"solid\" | \"dashed\" | \"dotted\" | \"double\" | \"none\";\n\nfunction BorderStylePreviewIcon({ style }: { style: BorderStyleOption }) {\n const isNone = style === \"none\";\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-flex h-4 w-4 shrink-0 rounded-[2px]\",\n isNone ? \"border border-border/70 bg-muted/30\" : \"border text-current\",\n )}\n style={\n isNone\n ? undefined\n : {\n borderStyle: style,\n borderWidth: style === \"double\" ? 3 : 2,\n }\n }\n >\n {isNone && <span className=\"absolute left-1/2 top-0 h-full w-px -translate-x-1/2 rotate-45 bg-muted-foreground/70\" />}\n </span>\n );\n}\n\nfunction BorderPositionPreviewIcon({ position }: { position: TableBorderPosition }) {\n const showTop = position === \"all\" || position === \"outer\" || position === \"top\";\n const showRight = position === \"all\" || position === \"outer\" || position === \"right\";\n const showBottom = position === \"all\" || position === \"outer\" || position === \"bottom\";\n const showLeft = position === \"all\" || position === \"outer\" || position === \"left\";\n const showHorizontal = position === \"all\" || position === \"inner\" || position === \"horizontal\";\n const showVertical = position === \"all\" || position === \"inner\" || position === \"vertical\";\n\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 20 20\" className=\"h-5 w-5 fill-none stroke-current\">\n <path\n d=\"M2 2H18V18H2Z M2 10H18 M10 2V18\"\n className=\"text-foreground opacity-70\"\n stroke=\"currentColor\"\n strokeDasharray=\"2 1.5\"\n strokeWidth=\"1.25\"\n />\n {showTop && <path d=\"M2 2H18\" strokeWidth=\"2\" />}\n {showRight && <path d=\"M18 2V18\" strokeWidth=\"2\" />}\n {showBottom && <path d=\"M2 18H18\" strokeWidth=\"2\" />}\n {showLeft && <path d=\"M2 2V18\" strokeWidth=\"2\" />}\n {showHorizontal && <path d=\"M2 10H18\" strokeWidth=\"2\" />}\n {showVertical && <path d=\"M10 2V18\" strokeWidth=\"2\" />}\n </svg>\n );\n}\n\ntype BubbleMenuContext = \"none\" | \"text\" | \"table-cell\" | \"image\" | \"link\";\n\nexport function getBubbleMenuPosition({\n start,\n end,\n menuSize,\n viewport,\n preferredPlacement = \"auto\",\n offset = 16,\n padding = 8,\n}: {\n start: { top: number; left: number; bottom: number };\n end: { top: number; left: number; bottom: number };\n menuSize: { width: number; height: number };\n viewport: { width: number; height: number };\n preferredPlacement?: UEditorBubbleMenuPlacement;\n offset?: number;\n padding?: number;\n}) {\n const selectionTop = Math.min(start.top, end.top);\n const selectionBottom = Math.max(start.bottom, end.bottom);\n const spaceAbove = selectionTop - offset - padding;\n const spaceBelow = viewport.height - padding - selectionBottom - offset;\n const placement: \"top\" | \"bottom\" = preferredPlacement === \"auto\"\n ? menuSize.height <= spaceAbove || spaceAbove >= spaceBelow ? \"top\" : \"bottom\"\n : preferredPlacement;\n\n const halfWidth = menuSize.width / 2;\n const minLeft = padding + halfWidth;\n const maxLeft = viewport.width - padding - halfWidth;\n const selectionCenter = (start.left + end.left) / 2;\n const left = maxLeft >= minLeft\n ? Math.min(maxLeft, Math.max(minLeft, selectionCenter))\n : viewport.width / 2;\n\n const requestedTop = placement === \"top\" ? selectionTop - offset : selectionBottom + offset;\n const minTop = placement === \"top\" ? padding + menuSize.height : padding;\n const maxTop = placement === \"top\" ? viewport.height - padding : viewport.height - padding - menuSize.height;\n const top = maxTop >= minTop\n ? Math.min(maxTop, Math.max(minTop, requestedTop))\n : Math.max(padding, requestedTop);\n\n return { top, left, placement };\n}\n\nfunction getBubbleMenuContext(editor: Editor): BubbleMenuContext {\n const { selection } = editor.state;\n\n if (editor.isActive(\"image\")) return \"image\";\n if (selection instanceof CellSelection) return \"table-cell\";\n if (editor.isActive(\"link\")) return \"link\";\n if (!selection.empty) return \"text\";\n\n return \"none\";\n}\n\nconst BubbleMenuContent = ({\n editor,\n context,\n onKeepOpenChange,\n onLinkInputOpenChange,\n onRequestClose,\n fontSizes,\n lineHeights,\n initialShowLinkInput = false,\n}: {\n editor: Editor;\n context: BubbleMenuContext;\n onKeepOpenChange?: (keepOpen: boolean) => void;\n onLinkInputOpenChange?: (open: boolean) => void;\n onRequestClose?: () => void;\n fontSizes?: UEditorFontSizeOption[];\n lineHeights?: UEditorLineHeightOption[];\n initialShowLinkInput?: boolean;\n}) => {\n const t = useSmartTranslations(\"UEditor\");\n useSharedEditorUiRenderState(editor);\n const { textColors, highlightColors } = useEditorColors();\n const [showLinkInput, setShowLinkInput] = useState(initialShowLinkInput);\n const [activeColorPalette, setActiveColorPalette] = useState<\"text\" | \"highlight\" | \"cell-bg\" | \"cell-border\" | \"cell-border-color\" | null>(null);\n\n useEffect(() => {\n setShowLinkInput(initialShowLinkInput);\n }, [initialShowLinkInput]);\n\n const [showTypographyPanel, setShowTypographyPanel] = useState(false);\n const [showFormulaPanel, setShowFormulaPanel] = useState(false);\n const [formulaDraft, setFormulaDraft] = useState(\"\");\n const [showFontSizeOptions, setShowFontSizeOptions] = useState(false);\n const [fontSizeDraft, setFontSizeDraft] = useState(\"\");\n const isImageSelected = context === \"image\";\n const isTableCellSelection = context === \"table-cell\";\n const imageAttrs = editor.getAttributes(\"image\") as { imageLayout?: string; imageWidthPreset?: UEditorImageWidthPreset | null };\n const imageLayout = imageAttrs.imageLayout === \"left\" || imageAttrs.imageLayout === \"right\" ? imageAttrs.imageLayout : \"block\";\n const imageWidthPreset =\n imageAttrs.imageWidthPreset === \"sm\" || imageAttrs.imageWidthPreset === \"md\" || imageAttrs.imageWidthPreset === \"lg\"\n ? imageAttrs.imageWidthPreset\n : null;\n const textStyleAttrs = editor.getAttributes(\"textStyle\") as { color?: string; fontSize?: string; lineHeight?: string };\n const currentTextColor = normalizeStyleValue(textStyleAttrs.color) || \"inherit\";\n const currentHighlightColor = normalizeStyleValue(editor.getAttributes(\"highlight\").color) || \"\";\n const currentCellBgColor =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").backgroundColor || editor.getAttributes(\"tableHeader\").backgroundColor) || \"\";\n const currentCellFormula =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").formula || editor.getAttributes(\"tableHeader\").formula) || \"\";\n const currentCellNumberFormat =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").numberFormat || editor.getAttributes(\"tableHeader\").numberFormat) || \"text\";\n const currentCellBorderStyle = editor.getAttributes(\"tableCell\").borderStyle || editor.getAttributes(\"tableHeader\").borderStyle || \"solid\";\n const currentCellBorderWidth = editor.getAttributes(\"tableCell\").borderWidth || editor.getAttributes(\"tableHeader\").borderWidth || \"1px\";\n const currentCellBorderColor =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").borderColor || editor.getAttributes(\"tableHeader\").borderColor) || \"#000000\";\n const [borderStyleDraft, setBorderStyleDraft] = useState<BorderStyleOption>(\n ([\"solid\", \"dashed\", \"dotted\", \"double\"] as string[]).includes(currentCellBorderStyle)\n ? (currentCellBorderStyle as BorderStyleOption)\n : \"solid\",\n );\n const [borderWidthDraft, setBorderWidthDraft] = useState(currentCellBorderWidth);\n const [borderColorDraft, setBorderColorDraft] = useState(currentCellBorderColor);\n const [borderEditMode, setBorderEditMode] = useState<\"draw\" | \"erase\">(\"draw\");\n const [activeBorderPosition, setActiveBorderPosition] = useState<TableBorderPosition>(\"all\");\n const currentCellVerticalAlign =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").verticalAlign || editor.getAttributes(\"tableHeader\").verticalAlign) || \"\";\n const currentCellTextDirection =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").textDirection || editor.getAttributes(\"tableHeader\").textDirection) || \"horizontal\";\n const currentCellTextWrap =\n normalizeStyleValue(editor.getAttributes(\"tableCell\").textWrap || editor.getAttributes(\"tableHeader\").textWrap) || \"wrap\";\n const isInTable = isSelectionInTable(editor.state);\n const canMergeCells = isInTable && editor.can().mergeCells();\n const canSplitCell = isInTable && editor.can().splitCell();\n const currentFontSize = normalizeStyleValue(textStyleAttrs.fontSize);\n const currentLineHeight = normalizeStyleValue(textStyleAttrs.lineHeight);\n const quickFontSizes = useMemo(\n () => (fontSizes ?? getDefaultFontSizes()).filter((option) => [\"14px\", \"16px\", \"24px\"].includes(option.value)),\n [fontSizes],\n );\n const quickLineHeights = useMemo(\n () => (lineHeights ?? getDefaultLineHeights()).filter((option) => [\"1.2\", \"1.5\", \"1.75\"].includes(option.value)),\n [lineHeights],\n );\n const borderColors = useMemo(\n () => [\n highlightColors[0] ?? { name: t(\"colors.default\"), color: \"\" },\n { name: \"Black\", color: \"#000000\" },\n { name: \"White\", color: \"#ffffff\" },\n ...highlightColors.slice(1),\n ],\n [highlightColors, t],\n );\n\n useEffect(() => {\n setFontSizeDraft(currentFontSize.replace(/px$/i, \"\"));\n }, [currentFontSize]);\n\n useEffect(() => {\n setFormulaDraft(currentCellFormula);\n }, [currentCellFormula]);\n\n const applyFontSizeDraft = () => {\n const normalized = fontSizeDraft.trim();\n if (!normalized) {\n editor.chain().focus().unsetFontSize().run();\n return;\n }\n\n const parsed = Number.parseFloat(normalized);\n if (!Number.isFinite(parsed) || parsed <= 0) return;\n\n const clamped = Math.min(96, Math.max(8, parsed));\n editor.chain().focus().setFontSize(`${clamped}px`).run();\n setFontSizeDraft(String(clamped));\n };\n\n useEffect(() => {\n const shouldKeepOpen = showLinkInput || Boolean(activeColorPalette) || showFormulaPanel || showTypographyPanel;\n onKeepOpenChange?.(shouldKeepOpen);\n onLinkInputOpenChange?.(showLinkInput);\n }, [activeColorPalette, onKeepOpenChange, onLinkInputOpenChange, showFormulaPanel, showLinkInput, showTypographyPanel]);\n\n const closeTransientPanels = useCallback(() => {\n setActiveColorPalette(null);\n setShowLinkInput(false);\n onKeepOpenChange?.(false);\n onLinkInputOpenChange?.(false);\n onRequestClose?.();\n }, [onKeepOpenChange, onLinkInputOpenChange, onRequestClose]);\n\n const selectTableCellBorderColor = useCallback((color: string) => {\n const value = color || \"currentColor\";\n setBorderColorDraft(value);\n setBorderEditMode(\"draw\");\n setActiveBorderPosition(\"all\");\n applyTableCellBorders(editor, \"all\", {\n color: value,\n style: borderStyleDraft,\n width: borderWidthDraft,\n }, { focus: false });\n setActiveColorPalette(\"cell-border\");\n onKeepOpenChange?.(true);\n }, [borderStyleDraft, borderWidthDraft, editor, onKeepOpenChange]);\n\n const applyTableCellBorderPosition = useCallback((position: TableBorderPosition) => {\n setActiveBorderPosition(position);\n applyTableCellBorders(editor, position, {\n color: borderColorDraft,\n style: borderEditMode === \"erase\" ? \"none\" : borderStyleDraft,\n width: borderWidthDraft,\n }, { focus: false });\n onKeepOpenChange?.(true);\n }, [borderColorDraft, borderEditMode, borderStyleDraft, borderWidthDraft, editor, onKeepOpenChange]);\n\n const applyTableCellBorderStyle = useCallback((style: BorderStyleOption) => {\n setBorderStyleDraft(style);\n setBorderEditMode(\"draw\");\n setActiveBorderPosition(\"all\");\n applyTableCellBorders(editor, \"all\", {\n color: borderColorDraft,\n style,\n width: borderWidthDraft,\n }, { focus: false });\n onKeepOpenChange?.(true);\n }, [borderColorDraft, borderWidthDraft, editor, onKeepOpenChange]);\n\n const applyTableCellBorderWidth = useCallback((width: string) => {\n setBorderWidthDraft(width);\n setBorderEditMode(\"draw\");\n setActiveBorderPosition(\"all\");\n applyTableCellBorders(editor, \"all\", {\n color: borderColorDraft,\n style: borderStyleDraft,\n width,\n }, { focus: false });\n onKeepOpenChange?.(true);\n }, [borderColorDraft, borderStyleDraft, editor, onKeepOpenChange]);\n\n const clearTableCellBorders = useCallback(() => {\n setActiveBorderPosition(\"all\");\n setBorderEditMode(\"erase\");\n applyTableCellBorders(editor, \"all\", {\n color: borderColorDraft,\n style: \"none\",\n width: borderWidthDraft,\n }, { focus: false });\n onKeepOpenChange?.(true);\n }, [borderColorDraft, borderWidthDraft, editor, onKeepOpenChange]);\n\n const closeColorPalette = useCallback(() => {\n setActiveColorPalette(null);\n onKeepOpenChange?.(false);\n }, [onKeepOpenChange]);\n\n const applyInlineColor = useCallback((color: string, focus: boolean) => {\n if (activeColorPalette === \"text\") {\n const chain = editor.chain();\n if (focus) chain.focus();\n if (color === \"inherit\") {\n chain.unsetColor().run();\n } else {\n chain.setColor(color).run();\n }\n } else if (activeColorPalette === \"highlight\") {\n const chain = editor.chain();\n if (focus) chain.focus();\n if (color === \"\") {\n chain.unsetHighlight().run();\n } else {\n chain.toggleHighlight({ color }).run();\n }\n } else {\n applyTableCellBackground(editor, color, { focus });\n }\n }, [activeColorPalette, editor]);\n\n const applyInlineColorAndClose = useCallback((color: string) => {\n applyInlineColor(color, true);\n closeColorPalette();\n }, [applyInlineColor, closeColorPalette]);\n\n const applyCustomColor = useCallback((color: string) => {\n applyInlineColor(color, false);\n }, [applyInlineColor]);\n\n useEffect(() => {\n if (!showLinkInput) return;\n\n // If user opened the link input but then clicked somewhere else in the editor,\n // close the input and resume normal bubble behavior.\n const close = () => setShowLinkInput(false);\n editor.on(\"selectionUpdate\", close);\n editor.on(\"blur\", close);\n\n return () => {\n editor.off(\"selectionUpdate\", close);\n editor.off(\"blur\", close);\n };\n }, [editor, showLinkInput]);\n\n if (showLinkInput) {\n return (\n <LinkInput\n initialUrl={editor.getAttributes(\"link\").href || \"\"}\n onSubmit={(url) => {\n applyEditorLink(editor, url);\n setShowLinkInput(false);\n // Move focus back to editor so the bubble can resume normal tracking.\n requestAnimationFrame(() => editor.commands.focus());\n }}\n onCancel={() => {\n setShowLinkInput(false);\n requestAnimationFrame(() => editor.commands.focus());\n }}\n />\n );\n }\n if (activeColorPalette) {\n const isTextPalette = activeColorPalette === \"text\";\n const isHighlightPalette = activeColorPalette === \"highlight\";\n\n if (activeColorPalette === \"cell-border\") {\n return (\n <div className=\"flex w-72 flex-col gap-2 p-2 text-sm\" data-ueditor-keep-open>\n <div className=\"font-semibold text-xs text-muted-foreground uppercase tracking-wider mb-1\">\n {t(\"tableMenu.cellBorder\") || \"Cell Borders\"}\n </div>\n\n <div className=\"flex gap-2\">\n <div className=\"min-w-0 flex-1\">\n <label className=\"mb-1 block text-xs text-muted-foreground\">{t(\"tableMenu.borderPosition\") || \"Border placement\"}</label>\n <div className=\"grid grid-cols-5 gap-1\" role=\"group\" aria-label={t(\"tableMenu.borderPosition\") || \"Border placement\"}>\n {([\n [\"all\", \"borderAll\"],\n [\"outer\", \"borderOuter\"],\n [\"inner\", \"borderInner\"],\n [\"horizontal\", \"borderHorizontal\"],\n [\"vertical\", \"borderVertical\"],\n [\"top\", \"borderTop\"],\n [\"right\", \"borderRight\"],\n [\"bottom\", \"borderBottom\"],\n [\"left\", \"borderLeft\"],\n ] as Array<[TableBorderPosition, string]>).map(([position, labelKey]) => {\n const label = t(`tableMenu.${labelKey}`) || position;\n return (\n <button\n key={position}\n type=\"button\"\n aria-label={label}\n title={label}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => applyTableCellBorderPosition(position)}\n className={cn(\n \"inline-flex h-8 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted hover:text-primary\",\n activeBorderPosition === position ? \"bg-primary/10 text-primary\" : \"bg-muted/40\",\n )}\n >\n <BorderPositionPreviewIcon position={position} />\n </button>\n );\n })}\n <button\n type=\"button\"\n aria-label={t(\"tableMenu.clearBorder\") || \"Clear borders\"}\n title={t(\"tableMenu.clearBorder\") || \"Clear borders\"}\n onMouseDown={(event) => event.preventDefault()}\n onClick={clearTableCellBorders}\n className=\"inline-flex h-8 items-center justify-center rounded-md bg-muted/40 text-destructive transition-colors hover:bg-destructive/10\"\n >\n <BorderStylePreviewIcon style=\"none\" />\n </button>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1 border-l border-border pl-2 pt-5\" role=\"group\" aria-label={t(\"tableMenu.borderMode\") || \"Border mode\"}>\n <button\n type=\"button\"\n aria-label={t(\"tableMenu.borderDraw\") || \"Draw borders\"}\n title={t(\"tableMenu.borderDraw\") || \"Draw borders\"}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setBorderEditMode(\"draw\")}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md transition-colors hover:bg-muted\",\n borderEditMode === \"draw\" ? \"bg-primary/10 text-primary\" : \"text-muted-foreground\",\n )}\n >\n <Edit2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label={t(\"tableMenu.borderErase\") || \"Hide borders\"}\n title={t(\"tableMenu.borderErase\") || \"Hide borders\"}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setBorderEditMode(\"erase\")}\n className={cn(\n \"inline-flex h-8 w-8 items-center justify-center rounded-md transition-colors hover:bg-muted\",\n borderEditMode === \"erase\" ? \"bg-destructive/10 text-destructive\" : \"text-muted-foreground\",\n )}\n >\n <Eraser className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n \n {/* Border Style Selector */}\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs text-muted-foreground\">{t(\"tableMenu.borderStyle\") || \"Border Style\"}</label>\n <div className=\"grid grid-cols-4 gap-1.5\" role=\"group\" aria-label={t(\"tableMenu.borderStyle\") || \"Border Style\"}>\n {([\n [\"solid\", \"Solid\"],\n [\"dashed\", \"Dashed\"],\n [\"dotted\", \"Dotted\"],\n [\"double\", \"Double\"],\n ] as Array<[BorderStyleOption, string]>).map(([style, label]) => (\n <button\n key={style}\n type=\"button\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => applyTableCellBorderStyle(style)}\n className={cn(\n \"inline-flex h-8 min-w-0 items-center justify-center gap-1.5 rounded-md px-2.5 text-xs font-medium transition-colors hover:bg-muted\",\n borderStyleDraft === style ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n <BorderStylePreviewIcon style={style} />\n <span>{label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Border Width Selector */}\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs text-muted-foreground\">{t(\"tableMenu.borderWidth\") || \"Border Width\"}</label>\n <div className=\"grid grid-cols-4 gap-1\" role=\"group\" aria-label={t(\"tableMenu.borderWidth\") || \"Border Width\"}>\n {[\"1px\", \"2px\", \"3px\", \"4px\"].map((width) => (\n <button\n key={width}\n type=\"button\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => applyTableCellBorderWidth(width)}\n className={cn(\n \"h-8 rounded-md px-2 text-xs font-medium transition-colors hover:bg-muted\",\n borderWidthDraft === width ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n {width}\n </button>\n ))}\n </div>\n </div>\n\n {/* Border Color Trigger */}\n <button\n type=\"button\"\n onClick={() => setActiveColorPalette(\"cell-border-color\")}\n className=\"flex items-center justify-between w-full h-8 px-2 rounded-md border border-input hover:bg-accent text-xs\"\n >\n <span>{t(\"tableMenu.borderColor\") || \"Border Color\"}</span>\n <span\n className=\"w-4 h-4 rounded-full border border-border\"\n style={{\n backgroundColor: borderColorDraft,\n }}\n />\n </button>\n\n </div>\n );\n }\n\n if (activeColorPalette === \"cell-border-color\") {\n return (\n <div className=\"w-56\" data-ueditor-keep-open>\n <EditorColorPalette\n colors={borderColors}\n currentColor={borderColorDraft}\n onSelect={selectTableCellBorderColor}\n label={t(\"tableMenu.borderColor\") || \"Border Color\"}\n />\n </div>\n );\n }\n\n return (\n <div className=\"w-56\" data-ueditor-keep-open>\n <EditorColorPalette\n colors={isTextPalette ? textColors : highlightColors}\n currentColor={isTextPalette ? currentTextColor : isHighlightPalette ? currentHighlightColor : currentCellBgColor}\n onSelect={applyInlineColorAndClose}\n onCustomColorSelect={applyCustomColor}\n label={\n isTextPalette ? t(\"colors.textColor\") : isHighlightPalette ? t(\"colors.highlight\") : t(\"tableMenu.cellBackground\") || \"Cell background\"\n }\n />\n </div>\n );\n }\n\n if (isImageSelected) {\n return (\n <div className=\"flex items-center gap-0.5 p-1\">\n <ToolbarButton onClick={() => applyImageLayout(editor, \"block\")} active={imageLayout === \"block\"} title={t(\"toolbar.imageLayoutBlock\")}>\n <AlignCenter className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => applyImageLayout(editor, \"left\")} active={imageLayout === \"left\"} title={t(\"toolbar.imageLayoutLeft\")}>\n <AlignLeft className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => applyImageLayout(editor, \"right\")} active={imageLayout === \"right\"} title={t(\"toolbar.imageLayoutRight\")}>\n <AlignRight className=\"w-4 h-4\" />\n </ToolbarButton>\n\n <div className=\"w-px h-6 bg-border/50 mx-1\" />\n\n <ToolbarButton onClick={() => applyImageWidthPreset(editor, \"sm\")} active={imageWidthPreset === \"sm\"} title={t(\"toolbar.imageWidthSm\")}>\n <span className=\"text-[10px] font-semibold\">S</span>\n </ToolbarButton>\n <ToolbarButton onClick={() => applyImageWidthPreset(editor, \"md\")} active={imageWidthPreset === \"md\"} title={t(\"toolbar.imageWidthMd\")}>\n <span className=\"text-[10px] font-semibold\">M</span>\n </ToolbarButton>\n <ToolbarButton onClick={() => applyImageWidthPreset(editor, \"lg\")} active={imageWidthPreset === \"lg\"} title={t(\"toolbar.imageWidthLg\")}>\n <span className=\"text-[10px] font-semibold\">L</span>\n </ToolbarButton>\n\n <div className=\"w-px h-6 bg-border/50 mx-1\" />\n\n <ToolbarButton onClick={() => resetImageSize(editor)} title={t(\"toolbar.imageResetSize\")}>\n <RotateCcw className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => deleteSelectedImage(editor)}\n title={t(\"toolbar.imageDelete\")}\n className=\"text-destructive hover:text-destructive\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </ToolbarButton>\n </div>\n );\n }\n\n if (showFormulaPanel && isInTable) {\n return (\n <div className=\"w-72 p-2\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"px-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {t(\"tableMenu.formula\") || \"Formula\"}\n </span>\n <button\n type=\"button\"\n onClick={() => {\n setShowFormulaPanel(false);\n onKeepOpenChange?.(false);\n }}\n className=\"rounded-md px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {t(\"colors.done\")}\n </button>\n </div>\n\n <div className={cn(\"flex h-9 items-center overflow-hidden rounded-md bg-muted/40\", formControlGroupOutlineClass)}>\n <input\n value={formulaDraft}\n onChange={(event) => setFormulaDraft(event.target.value)}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") {\n event.preventDefault();\n setSelectedTableCellFormula(editor, formulaDraft);\n setShowFormulaPanel(false);\n onKeepOpenChange?.(false);\n }\n }}\n aria-label={t(\"tableMenu.formula\") || \"Formula\"}\n placeholder=\"=SUM(A1:A3)\"\n className=\"h-full min-w-0 flex-1 bg-transparent px-2 text-sm font-medium text-foreground outline-none\"\n />\n </div>\n\n <div className=\"mt-2\">\n <div className=\"mb-1 px-1 text-[11px] font-medium text-muted-foreground\">\n {t(\"tableMenu.numberFormat\") || \"Number format\"}\n </div>\n <div className=\"grid grid-cols-5 gap-1\">\n {[\n [\"text\", \"Text\"],\n [\"number\", \"123\"],\n [\"currency\", \"$\"],\n [\"percent\", \"%\"],\n [\"date\", \"Date\"],\n ].map(([format, label]) => (\n <button\n key={format}\n type=\"button\"\n onClick={() => setSelectedTableCellNumberFormat(editor, format)}\n className={cn(\n \"h-8 rounded-md text-[11px] font-semibold transition-colors hover:bg-muted\",\n currentCellNumberFormat === format || (format === \"text\" && !currentCellNumberFormat)\n ? \"bg-primary/10 text-primary\"\n : \"bg-muted/40 text-foreground\",\n )}\n >\n {format === \"text\" ? t(\"tableMenu.formatText\") || label : format === \"date\" ? t(\"tableMenu.formatDate\") || label : label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"mt-2 grid grid-cols-3 gap-1\">\n <button\n type=\"button\"\n onClick={() => {\n setSelectedTableCellFormula(editor, formulaDraft);\n setShowFormulaPanel(false);\n onKeepOpenChange?.(false);\n }}\n className=\"h-8 rounded-md bg-primary/10 text-xs font-semibold text-primary transition-colors hover:bg-primary/15\"\n >\n {t(\"tableMenu.apply\") || \"Apply\"}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n clearSelectedTableCellFormula(editor);\n setFormulaDraft(\"\");\n }}\n className=\"h-8 rounded-md bg-muted/40 text-xs font-semibold text-foreground transition-colors hover:bg-muted\"\n >\n {t(\"tableMenu.clear\") || \"Clear\"}\n </button>\n <button\n type=\"button\"\n onClick={() => recalculateSelectedTable(editor)}\n className=\"h-8 rounded-md bg-muted/40 text-xs font-semibold text-foreground transition-colors hover:bg-muted\"\n >\n {t(\"tableMenu.recalculate\") || \"Recalc\"}\n </button>\n </div>\n </div>\n );\n }\n\n if (showTypographyPanel) {\n return (\n <div className=\"w-72 p-2\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"px-1 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">{t(\"toolbar.textStyle\")}</span>\n <button\n type=\"button\"\n onClick={() => setShowTypographyPanel(false)}\n className=\"rounded-md px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n {t(\"colors.done\")}\n </button>\n </div>\n\n <div className=\"space-y-2\">\n <div>\n <div className=\"mb-1 px-1 text-[11px] font-medium text-muted-foreground\">{t(\"toolbar.fontSize\")}</div>\n <div className={cn(\"flex h-9 items-center overflow-hidden rounded-md bg-muted/40\", formControlGroupOutlineClass)}>\n <input\n type=\"number\"\n min={8}\n max={96}\n step={1}\n value={fontSizeDraft}\n onChange={(event) => setFontSizeDraft(event.target.value)}\n onBlur={applyFontSizeDraft}\n onMouseDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") {\n event.preventDefault();\n applyFontSizeDraft();\n }\n }}\n aria-label={t(\"toolbar.fontSize\")}\n placeholder=\"A\"\n className=\"h-full min-w-0 flex-1 bg-transparent px-2 text-center text-sm font-semibold text-foreground outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n />\n <span className=\"border-l border-border/50 px-2 text-[11px] text-muted-foreground\">px</span>\n <button\n type=\"button\"\n aria-label={t(\"toolbar.fontSize\")}\n onClick={() => setShowFontSizeOptions((open) => !open)}\n className={cn(\n \"flex h-full w-9 items-center justify-center border-l border-border/50 transition-colors hover:bg-muted\",\n showFontSizeOptions && \"bg-primary/10 text-primary\",\n )}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </button>\n </div>\n {showFontSizeOptions && (\n <div className=\"mt-1 grid grid-cols-4 gap-1\">\n <button\n type=\"button\"\n onClick={() => {\n editor.chain().focus().unsetFontSize().run();\n setShowFontSizeOptions(false);\n }}\n className={cn(\n \"h-8 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n !currentFontSize ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n A\n </button>\n {quickFontSizes.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => {\n editor.chain().focus().setFontSize(option.value).run();\n setShowFontSizeOptions(false);\n }}\n className={cn(\n \"h-8 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n normalizeStyleValue(option.value) === currentFontSize ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n\n <div>\n <div className=\"mb-1 px-1 text-[11px] font-medium text-muted-foreground\">{t(\"toolbar.lineHeight\")}</div>\n <div className=\"grid grid-cols-4 gap-1\">\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().unsetLineHeight().run()}\n className={cn(\n \"h-8 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n !currentLineHeight ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n LH\n </button>\n {quickLineHeights.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => editor.chain().focus().setLineHeight(option.value).run()}\n className={cn(\n \"h-8 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n normalizeStyleValue(option.value) === currentLineHeight ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-1 border-t border-border/40 pt-2\">\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n className={cn(\n \"flex h-8 items-center justify-center gap-2 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n editor.isActive(\"subscript\") ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n <SubscriptIcon className=\"h-4 w-4\" />\n {t(\"toolbar.subscript\")}\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n className={cn(\n \"flex h-8 items-center justify-center gap-2 rounded-md text-xs font-semibold transition-colors hover:bg-muted\",\n editor.isActive(\"superscript\") ? \"bg-primary/10 text-primary\" : \"bg-muted/40 text-foreground\",\n )}\n >\n <SuperscriptIcon className=\"h-4 w-4\" />\n {t(\"toolbar.superscript\")}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n const VerticalAlignActiveIcon =\n currentCellVerticalAlign === \"middle\"\n ? TableVerticalAlignMiddleIcon\n : currentCellVerticalAlign === \"bottom\"\n ? TableVerticalAlignBottomIcon\n : TableVerticalAlignTopIcon;\n\n if (isTableCellSelection) {\n return (\n <div className=\"flex items-center gap-0.5 p-1\" data-ueditor-cell-inspector=\"\">\n <ToolbarButton\n onMouseDown={() => onKeepOpenChange?.(true)}\n onClick={() => setActiveColorPalette(\"cell-bg\")}\n active={Boolean(currentCellBgColor)}\n title={t(\"tableMenu.cellBackground\") || \"Cell background\"}\n >\n <CellBgColorIcon color={currentCellBgColor} />\n </ToolbarButton>\n <ToolbarButton\n onMouseDown={() => onKeepOpenChange?.(true)}\n onClick={() => setActiveColorPalette(\"cell-border\")}\n active={Boolean(\n editor.getAttributes(\"tableCell\").borderColor ||\n editor.getAttributes(\"tableHeader\").borderColor ||\n editor.getAttributes(\"tableCell\").borderStyle ||\n editor.getAttributes(\"tableHeader\").borderStyle ||\n editor.getAttributes(\"tableCell\").borderWidth ||\n editor.getAttributes(\"tableHeader\").borderWidth\n )}\n title={t(\"tableMenu.cellBorder\") || \"Cell border\"}\n >\n <CellBorderIcon\n color={\n editor.getAttributes(\"tableCell\").borderColor ||\n editor.getAttributes(\"tableHeader\").borderColor\n }\n />\n </ToolbarButton>\n <ToolbarButton\n onMouseDown={() => onKeepOpenChange?.(true)}\n onClick={() => {\n setFormulaDraft(currentCellFormula);\n setShowFormulaPanel(true);\n }}\n active={Boolean(currentCellFormula)}\n title={t(\"tableMenu.formula\") || \"Formula\"}\n >\n <Sigma className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n if (canSplitCell) {\n editor.chain().focus().splitCell().run();\n return;\n }\n mergeTableCellsPreservingColumnWidths(editor);\n }}\n active={canSplitCell}\n disabled={!canMergeCells && !canSplitCell}\n title={canSplitCell ? t(\"tableMenu.splitCell\") || \"Split cell\" : t(\"tableMenu.mergeCells\") || \"Merge cells\"}\n >\n <TableCellsMerge className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => applyTableCellAttribute(\n editor,\n \"textWrap\",\n currentCellTextWrap === \"nowrap\" ? \"wrap\" : \"nowrap\",\n { focus: false },\n )}\n active={currentCellTextWrap !== \"nowrap\"}\n title={currentCellTextWrap === \"nowrap\" ? t(\"tableMenu.wrapText\") : t(\"tableMenu.noWrapText\")}\n >\n <WrapText className=\"h-4 w-4\" />\n </ToolbarButton>\n <DropdownMenu\n onOpenChange={onKeepOpenChange}\n trigger={\n <ToolbarButton\n onMouseDown={() => onKeepOpenChange?.(true)}\n onClick={() => {}}\n title={t(\"tableMenu.alignVertical\") || \"Vertical alignment\"}\n >\n <VerticalAlignActiveIcon className=\"w-4 h-4\" />\n <ChevronDown className=\"w-3 h-3\" />\n </ToolbarButton>\n }\n >\n <DropdownMenuItem\n icon={TableVerticalAlignTopIcon}\n label={t(\"tableMenu.alignVerticalTop\") || \"Align top\"}\n onClick={() => applyTableCellAttribute(editor, \"verticalAlign\", \"top\", { focus: false })}\n active={currentCellVerticalAlign === \"top\"}\n />\n <DropdownMenuItem\n icon={TableVerticalAlignMiddleIcon}\n label={t(\"tableMenu.alignVerticalMiddle\") || \"Align middle\"}\n onClick={() => applyTableCellAttribute(editor, \"verticalAlign\", \"middle\", { focus: false })}\n active={currentCellVerticalAlign === \"middle\"}\n />\n <DropdownMenuItem\n icon={TableVerticalAlignBottomIcon}\n label={t(\"tableMenu.alignVerticalBottom\") || \"Align bottom\"}\n onClick={() => applyTableCellAttribute(editor, \"verticalAlign\", \"bottom\", { focus: false })}\n active={currentCellVerticalAlign === \"bottom\"}\n />\n </DropdownMenu>\n <DropdownMenu\n onOpenChange={onKeepOpenChange}\n trigger={\n <ToolbarButton\n onMouseDown={() => onKeepOpenChange?.(true)}\n onClick={() => {}}\n title={t(\"tableMenu.textDirection\")}\n >\n {currentCellTextDirection === \"vertical\" ? <ArrowDown className=\"w-4 h-4\" /> : <ArrowRight className=\"w-4 h-4\" />}\n <ChevronDown className=\"w-3 h-3\" />\n </ToolbarButton>\n }\n >\n <DropdownMenuItem\n icon={ArrowRight}\n label={t(\"tableMenu.horizontalText\")}\n onClick={() => applyTableCellAttribute(editor, \"textDirection\", null, { focus: false })}\n active={currentCellTextDirection === \"horizontal\"}\n />\n <DropdownMenuItem\n icon={ArrowDown}\n label={t(\"tableMenu.verticalText\")}\n onClick={() => applyTableCellAttribute(editor, \"textDirection\", \"vertical\", { focus: false })}\n active={currentCellTextDirection === \"vertical\"}\n />\n </DropdownMenu>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-0.5 p-1\">\n <ToolbarButton onClick={() => editor.chain().focus().toggleBold().run()} active={editor.isActive(\"bold\")} title={t(\"toolbar.bold\")}>\n <BoldIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleItalic().run()} active={editor.isActive(\"italic\")} title={t(\"toolbar.italic\")}>\n <ItalicIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n active={editor.isActive(\"underline\")}\n title={t(\"toolbar.underline\")}\n >\n <UnderlineIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleStrike().run()} active={editor.isActive(\"strike\")} title={t(\"toolbar.strike\")}>\n <StrikethroughIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => editor.chain().focus().toggleCode().run()} active={editor.isActive(\"code\")} title={t(\"toolbar.code\")}>\n <CodeIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n\n <div className=\"w-px h-6 bg-border/50 mx-1\" />\n\n <ToolbarButton\n onMouseDown={() => {\n // Pin the bubble as early as possible (mousedown) so it won't disappear when focusing the input.\n onKeepOpenChange?.(true);\n }}\n onClick={() => {\n setShowLinkInput(true);\n }}\n active={editor.isActive(\"link\")}\n title={t(\"toolbar.link\")}\n >\n <LinkIcon className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={() => setActiveColorPalette(\"text\")} title={t(\"colors.textColor\")}>\n <TextColorIcon color={currentTextColor} />\n </ToolbarButton>\n <ToolbarButton onClick={() => setActiveColorPalette(\"highlight\")} active={editor.isActive(\"highlight\")} title={t(\"colors.highlight\")}>\n <HighlightColorIcon color={currentHighlightColor} />\n </ToolbarButton>\n <ToolbarButton\n onClick={() => setShowTypographyPanel(true)}\n active={Boolean(currentFontSize || currentLineHeight || editor.isActive(\"subscript\") || editor.isActive(\"superscript\"))}\n title={t(\"toolbar.textStyle\")}\n >\n <Type className=\"w-4 h-4\" />\n </ToolbarButton>\n </div>\n );\n};\n\nconst LinkPreviewContent = ({ editor, onEdit }: { editor: Editor; onEdit: () => void }) => {\n const url = editor.getAttributes(\"link\").href || \"\";\n const t = useSmartTranslations(\"UEditor\");\n\n const handleOpen = () => {\n const safeUrl = sanitizeUEditorUrl(url, \"link\");\n if (safeUrl) window.open(safeUrl, \"_blank\", \"noopener,noreferrer\");\n };\n\n const handleUnlink = () => {\n editor.chain().focus().unsetLink().run();\n };\n\n return (\n <div className=\"flex items-center gap-1 p-1 max-w-sm\">\n <span className=\"text-xs text-muted-foreground font-mono px-2 truncate max-w-45\">\n {url}\n </span>\n <div className=\"w-px h-6 bg-border/50 mx-1\" />\n <ToolbarButton onClick={handleOpen} title={t(\"linkPreview.open\") || \"Open link\"}>\n <ExternalLink className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={onEdit} title={t(\"linkPreview.edit\") || \"Edit link\"}>\n <Edit2 className=\"w-4 h-4\" />\n </ToolbarButton>\n <ToolbarButton onClick={handleUnlink} title={t(\"linkPreview.unlink\") || \"Remove link\"} className=\"text-destructive hover:text-destructive\">\n <Unlink className=\"w-4 h-4\" />\n </ToolbarButton>\n </div>\n );\n};\n\nexport const CustomBubbleMenu = ({\n editor,\n placement = \"auto\",\n fontSizes,\n lineHeights,\n}: {\n editor: Editor;\n placement?: UEditorBubbleMenuPlacement;\n fontSizes?: UEditorFontSizeOption[];\n lineHeights?: UEditorLineHeightOption[];\n}) => {\n const SHOW_DELAY_MS = 180;\n const BUBBLE_MENU_OFFSET = 16;\n const BUBBLE_MENU_ESTIMATED_HEIGHT = 44;\n const [isVisible, setIsVisible] = useState(false);\n const [linkInputOpen, setLinkInputOpen] = useState(false);\n const [position, setPosition] = useState<{ top: number; left: number; placement: \"top\" | \"bottom\" }>({\n top: 0,\n left: 0,\n placement: \"top\",\n });\n const menuRef = useRef<HTMLDivElement>(null);\n const updatePositionRef = useRef<() => void>(() => {});\n const keepOpenRef = useRef(false);\n const [keepOpen, setKeepOpenState] = useState(false);\n const showTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const suppressShowUntilRef = useRef(0);\n const getPortalContainer = useUEditorPortalContainerGetter();\n const portalContainer = isVisible ? resolveUEditorPortalContainer(getPortalContainer) : null;\n const editorDocument = editor.view.dom.ownerDocument;\n const editorWindow = editorDocument.defaultView;\n const portalDocument = portalContainer?.ownerDocument ?? null;\n const portalWindow = portalDocument?.defaultView ?? null;\n const setKeepOpen = useCallback((next: boolean) => {\n keepOpenRef.current = next;\n setKeepOpenState(next);\n if (!next) setLinkInputOpen(false);\n if (next) setIsVisible(true);\n }, []);\n const closeBubbleMenu = useCallback((suppressShow = true) => {\n suppressShowUntilRef.current = suppressShow ? Date.now() + 1000 : 0;\n keepOpenRef.current = false;\n setKeepOpenState(false);\n setLinkInputOpen(false);\n setIsVisible(false);\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n showTimeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n const clearShowTimeout = () => {\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n showTimeoutRef.current = null;\n }\n };\n\n const updatePosition = () => {\n const { state, view } = editor;\n const { from, to } = state.selection;\n const context = getBubbleMenuContext(editor);\n\n if (Date.now() < suppressShowUntilRef.current) {\n clearShowTimeout();\n setIsVisible(false);\n return;\n }\n\n const isInputFocused = () => {\n const active = editorDocument.activeElement;\n return Boolean(active && (menuRef.current?.contains(active) || active.closest?.(\"[data-ueditor-keep-open]\")));\n };\n\n if (!keepOpenRef.current && !isInputFocused() && (context === \"none\" || !view.hasFocus())) {\n clearShowTimeout();\n setIsVisible(false);\n return;\n }\n\n let start: { top: number; left: number; right: number; bottom: number };\n let end: { top: number; left: number; right: number; bottom: number };\n try {\n start = view.coordsAtPos(from);\n end = view.coordsAtPos(to);\n } catch {\n if (keepOpenRef.current) {\n clearShowTimeout();\n setIsVisible(true);\n return;\n }\n clearShowTimeout();\n setIsVisible(false);\n return;\n }\n\n const menuHeight = menuRef.current?.getBoundingClientRect().height || BUBBLE_MENU_ESTIMATED_HEIGHT;\n const menuWidth = menuRef.current?.getBoundingClientRect().width || 0;\n setPosition(getBubbleMenuPosition({\n start,\n end,\n menuSize: { width: menuWidth, height: menuHeight },\n viewport: {\n width: editorWindow?.innerWidth ?? window.innerWidth,\n height: editorWindow?.innerHeight ?? window.innerHeight,\n },\n preferredPlacement: placement,\n offset: BUBBLE_MENU_OFFSET,\n }));\n if (keepOpenRef.current) {\n clearShowTimeout();\n setIsVisible(true);\n return;\n }\n\n clearShowTimeout();\n showTimeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n showTimeoutRef.current = null;\n }, SHOW_DELAY_MS);\n };\n\n const handleBlur = () => {\n const isInputFocused = Boolean(editorDocument.activeElement && (menuRef.current?.contains(editorDocument.activeElement) || editorDocument.activeElement.closest?.(\"[data-ueditor-keep-open]\")));\n if (!keepOpenRef.current && !isInputFocused) {\n clearShowTimeout();\n setIsVisible(false);\n }\n };\n\n let animationFrameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (animationFrameId !== null) return;\n animationFrameId = editorWindow?.requestAnimationFrame(() => {\n animationFrameId = null;\n updatePosition();\n }) ?? null;\n };\n\n editor.on(\"transaction\", schedulePositionUpdate);\n editor.on(\"focus\", schedulePositionUpdate);\n editor.on(\"blur\", handleBlur);\n editorWindow?.addEventListener(\"resize\", schedulePositionUpdate);\n editorWindow?.addEventListener(\"scroll\", schedulePositionUpdate, true);\n updatePositionRef.current = updatePosition;\n schedulePositionUpdate();\n\n return () => {\n updatePositionRef.current = () => {};\n if (animationFrameId !== null) editorWindow?.cancelAnimationFrame(animationFrameId);\n clearShowTimeout();\n editor.off(\"transaction\", schedulePositionUpdate);\n editor.off(\"focus\", schedulePositionUpdate);\n editor.off(\"blur\", handleBlur);\n editorWindow?.removeEventListener(\"resize\", schedulePositionUpdate);\n editorWindow?.removeEventListener(\"scroll\", schedulePositionUpdate, true);\n };\n }, [editor, editorDocument, editorWindow, placement]);\n\n useEffect(() => {\n if (!isVisible || !portalWindow?.ResizeObserver) return;\n const menu = menuRef.current;\n if (!menu) return;\n\n let animationFrameId: number | null = null;\n const observer = new portalWindow.ResizeObserver(() => {\n if (animationFrameId !== null) portalWindow.cancelAnimationFrame(animationFrameId);\n animationFrameId = portalWindow.requestAnimationFrame(() => {\n animationFrameId = null;\n updatePositionRef.current();\n });\n });\n observer.observe(menu);\n\n return () => {\n if (animationFrameId !== null) portalWindow.cancelAnimationFrame(animationFrameId);\n observer.disconnect();\n };\n }, [isVisible, portalWindow]);\n\n useEffect(() => {\n if (!isVisible || !portalDocument) return;\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as HTMLElement | null;\n if (target && (menuRef.current?.contains(target) || target.closest(\"[data-ueditor-keep-open]\"))) return;\n closeBubbleMenu(false);\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeBubbleMenu();\n };\n\n const unsubscribePointerDown = subscribeSharedGlobalEvent(\n portalDocument,\n \"pointerdown\",\n handlePointerDown as EventListener,\n true,\n );\n const unsubscribeKeyDown = subscribeSharedGlobalEvent(\n portalDocument,\n \"keydown\",\n handleKeyDown as EventListener,\n );\n return () => {\n unsubscribePointerDown();\n unsubscribeKeyDown();\n };\n }, [closeBubbleMenu, editor, isVisible, portalDocument]);\n\n if (!isVisible || !portalContainer) return null;\n\n const context = getBubbleMenuContext(editor);\n if (context === \"none\") return null;\n\n return createPortal(\n <div\n ref={menuRef}\n data-popover\n data-placement={position.placement}\n className=\"fixed z-[99999] flex rounded-xl border border-border/40 bg-card text-card-foreground shadow-lg backdrop-blur-sm overflow-hidden animate-in fade-in-0 zoom-in-95\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: position.placement === \"top\" ? \"translate(-50%, -100%)\" : \"translate(-50%, 0)\",\n }}\n onMouseDown={(e) => {\n const target = e.target as HTMLElement | null;\n if (target?.closest?.(\"[data-ueditor-close-on-select]\")) {\n setKeepOpen(false);\n } else if (target?.closest?.(\"[data-ueditor-keep-open]\")) {\n setKeepOpen(true);\n }\n if (target && target.closest(\"input, textarea, select\")) {\n return;\n }\n e.preventDefault();\n }}\n >\n {context === \"link\" && !keepOpen && !linkInputOpen ? (\n <LinkPreviewContent\n editor={editor}\n onEdit={() => {\n setLinkInputOpen(true);\n setKeepOpen(true);\n }}\n />\n ) : (\n <BubbleMenuContent\n key={context}\n editor={editor}\n context={context}\n onKeepOpenChange={setKeepOpen}\n onLinkInputOpenChange={setLinkInputOpen}\n onRequestClose={closeBubbleMenu}\n fontSizes={fontSizes}\n lineHeights={lineHeights}\n initialShowLinkInput={linkInputOpen}\n />\n )}\n </div>,\n portalContainer,\n );\n};\n\nexport const CustomFloatingMenu = ({ editor }: { editor: Editor }) => {\n const FLOATING_MENU_OFFSET = 16;\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const getPortalContainer = useUEditorPortalContainerGetter();\n const portalContainer = isVisible ? resolveUEditorPortalContainer(getPortalContainer) : null;\n const editorWindow = editor.view.dom.ownerDocument.defaultView;\n\n useEffect(() => {\n const updatePosition = () => {\n const { state, view } = editor;\n const { $from, empty } = state.selection;\n\n const isEmptyTextBlock = $from.parent.isTextblock && $from.parent.type.name === \"paragraph\" && $from.parent.textContent === \"\" && empty;\n\n if (!isEmptyTextBlock || !view.hasFocus()) {\n setIsVisible(false);\n return;\n }\n\n const coords = view.coordsAtPos($from.pos);\n setPosition({ top: coords.top - FLOATING_MENU_OFFSET, left: coords.left });\n setIsVisible(true);\n };\n\n const handleBlur = () => setIsVisible(false);\n\n let animationFrameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (animationFrameId !== null) return;\n animationFrameId = editorWindow?.requestAnimationFrame(() => {\n animationFrameId = null;\n updatePosition();\n }) ?? null;\n };\n\n editor.on(\"transaction\", schedulePositionUpdate);\n editor.on(\"focus\", schedulePositionUpdate);\n editor.on(\"blur\", handleBlur);\n editorWindow?.addEventListener(\"resize\", schedulePositionUpdate);\n editorWindow?.addEventListener(\"scroll\", schedulePositionUpdate, true);\n schedulePositionUpdate();\n\n return () => {\n if (animationFrameId !== null) editorWindow?.cancelAnimationFrame(animationFrameId);\n editor.off(\"transaction\", schedulePositionUpdate);\n editor.off(\"focus\", schedulePositionUpdate);\n editor.off(\"blur\", handleBlur);\n editorWindow?.removeEventListener(\"resize\", schedulePositionUpdate);\n editorWindow?.removeEventListener(\"scroll\", schedulePositionUpdate, true);\n };\n }, [editor, editorWindow]);\n\n if (!isVisible || !portalContainer) return null;\n\n return createPortal(\n <div\n data-popover\n className=\"fixed z-99999 rounded-2xl border border-border/50 bg-card text-card-foreground shadow-lg backdrop-blur-sm overflow-hidden animate-in fade-in-0 slide-in-from-bottom-2\"\n style={{\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: \"translate(-50%, -100%)\",\n }}\n onMouseDown={(e) => e.preventDefault()}\n >\n <FloatingMenuContent editor={editor} />\n </div>,\n portalContainer,\n );\n};\n","import type { Editor } from \"@tiptap/core\";\nimport { selectedRect } from \"@tiptap/pm/tables\";\n\nexport type TableBorderPosition = \"all\" | \"outer\" | \"inner\" | \"horizontal\" | \"vertical\" | \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface TableBorderFormat {\n color: string;\n style: \"solid\" | \"dashed\" | \"dotted\" | \"double\" | \"none\";\n width: string;\n}\n\ntype BorderSide = \"top\" | \"right\" | \"bottom\" | \"left\";\ntype BorderQuad = Record<BorderSide, string>;\n\nconst SIDES: BorderSide[] = [\"top\", \"right\", \"bottom\", \"left\"];\nconst OPPOSITE_SIDE: Record<BorderSide, BorderSide> = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n};\n\nfunction splitCssValues(value: string) {\n const values: string[] = [];\n let token = \"\";\n let parentheses = 0;\n\n for (const character of value.trim()) {\n if (/\\s/.test(character) && parentheses === 0) {\n if (token) values.push(token);\n token = \"\";\n continue;\n }\n if (character === \"(\") parentheses += 1;\n if (character === \")\") parentheses = Math.max(0, parentheses - 1);\n token += character;\n }\n if (token) values.push(token);\n return values;\n}\n\nfunction expandCssQuad(value: unknown, fallback: string): BorderQuad {\n const values = typeof value === \"string\" ? splitCssValues(value) : [];\n const [top = fallback, right = top, bottom = top, left = right] = values;\n return { top, right, bottom, left };\n}\n\nfunction serializeCssQuad({ top, right, bottom, left }: BorderQuad) {\n if (top === right && top === bottom && top === left) return top;\n if (top === bottom && right === left) return `${top} ${right}`;\n if (right === left) return `${top} ${right} ${bottom}`;\n return `${top} ${right} ${bottom} ${left}`;\n}\n\nfunction getAppliedSides(\n position: TableBorderPosition,\n cell: { top: number; right: number; bottom: number; left: number },\n selection: { top: number; right: number; bottom: number; left: number },\n) {\n const outer = {\n top: cell.top === selection.top,\n right: cell.right === selection.right,\n bottom: cell.bottom === selection.bottom,\n left: cell.left === selection.left,\n };\n const inner = {\n top: cell.top > selection.top,\n right: cell.right < selection.right,\n bottom: cell.bottom < selection.bottom,\n left: cell.left > selection.left,\n };\n\n switch (position) {\n case \"all\":\n return { top: true, right: true, bottom: true, left: true };\n case \"outer\":\n return outer;\n case \"inner\":\n return inner;\n case \"horizontal\":\n return { top: inner.top, right: false, bottom: inner.bottom, left: false };\n case \"vertical\":\n return { top: false, right: inner.right, bottom: false, left: inner.left };\n default:\n return {\n top: position === \"top\" && outer.top,\n right: position === \"right\" && outer.right,\n bottom: position === \"bottom\" && outer.bottom,\n left: position === \"left\" && outer.left,\n };\n }\n}\n\nexport function applyTableCellBorders(editor: Editor, position: TableBorderPosition, format: TableBorderFormat, options: { focus?: boolean } = {}) {\n const { state, view } = editor;\n const selection = selectedRect(state);\n const transaction = state.tr;\n const cellPositions = new Set(selection.map.cellsInRect(selection));\n const sidesByCell = new Map<number, Set<BorderSide>>();\n\n const addSide = (cellPos: number, side: BorderSide) => {\n const sides = sidesByCell.get(cellPos) ?? new Set<BorderSide>();\n sides.add(side);\n sidesByCell.set(cellPos, sides);\n };\n\n const addAdjacentSides = (\n cell: { top: number; right: number; bottom: number; left: number },\n side: BorderSide,\n ) => {\n const adjacentPositions = new Set<number>();\n if (side === \"top\" && cell.top > 0) {\n for (let col = cell.left; col < cell.right; col += 1) adjacentPositions.add(selection.map.map[(cell.top - 1) * selection.map.width + col]);\n } else if (side === \"bottom\" && cell.bottom < selection.map.height) {\n for (let col = cell.left; col < cell.right; col += 1) adjacentPositions.add(selection.map.map[cell.bottom * selection.map.width + col]);\n } else if (side === \"left\" && cell.left > 0) {\n for (let row = cell.top; row < cell.bottom; row += 1) adjacentPositions.add(selection.map.map[row * selection.map.width + cell.left - 1]);\n } else if (side === \"right\" && cell.right < selection.map.width) {\n for (let row = cell.top; row < cell.bottom; row += 1) adjacentPositions.add(selection.map.map[row * selection.map.width + cell.right]);\n }\n\n for (const adjacentPos of adjacentPositions) addSide(adjacentPos, OPPOSITE_SIDE[side]);\n };\n\n for (const relativePos of cellPositions) {\n const cell = selection.map.findCell(relativePos);\n const appliedSides = getAppliedSides(position, cell, selection);\n for (const side of SIDES) {\n if (!appliedSides[side]) continue;\n addSide(relativePos, side);\n addAdjacentSides(cell, side);\n }\n }\n\n for (const [relativePos, appliedSides] of sidesByCell) {\n const absolutePos = selection.tableStart + relativePos;\n const node = state.doc.nodeAt(absolutePos);\n if (!node) continue;\n\n const styles = expandCssQuad(node.attrs.borderStyle, \"solid\");\n const widths = expandCssQuad(node.attrs.borderWidth, \"1px\");\n const colors = expandCssQuad(node.attrs.borderColor, \"#000000\");\n\n for (const side of SIDES) {\n if (!appliedSides.has(side)) continue;\n styles[side] = format.style;\n widths[side] = format.width;\n colors[side] = format.color || \"currentColor\";\n }\n\n transaction.setNodeMarkup(absolutePos, undefined, {\n ...node.attrs,\n borderStyle: serializeCssQuad(styles),\n borderWidth: serializeCssQuad(widths),\n borderColor: serializeCssQuad(colors),\n });\n }\n\n if (transaction.docChanged) view.dispatch(transaction);\n if (options.focus ?? true) view.focus();\n return transaction.docChanged;\n}\n","type SharedGlobalEventOptions = boolean | Pick<AddEventListenerOptions, \"capture\" | \"passive\">;\n\ntype SharedGlobalEventRegistry = {\n listeners: Set<EventListener>;\n nativeListener: EventListener;\n options: SharedGlobalEventOptions | undefined;\n};\n\nconst registriesByTarget = new WeakMap<EventTarget, Map<string, SharedGlobalEventRegistry>>();\n\nfunction getListenerOptionsKey(options: SharedGlobalEventOptions | undefined) {\n const capture = typeof options === \"boolean\" ? options : Boolean(options?.capture);\n const passive = typeof options === \"object\" ? Boolean(options.passive) : false;\n return `${capture ? 1 : 0}:${passive ? 1 : 0}`;\n}\n\n/**\n * Shares one native listener for equivalent window/document subscriptions.\n * Editor-specific DOM listeners intentionally remain local to their editor.\n */\nexport function subscribeSharedGlobalEvent(\n target: EventTarget,\n type: string,\n listener: EventListener,\n options?: SharedGlobalEventOptions,\n) {\n let targetRegistries = registriesByTarget.get(target);\n if (!targetRegistries) {\n targetRegistries = new Map();\n registriesByTarget.set(target, targetRegistries);\n }\n\n const registryKey = `${type}:${getListenerOptionsKey(options)}`;\n let registry = targetRegistries.get(registryKey);\n\n if (!registry) {\n const listeners = new Set<EventListener>();\n const nativeListener: EventListener = (event) => {\n for (const currentListener of [...listeners]) {\n currentListener.call(target, event);\n }\n };\n\n registry = { listeners, nativeListener, options };\n targetRegistries.set(registryKey, registry);\n target.addEventListener(type, nativeListener, options);\n }\n\n registry.listeners.add(listener);\n let subscribed = true;\n\n return () => {\n if (!subscribed) return;\n subscribed = false;\n\n registry?.listeners.delete(listener);\n if (!registry || registry.listeners.size > 0) return;\n\n target.removeEventListener(type, registry.nativeListener, registry.options);\n targetRegistries?.delete(registryKey);\n };\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport type { Editor } from \"@tiptap/core\";\nimport { useEditorState } from \"@tiptap/react\";\nimport { cn } from \"../../utils/cn\";\n\nexport const CharacterCountDisplay = ({ editor, maxCharacters }: { editor: Editor; maxCharacters?: number }) => {\n const t = useSmartTranslations(\"UEditor\");\n const { characterCount, wordCount } = useEditorState({\n editor,\n selector: ({ editor: currentEditor }) => {\n const storage = currentEditor.storage as unknown as {\n characterCount?: { characters?: () => number; words?: () => number };\n };\n\n return {\n characterCount: storage.characterCount?.characters?.() ?? 0,\n wordCount: storage.characterCount?.words?.() ?? 0,\n };\n },\n });\n const percentage = maxCharacters ? Math.round((characterCount / maxCharacters) * 100) : 0;\n\n return (\n <div className=\"flex items-center gap-3 px-3 py-2 text-xs text-muted-foreground border-t border-border/30 bg-muted/20\">\n <span>\n {wordCount} {t(\"words\")}\n </span>\n <span>\n {characterCount} {t(\"characters\")}\n </span>\n {maxCharacters && (\n <span className={cn(percentage > 90 && \"text-destructive\", percentage > 100 && \"font-bold\")}>\n {characterCount}/{maxCharacters}\n </span>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport type { ChainedCommands, Editor } from \"@tiptap/core\";\nimport { moveTableColumn, moveTableRow } from \"prosemirror-tables\";\nimport {\n AlignCenter,\n AlignLeft,\n AlignRight,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n Columns,\n Copy,\n Grid,\n Minimize2,\n Paintbrush,\n Rows,\n Table as TableIcon,\n Trash2,\n} from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport { applyTableAlignment } from \"./table-align-utils\";\nimport {\n clearTableColumnAt,\n clearTableRowAt,\n distributeTableColumnsEqually,\n distributeTableRowsAndColumnsEqually,\n distributeTableRowsEqually,\n duplicateTableColumnAt,\n duplicateTableRowAt,\n expandTableFromCell,\n runTableCommandAtCellPos,\n} from \"./table-cell-commands\";\nimport {\n isPointOverRenderedText,\n isCrossRealmTableCell,\n resolveEventElement,\n UEDITOR_TABLE_LAYOUT_CHANGE_EVENT,\n} from \"./table-dom-utils\";\nimport {\n areTableHoverStatesEqual,\n buildTableHoverState,\n DEFAULT_TABLE_HOVER_STATE,\n type TableHoverState,\n} from \"./table-hover-state\";\nimport { TableDragPreview, type TableDragPreviewState } from \"./table-drag-preview\";\nimport { TableAddRails } from \"./table-add-rails\";\nimport { TableControlMenu } from \"./table-control-menu\";\nimport { TableColumnHandles, TableRowHandles } from \"./table-axis-handles\";\nimport { formatTableResizeDimensionLabel, TableResizeHandles } from \"./table-resize-handles\";\nimport {\n buildTableControlLayout,\n findTableInfo,\n getCellFromTarget,\n getTableCellTextSelectionRange,\n type TableAxisHandle,\n type TableControlLayout,\n} from \"./table-layout-model\";\nimport {\n applyTableSize,\n createTableSizeSnapshot,\n resolveTableResizeDimensions,\n type TableResizeEdge,\n type TableResizeDimensions,\n type TableSizeSnapshot,\n} from \"./table-size-utils\";\nimport { subscribeSharedGlobalEvent } from \"./shared-global-listeners\";\nimport {\n getTableColumnRatios,\n moveResponsiveColumnRatio,\n normalizeTableWidthMode,\n TABLE_WIDTH_BASIS_POINTS,\n} from \"./table-width-model\";\nimport { rewriteTableNodeFormulaReferencesForMove } from \"./table-formula-references\";\n\nconst TABLE_MENU_TOP_OFFSET = 10;\nconst AXIS_HANDLE_RADIUS = 12;\n\n/** Public props for the `TableControls` component. */\ntype TableControlsProps = {\n editor: Editor;\n containerRef: React.RefObject<HTMLDivElement | null>;\n showCellInspector?: boolean;\n};\n\ntype DragState =\n | { kind: \"row\"; originIndex: number; targetIndex: number; anchorPos: number }\n | { kind: \"column\"; originIndex: number; targetIndex: number; anchorPos: number }\n | { kind: \"add-row\"; previewRows: number }\n | { kind: \"add-column\"; previewCols: number }\n | {\n kind: \"resize-table\";\n pointerId: number;\n pointerTarget: HTMLButtonElement;\n startX: number;\n startY: number;\n edge: TableResizeEdge;\n snapshot: TableSizeSnapshot;\n pendingDimensions: TableResizeDimensions;\n };\n\ntype OpenMenuKey = `row:${number}` | `column:${number}` | \"table\" | null;\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction nearestIndex(centers: number[], position: number) {\n let bestIndex = 0;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n centers.forEach((center, index) => {\n const distance = Math.abs(center - position);\n if (distance < bestDistance) {\n bestDistance = distance;\n bestIndex = index;\n }\n });\n\n return bestIndex;\n}\n\nfunction setDocumentCursor(ownerDocument: Document, cursor: string) {\n ownerDocument.body.style.cursor = cursor;\n}\n\nfunction getSelectedCell(editor: Editor) {\n const editorWindow = editor.view.dom.ownerDocument.defaultView;\n const browserSelection = editorWindow?.getSelection();\n const anchorElement = resolveEventElement(browserSelection?.anchorNode ?? null);\n const anchorCell = anchorElement?.closest?.(\"th,td\");\n if (isCrossRealmTableCell(anchorCell) && editor.view.dom.contains(anchorCell)) {\n return anchorCell;\n }\n\n const domAtPos = editor.view.domAtPos(editor.state.selection.from);\n return getCellFromTarget(domAtPos.node);\n}\n\nexport function TableControls({ editor, containerRef, showCellInspector = true }: TableControlsProps) {\n const t = useSmartTranslations(\"UEditor\");\n const editorDocument = editor.view.dom.ownerDocument;\n const editorWindow = editorDocument.defaultView;\n const [layout, setLayout] = React.useState<TableControlLayout | null>(null);\n const [dragPreview, setDragPreview] = React.useState<TableDragPreviewState | null>(null);\n const [tableResizeActive, setTableResizeActive] = React.useState(false);\n const [hoverState, setHoverState] = React.useState<TableHoverState>(DEFAULT_TABLE_HOVER_STATE);\n const [openMenuKey, setOpenMenuKey] = React.useState<OpenMenuKey>(null);\n const layoutRef = React.useRef<TableControlLayout | null>(null);\n const dragStateRef = React.useRef<DragState | null>(null);\n const syncFrameRef = React.useRef<number | null>(null);\n const layoutRefreshFrameRef = React.useRef<number | null>(null);\n const tableResizeFrameRef = React.useRef<HTMLDivElement>(null);\n const tableResizePreviewFrameRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n layoutRef.current = layout;\n }, [layout]);\n\n const syncFromCell = React.useCallback((cell: HTMLTableCellElement | null) => {\n const surface = containerRef.current;\n if (!surface || !cell) {\n layoutRef.current = null;\n setLayout(null);\n return;\n }\n\n const nextLayout = buildTableControlLayout(editor, surface, cell);\n layoutRef.current = nextLayout;\n setLayout(nextLayout);\n }, [containerRef, editor]);\n\n const syncFromSelection = React.useCallback(() => {\n syncFromCell(getSelectedCell(editor));\n }, [editor, syncFromCell]);\n\n const scheduleSyncFromSelection = React.useCallback(() => {\n if (syncFrameRef.current !== null) return;\n\n if (!editorWindow) return;\n syncFrameRef.current = editorWindow.requestAnimationFrame(() => {\n syncFrameRef.current = null;\n syncFromSelection();\n });\n }, [editorWindow, syncFromSelection]);\n\n React.useEffect(() => () => {\n if (syncFrameRef.current !== null) {\n editorWindow?.cancelAnimationFrame(syncFrameRef.current);\n syncFrameRef.current = null;\n }\n }, [editorWindow]);\n\n const refreshCurrentLayout = React.useCallback(() => {\n const currentLayout = layoutRef.current;\n if (!currentLayout) return;\n\n const surface = containerRef.current;\n if (!surface) {\n layoutRef.current = null;\n setLayout(null);\n return;\n }\n\n const node = editor.view.nodeDOM(currentLayout.cellPos);\n const cell = getCellFromTarget(node) ?? getSelectedCell(editor);\n const nextLayout = cell ? buildTableControlLayout(editor, surface, cell) : null;\n layoutRef.current = nextLayout;\n setLayout(nextLayout);\n }, [containerRef, editor]);\n\n const scheduleCurrentLayoutRefresh = React.useCallback(() => {\n if (!layoutRef.current || layoutRefreshFrameRef.current !== null) return;\n\n if (!editorWindow) return;\n layoutRefreshFrameRef.current = editorWindow.requestAnimationFrame(() => {\n layoutRefreshFrameRef.current = null;\n refreshCurrentLayout();\n });\n }, [editorWindow, refreshCurrentLayout]);\n\n React.useEffect(() => () => {\n if (layoutRefreshFrameRef.current !== null) {\n editorWindow?.cancelAnimationFrame(layoutRefreshFrameRef.current);\n layoutRefreshFrameRef.current = null;\n }\n }, [editorWindow]);\n\n const updateTableResizePreview = React.useCallback((dimensions: TableResizeDimensions) => {\n const frame = tableResizeFrameRef.current;\n if (!frame) return;\n\n frame.style.width = `${dimensions.width}px`;\n frame.style.height = `${dimensions.height}px`;\n const activeLayout = layoutRef.current;\n if (activeLayout) {\n frame.style.left = `${activeLayout.tableLeft + (dimensions.leftDelta ?? 0)}px`;\n }\n const dimensionsLabel = frame.querySelector<HTMLElement>(\"[data-table-resize-dimensions]\");\n if (dimensionsLabel && activeLayout) {\n dimensionsLabel.textContent = formatTableResizeDimensionLabel({\n width: dimensions.width,\n height: dimensions.height,\n widthBp: dimensions.widthBp,\n widthMode: activeLayout.widthMode,\n viewportWidth: activeLayout.viewportWidth,\n });\n }\n }, []);\n\n const resetTableResizePreview = React.useCallback(() => {\n const activeLayout = layoutRef.current;\n if (!activeLayout) return;\n updateTableResizePreview({\n width: Math.round(activeLayout.tableWidth),\n height: Math.round(activeLayout.tableHeight),\n leftDelta: 0,\n });\n }, [updateTableResizePreview]);\n\n const clearDrag = React.useCallback(() => {\n const dragState = dragStateRef.current;\n if (dragState?.kind === \"resize-table\") {\n try {\n if (dragState.pointerTarget.hasPointerCapture?.(dragState.pointerId)) {\n dragState.pointerTarget.releasePointerCapture(dragState.pointerId);\n }\n } catch {}\n }\n\n if (tableResizePreviewFrameRef.current !== null) {\n editorWindow?.cancelAnimationFrame(tableResizePreviewFrameRef.current);\n tableResizePreviewFrameRef.current = null;\n }\n dragStateRef.current = null;\n setDragPreview(null);\n setTableResizeActive(false);\n resetTableResizePreview();\n setDocumentCursor(editorDocument, \"\");\n }, [editorDocument, editorWindow, resetTableResizePreview]);\n\n const updateHoverState = React.useCallback((event: MouseEvent | PointerEvent) => {\n const activeLayout = layoutRef.current;\n const surface = containerRef.current;\n if (!activeLayout || !surface || dragStateRef.current || event.buttons !== 0) {\n setHoverState(DEFAULT_TABLE_HOVER_STATE);\n return;\n }\n\n const nextState = buildTableHoverState({\n event,\n layout: activeLayout,\n surface,\n });\n\n setHoverState((prev) => {\n return areTableHoverStatesEqual(prev, nextState) ? prev : nextState;\n });\n }, [containerRef]);\n\n React.useEffect(() => {\n const proseMirror = editor.view.dom as HTMLElement;\n const surface = containerRef.current;\n if (!surface) return undefined;\n const scrollListenerOptions = { passive: true, capture: true };\n\n const handleMouseOver = (event: MouseEvent) => {\n if (dragStateRef.current) return;\n const cell = getCellFromTarget(event.target);\n if (!cell) return;\n syncFromCell(cell);\n };\n\n const handleSurfaceMouseMove = (event: MouseEvent) => {\n updateHoverState(event);\n };\n\n const handleMouseLeave = () => {\n if (dragStateRef.current) return;\n setHoverState(DEFAULT_TABLE_HOVER_STATE);\n };\n\n const handleFocusIn = (event?: Event) => {\n if (dragStateRef.current) return;\n const cell = event ? getCellFromTarget(event.target) : null;\n syncFromCell(cell ?? getSelectedCell(editor));\n };\n\n const handleDoubleClick = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n const cell = getCellFromTarget(event.target);\n if (!cell || cell.hasAttribute(\"data-formula\")) return;\n\n const surface = containerRef.current;\n const nextLayout = surface ? buildTableControlLayout(editor, surface, cell) : null;\n if (!nextLayout) return;\n\n if (isPointOverRenderedText(cell, event.clientX, event.clientY)) {\n const textSelection = getTableCellTextSelectionRange(editor, nextLayout.cellPos);\n if (textSelection) {\n event.preventDefault();\n const didSelectText = editor.commands.setTextSelection(textSelection);\n if (didSelectText) {\n editor.view.focus();\n layoutRef.current = nextLayout;\n setLayout(nextLayout);\n setHoverState(DEFAULT_TABLE_HOVER_STATE);\n return;\n }\n }\n }\n\n const didSelect = editor.commands.setCellSelection({\n anchorCell: nextLayout.cellPos,\n headCell: nextLayout.cellPos,\n });\n if (!didSelect) return;\n\n event.preventDefault();\n editor.view.focus();\n layoutRef.current = nextLayout;\n setLayout(nextLayout);\n };\n\n proseMirror.addEventListener(\"mouseover\", handleMouseOver);\n proseMirror.addEventListener(\"mouseleave\", handleMouseLeave);\n proseMirror.addEventListener(\"click\", handleFocusIn);\n proseMirror.addEventListener(\"dblclick\", handleDoubleClick);\n proseMirror.addEventListener(\"mouseup\", handleFocusIn);\n proseMirror.addEventListener(\"focusin\", handleFocusIn);\n surface.addEventListener(\"mouseover\", handleSurfaceMouseMove);\n surface.addEventListener(\"mousemove\", handleSurfaceMouseMove);\n surface.addEventListener(\"scroll\", scheduleCurrentLayoutRefresh, scrollListenerOptions);\n surface.addEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, scheduleCurrentLayoutRefresh);\n if (!editorWindow) return undefined;\n const unsubscribeResize = subscribeSharedGlobalEvent(editorWindow, \"resize\", scheduleCurrentLayoutRefresh);\n const unsubscribeWindowScroll = subscribeSharedGlobalEvent(editorWindow, \"scroll\", scheduleCurrentLayoutRefresh, { passive: true });\n editor.on(\"selectionUpdate\", scheduleSyncFromSelection);\n editor.on(\"update\", scheduleCurrentLayoutRefresh);\n\n syncFromSelection();\n\n return () => {\n proseMirror.removeEventListener(\"mouseover\", handleMouseOver);\n proseMirror.removeEventListener(\"mouseleave\", handleMouseLeave);\n proseMirror.removeEventListener(\"click\", handleFocusIn);\n proseMirror.removeEventListener(\"dblclick\", handleDoubleClick);\n proseMirror.removeEventListener(\"mouseup\", handleFocusIn);\n proseMirror.removeEventListener(\"focusin\", handleFocusIn);\n surface.removeEventListener(\"mouseover\", handleSurfaceMouseMove);\n surface.removeEventListener(\"mousemove\", handleSurfaceMouseMove);\n surface.removeEventListener(\"scroll\", scheduleCurrentLayoutRefresh, scrollListenerOptions);\n surface.removeEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, scheduleCurrentLayoutRefresh);\n unsubscribeResize();\n unsubscribeWindowScroll();\n editor.off(\"selectionUpdate\", scheduleSyncFromSelection);\n editor.off(\"update\", scheduleCurrentLayoutRefresh);\n };\n }, [clearDrag, containerRef, editor, editorWindow, scheduleCurrentLayoutRefresh, scheduleSyncFromSelection, syncFromCell, syncFromSelection, updateHoverState]);\n\n const runAtCellPos = React.useCallback((cellPos: number | null, command: (chain: ChainedCommands) => ChainedCommands, options?: { sync?: boolean }) => {\n const result = runTableCommandAtCellPos(editor, cellPos, command);\n if (options?.sync !== false) {\n scheduleSyncFromSelection();\n }\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const runAtActiveCell = React.useCallback((command: (chain: ChainedCommands) => ChainedCommands, options?: { sync?: boolean }) => {\n return runAtCellPos(layoutRef.current?.cellPos ?? null, command, options);\n }, [runAtCellPos]);\n\n const duplicateRowAt = React.useCallback((rowIndex: number, cellPos: number | null) => {\n const result = duplicateTableRowAt(editor, rowIndex, cellPos);\n scheduleSyncFromSelection();\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const clearRowAt = React.useCallback((rowIndex: number, cellPos: number | null) => {\n const result = clearTableRowAt(editor, rowIndex, cellPos);\n scheduleSyncFromSelection();\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const duplicateColumnAt = React.useCallback((columnIndex: number, cellPos: number | null) => {\n const result = duplicateTableColumnAt(editor, columnIndex, cellPos);\n scheduleSyncFromSelection();\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const clearColumnAt = React.useCallback((columnIndex: number, cellPos: number | null) => {\n const result = clearTableColumnAt(editor, columnIndex, cellPos);\n scheduleSyncFromSelection();\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const expandTableBy = React.useCallback((rows: number, cols: number) => {\n const activeCellPos = layoutRef.current?.cellPos ?? editor.state.selection.from;\n const result = expandTableFromCell(editor, activeCellPos, rows, cols);\n scheduleSyncFromSelection();\n return result;\n }, [editor, scheduleSyncFromSelection]);\n\n const canExpandTable = Boolean(layout);\n const controlsVisible = false;\n const tableMenuOpen = openMenuKey === \"table\";\n const startTableResize = React.useCallback((event: React.PointerEvent<HTMLButtonElement>, edge: TableResizeEdge) => {\n if (event.button !== 0 || dragStateRef.current) return;\n\n const activeLayout = layoutRef.current;\n if (!activeLayout) return;\n\n const snapshot = createTableSizeSnapshot(\n editor,\n activeLayout.cellPos,\n activeLayout.tableWidth,\n activeLayout.tableHeight,\n activeLayout.viewportWidth,\n );\n if (!snapshot) return;\n\n event.preventDefault();\n event.stopPropagation();\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {}\n\n setOpenMenuKey(null);\n setHoverState(DEFAULT_TABLE_HOVER_STATE);\n setTableResizeActive(true);\n const pendingDimensions = {\n width: snapshot.startWidth,\n height: snapshot.startHeight,\n };\n dragStateRef.current = {\n kind: \"resize-table\",\n pointerId: event.pointerId,\n pointerTarget: event.currentTarget,\n startX: event.clientX,\n startY: event.clientY,\n edge,\n snapshot,\n pendingDimensions,\n };\n updateTableResizePreview(pendingDimensions);\n setDocumentCursor(editorDocument, edge === \"both\" ? \"nwse-resize\" : \"ew-resize\");\n }, [editor, editorDocument, updateTableResizePreview]);\n const fitTableToEditorWidth = React.useCallback(() => {\n if (dragStateRef.current) return;\n\n const activeLayout = layoutRef.current;\n if (!activeLayout) return;\n\n const snapshot = createTableSizeSnapshot(\n editor,\n activeLayout.cellPos,\n activeLayout.tableWidth,\n activeLayout.tableHeight,\n activeLayout.viewportWidth,\n );\n if (!snapshot) return;\n\n const didResize = applyTableSize(editor, snapshot, {\n width: Math.round(activeLayout.viewportWidth),\n height: snapshot.startHeight,\n widthBp: TABLE_WIDTH_BASIS_POINTS,\n offsetBp: 0,\n leftDelta: -((snapshot.offsetBp / TABLE_WIDTH_BASIS_POINTS) * snapshot.containerWidth),\n }, { widthMode: \"responsive\" });\n if (didResize) {\n scheduleSyncFromSelection();\n }\n }, [editor, scheduleSyncFromSelection]);\n const resizeTableWithKeyboard = React.useCallback((\n event: React.KeyboardEvent<HTMLButtonElement>,\n edge: TableResizeEdge,\n ) => {\n const horizontal = event.key === \"ArrowLeft\" || event.key === \"ArrowRight\";\n const vertical = event.key === \"ArrowUp\" || event.key === \"ArrowDown\";\n if ((!horizontal && !vertical) || (edge !== \"both\" && !horizontal)) return;\n\n const activeLayout = layoutRef.current;\n if (!activeLayout) return;\n const snapshot = createTableSizeSnapshot(\n editor,\n activeLayout.cellPos,\n activeLayout.tableWidth,\n activeLayout.tableHeight,\n activeLayout.viewportWidth,\n );\n if (!snapshot) return;\n\n event.preventDefault();\n event.stopPropagation();\n const step = event.shiftKey ? 20 : 5;\n const dimensions = resolveTableResizeDimensions({\n deltaX: event.key === \"ArrowLeft\" ? -step : event.key === \"ArrowRight\" ? step : 0,\n deltaY: event.key === \"ArrowUp\" ? -step : event.key === \"ArrowDown\" ? step : 0,\n edge,\n lockAxis: false,\n preserveRatio: false,\n snapshot,\n });\n if (applyTableSize(editor, snapshot, dimensions, { widthMode: snapshot.widthMode })) {\n scheduleSyncFromSelection();\n }\n }, [editor, scheduleSyncFromSelection]);\n const startAddColumnDrag = React.useCallback((event: React.PointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0 || dragStateRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n setOpenMenuKey(null);\n dragStateRef.current = { kind: \"add-column\", previewCols: 1 };\n setDragPreview({ kind: \"add-column\", previewCols: 1 });\n setDocumentCursor(editorDocument, \"ew-resize\");\n }, [editorDocument]);\n const startAddRowDrag = React.useCallback((event: React.PointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0 || dragStateRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n setOpenMenuKey(null);\n dragStateRef.current = { kind: \"add-row\", previewRows: 1 };\n setDragPreview({ kind: \"add-row\", previewRows: 1 });\n setDocumentCursor(editorDocument, \"ns-resize\");\n }, [editorDocument]);\n const startRowDrag = React.useCallback((event: React.PointerEvent<HTMLButtonElement>, rowHandle: TableAxisHandle) => {\n if (event.button !== 0 || dragStateRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n setOpenMenuKey(null);\n dragStateRef.current = {\n kind: \"row\",\n originIndex: rowHandle.index,\n targetIndex: rowHandle.index,\n anchorPos: rowHandle.cellPos,\n };\n setDragPreview({\n kind: \"row\",\n originIndex: rowHandle.index,\n targetIndex: rowHandle.index,\n targetStart: rowHandle.start,\n targetSize: rowHandle.size,\n });\n setDocumentCursor(editorDocument, \"grabbing\");\n }, [editorDocument]);\n const startColumnDrag = React.useCallback((event: React.PointerEvent<HTMLButtonElement>, columnHandle: TableAxisHandle) => {\n if (event.button !== 0 || dragStateRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n setOpenMenuKey(null);\n dragStateRef.current = {\n kind: \"column\",\n originIndex: columnHandle.index,\n targetIndex: columnHandle.index,\n anchorPos: columnHandle.cellPos,\n };\n setDragPreview({\n kind: \"column\",\n originIndex: columnHandle.index,\n targetIndex: columnHandle.index,\n targetStart: columnHandle.start,\n targetSize: columnHandle.size,\n });\n setDocumentCursor(editorDocument, \"grabbing\");\n }, [editorDocument]);\n const moveRowWithKeyboard = React.useCallback((rowHandle: TableAxisHandle, direction: -1 | 1) => {\n const targetIndex = clamp(rowHandle.index + direction, 0, (layoutRef.current?.rowHandles.length ?? 1) - 1);\n if (targetIndex === rowHandle.index) return;\n const tableInfo = findTableInfo(editor, rowHandle.cellPos);\n moveTableRow({\n from: rowHandle.index,\n to: targetIndex,\n pos: rowHandle.cellPos,\n select: true,\n })(editor.state, (transaction) => {\n const nextTable = tableInfo ? transaction.doc.nodeAt(tableInfo.pos) : null;\n if (tableInfo && nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteTableNodeFormulaReferencesForMove(nextTable, \"row\", rowHandle.index, targetIndex);\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n editor.view.dispatch(transaction);\n });\n scheduleSyncFromSelection();\n }, [editor, scheduleSyncFromSelection]);\n const moveColumnWithKeyboard = React.useCallback((columnHandle: TableAxisHandle, direction: -1 | 1) => {\n const targetIndex = clamp(columnHandle.index + direction, 0, (layoutRef.current?.columnHandles.length ?? 1) - 1);\n if (targetIndex === columnHandle.index) return;\n const tableInfo = findTableInfo(editor, columnHandle.cellPos);\n const responsiveRatios = tableInfo && normalizeTableWidthMode(tableInfo.node.attrs.widthMode) === \"responsive\"\n ? moveResponsiveColumnRatio(getTableColumnRatios(tableInfo.node), columnHandle.index, targetIndex)\n : null;\n moveTableColumn({\n from: columnHandle.index,\n to: targetIndex,\n pos: columnHandle.cellPos,\n select: true,\n })(editor.state, (transaction) => {\n if (tableInfo && responsiveRatios) {\n const nextTable = transaction.doc.nodeAt(tableInfo.pos);\n if (nextTable?.type.name === \"table\") {\n transaction.setNodeMarkup(tableInfo.pos, undefined, {\n ...nextTable.attrs,\n widthMode: \"responsive\",\n columnRatios: responsiveRatios,\n });\n }\n }\n const nextTable = tableInfo ? transaction.doc.nodeAt(tableInfo.pos) : null;\n if (tableInfo && nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteTableNodeFormulaReferencesForMove(nextTable, \"column\", columnHandle.index, targetIndex);\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n editor.view.dispatch(transaction);\n });\n scheduleSyncFromSelection();\n }, [editor, scheduleSyncFromSelection]);\n\n React.useEffect(() => {\n if (!editorWindow) return;\n const handlePointerMove = (event: PointerEvent) => {\n const dragState = dragStateRef.current;\n const activeLayout = layoutRef.current;\n const surface = containerRef.current;\n if (!dragState || !activeLayout || !surface) return;\n\n const surfaceRect = surface.getBoundingClientRect();\n const relativeX = event.clientX - surfaceRect.left + surface.scrollLeft;\n const relativeY = event.clientY - surfaceRect.top + surface.scrollTop;\n\n if (dragState.kind === \"resize-table\") {\n return;\n }\n\n if (dragState.kind === \"row\") {\n const targetHandleIndex = nearestIndex(activeLayout.rowHandles.map((item) => item.center), relativeY);\n const targetRow = activeLayout.rowHandles[targetHandleIndex];\n const targetIndex = targetRow.index;\n dragState.targetIndex = targetIndex;\n setDragPreview({\n kind: \"row\",\n originIndex: dragState.originIndex,\n targetIndex,\n targetStart: targetRow.start,\n targetSize: targetRow.size,\n });\n setDocumentCursor(editorDocument, \"grabbing\");\n return;\n }\n\n if (dragState.kind === \"column\") {\n const targetHandleIndex = nearestIndex(activeLayout.columnHandles.map((item) => item.center), relativeX);\n const targetColumn = activeLayout.columnHandles[targetHandleIndex];\n const targetIndex = targetColumn.index;\n dragState.targetIndex = targetIndex;\n setDragPreview({\n kind: \"column\",\n originIndex: dragState.originIndex,\n targetIndex,\n targetStart: targetColumn.start,\n targetSize: targetColumn.size,\n });\n setDocumentCursor(editorDocument, \"grabbing\");\n return;\n }\n\n if (dragState.kind === \"add-column\") {\n const previewCols = Math.max(1, 1 + Math.floor(Math.max(0, relativeX - (activeLayout.tableLeft + activeLayout.tableWidth)) / activeLayout.avgColumnWidth));\n dragState.previewCols = previewCols;\n setDragPreview({ kind: \"add-column\", previewCols });\n setDocumentCursor(editorDocument, \"ew-resize\");\n return;\n }\n\n const previewRows = Math.max(1, 1 + Math.floor(Math.max(0, relativeY - (activeLayout.tableTop + activeLayout.tableHeight)) / activeLayout.avgRowHeight));\n dragState.previewRows = previewRows;\n setDragPreview({ kind: \"add-row\", previewRows });\n setDocumentCursor(editorDocument, \"ns-resize\");\n };\n\n const handlePointerUp = () => {\n const dragState = dragStateRef.current;\n if (!dragState || dragState.kind === \"resize-table\") return;\n\n if (dragState.kind === \"row\" && dragState.originIndex !== dragState.targetIndex) {\n const tableInfo = findTableInfo(editor, dragState.anchorPos);\n moveTableRow({\n from: dragState.originIndex,\n to: dragState.targetIndex,\n pos: dragState.anchorPos,\n select: true,\n })(editor.state, (transaction) => {\n const nextTable = tableInfo ? transaction.doc.nodeAt(tableInfo.pos) : null;\n if (tableInfo && nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteTableNodeFormulaReferencesForMove(\n nextTable,\n \"row\",\n dragState.originIndex,\n dragState.targetIndex,\n );\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n editor.view.dispatch(transaction);\n });\n scheduleSyncFromSelection();\n }\n\n if (dragState.kind === \"column\" && dragState.originIndex !== dragState.targetIndex) {\n const tableInfo = findTableInfo(editor, dragState.anchorPos);\n const responsiveRatios = tableInfo && normalizeTableWidthMode(tableInfo.node.attrs.widthMode) === \"responsive\"\n ? moveResponsiveColumnRatio(\n getTableColumnRatios(tableInfo.node),\n dragState.originIndex,\n dragState.targetIndex,\n )\n : null;\n moveTableColumn({\n from: dragState.originIndex,\n to: dragState.targetIndex,\n pos: dragState.anchorPos,\n select: true,\n })(editor.state, (transaction) => {\n if (tableInfo && responsiveRatios) {\n const nextTable = transaction.doc.nodeAt(tableInfo.pos);\n if (nextTable?.type.name === \"table\") {\n transaction.setNodeMarkup(tableInfo.pos, undefined, {\n ...nextTable.attrs,\n widthMode: \"responsive\",\n columnRatios: responsiveRatios,\n });\n }\n }\n const nextTable = tableInfo ? transaction.doc.nodeAt(tableInfo.pos) : null;\n if (tableInfo && nextTable?.type.name === \"table\") {\n const rewrittenTable = rewriteTableNodeFormulaReferencesForMove(\n nextTable,\n \"column\",\n dragState.originIndex,\n dragState.targetIndex,\n );\n if (rewrittenTable !== nextTable) {\n transaction.replaceWith(tableInfo.pos, tableInfo.pos + nextTable.nodeSize, rewrittenTable);\n }\n }\n editor.view.dispatch(transaction);\n });\n scheduleSyncFromSelection();\n }\n\n if (dragState.kind === \"add-row\") {\n expandTableBy(dragState.previewRows, 0);\n }\n\n if (dragState.kind === \"add-column\") {\n expandTableBy(0, dragState.previewCols);\n }\n\n clearDrag();\n };\n\n const unsubscribePointerMove = subscribeSharedGlobalEvent(\n editorWindow,\n \"pointermove\",\n handlePointerMove as EventListener,\n { passive: false },\n );\n const unsubscribePointerUp = subscribeSharedGlobalEvent(editorWindow, \"pointerup\", handlePointerUp);\n const unsubscribePointerCancel = subscribeSharedGlobalEvent(editorWindow, \"pointercancel\", clearDrag);\n const unsubscribeBlur = subscribeSharedGlobalEvent(editorWindow, \"blur\", clearDrag);\n\n return () => {\n unsubscribePointerMove();\n unsubscribePointerUp();\n unsubscribePointerCancel();\n unsubscribeBlur();\n };\n }, [clearDrag, containerRef, editor, editorDocument, editorWindow, expandTableBy, scheduleSyncFromSelection]);\n\n React.useEffect(() => {\n if (!editorWindow) return;\n const handlePointerMove = (event: PointerEvent) => {\n const dragState = dragStateRef.current;\n if (!dragState || dragState.kind !== \"resize-table\" || event.pointerId !== dragState.pointerId) return;\n\n dragState.pendingDimensions = resolveTableResizeDimensions({\n deltaX: event.clientX - dragState.startX,\n deltaY: event.clientY - dragState.startY,\n lockAxis: event.ctrlKey && !event.shiftKey,\n preserveRatio: event.ctrlKey && event.shiftKey,\n edge: dragState.edge,\n snapshot: dragState.snapshot,\n });\n\n if (tableResizePreviewFrameRef.current === null) {\n if (!editorWindow) return;\n tableResizePreviewFrameRef.current = editorWindow.requestAnimationFrame(() => {\n tableResizePreviewFrameRef.current = null;\n const currentDragState = dragStateRef.current;\n if (!currentDragState || currentDragState.kind !== \"resize-table\") return;\n updateTableResizePreview(currentDragState.pendingDimensions);\n });\n }\n\n setDocumentCursor(editorDocument, dragState.edge === \"both\" ? \"nwse-resize\" : \"ew-resize\");\n if (event.cancelable) event.preventDefault();\n };\n\n const finishTableResize = (event: PointerEvent, commit: boolean) => {\n const dragState = dragStateRef.current;\n if (!dragState || dragState.kind !== \"resize-table\" || event.pointerId !== dragState.pointerId) return;\n\n if (tableResizePreviewFrameRef.current !== null) {\n editorWindow?.cancelAnimationFrame(tableResizePreviewFrameRef.current);\n tableResizePreviewFrameRef.current = null;\n }\n updateTableResizePreview(dragState.pendingDimensions);\n\n if (commit && applyTableSize(\n editor,\n dragState.snapshot,\n dragState.pendingDimensions,\n { widthMode: dragState.snapshot.widthMode },\n )) {\n scheduleSyncFromSelection();\n }\n clearDrag();\n };\n\n const handlePointerUp = (event: PointerEvent) => finishTableResize(event, true);\n const handlePointerCancel = (event: PointerEvent) => finishTableResize(event, false);\n\n const unsubscribePointerMove = subscribeSharedGlobalEvent(\n editorWindow,\n \"pointermove\",\n handlePointerMove as EventListener,\n { passive: false },\n );\n const unsubscribePointerUp = subscribeSharedGlobalEvent(\n editorWindow,\n \"pointerup\",\n handlePointerUp as EventListener,\n );\n const unsubscribePointerCancel = subscribeSharedGlobalEvent(\n editorWindow,\n \"pointercancel\",\n handlePointerCancel as EventListener,\n );\n\n return () => {\n unsubscribePointerMove();\n unsubscribePointerUp();\n unsubscribePointerCancel();\n if (tableResizePreviewFrameRef.current !== null) {\n editorWindow?.cancelAnimationFrame(tableResizePreviewFrameRef.current);\n tableResizePreviewFrameRef.current = null;\n }\n };\n }, [clearDrag, editor, editorDocument, editorWindow, scheduleSyncFromSelection, updateTableResizePreview]);\n\n const openCellInspector = React.useCallback(() => {\n const cellPos = layoutRef.current?.cellPos;\n if (!showCellInspector || cellPos == null) return;\n\n const didSelect = editor.commands.setCellSelection({\n anchorCell: cellPos,\n headCell: cellPos,\n });\n if (!didSelect) return;\n\n editorWindow?.requestAnimationFrame(() => {\n if (!editor.isDestroyed) editor.view.focus();\n });\n }, [editor, editorWindow, showCellInspector]);\n\n const menuItems = React.useMemo(() => {\n if (!layout) return [];\n\n return [\n ...(showCellInspector\n ? [{\n label: t(\"tableMenu.cellFormatting\"),\n icon: Paintbrush,\n onClick: openCellInspector,\n }]\n : []),\n {\n label: t(\"tableMenu.fitToEditorWidth\"),\n icon: Minimize2,\n onClick: fitTableToEditorWidth,\n },\n {\n label: t(\"tableMenu.alignLeft\"),\n icon: AlignLeft,\n onClick: () => applyTableAlignment(editor, \"left\", layout.cellPos),\n },\n {\n label: t(\"tableMenu.alignCenter\"),\n icon: AlignCenter,\n onClick: () => applyTableAlignment(editor, \"center\", layout.cellPos),\n },\n {\n label: t(\"tableMenu.alignRight\"),\n icon: AlignRight,\n onClick: () => applyTableAlignment(editor, \"right\", layout.cellPos),\n },\n {\n label: t(\"tableMenu.distributeColumns\"),\n icon: Columns,\n onClick: () => distributeTableColumnsEqually(editor, layout.cellPos),\n },\n {\n label: t(\"tableMenu.distributeRows\"),\n icon: Rows,\n onClick: () => distributeTableRowsEqually(editor, layout.cellPos),\n },\n {\n label: t(\"tableMenu.distributeBoth\"),\n icon: Grid,\n onClick: () => distributeTableRowsAndColumnsEqually(editor, layout.cellPos),\n },\n {\n label: t(\"tableMenu.addColumnBefore\"),\n icon: ArrowLeft,\n onClick: () => runAtActiveCell((chain) => chain.addColumnBefore()),\n },\n {\n label: t(\"tableMenu.addColumnAfter\"),\n icon: ArrowRight,\n onClick: () => runAtActiveCell((chain) => chain.addColumnAfter()),\n },\n {\n label: t(\"tableMenu.addRowBefore\"),\n icon: ArrowUp,\n onClick: () => runAtActiveCell((chain) => chain.addRowBefore()),\n },\n {\n label: t(\"tableMenu.addRowAfter\"),\n icon: ArrowDown,\n onClick: () => runAtActiveCell((chain) => chain.addRowAfter()),\n },\n {\n label: t(\"tableMenu.toggleHeaderRow\"),\n icon: TableIcon,\n onClick: () => runAtActiveCell((chain) => chain.toggleHeaderRow()),\n },\n {\n label: t(\"tableMenu.toggleHeaderColumn\"),\n icon: TableIcon,\n onClick: () => runAtActiveCell((chain) => chain.toggleHeaderColumn()),\n },\n {\n label: t(\"tableMenu.deleteColumn\"),\n icon: Trash2,\n onClick: () => runAtActiveCell((chain) => chain.deleteColumn()),\n destructive: true,\n },\n {\n label: t(\"tableMenu.deleteRow\"),\n icon: Trash2,\n onClick: () => runAtActiveCell((chain) => chain.deleteRow()),\n destructive: true,\n },\n {\n label: t(\"tableMenu.deleteTable\"),\n icon: Trash2,\n onClick: () => runAtActiveCell((chain) => chain.deleteTable()),\n destructive: true,\n },\n ];\n }, [editor, fitTableToEditorWidth, layout, openCellInspector, runAtActiveCell, showCellInspector, t]);\n\n const getRowHandleMenuItems = React.useCallback((rowHandle: TableAxisHandle) => ([\n {\n label: t(\"tableMenu.addRowBefore\"),\n icon: ArrowUp,\n onClick: () => runAtCellPos(rowHandle.cellPos, (chain) => chain.addRowBefore()),\n },\n {\n label: t(\"tableMenu.addRowAfter\"),\n icon: ArrowDown,\n onClick: () => runAtCellPos(rowHandle.cellPos, (chain) => chain.addRowAfter()),\n },\n {\n label: t(\"tableMenu.duplicateRow\"),\n icon: Copy,\n onClick: () => duplicateRowAt(rowHandle.index, rowHandle.cellPos),\n },\n {\n label: t(\"tableMenu.distributeRows\"),\n icon: Rows,\n onClick: () => distributeTableRowsEqually(editor, rowHandle.cellPos),\n },\n {\n label: t(\"tableMenu.clearRowContents\"),\n icon: TableIcon,\n onClick: () => clearRowAt(rowHandle.index, rowHandle.cellPos),\n },\n {\n label: t(\"tableMenu.deleteRow\"),\n icon: Trash2,\n onClick: () => runAtCellPos(rowHandle.cellPos, (chain) => chain.deleteRow()),\n destructive: true,\n },\n ]), [clearRowAt, duplicateRowAt, editor, runAtCellPos, t]);\n\n const getColumnHandleMenuItems = React.useCallback((columnHandle: TableAxisHandle) => ([\n {\n label: t(\"tableMenu.addColumnBefore\"),\n icon: ArrowLeft,\n onClick: () => runAtCellPos(columnHandle.cellPos, (chain) => chain.addColumnBefore()),\n },\n {\n label: t(\"tableMenu.addColumnAfter\"),\n icon: ArrowRight,\n onClick: () => runAtCellPos(columnHandle.cellPos, (chain) => chain.addColumnAfter()),\n },\n {\n label: t(\"tableMenu.duplicateColumn\"),\n icon: Copy,\n onClick: () => duplicateColumnAt(columnHandle.index, columnHandle.cellPos),\n },\n {\n label: t(\"tableMenu.distributeColumns\"),\n icon: Columns,\n onClick: () => distributeTableColumnsEqually(editor, columnHandle.cellPos),\n },\n {\n label: t(\"tableMenu.clearColumnContents\"),\n icon: TableIcon,\n onClick: () => clearColumnAt(columnHandle.index, columnHandle.cellPos),\n },\n {\n label: t(\"tableMenu.deleteColumn\"),\n icon: Trash2,\n onClick: () => runAtCellPos(columnHandle.cellPos, (chain) => chain.deleteColumn()),\n destructive: true,\n },\n ]), [clearColumnAt, duplicateColumnAt, editor, runAtCellPos, t]);\n\n if (!layout) {\n return null;\n }\n\n const menuTop = Math.max(8, layout.tableTop - TABLE_MENU_TOP_OFFSET);\n const menuLeft = Math.max(8, layout.tableLeft);\n // Visually center the axis handles on the table border. Hover hit testing\n // remains restricted to the outside half so the inside half cannot compete\n // with text selection.\n const rowHandleLeft = layout.tableLeft - AXIS_HANDLE_RADIUS;\n const columnHandleTop = layout.tableTop - AXIS_HANDLE_RADIUS;\n\n return (\n <>\n <TableRowHandles\n activeRowIndex={layout.activeRowIndex}\n controlsVisible={controlsVisible}\n getMenuItems={getRowHandleMenuItems}\n hoverRowHandleIndex={hoverState.rowHandleIndex}\n onOpenMenuChange={(menuKey, open) => {\n setOpenMenuKey((prev) => (open ? menuKey as OpenMenuKey : prev === menuKey ? null : prev));\n }}\n onMove={moveRowWithKeyboard}\n onStartDrag={startRowDrag}\n openMenuKey={openMenuKey}\n rowDragLabel={t(\"tableMenu.dragRow\")}\n rowHandleLeft={rowHandleLeft}\n rowHandles={layout.rowHandles}\n />\n\n <TableColumnHandles\n activeColumnIndex={layout.activeColumnIndex}\n columnDragLabel={t(\"tableMenu.dragColumn\")}\n columnHandleTop={columnHandleTop}\n columnHandles={layout.columnHandles}\n controlsVisible={controlsVisible}\n getMenuItems={getColumnHandleMenuItems}\n hoverColumnHandleIndex={hoverState.columnHandleIndex}\n onOpenMenuChange={(menuKey, open) => {\n setOpenMenuKey((prev) => (open ? menuKey as OpenMenuKey : prev === menuKey ? null : prev));\n }}\n onMove={moveColumnWithKeyboard}\n onStartDrag={startColumnDrag}\n openMenuKey={openMenuKey}\n />\n\n <TableControlMenu\n controlsVisible={controlsVisible}\n isOpen={tableMenuOpen}\n items={menuItems}\n label={t(\"tableMenu.openControls\")}\n left={menuLeft}\n menuVisible={hoverState.menuVisible}\n onOpenChange={(open) => {\n setOpenMenuKey((prev) => (open ? \"table\" : prev === \"table\" ? null : prev));\n }}\n top={menuTop}\n />\n\n {dragPreview === null && (\n <TableResizeHandles\n active={tableResizeActive}\n ctrlHint={t(\"tableMenu.resizeCtrlHint\")}\n frameRef={tableResizeFrameRef}\n layout={layout}\n onFitWidth={fitTableToEditorWidth}\n onKeyboardResize={resizeTableWithKeyboard}\n onStartResize={startTableResize}\n resizeBothLabel={t(\"tableMenu.resizeBoth\")}\n />\n )}\n\n <TableAddRails\n addColumnVisible={hoverState.addColumnVisible}\n addRowVisible={hoverState.addRowVisible}\n canExpandTable={canExpandTable}\n controlsVisible={controlsVisible}\n layout={layout}\n onStartAddColumn={startAddColumnDrag}\n onStartAddRow={startAddRowDrag}\n onAddColumn={() => expandTableBy(0, 1)}\n onAddRow={() => expandTableBy(1, 0)}\n quickAddColumnLabel={t(\"tableMenu.quickAddColumnAfter\")}\n quickAddRowLabel={t(\"tableMenu.quickAddRowAfter\")}\n />\n\n <TableDragPreview\n columnDragLabel={t(\"tableMenu.dragColumn\")}\n dragPreview={dragPreview}\n layout={layout}\n rowDragLabel={t(\"tableMenu.dragRow\")}\n />\n </>\n );\n}\n\nexport default TableControls;\n","import { isCrossRealmHTMLElement, resolveEventElement } from \"./table-dom-utils\";\nimport { getVisibleTableBounds, type TableControlLayout } from \"./table-layout-model\";\n\nconst MENU_HOVER_PADDING = 18;\nconst ROW_HANDLE_HOVER_WIDTH = 28;\nconst COLUMN_HANDLE_HOVER_HEIGHT = 28;\nconst ADD_COLUMN_HOVER_WIDTH = 24;\nconst ADD_ROW_HOVER_HEIGHT = 24;\nconst HANDLE_HOVER_RADIUS = 14;\n\nfunction isHTMLElement(element: Element | null | undefined): element is HTMLElement {\n return isCrossRealmHTMLElement(element);\n}\n\nexport type TableHoverState = {\n menuVisible: boolean;\n addColumnVisible: boolean;\n addRowVisible: boolean;\n rowHandleIndex: number | null;\n columnHandleIndex: number | null;\n};\n\nexport const DEFAULT_TABLE_HOVER_STATE: TableHoverState = {\n menuVisible: false,\n addColumnVisible: false,\n addRowVisible: false,\n rowHandleIndex: null,\n columnHandleIndex: null,\n};\n\nexport function areTableHoverStatesEqual(left: TableHoverState, right: TableHoverState) {\n return left.menuVisible === right.menuVisible\n && left.addColumnVisible === right.addColumnVisible\n && left.addRowVisible === right.addRowVisible\n && left.rowHandleIndex === right.rowHandleIndex\n && left.columnHandleIndex === right.columnHandleIndex;\n}\n\nexport function buildTableHoverState({\n event,\n layout,\n surface,\n}: {\n event: MouseEvent | PointerEvent;\n layout: TableControlLayout;\n surface: HTMLDivElement;\n}): TableHoverState {\n // A pressed primary pointer inside the editor is normally selecting text.\n // Do not let table chrome appear underneath that gesture. Table control\n // drags are already kept visible by their dedicated drag state.\n if (event.buttons !== 0) {\n return DEFAULT_TABLE_HOVER_STATE;\n }\n\n const surfaceRect = surface.getBoundingClientRect();\n const relativeX = event.clientX - surfaceRect.left - surface.clientLeft + surface.scrollLeft;\n const relativeY = event.clientY - surfaceRect.top - surface.clientTop + surface.scrollTop;\n const targetElement = resolveEventElement(event.target);\n\n const directRowHandle = targetElement?.closest?.(\"[data-row-handle-index]\");\n const directColumnHandle = targetElement?.closest?.(\"[data-column-handle-index]\");\n const directTableMenu = targetElement?.closest?.(\"[data-table-control='table-menu']\");\n const directAddColumn = targetElement?.closest?.(\"[data-table-control='add-column']\");\n const directAddRow = targetElement?.closest?.(\"[data-table-control='add-row']\");\n\n const directRowHandleIndex = isHTMLElement(directRowHandle) && relativeX <= layout.tableLeft\n ? Number.parseInt(directRowHandle.dataset.rowHandleIndex ?? \"\", 10)\n : Number.NaN;\n const directColumnHandleIndex = isHTMLElement(directColumnHandle) && relativeY <= layout.tableTop\n ? Number.parseInt(directColumnHandle.dataset.columnHandleIndex ?? \"\", 10)\n : Number.NaN;\n const visibleBounds = getVisibleTableBounds(layout);\n const rowRailTop = layout.wrapperTop + layout.wrapperHeight;\n\n const isMouseInTable = relativeX >= layout.tableLeft\n && relativeX <= layout.tableLeft + layout.tableWidth\n && relativeY >= layout.tableTop\n && relativeY <= layout.tableTop + layout.tableHeight;\n\n const rowHandleIndex = Number.isFinite(directRowHandleIndex)\n ? directRowHandleIndex\n : layout.rowHandles.find((rowHandle) => (\n relativeX >= layout.tableLeft - ROW_HANDLE_HOVER_WIDTH\n && relativeX <= layout.tableLeft\n && Math.abs(relativeY - rowHandle.center) <= HANDLE_HOVER_RADIUS\n ))?.index ?? null;\n\n const columnHandleIndex = Number.isFinite(directColumnHandleIndex)\n ? directColumnHandleIndex\n : layout.columnHandles.find((columnHandle) => (\n relativeY >= layout.tableTop - COLUMN_HANDLE_HOVER_HEIGHT\n && relativeY <= layout.tableTop\n && Math.abs(relativeX - columnHandle.center) <= HANDLE_HOVER_RADIUS\n ))?.index ?? null;\n\n const menuVisible = Boolean(directTableMenu) || isMouseInTable || (\n relativeX >= layout.tableLeft - MENU_HOVER_PADDING\n && relativeX <= layout.tableLeft + 42\n && relativeY >= layout.tableTop - COLUMN_HANDLE_HOVER_HEIGHT\n && relativeY <= layout.tableTop + MENU_HOVER_PADDING\n );\n\n const lastRow = layout.rowHandles[layout.rowHandles.length - 1];\n const lastCol = layout.columnHandles[layout.columnHandles.length - 1];\n\n const isMouseInLastColumn = lastCol\n ? relativeX >= lastCol.start\n && relativeX <= lastCol.start + lastCol.size\n && relativeY >= visibleBounds.top\n && relativeY <= visibleBounds.bottom\n : false;\n\n const addColumnVisible = Boolean(directAddColumn) || (\n relativeX >= visibleBounds.right\n && relativeX <= visibleBounds.right + ADD_COLUMN_HOVER_WIDTH\n && relativeY >= visibleBounds.top\n && relativeY <= visibleBounds.bottom\n ) || isMouseInLastColumn;\n\n const isMouseInLastRow = lastRow\n ? relativeY >= lastRow.start\n && relativeY <= lastRow.start + lastRow.size\n && relativeX >= visibleBounds.left\n && relativeX <= visibleBounds.right\n : false;\n\n const addRowVisible = Boolean(directAddRow) || (\n relativeY >= rowRailTop\n && relativeY <= rowRailTop + ADD_ROW_HOVER_HEIGHT\n && relativeX >= visibleBounds.left\n && relativeX <= visibleBounds.right\n ) || isMouseInLastRow;\n\n return {\n menuVisible,\n addColumnVisible,\n addRowVisible,\n rowHandleIndex,\n columnHandleIndex,\n };\n}\n","import type { TableControlLayout } from \"./table-layout-model\";\n\nexport type TableDragPreviewState =\n | { kind: \"row\"; originIndex: number; targetIndex: number; targetStart: number; targetSize: number }\n | { kind: \"column\"; originIndex: number; targetIndex: number; targetStart: number; targetSize: number }\n | { kind: \"add-row\"; previewRows: number }\n | { kind: \"add-column\"; previewCols: number };\n\nexport function TableDragPreview({\n columnDragLabel,\n dragPreview,\n layout,\n rowDragLabel,\n}: {\n columnDragLabel: string;\n dragPreview: TableDragPreviewState | null;\n layout: TableControlLayout;\n rowDragLabel: string;\n}) {\n if (!dragPreview) return null;\n\n const expandPreviewWidth = dragPreview.kind === \"add-column\"\n ? layout.tableWidth + dragPreview.previewCols * layout.avgColumnWidth\n : layout.tableWidth;\n const expandPreviewHeight = dragPreview.kind === \"add-row\"\n ? layout.tableHeight + dragPreview.previewRows * layout.avgRowHeight\n : layout.tableHeight;\n const dragStatusText = dragPreview.kind === \"row\"\n ? `${rowDragLabel} ${dragPreview.originIndex + 1} -> ${dragPreview.targetIndex + 1}`\n : dragPreview.kind === \"column\"\n ? `${columnDragLabel} ${dragPreview.originIndex + 1} -> ${dragPreview.targetIndex + 1}`\n : dragPreview.kind === \"add-row\"\n ? `+${dragPreview.previewRows}R`\n : `+${dragPreview.previewCols}C`;\n\n return (\n <>\n {dragPreview.kind === \"row\" && (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 rounded-lg border border-primary/20 bg-primary/10\"\n style={{\n top: dragPreview.targetStart,\n left: layout.tableLeft,\n width: layout.tableWidth,\n height: dragPreview.targetSize,\n }}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 rounded-full bg-primary/80\"\n style={{\n top: dragPreview.targetStart + dragPreview.targetSize / 2 - 1,\n left: layout.tableLeft,\n width: layout.tableWidth,\n height: 2,\n }}\n />\n </>\n )}\n\n {dragPreview.kind === \"column\" && (\n <>\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 rounded-lg border border-primary/20 bg-primary/10\"\n style={{\n top: layout.tableTop,\n left: dragPreview.targetStart,\n width: dragPreview.targetSize,\n height: layout.tableHeight,\n }}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 rounded-full bg-primary/80\"\n style={{\n top: layout.tableTop,\n left: dragPreview.targetStart + dragPreview.targetSize / 2 - 1,\n width: 2,\n height: layout.tableHeight,\n }}\n />\n </>\n )}\n\n {(dragPreview.kind === \"add-row\" || dragPreview.kind === \"add-column\") && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute z-20 rounded-xl border border-dashed border-primary/70 bg-primary/5\"\n style={{\n top: layout.tableTop,\n left: layout.tableLeft,\n width: expandPreviewWidth,\n height: expandPreviewHeight,\n }}\n />\n )}\n\n <div\n role=\"status\"\n className=\"pointer-events-none absolute z-30 rounded-full border border-primary/20 bg-background/95 px-2 py-1 text-[11px] font-medium text-foreground shadow-sm backdrop-blur\"\n style={{\n top: dragPreview.kind === \"add-row\" || dragPreview.kind === \"add-column\" ? layout.tableTop + expandPreviewHeight + 8 : layout.tableTop - 40,\n left: dragPreview.kind === \"add-row\" || dragPreview.kind === \"add-column\"\n ? layout.tableLeft + Math.max(0, expandPreviewWidth - 84)\n : layout.tableLeft + Math.max(0, layout.tableWidth - 108),\n }}\n >\n {dragStatusText}\n </div>\n </>\n );\n}\n","import type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Tooltip } from \"../Tooltip\";\nimport { getVisibleTableBounds, type TableControlLayout } from \"./table-layout-model\";\n\nconst ADD_COLUMN_RAIL_GAP = 4;\nconst ADD_ROW_RAIL_GAP = 4;\nconst BUTTON_LONG_SIZE = 36;\nconst BUTTON_SHORT_SIZE = 14;\n\nexport function TableAddRails({\n addColumnVisible,\n addRowVisible,\n canExpandTable,\n controlsVisible,\n layout,\n onStartAddColumn,\n onStartAddRow,\n onAddColumn,\n onAddRow,\n quickAddColumnLabel,\n quickAddRowLabel,\n}: {\n addColumnVisible: boolean;\n addRowVisible: boolean;\n canExpandTable: boolean;\n controlsVisible: boolean;\n layout: TableControlLayout;\n onStartAddColumn: (event: React.PointerEvent<HTMLButtonElement>) => void;\n onStartAddRow: (event: React.PointerEvent<HTMLButtonElement>) => void;\n onAddColumn: () => void;\n onAddRow: () => void;\n quickAddColumnLabel: string;\n quickAddRowLabel: string;\n}) {\n const visibleBounds = getVisibleTableBounds(layout);\n const columnRailTop = visibleBounds.top + Math.max(0, (visibleBounds.height - BUTTON_LONG_SIZE) / 2);\n const columnRailLeft = visibleBounds.right + ADD_COLUMN_RAIL_GAP;\n const rowRailTop = layout.wrapperTop + layout.wrapperHeight + ADD_ROW_RAIL_GAP;\n const rowRailLeft = visibleBounds.left + Math.max(0, (visibleBounds.width - BUTTON_LONG_SIZE) / 2);\n const showColumnRail = controlsVisible || addColumnVisible;\n const showRowRail = controlsVisible || addRowVisible;\n\n return (\n <>\n <Tooltip\n placement=\"right\"\n content={<span className=\"text-xs font-medium\">{quickAddColumnLabel}</span>}\n >\n <button\n type=\"button\"\n data-table-control=\"add-column\"\n aria-label={quickAddColumnLabel}\n tabIndex={showColumnRail ? 0 : -1}\n onPointerDown={onStartAddColumn}\n onClick={(event) => {\n if (event.detail === 0 && canExpandTable) onAddColumn();\n }}\n disabled={!canExpandTable}\n className={cn(\n \"absolute z-30 inline-flex items-center justify-center rounded-md\",\n \"border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur\",\n \"transition-[opacity,transform,color,border-color,background-color] duration-200 delay-100 ease-out motion-reduce:transition-none cursor-pointer hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed\",\n )}\n style={{\n top: columnRailTop,\n // An invisible rail must not sit outside the table: even at\n // opacity 0 its box would otherwise create a horizontal scrollbar.\n left: showColumnRail ? columnRailLeft : Math.max(visibleBounds.left, visibleBounds.right - BUTTON_SHORT_SIZE),\n width: BUTTON_SHORT_SIZE,\n height: BUTTON_LONG_SIZE,\n opacity: showColumnRail ? 1 : 0,\n transform: showColumnRail ? \"scale(1)\" : \"scale(0.85)\",\n pointerEvents: showColumnRail ? \"auto\" : \"none\",\n }}\n >\n <span className=\"text-sm font-medium leading-none\">+</span>\n </button>\n </Tooltip>\n\n <Tooltip\n placement=\"bottom\"\n content={<span className=\"text-xs font-medium\">{quickAddRowLabel}</span>}\n >\n <button\n type=\"button\"\n data-table-control=\"add-row\"\n aria-label={quickAddRowLabel}\n tabIndex={showRowRail ? 0 : -1}\n onPointerDown={onStartAddRow}\n onClick={(event) => {\n if (event.detail === 0 && canExpandTable) onAddRow();\n }}\n disabled={!canExpandTable}\n className={cn(\n \"absolute z-30 inline-flex items-center justify-center rounded-md\",\n \"border border-border/70 bg-muted/40 text-muted-foreground shadow-sm backdrop-blur\",\n \"transition-[opacity,transform,color,border-color,background-color] duration-200 delay-100 ease-out motion-reduce:transition-none cursor-pointer hover:bg-accent hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed\",\n )}\n style={{\n top: rowRailTop,\n left: rowRailLeft,\n width: BUTTON_LONG_SIZE,\n height: BUTTON_SHORT_SIZE,\n opacity: showRowRail ? 1 : 0,\n transform: showRowRail ? \"scale(1)\" : \"scale(0.85)\",\n pointerEvents: showRowRail ? \"auto\" : \"none\",\n }}\n >\n <span className=\"text-sm font-medium leading-none\">+</span>\n </button>\n </Tooltip>\n </>\n );\n}\n","import { MoreHorizontal } from \"lucide-react\";\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DropdownMenu } from \"../DropdownMenu\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport function TableControlMenu({\n controlsVisible,\n isOpen,\n items,\n label,\n left,\n menuVisible,\n onOpenChange,\n top,\n}: {\n controlsVisible: boolean;\n isOpen: boolean;\n items: React.ComponentProps<typeof DropdownMenu>[\"items\"];\n label: string;\n left: number;\n menuVisible: boolean;\n onOpenChange: (open: boolean) => void;\n top: number;\n}) {\n const shown = controlsVisible || menuVisible || isOpen;\n\n return (\n <div\n className=\"absolute z-30\"\n data-table-control=\"table-menu\"\n style={{\n top,\n left,\n }}\n >\n <Tooltip\n placement=\"top\"\n disabled={isOpen}\n content={<span className=\"text-xs font-medium\">{label}</span>}\n >\n <span className=\"inline-flex\">\n <DropdownMenu\n placement=\"bottom-start\"\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n contentClassName=\"p-2\"\n items={items}\n trigger={(\n <button\n type=\"button\"\n aria-label={label}\n onMouseDown={(event) => event.preventDefault()}\n className={cn(\n \"pointer-events-auto inline-flex h-7 w-7 items-center justify-center rounded-full\",\n \"border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur\",\n \"transition-[opacity,transform,colors] duration-150 hover:bg-accent hover:text-foreground\",\n )}\n style={{\n opacity: shown ? 1 : 0,\n transform: shown ? \"scale(1)\" : \"scale(0.82)\",\n pointerEvents: shown ? \"auto\" : \"none\",\n }}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n )}\n />\n </span>\n </Tooltip>\n </div>\n );\n}\n","import { GripHorizontal, GripVertical } from \"lucide-react\";\nimport type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { DropdownMenu } from \"../DropdownMenu\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { TableAxisHandle } from \"./table-layout-model\";\n\nconst IDLE_HANDLE_SCALE = \"0.78\";\n\ntype DropdownItems = React.ComponentProps<typeof DropdownMenu>[\"items\"];\n\nexport function TableRowHandles({\n activeRowIndex,\n controlsVisible,\n getMenuItems,\n hoverRowHandleIndex,\n onOpenMenuChange,\n onMove,\n onStartDrag,\n openMenuKey,\n rowDragLabel,\n rowHandleLeft,\n rowHandles,\n}: {\n activeRowIndex: number;\n controlsVisible: boolean;\n getMenuItems: (rowHandle: TableAxisHandle) => DropdownItems;\n hoverRowHandleIndex: number | null;\n onOpenMenuChange: (menuKey: string, open: boolean) => void;\n onMove: (rowHandle: TableAxisHandle, direction: -1 | 1) => void;\n onStartDrag: (event: React.PointerEvent<HTMLButtonElement>, rowHandle: TableAxisHandle) => void;\n openMenuKey: string | null;\n rowDragLabel: string;\n rowHandleLeft: number;\n rowHandles: TableAxisHandle[];\n}) {\n return (\n <>\n {rowHandles.map((rowHandle) => {\n const menuKey = `row:${rowHandle.index}`;\n const isActive = rowHandle.index === activeRowIndex;\n const visible = controlsVisible || hoverRowHandleIndex === rowHandle.index || openMenuKey === menuKey;\n const isShown = visible || isActive;\n\n return (\n <div\n key={`row-handle-${rowHandle.index}`}\n className=\"absolute z-30\"\n data-row-handle-index={rowHandle.index}\n style={{\n top: Math.max(8, rowHandle.center - 12),\n left: rowHandleLeft,\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n <Tooltip\n placement=\"right\"\n disabled={openMenuKey === menuKey || (!visible && isActive)}\n content={<span className=\"text-xs font-medium\">{`${rowDragLabel} ${rowHandle.index + 1}`}</span>}\n >\n <span className=\"inline-flex\">\n <DropdownMenu\n placement=\"right\"\n isOpen={openMenuKey === menuKey}\n onOpenChange={(open) => onOpenMenuChange(menuKey, open)}\n contentClassName=\"p-2\"\n items={getMenuItems(rowHandle)}\n trigger={(\n <button\n type=\"button\"\n aria-label={`${rowDragLabel} ${rowHandle.index + 1}`}\n tabIndex={visible ? 0 : -1}\n onPointerDown={(event) => onStartDrag(event, rowHandle)}\n onKeyDown={(event) => {\n if (!event.altKey || (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\")) return;\n event.preventDefault();\n event.stopPropagation();\n onMove(rowHandle, event.key === \"ArrowUp\" ? -1 : 1);\n }}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-full transition-[opacity,transform,color,border-color,background-color] duration-200 delay-100 ease-out motion-reduce:transition-none\",\n visible\n ? \"border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur hover:bg-accent hover:text-foreground cursor-grab active:cursor-grabbing\"\n : \"border-transparent bg-transparent cursor-pointer\",\n )}\n style={{\n opacity: isShown ? 1 : 0,\n transform: isShown ? \"scale(1)\" : `scale(${IDLE_HANDLE_SCALE})`,\n // The idle marker is only a location hint. Keeping it\n // pointer-transparent prevents it from stealing a text\n // selection near the first character of a table cell.\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n {visible ? (\n <GripVertical aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <div className=\"h-3 w-1 rounded-full bg-muted-foreground/50 hover:bg-muted-foreground\" />\n )}\n </button>\n )}\n />\n </span>\n </Tooltip>\n </div>\n );\n })}\n </>\n );\n}\n\nexport function TableColumnHandles({\n activeColumnIndex,\n columnDragLabel,\n columnHandleTop,\n columnHandles,\n controlsVisible,\n getMenuItems,\n hoverColumnHandleIndex,\n onOpenMenuChange,\n onMove,\n onStartDrag,\n openMenuKey,\n}: {\n activeColumnIndex: number;\n columnDragLabel: string;\n columnHandleTop: number;\n columnHandles: TableAxisHandle[];\n controlsVisible: boolean;\n getMenuItems: (columnHandle: TableAxisHandle) => DropdownItems;\n hoverColumnHandleIndex: number | null;\n onOpenMenuChange: (menuKey: string, open: boolean) => void;\n onMove: (columnHandle: TableAxisHandle, direction: -1 | 1) => void;\n onStartDrag: (event: React.PointerEvent<HTMLButtonElement>, columnHandle: TableAxisHandle) => void;\n openMenuKey: string | null;\n}) {\n return (\n <>\n {columnHandles.map((columnHandle) => {\n const menuKey = `column:${columnHandle.index}`;\n const isActive = columnHandle.index === activeColumnIndex;\n const visible = controlsVisible || hoverColumnHandleIndex === columnHandle.index || openMenuKey === menuKey;\n const isShown = visible || isActive;\n\n return (\n <div\n key={`column-handle-${columnHandle.index}`}\n className=\"absolute z-30\"\n data-column-handle-index={columnHandle.index}\n style={{\n top: columnHandleTop,\n left: Math.max(8, columnHandle.center - 12),\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n <Tooltip\n placement=\"top\"\n disabled={openMenuKey === menuKey || (!visible && isActive)}\n content={<span className=\"text-xs font-medium\">{`${columnDragLabel} ${columnHandle.index + 1}`}</span>}\n >\n <span className=\"inline-flex\">\n <DropdownMenu\n placement=\"bottom-start\"\n isOpen={openMenuKey === menuKey}\n onOpenChange={(open) => onOpenMenuChange(menuKey, open)}\n contentClassName=\"p-2\"\n items={getMenuItems(columnHandle)}\n trigger={(\n <button\n type=\"button\"\n aria-label={`${columnDragLabel} ${columnHandle.index + 1}`}\n tabIndex={visible ? 0 : -1}\n onPointerDown={(event) => onStartDrag(event, columnHandle)}\n onKeyDown={(event) => {\n if (!event.altKey || (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\")) return;\n event.preventDefault();\n event.stopPropagation();\n onMove(columnHandle, event.key === \"ArrowLeft\" ? -1 : 1);\n }}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-full transition-[opacity,transform,color,border-color,background-color] duration-200 delay-100 ease-out motion-reduce:transition-none\",\n visible\n ? \"border border-border/70 bg-background/95 text-muted-foreground shadow-sm backdrop-blur hover:bg-accent hover:text-foreground cursor-grab active:cursor-grabbing\"\n : \"border-transparent bg-transparent cursor-pointer\",\n )}\n style={{\n opacity: isShown ? 1 : 0,\n transform: isShown ? \"scale(1)\" : `scale(${IDLE_HANDLE_SCALE})`,\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n {visible ? (\n <GripHorizontal aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n <div className=\"h-1 w-3 rounded-full bg-muted-foreground/50 hover:bg-muted-foreground\" />\n )}\n </button>\n )}\n />\n </span>\n </Tooltip>\n </div>\n );\n })}\n </>\n );\n}\n","import type React from \"react\";\nimport { MoveDiagonal2 } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport type { TableControlLayout } from \"./table-layout-model\";\nimport { formatBasisPointsAsPercentage, TABLE_WIDTH_BASIS_POINTS, type UEditorTableWidthMode } from \"./table-width-model\";\n\nconst EDGE_HANDLE_CLASS = cn(\n \"pointer-events-auto absolute top-0 z-10 h-full w-2 touch-none cursor-col-resize bg-transparent p-0\",\n \"border-transparent transition-colors duration-150 hover:border-primary\",\n \"focus-visible:border-primary focus-visible:outline-none\",\n);\n\nconst CORNER_HANDLE_CLASS = cn(\n \"pointer-events-auto absolute z-10 inline-flex touch-none items-center justify-center p-0\",\n \"text-primary/70 transition-[color,transform] duration-150 hover:text-primary active:scale-95\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n);\n\nexport function formatTableResizeDimensionLabel({\n width,\n height,\n widthBp,\n widthMode,\n viewportWidth,\n}: {\n width: number;\n height: number;\n widthBp?: number;\n widthMode: UEditorTableWidthMode;\n viewportWidth: number;\n}) {\n const widthLabel = widthMode === \"responsive\"\n ? formatBasisPointsAsPercentage(\n widthBp ?? (Math.max(1, width) / Math.max(1, viewportWidth)) * TABLE_WIDTH_BASIS_POINTS,\n )\n : `${Math.round(width)}px`;\n return `${widthLabel} × ${Math.round(height)}px`;\n}\n\nexport function TableResizeHandles({\n active,\n ctrlHint,\n frameRef,\n layout,\n onFitWidth,\n onKeyboardResize,\n onStartResize,\n resizeBothLabel,\n}: {\n active: boolean;\n ctrlHint: string;\n frameRef: React.RefObject<HTMLDivElement | null>;\n layout: TableControlLayout;\n onFitWidth: (event: React.MouseEvent<HTMLButtonElement>) => void;\n onKeyboardResize: (event: React.KeyboardEvent<HTMLButtonElement>, edge: \"both\" | \"left\" | \"right\") => void;\n onStartResize: (event: React.PointerEvent<HTMLButtonElement>, edge: \"both\" | \"left\" | \"right\") => void;\n resizeBothLabel: string;\n}) {\n return (\n <div\n ref={frameRef}\n data-table-resize-frame=\"\"\n data-resizing={active ? \"true\" : \"false\"}\n className={cn(\n \"pointer-events-none absolute z-[38] box-border border border-transparent\",\n active && \"border-primary bg-primary/3\",\n )}\n style={{\n left: layout.tableLeft,\n top: layout.tableTop,\n width: layout.tableWidth,\n height: layout.tableHeight,\n }}\n >\n {layout.widthMode === \"responsive\" ? (\n <>\n <button\n type=\"button\"\n aria-label={`${resizeBothLabel} — ←`}\n title={resizeBothLabel}\n data-table-resize-handle=\"left\"\n className={cn(\n EDGE_HANDLE_CLASS,\n \"left-0 border-l-2\",\n )}\n onPointerDown={(event) => onStartResize(event, \"left\")}\n onKeyDown={(event) => onKeyboardResize(event, \"left\")}\n />\n <button\n type=\"button\"\n aria-label={`${resizeBothLabel} — →`}\n title={resizeBothLabel}\n data-table-resize-handle=\"right\"\n className={cn(\n EDGE_HANDLE_CLASS,\n \"right-0 border-r-2\",\n )}\n onPointerDown={(event) => onStartResize(event, \"right\")}\n onKeyDown={(event) => onKeyboardResize(event, \"right\")}\n />\n </>\n ) : null}\n <button\n type=\"button\"\n aria-label={resizeBothLabel}\n title={`${resizeBothLabel}. ${ctrlHint}`}\n data-table-resize-handle=\"both\"\n className={cn(\n CORNER_HANDLE_CLASS,\n \"bottom-[-28px] right-0 h-6 w-6 cursor-nwse-resize\",\n active && \"text-primary\",\n )}\n onDoubleClick={onFitWidth}\n onClick={(event) => {\n if (event.detail === 0) onFitWidth(event);\n }}\n onPointerDown={(event) => onStartResize(event, \"both\")}\n onKeyDown={(event) => onKeyboardResize(event, \"both\")}\n >\n <MoveDiagonal2 aria-hidden=\"true\" className=\"h-3.5 w-3.5\" strokeWidth={2.25} />\n </button>\n {active ? (\n <span\n role=\"status\"\n aria-live=\"polite\"\n data-table-resize-dimensions=\"\"\n className=\"absolute bottom-2 right-2 rounded bg-foreground/85 px-1.5 py-0.5 text-[10px] font-medium text-background shadow-sm\"\n >\n {formatTableResizeDimensionLabel({\n width: layout.tableWidth,\n height: layout.tableHeight,\n widthMode: layout.widthMode,\n viewportWidth: layout.viewportWidth,\n })}\n </span>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport {\n COLUMN_RESIZE_LINE_THICKNESS,\n getRelativeBoundaryMetrics,\n getRelativeCellMetrics,\n getRelativeSelectedCellsMetrics,\n getSelectionTableCell,\n isColumnResizeHotspot,\n isRowResizeHotspot,\n resolveColumnResizeTarget,\n resolveEventElement,\n resolveRowResizeTarget,\n ROW_RESIZE_LINE_THICKNESS,\n UEDITOR_TABLE_LAYOUT_CHANGE_EVENT,\n isCrossRealmElement,\n isCrossRealmHTMLElement,\n isCrossRealmTable,\n isCrossRealmTableCell,\n isCrossRealmTableRow,\n} from \"./table-dom-utils\";\nimport { useTableRowResize } from \"./use-table-row-resize\";\nimport { subscribeSharedGlobalEvent } from \"./shared-global-listeners\";\n\nexport function useUEditorTableInteractions(editor: Editor | null, editable = true) {\n const editorContentRef = useRef<HTMLDivElement | null>(null);\n const tableColumnGuideRef = useRef<HTMLSpanElement | null>(null);\n const tableRowGuideRef = useRef<HTMLSpanElement | null>(null);\n const activeTableCellHighlightRef = useRef<HTMLSpanElement | null>(null);\n const hoveredTableCellRef = useRef<HTMLElement | null>(null);\n const activeTableCellRef = useRef<HTMLElement | null>(null);\n const suppressActiveCellHighlightRef = useRef(false);\n const tableLayoutSyncFrameRef = useRef<number | null>(null);\n\n const getProseMirrorElement = React.useCallback(() => {\n return editorContentRef.current?.querySelector(\".ProseMirror\") as HTMLElement | null;\n }, []);\n\n const setEditorResizeCursor = React.useCallback((cursor: string) => {\n const proseMirror = getProseMirrorElement();\n if (proseMirror) {\n proseMirror.style.cursor = cursor;\n }\n }, [getProseMirrorElement]);\n\n const hideColumnGuide = React.useCallback(() => {\n editorContentRef.current?.classList.remove(\"resize-cursor\");\n getProseMirrorElement()?.classList.remove(\"resize-cursor\");\n const guide = tableColumnGuideRef.current;\n if (guide) {\n guide.style.opacity = \"0\";\n }\n }, [getProseMirrorElement]);\n\n const hideRowGuide = React.useCallback(() => {\n editorContentRef.current?.classList.remove(\"resize-row-cursor\");\n getProseMirrorElement()?.classList.remove(\"resize-row-cursor\");\n const guide = tableRowGuideRef.current;\n if (guide) {\n guide.style.opacity = \"0\";\n }\n }, [getProseMirrorElement]);\n\n const hotspotTimerRef = useRef<number | null>(null);\n const activeHotspotKeyRef = useRef<string | null>(null);\n\n const clearHotspotTimer = React.useCallback(() => {\n if (hotspotTimerRef.current !== null) {\n const realm = editorContentRef.current?.ownerDocument.defaultView;\n realm?.clearTimeout(hotspotTimerRef.current);\n hotspotTimerRef.current = null;\n }\n }, []);\n\n const clearAllTableResizeHover = React.useCallback(() => {\n clearHotspotTimer();\n activeHotspotKeyRef.current = null;\n setEditorResizeCursor(\"\");\n hideColumnGuide();\n hideRowGuide();\n }, [clearHotspotTimer, hideColumnGuide, hideRowGuide, setEditorResizeCursor]);\n\n const updateActiveCellHighlight = React.useCallback((cell: HTMLElement | null) => {\n const surface = editorContentRef.current;\n const highlight = activeTableCellHighlightRef.current;\n if (!highlight) return;\n\n if (suppressActiveCellHighlightRef.current || !surface || !cell) {\n highlight.style.display = \"none\";\n return;\n }\n\n const metrics = getRelativeSelectedCellsMetrics(surface) ?? getRelativeCellMetrics(surface, cell);\n highlight.style.display = \"block\";\n highlight.style.left = `${metrics.left}px`;\n highlight.style.top = `${metrics.top}px`;\n highlight.style.width = `${metrics.width}px`;\n highlight.style.height = `${metrics.height}px`;\n }, []);\n\n const scheduleTableLayoutSync = React.useCallback(() => {\n if (!activeTableCellRef.current || tableLayoutSyncFrameRef.current !== null) return;\n\n const realm = editorContentRef.current?.ownerDocument.defaultView;\n if (!realm) return;\n tableLayoutSyncFrameRef.current = realm.requestAnimationFrame(() => {\n tableLayoutSyncFrameRef.current = null;\n const activeCell = activeTableCellRef.current;\n if (!activeCell) return;\n\n updateActiveCellHighlight(activeCell);\n editorContentRef.current?.dispatchEvent(new realm.CustomEvent(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT));\n });\n }, [updateActiveCellHighlight]);\n\n const setActiveTableCell = React.useCallback((cell: HTMLElement | null) => {\n if (activeTableCellRef.current === cell) {\n updateActiveCellHighlight(cell);\n return;\n }\n\n activeTableCellRef.current = cell;\n updateActiveCellHighlight(activeTableCellRef.current);\n }, [updateActiveCellHighlight]);\n\n const clearActiveTableCell = React.useCallback(() => {\n activeTableCellRef.current = null;\n updateActiveCellHighlight(null);\n }, [updateActiveCellHighlight]);\n\n const setHoveredTableCell = React.useCallback((cell: HTMLElement | null) => {\n hoveredTableCellRef.current = cell;\n }, []);\n\n const clearHoveredTableCell = React.useCallback(() => {\n hoveredTableCellRef.current = null;\n }, []);\n\n const showColumnGuide = React.useCallback((table: HTMLTableElement, row: HTMLTableRowElement, cell: HTMLTableCellElement) => {\n const surface = editorContentRef.current;\n const guide = tableColumnGuideRef.current;\n if (!surface || !guide) return;\n\n const metrics = getRelativeBoundaryMetrics(surface, table, row, cell);\n guide.style.left = `${metrics.columnRight - COLUMN_RESIZE_LINE_THICKNESS / 2}px`;\n guide.style.top = `${metrics.top}px`;\n guide.style.width = `${COLUMN_RESIZE_LINE_THICKNESS}px`;\n guide.style.height = `${metrics.height}px`;\n guide.style.opacity = \"1\";\n surface.classList.add(\"resize-cursor\");\n getProseMirrorElement()?.classList.add(\"resize-cursor\");\n setEditorResizeCursor(\"col-resize\");\n }, [getProseMirrorElement, setEditorResizeCursor]);\n\n const showRowGuide = React.useCallback((table: HTMLTableElement, row: HTMLTableRowElement, cell: HTMLTableCellElement, previewHeight?: number) => {\n const surface = editorContentRef.current;\n const guide = tableRowGuideRef.current;\n if (!surface || !guide) return;\n\n const metrics = getRelativeBoundaryMetrics(surface, table, row, cell);\n const rowRect = row.getBoundingClientRect();\n const previewBottom = typeof previewHeight === \"number\"\n ? metrics.rowBottom - rowRect.height + previewHeight\n : metrics.rowBottom;\n guide.style.left = `${metrics.left}px`;\n guide.style.top = `${previewBottom - ROW_RESIZE_LINE_THICKNESS / 2}px`;\n guide.style.width = `${metrics.width}px`;\n guide.style.height = `${ROW_RESIZE_LINE_THICKNESS}px`;\n guide.style.opacity = \"1\";\n surface.classList.add(\"resize-row-cursor\");\n getProseMirrorElement()?.classList.add(\"resize-row-cursor\");\n setEditorResizeCursor(\"row-resize\");\n }, [getProseMirrorElement, setEditorResizeCursor]);\n\n const {\n beginResize,\n cancelResize,\n cleanup: cleanupRowResize,\n handlePointerMove: handleRowResizePointerMove,\n handlePointerUp: handleRowResizePointerUp,\n isResizing: isRowResizing,\n syncActiveGuide: syncActiveRowResizeGuide,\n } = useTableRowResize({\n editor,\n setHoveredTableCell,\n clearHoveredTableCell,\n showRowGuide,\n clearAllTableResizeHover,\n scheduleTableLayoutSync,\n });\n\n const syncActiveTableCellFromSelection = React.useCallback(() => {\n if (!editor) return;\n if (!editor.isFocused) {\n clearActiveTableCell();\n return;\n }\n setActiveTableCell(getSelectionTableCell(editor.view));\n }, [clearActiveTableCell, editor, setActiveTableCell]);\n\n useEffect(() => {\n if (!editor || !editable) return undefined;\n\n const proseMirror = editor.view.dom as HTMLElement;\n const editorDocument = proseMirror.ownerDocument;\n const editorWindow = editorDocument.defaultView;\n if (!editorWindow) return undefined;\n const surface = editorContentRef.current;\n let selectionSyncFrameId = 0;\n let selectionSyncTimeoutId = 0;\n let pendingFallbackCell: HTMLElement | null = null;\n const scrollListenerOptions = { passive: true, capture: true };\n\n const scheduleActiveCellSync = (fallbackCell: HTMLElement | null = null) => {\n if (fallbackCell) pendingFallbackCell = fallbackCell;\n\n const syncActiveCell = () => {\n if (!editor.isFocused) {\n clearActiveTableCell();\n return;\n }\n setActiveTableCell(getSelectionTableCell(editor.view) ?? pendingFallbackCell);\n };\n\n if (selectionSyncFrameId === 0) {\n selectionSyncFrameId = editorWindow.requestAnimationFrame(() => {\n selectionSyncFrameId = 0;\n syncActiveCell();\n if (selectionSyncTimeoutId === 0) pendingFallbackCell = null;\n });\n }\n\n editorWindow.clearTimeout(selectionSyncTimeoutId);\n selectionSyncTimeoutId = editorWindow.setTimeout(() => {\n selectionSyncTimeoutId = 0;\n syncActiveCell();\n if (selectionSyncFrameId === 0) pendingFallbackCell = null;\n }, 0);\n };\n\n const handleSelectionChange = () => {\n scheduleActiveCellSync();\n };\n\n const handleActiveCellLayoutChange = () => {\n updateActiveCellHighlight(activeTableCellRef.current);\n };\n\n const handleEditorMouseMove = (event: MouseEvent) => {\n if (syncActiveRowResizeGuide()) {\n return;\n }\n\n if (event.buttons !== 0) {\n clearAllTableResizeHover();\n return;\n }\n\n const target = resolveEventElement(event.target);\n if (!isCrossRealmElement(target)) {\n clearAllTableResizeHover();\n return;\n }\n\n const cell = target.closest(\"th,td\");\n if (!isCrossRealmHTMLElement(cell)) {\n clearHoveredTableCell();\n clearAllTableResizeHover();\n return;\n }\n\n setHoveredTableCell(cell);\n\n const row = cell.closest(\"tr\");\n const table = cell.closest(\"table\");\n if (!isCrossRealmTableRow(row) || !isCrossRealmTable(table)) {\n clearHoveredTableCell();\n clearAllTableResizeHover();\n return;\n }\n\n const rowTarget = resolveRowResizeTarget(cell, event.clientX, event.clientY);\n const colTarget = resolveColumnResizeTarget(cell, event.clientX, event.clientY);\n\n if (rowTarget) {\n const hotspotKey = `row:${rowTarget.row.rowIndex}-${rowTarget.cell.cellIndex}`;\n if (activeHotspotKeyRef.current === hotspotKey) {\n hideColumnGuide();\n showRowGuide(table, rowTarget.row, rowTarget.cell);\n return;\n }\n if (activeHotspotKeyRef.current !== hotspotKey) {\n clearHotspotTimer();\n activeHotspotKeyRef.current = hotspotKey;\n hotspotTimerRef.current = editorWindow.setTimeout(() => {\n hotspotTimerRef.current = null;\n hideColumnGuide();\n showRowGuide(table, rowTarget.row, rowTarget.cell);\n }, 100);\n }\n return;\n }\n\n if (colTarget) {\n const hotspotKey = `col:${colTarget.row.rowIndex}-${colTarget.cell.cellIndex}`;\n if (activeHotspotKeyRef.current === hotspotKey) {\n hideRowGuide();\n showColumnGuide(table, colTarget.row, colTarget.cell);\n return;\n }\n if (activeHotspotKeyRef.current !== hotspotKey) {\n clearHotspotTimer();\n activeHotspotKeyRef.current = hotspotKey;\n hotspotTimerRef.current = editorWindow.setTimeout(() => {\n hotspotTimerRef.current = null;\n hideRowGuide();\n showColumnGuide(table, colTarget.row, colTarget.cell);\n }, 100);\n }\n return;\n }\n\n clearHotspotTimer();\n activeHotspotKeyRef.current = null;\n clearAllTableResizeHover();\n };\n\n const handleEditorMouseLeave = () => {\n clearHoveredTableCell();\n if (!isRowResizing()) {\n clearAllTableResizeHover();\n }\n };\n\n const handleEditorMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) return;\n\n const target = resolveEventElement(event.target);\n if (!isCrossRealmElement(target)) {\n clearActiveTableCell();\n return;\n }\n\n const cell = target.closest(\"th,td\");\n if (!isCrossRealmTableCell(cell)) {\n clearActiveTableCell();\n return;\n }\n\n const row = cell.closest(\"tr\");\n const table = cell.closest(\"table\");\n if (!isCrossRealmTableRow(row) || !isCrossRealmTable(table)) return;\n\n const rowTarget = resolveRowResizeTarget(cell, event.clientX, event.clientY);\n if (rowTarget) {\n event.preventDefault();\n event.stopPropagation();\n editorWindow.getSelection()?.removeAllRanges();\n if (beginResize(event, table, rowTarget.row, rowTarget.cell)) {\n suppressActiveCellHighlightRef.current = true;\n updateActiveCellHighlight(null);\n return;\n }\n }\n\n setActiveTableCell(cell);\n scheduleActiveCellSync(cell);\n };\n\n const handlePointerMove = (event: MouseEvent) => {\n handleRowResizePointerMove(event);\n };\n\n const handlePointerUp = (event: MouseEvent) => {\n const wasRowResizing = isRowResizing();\n handleRowResizePointerUp(event);\n if (wasRowResizing) {\n suppressActiveCellHighlightRef.current = false;\n editorWindow.requestAnimationFrame(() => {\n updateActiveCellHighlight(activeTableCellRef.current);\n });\n }\n };\n\n const handleWindowBlur = () => {\n const wasRowResizing = isRowResizing();\n cancelResize();\n if (wasRowResizing) {\n suppressActiveCellHighlightRef.current = false;\n updateActiveCellHighlight(activeTableCellRef.current);\n }\n };\n\n proseMirror.addEventListener(\"mousemove\", handleEditorMouseMove);\n proseMirror.addEventListener(\"mouseleave\", handleEditorMouseLeave);\n proseMirror.addEventListener(\"mousedown\", handleEditorMouseDown);\n proseMirror.addEventListener(\"click\", handleSelectionChange);\n proseMirror.addEventListener(\"mouseup\", handleSelectionChange);\n proseMirror.addEventListener(\"keyup\", handleSelectionChange);\n proseMirror.addEventListener(\"focusin\", handleSelectionChange);\n const unsubscribeSelectionChange = subscribeSharedGlobalEvent(\n editorDocument,\n \"selectionchange\",\n handleSelectionChange,\n );\n surface?.addEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, handleActiveCellLayoutChange);\n surface?.addEventListener(\"scroll\", handleActiveCellLayoutChange, scrollListenerOptions);\n const unsubscribeResize = subscribeSharedGlobalEvent(editorWindow, \"resize\", handleActiveCellLayoutChange);\n const unsubscribePointerMove = subscribeSharedGlobalEvent(\n editorDocument,\n \"pointermove\",\n handlePointerMove as EventListener,\n );\n const unsubscribePointerUp = subscribeSharedGlobalEvent(\n editorDocument,\n \"pointerup\",\n handlePointerUp as EventListener,\n );\n const unsubscribeWindowBlur = subscribeSharedGlobalEvent(editorWindow, \"blur\", handleWindowBlur);\n editor.on(\"selectionUpdate\", syncActiveTableCellFromSelection);\n editor.on(\"focus\", syncActiveTableCellFromSelection);\n editor.on(\"blur\", clearActiveTableCell);\n editor.on(\"update\", scheduleTableLayoutSync);\n syncActiveTableCellFromSelection();\n\n return () => {\n proseMirror.removeEventListener(\"mousemove\", handleEditorMouseMove);\n proseMirror.removeEventListener(\"mouseleave\", handleEditorMouseLeave);\n proseMirror.removeEventListener(\"mousedown\", handleEditorMouseDown);\n proseMirror.removeEventListener(\"click\", handleSelectionChange);\n proseMirror.removeEventListener(\"mouseup\", handleSelectionChange);\n proseMirror.removeEventListener(\"keyup\", handleSelectionChange);\n proseMirror.removeEventListener(\"focusin\", handleSelectionChange);\n unsubscribeSelectionChange();\n surface?.removeEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, handleActiveCellLayoutChange);\n surface?.removeEventListener(\"scroll\", handleActiveCellLayoutChange, scrollListenerOptions);\n unsubscribeResize();\n unsubscribePointerMove();\n unsubscribePointerUp();\n unsubscribeWindowBlur();\n editor.off(\"selectionUpdate\", syncActiveTableCellFromSelection);\n editor.off(\"focus\", syncActiveTableCellFromSelection);\n editor.off(\"blur\", clearActiveTableCell);\n editor.off(\"update\", scheduleTableLayoutSync);\n if (selectionSyncFrameId !== 0) {\n editorWindow.cancelAnimationFrame(selectionSyncFrameId);\n selectionSyncFrameId = 0;\n }\n editorWindow.clearTimeout(selectionSyncTimeoutId);\n pendingFallbackCell = null;\n if (tableLayoutSyncFrameRef.current !== null) {\n editorWindow.cancelAnimationFrame(tableLayoutSyncFrameRef.current);\n tableLayoutSyncFrameRef.current = null;\n }\n cleanupRowResize();\n suppressActiveCellHighlightRef.current = false;\n editorDocument.body.style.cursor = \"\";\n clearActiveTableCell();\n clearHoveredTableCell();\n clearAllTableResizeHover();\n clearHotspotTimer();\n };\n }, [beginResize, cancelResize, cleanupRowResize, clearActiveTableCell, clearAllTableResizeHover, clearHotspotTimer, clearHoveredTableCell, editable, editor, handleRowResizePointerMove, handleRowResizePointerUp, hideColumnGuide, hideRowGuide, isRowResizing, scheduleTableLayoutSync, setActiveTableCell, setHoveredTableCell, showColumnGuide, showRowGuide, syncActiveRowResizeGuide, syncActiveTableCellFromSelection, updateActiveCellHighlight]);\n\n return {\n editorContentRef,\n tableColumnGuideRef,\n tableRowGuideRef,\n activeTableCellHighlightRef,\n };\n}\n","\"use client\";\n\nimport React, { useRef } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport {\n findTableRowNodeInfo,\n isRowResizeHotspot,\n isRowResizingGlobal,\n MIN_TABLE_ROW_HEIGHT,\n} from \"./table-dom-utils\";\n\ntype RowGuideHandler = (\n table: HTMLTableElement,\n row: HTMLTableRowElement,\n cell: HTMLTableCellElement,\n previewHeight?: number,\n) => void;\n\ntype UseTableRowResizeOptions = {\n editor: Editor | null;\n setHoveredTableCell: (cell: HTMLElement | null) => void;\n clearHoveredTableCell: () => void;\n showRowGuide: RowGuideHandler;\n clearAllTableResizeHover: () => void;\n scheduleTableLayoutSync: () => void;\n};\n\ntype RowResizeState = {\n rowElement: HTMLTableRowElement;\n tableElement: HTMLTableElement;\n cellElement: HTMLTableCellElement;\n cellIndex: number;\n rowPos: number;\n rowNode: ProseMirrorNode;\n startY: number;\n startHeight: number;\n previewHeight: number;\n pendingHeight: number;\n};\n\nfunction setRowResizeBodyState(ownerDocument: Document, active: boolean) {\n ownerDocument.body.style.userSelect = active ? \"none\" : \"\";\n ownerDocument.body.style.cursor = active ? \"row-resize\" : \"\";\n}\n\nexport function useTableRowResize({\n editor,\n setHoveredTableCell,\n clearHoveredTableCell,\n showRowGuide,\n clearAllTableResizeHover,\n scheduleTableLayoutSync,\n}: UseTableRowResizeOptions) {\n const stateRef = useRef<RowResizeState | null>(null);\n\n const syncActiveGuide = React.useCallback(() => {\n const state = stateRef.current;\n if (!state) return false;\n\n setHoveredTableCell(state.cellElement);\n showRowGuide(state.tableElement, state.rowElement, state.cellElement, state.pendingHeight);\n return true;\n }, [setHoveredTableCell, showRowGuide]);\n\n const isResizing = React.useCallback(() => stateRef.current !== null, []);\n\n const beginResize = React.useCallback((\n event: MouseEvent,\n table: HTMLTableElement,\n row: HTMLTableRowElement,\n cell: HTMLTableCellElement,\n ) => {\n if (!editor || !isRowResizeHotspot(cell, event.clientX, event.clientY)) {\n return false;\n }\n\n setHoveredTableCell(cell);\n const rowInfo = findTableRowNodeInfo(editor.view, row);\n if (!rowInfo) return false;\n\n const startHeight = row.getBoundingClientRect().height;\n stateRef.current = {\n rowElement: row,\n tableElement: table,\n cellElement: cell,\n cellIndex: cell.cellIndex,\n rowPos: rowInfo.pos,\n rowNode: rowInfo.node,\n startY: event.clientY,\n startHeight,\n previewHeight: startHeight,\n pendingHeight: startHeight,\n };\n\n showRowGuide(table, row, cell, startHeight);\n isRowResizingGlobal.active = true;\n const editorDocument = editor.view.dom.ownerDocument;\n editorDocument.defaultView?.getSelection()?.removeAllRanges();\n setRowResizeBodyState(editorDocument, true);\n event.preventDefault();\n event.stopPropagation();\n return true;\n }, [editor, setHoveredTableCell, showRowGuide]);\n\n const handlePointerMove = React.useCallback((event: MouseEvent | PointerEvent) => {\n const state = stateRef.current;\n if (!state) return;\n\n const nextHeight = Math.max(\n MIN_TABLE_ROW_HEIGHT,\n Math.round(state.startHeight + (event.clientY - state.startY)),\n );\n\n if (nextHeight === state.pendingHeight) {\n setRowResizeBodyState(state.rowElement.ownerDocument, true);\n showRowGuide(state.tableElement, state.rowElement, state.cellElement, state.pendingHeight);\n return;\n }\n\n state.pendingHeight = nextHeight;\n state.previewHeight = nextHeight;\n setRowResizeBodyState(state.rowElement.ownerDocument, true);\n showRowGuide(state.tableElement, state.rowElement, state.cellElement, nextHeight);\n }, [showRowGuide]);\n\n const handlePointerUp = React.useCallback((event: MouseEvent | PointerEvent) => {\n if (!editor) return;\n const state = stateRef.current;\n if (!state) return;\n\n const nextHeight = Math.max(\n MIN_TABLE_ROW_HEIGHT,\n Math.round(state.startHeight + (event.clientY - state.startY)),\n );\n\n state.pendingHeight = nextHeight;\n\n const rowNode = editor.view.state.doc.nodeAt(state.rowPos) ?? state.rowNode;\n if (rowNode.attrs.rowHeight !== nextHeight) {\n const tr = editor.view.state.tr;\n tr.setNodeMarkup(state.rowPos, undefined, {\n ...rowNode.attrs,\n rowHeight: nextHeight,\n });\n editor.view.dispatch(tr);\n }\n\n stateRef.current = null;\n isRowResizingGlobal.active = false;\n setRowResizeBodyState(state.rowElement.ownerDocument, false);\n clearHoveredTableCell();\n clearAllTableResizeHover();\n scheduleTableLayoutSync();\n }, [clearAllTableResizeHover, clearHoveredTableCell, editor, scheduleTableLayoutSync]);\n\n const cancelResize = React.useCallback(() => {\n const state = stateRef.current;\n if (!state) return;\n\n stateRef.current = null;\n isRowResizingGlobal.active = false;\n setRowResizeBodyState(state.rowElement.ownerDocument, false);\n clearHoveredTableCell();\n clearAllTableResizeHover();\n scheduleTableLayoutSync();\n }, [clearAllTableResizeHover, clearHoveredTableCell, scheduleTableLayoutSync]);\n\n const cleanup = React.useCallback(() => {\n const editorDocument = stateRef.current?.rowElement.ownerDocument ?? editor?.view.dom.ownerDocument;\n stateRef.current = null;\n isRowResizingGlobal.active = false;\n if (editorDocument) {\n setRowResizeBodyState(editorDocument, false);\n }\n }, [editor]);\n\n return {\n beginResize,\n cancelResize,\n cleanup,\n handlePointerMove,\n handlePointerUp,\n isResizing,\n syncActiveGuide,\n };\n}\n","\"use client\";\n\nimport { useEffect, useRef, type RefObject } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { TableMap } from \"@tiptap/pm/tables\";\nimport { getTableFormulaReferences, indexToColumnName, isDraftTableFormula } from \"./table-formula\";\nimport { recalculateActiveTableFormulas } from \"./table-formula-commands\";\nimport {\n cancelFormulaEditing,\n getFormulaCycleBlockedLabels,\n getFormulaEditingTableContext,\n getFormulaTableCellInfo,\n} from \"./table-formula-range-picker\";\nimport { UEDITOR_TABLE_LAYOUT_CHANGE_EVENT } from \"./table-dom-utils\";\nimport { subscribeSharedGlobalEvent } from \"./shared-global-listeners\";\n\ntype CoordinateSegment = {\n start: number;\n size: number;\n span: number;\n};\n\nfunction setPosition(element: HTMLElement, left: number, top: number, width?: number, height?: number) {\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n if (width != null) element.style.width = `${Math.max(0, width)}px`;\n if (height != null) element.style.height = `${Math.max(0, height)}px`;\n}\n\nfunction createCoordinateLabel(ownerDocument: Document, kind: \"column\" | \"row\", label: string) {\n const element = ownerDocument.createElement(\"span\");\n element.dataset.ueditorFormulaCoordinate = kind;\n element.textContent = label;\n element.className =\n \"pointer-events-none absolute z-30 flex items-center justify-center rounded-[3px] border border-primary/35 bg-primary/90 px-1 font-mono text-[10px] font-semibold leading-none text-primary-foreground shadow-sm\";\n return element;\n}\n\nfunction createReferenceHighlight(ownerDocument: Document, label: string) {\n const element = ownerDocument.createElement(\"span\");\n element.dataset.ueditorFormulaReference = label;\n element.className = \"pointer-events-none absolute z-[21] rounded-[2px] border-2 border-emerald-500 bg-emerald-500/15\";\n return element;\n}\n\nfunction createBlockedReferenceHighlight(ownerDocument: Document, label: string) {\n const element = ownerDocument.createElement(\"span\");\n element.dataset.ueditorFormulaBlockedReference = label;\n element.className =\n \"pointer-events-none absolute z-[22] rounded-[2px] border-2 border-destructive/80 bg-destructive/10\";\n return element;\n}\n\ntype FormulaActionLabels = {\n apply: string;\n cancel: string;\n};\n\nexport function useFormulaCoordinateOverlay(\n editor: Editor | null,\n containerRef: RefObject<HTMLDivElement | null>,\n labels: FormulaActionLabels,\n) {\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!editor) return undefined;\n\n const overlay = overlayRef.current;\n const container = containerRef.current;\n if (!overlay || !container) return undefined;\n const editorDocument = overlay.ownerDocument;\n const editorWindow = editorDocument.defaultView;\n if (!editorWindow) return undefined;\n\n let animationFrame: number | null = null;\n let activeTable: HTMLTableElement | null = null;\n let activeTablePos: number | null = null;\n let hoverLabel: HTMLSpanElement | null = null;\n const scrollListenerOptions = { passive: true, capture: true };\n\n const clearOverlay = () => {\n activeTable = null;\n activeTablePos = null;\n hoverLabel = null;\n overlay.replaceChildren();\n overlay.style.display = \"none\";\n };\n\n const syncOverlay = () => {\n animationFrame = null;\n if (editor.isDestroyed) return;\n\n const context = getFormulaEditingTableContext(editor.view);\n if (!context) {\n clearOverlay();\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const tableRect = context.tableDom.getBoundingClientRect();\n const tableLeft = tableRect.left - containerRect.left + container.scrollLeft;\n const tableTop = tableRect.top - containerRect.top + container.scrollTop;\n const map = TableMap.get(context.tableNode);\n const columnSegments: Array<CoordinateSegment | undefined> = Array(map.width);\n const rowSegments: Array<CoordinateSegment | undefined> = Array(map.height);\n const cellInfos: Array<ReturnType<typeof getFormulaTableCellInfo>> = [];\n\n for (const cell of context.tableDom.querySelectorAll(\"th,td\")) {\n if (!(cell instanceof editorWindow.HTMLTableCellElement)) continue;\n const info = getFormulaTableCellInfo(editor.view, cell, context.tablePos);\n if (!info) continue;\n cellInfos.push(info);\n\n const cellRect = cell.getBoundingClientRect();\n const columnSpan = Math.max(1, info.rect.right - info.rect.left);\n const rowSpan = Math.max(1, info.rect.bottom - info.rect.top);\n const columnWidth = cellRect.width / columnSpan;\n const rowHeight = cellRect.height / rowSpan;\n\n for (let column = info.rect.left; column < info.rect.right; column += 1) {\n if (!columnSegments[column] || columnSpan < columnSegments[column]!.span) {\n columnSegments[column] = {\n start: cellRect.left - containerRect.left + container.scrollLeft + (column - info.rect.left) * columnWidth,\n size: columnWidth,\n span: columnSpan,\n };\n }\n }\n\n for (let row = info.rect.top; row < info.rect.bottom; row += 1) {\n if (!rowSegments[row] || rowSpan < rowSegments[row]!.span) {\n rowSegments[row] = {\n start: cellRect.top - containerRect.top + container.scrollTop + (row - info.rect.top) * rowHeight,\n size: rowHeight,\n span: rowSpan,\n };\n }\n }\n }\n\n const fallbackColumnWidth = map.width > 0 ? tableRect.width / map.width : 0;\n const fallbackRowHeight = map.height > 0 ? tableRect.height / map.height : 0;\n const children: HTMLElement[] = [];\n\n const actions = editorDocument.createElement(\"div\");\n actions.dataset.ueditorFormulaActions = \"\";\n actions.className =\n \"pointer-events-auto absolute z-50 flex items-center gap-1 rounded-md border border-border bg-background p-1 shadow-md\";\n const formulaCellRect = context.cellDom.getBoundingClientRect();\n const formulaActionsHeight = 34;\n const formulaActionsTop = formulaCellRect.bottom + 4 + formulaActionsHeight > tableRect.bottom\n ? Math.max(containerRect.top + 4, formulaCellRect.top - formulaActionsHeight - 4)\n : formulaCellRect.bottom + 4;\n setPosition(\n actions,\n formulaCellRect.left - containerRect.left + container.scrollLeft,\n formulaActionsTop - containerRect.top + container.scrollTop,\n );\n\n const applyButton = editorDocument.createElement(\"button\");\n applyButton.type = \"button\";\n applyButton.dataset.ueditorFormulaApply = \"\";\n applyButton.disabled = isDraftTableFormula(context.formula);\n applyButton.textContent = `${applyButton.disabled ? \"\" : \"✓ \"}${labels.apply} (Enter)`;\n applyButton.className =\n \"rounded bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45\";\n\n const cancelButton = editorDocument.createElement(\"button\");\n cancelButton.type = \"button\";\n cancelButton.dataset.ueditorFormulaCancel = \"\";\n cancelButton.textContent = `${labels.cancel} (Esc)`;\n cancelButton.className =\n \"rounded px-2.5 py-1 text-xs font-medium text-foreground hover:bg-muted\";\n\n const preserveSelection = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n applyButton.addEventListener(\"mousedown\", preserveSelection);\n cancelButton.addEventListener(\"mousedown\", preserveSelection);\n applyButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!applyButton.disabled) recalculateActiveTableFormulas(editor);\n });\n cancelButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n cancelFormulaEditing(editor.view);\n });\n actions.append(applyButton, cancelButton);\n children.push(actions);\n\n for (let column = 0; column < map.width; column += 1) {\n const segment = columnSegments[column] ?? {\n start: tableLeft + column * fallbackColumnWidth,\n size: fallbackColumnWidth,\n span: map.width,\n };\n const label = createCoordinateLabel(editorDocument, \"column\", indexToColumnName(column));\n setPosition(label, segment.start, Math.max(0, tableTop - 22), segment.size, 20);\n children.push(label);\n }\n\n for (let row = 0; row < map.height; row += 1) {\n const segment = rowSegments[row] ?? {\n start: tableTop + row * fallbackRowHeight,\n size: fallbackRowHeight,\n span: map.height,\n };\n const label = createCoordinateLabel(editorDocument, \"row\", String(row + 1));\n setPosition(label, Math.max(0, tableLeft - 28), segment.start, 26, segment.size);\n children.push(label);\n }\n\n const references = new Set(getTableFormulaReferences(context.formula));\n const blockedReferences = getFormulaCycleBlockedLabels(context.tableNode, context.formulaCellLabel);\n for (const info of cellInfos) {\n if (!info) continue;\n const cellRect = info.cell.getBoundingClientRect();\n const highlight = info.label !== context.formulaCellLabel && blockedReferences.has(info.label)\n ? createBlockedReferenceHighlight(editorDocument, info.label)\n : references.has(info.label)\n ? createReferenceHighlight(editorDocument, info.label)\n : null;\n if (!highlight) continue;\n setPosition(\n highlight,\n cellRect.left - containerRect.left + container.scrollLeft + 2,\n cellRect.top - containerRect.top + container.scrollTop + 2,\n cellRect.width - 4,\n cellRect.height - 4,\n );\n children.push(highlight);\n }\n\n hoverLabel = editorDocument.createElement(\"span\");\n hoverLabel.dataset.ueditorFormulaHoverLabel = \"\";\n hoverLabel.className =\n \"pointer-events-none absolute z-40 hidden rounded bg-foreground px-1.5 py-1 font-mono text-[10px] font-semibold leading-none text-background shadow-md\";\n children.push(hoverLabel);\n\n overlay.replaceChildren(...children);\n overlay.style.display = \"block\";\n activeTable = context.tableDom;\n activeTablePos = context.tablePos;\n };\n\n const scheduleSync = () => {\n if (animationFrame != null) return;\n animationFrame = editorWindow.requestAnimationFrame(syncOverlay);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n if (!activeTable || activeTablePos == null || !hoverLabel) return;\n const target = event.target instanceof editorWindow.Element ? event.target.closest(\"th,td\") : null;\n if (!(target instanceof editorWindow.HTMLTableCellElement) || target.closest(\"table\") !== activeTable) {\n hoverLabel.style.display = \"none\";\n return;\n }\n\n const info = getFormulaTableCellInfo(editor.view, target, activeTablePos);\n if (!info) {\n hoverLabel.style.display = \"none\";\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const cellRect = target.getBoundingClientRect();\n hoverLabel.textContent = info.label;\n hoverLabel.style.display = \"block\";\n setPosition(\n hoverLabel,\n cellRect.left - containerRect.left + container.scrollLeft + 4,\n cellRect.top - containerRect.top + container.scrollTop + 4,\n );\n };\n\n const handleMouseLeave = () => {\n if (hoverLabel) hoverLabel.style.display = \"none\";\n };\n\n editor.on(\"selectionUpdate\", scheduleSync);\n editor.on(\"update\", scheduleSync);\n editor.on(\"focus\", scheduleSync);\n editor.on(\"blur\", scheduleSync);\n editor.view.dom.addEventListener(\"mousemove\", handleMouseMove);\n editor.view.dom.addEventListener(\"mouseleave\", handleMouseLeave);\n container.addEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, scheduleSync);\n container.addEventListener(\"scroll\", scheduleSync, scrollListenerOptions);\n const unsubscribeResize = subscribeSharedGlobalEvent(editorWindow, \"resize\", scheduleSync);\n scheduleSync();\n\n return () => {\n editor.off(\"selectionUpdate\", scheduleSync);\n editor.off(\"update\", scheduleSync);\n editor.off(\"focus\", scheduleSync);\n editor.off(\"blur\", scheduleSync);\n editor.view.dom.removeEventListener(\"mousemove\", handleMouseMove);\n editor.view.dom.removeEventListener(\"mouseleave\", handleMouseLeave);\n container.removeEventListener(UEDITOR_TABLE_LAYOUT_CHANGE_EVENT, scheduleSync);\n container.removeEventListener(\"scroll\", scheduleSync, scrollListenerOptions);\n unsubscribeResize();\n if (animationFrame != null) editorWindow.cancelAnimationFrame(animationFrame);\n clearOverlay();\n };\n }, [containerRef, editor, labels.apply, labels.cancel]);\n\n return overlayRef;\n}\n","import type { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport type { EditorView } from \"@tiptap/pm/view\";\nimport { TableMap } from \"@tiptap/pm/tables\";\nimport {\n buildTableFormulaDependencyGraph,\n getTableCellRangeLabels,\n indexToColumnName,\n parseTableCellRange,\n type TableFormulaCell,\n} from \"./table-formula\";\nimport {\n isCrossRealmTable,\n isCrossRealmTableCell,\n isValidProseMirrorPosition,\n resolveEventElement,\n} from \"./table-dom-utils\";\n\nexport type FormulaRangePickState = {\n anchorLabel: string;\n anchorCell: HTMLTableCellElement;\n tablePos: number;\n insertedFrom: number;\n insertedTo: number;\n currentLabel: string;\n currentCell: HTMLTableCellElement;\n blocked: boolean;\n formulaCellLabel: string;\n};\n\nexport type FormulaRangePickHighlight = {\n left: number;\n top: number;\n width: number;\n height: number;\n blocked: boolean;\n};\n\nfunction getCellText(cellNode: ProseMirrorNode) {\n return cellNode.textBetween(0, cellNode.content.size, \"\\n\").trim();\n}\n\nexport function getFormulaEditingTableContext(view: EditorView) {\n const { $from } = view.state.selection;\n\n for (let depth = $from.depth; depth > 0; depth -= 1) {\n const node = $from.node(depth);\n if (node.type.name !== \"tableCell\" && node.type.name !== \"tableHeader\") continue;\n if (!getCellText(node).startsWith(\"=\")) return null;\n\n const cellPos = $from.before(depth);\n const cellDom = view.nodeDOM(cellPos);\n if (!isCrossRealmTableCell(cellDom) || !view.dom.contains(cellDom)) return null;\n const tableDepth = depth - 2;\n const tableNode = tableDepth > 0 ? $from.node(tableDepth) : null;\n if (!tableNode || tableNode.type.name !== \"table\") return null;\n const tableDom = cellDom.closest(\"table\");\n if (!isCrossRealmTable(tableDom) || !view.dom.contains(tableDom)) return null;\n const tableMap = TableMap.get(tableNode);\n const tableStart = $from.start(tableDepth);\n const formulaCellRect = tableMap.findCell(cellPos - tableStart);\n\n return {\n cellContentEnd: $from.end(depth),\n cellContentStart: $from.start(depth),\n cellDom,\n formula: getCellText(node),\n tableDom,\n tableNode,\n tablePos: $from.before(tableDepth),\n formulaCellLabel: `${indexToColumnName(formulaCellRect.left)}${formulaCellRect.top + 1}`,\n };\n }\n\n return null;\n}\n\nfunction collectTableFormulaCells(tableNode: ProseMirrorNode) {\n const tableMap = TableMap.get(tableNode);\n const formulas: TableFormulaCell[] = [];\n\n tableNode.forEach((rowNode, rowOffset) => {\n rowNode.forEach((cellNode, cellOffset) => {\n const formula = typeof cellNode.attrs.formula === \"string\" ? cellNode.attrs.formula.trim() : \"\";\n if (!formula) return;\n\n const rect = tableMap.findCell(rowOffset + 1 + cellOffset);\n formulas.push({\n label: `${indexToColumnName(rect.left)}${rect.top + 1}`,\n formula,\n });\n });\n });\n\n return formulas;\n}\n\nexport function getFormulaCycleBlockedLabels(tableNode: ProseMirrorNode, formulaCellLabel: string) {\n const graph = buildTableFormulaDependencyGraph(collectTableFormulaCells(tableNode));\n const blocked = new Set<string>();\n const queue = [formulaCellLabel.toUpperCase()];\n\n for (let index = 0; index < queue.length; index += 1) {\n const label = queue[index];\n if (!label || blocked.has(label)) continue;\n blocked.add(label);\n for (const dependent of graph.dependents.get(label) ?? []) {\n if (!blocked.has(dependent)) queue.push(dependent);\n }\n }\n\n return blocked;\n}\n\nfunction getReferenceLabels(reference: string) {\n const range = parseTableCellRange(reference);\n return range ? getTableCellRangeLabels(range) : [reference.toUpperCase()];\n}\n\nfunction isBlockedFormulaReference(tableNode: ProseMirrorNode, formulaCellLabel: string, reference: string) {\n const blockedLabels = getFormulaCycleBlockedLabels(tableNode, formulaCellLabel);\n return getReferenceLabels(reference).some((label) => blockedLabels.has(label));\n}\n\nexport function cancelFormulaEditing(view: EditorView) {\n const context = getFormulaEditingTableContext(view);\n if (!context) return false;\n\n let tr = view.state.tr.delete(context.cellContentStart, context.cellContentEnd);\n const selectionPos = Math.min(context.cellContentStart, tr.doc.content.size);\n tr = tr.setSelection(TextSelection.near(tr.doc.resolve(selectionPos)));\n view.dispatch(tr);\n view.focus();\n return true;\n}\n\nfunction getReferenceInsertionPrefix(view: EditorView, cellContentStart: number, insertionPos: number) {\n const textBeforeCursor = view.state.doc.textBetween(cellContentStart, insertionPos, \"\", \"\");\n const isInsideFunctionArguments = /[A-Z]+\\([^)]*$/i.test(textBeforeCursor);\n const followsReference = /\\$?[A-Z]+\\$?[1-9]\\d*(?::\\$?[A-Z]+\\$?[1-9]\\d*)?\\s*$/i.test(textBeforeCursor);\n\n return isInsideFunctionArguments && followsReference ? \",\" : \"\";\n}\n\nfunction findTableForPos(view: EditorView, pos: number) {\n if (!isValidProseMirrorPosition(view.state.doc, pos)) return null;\n\n const $pos = view.state.doc.resolve(pos);\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth);\n if (node.type.name === \"table\") {\n return {\n node,\n pos: $pos.before(depth),\n start: $pos.start(depth),\n };\n }\n }\n\n return null;\n}\n\nfunction getCellRelativePosFromDomPos(map: TableMap, tableStart: number, domPos: number) {\n const relativeDomPos = domPos - tableStart;\n const seen = new Set<number>();\n\n for (const relativeCellPos of map.map) {\n if (seen.has(relativeCellPos)) continue;\n seen.add(relativeCellPos);\n\n if (relativeDomPos === relativeCellPos || relativeDomPos === relativeCellPos + 1) {\n return relativeCellPos;\n }\n }\n\n return null;\n}\n\nexport function getFormulaTableCellInfo(view: EditorView, target: EventTarget | null, tablePos: number) {\n const element = resolveEventElement(target);\n const cell = element?.closest?.(\"th,td\");\n if (!isCrossRealmTableCell(cell) || !view.dom.contains(cell)) return null;\n\n const domPos = view.posAtDOM(cell, 0);\n if (!isValidProseMirrorPosition(view.state.doc, domPos)) return null;\n const tableInfo = findTableForPos(view, domPos);\n if (!tableInfo || tableInfo.pos !== tablePos) return null;\n\n const map = TableMap.get(tableInfo.node);\n const relativeCellPos = getCellRelativePosFromDomPos(map, tableInfo.start, domPos);\n if (relativeCellPos == null) return null;\n\n const rect = map.findCell(relativeCellPos);\n return {\n cell,\n label: `${indexToColumnName(rect.left)}${rect.top + 1}`,\n rect,\n };\n}\n\nfunction normalizeFormulaRangeLabel(fromLabel: string, toLabel: string) {\n return fromLabel === toLabel ? fromLabel : `${fromLabel}:${toLabel}`;\n}\n\nfunction replacePickedLabel(\n view: EditorView,\n pickState: FormulaRangePickState,\n nextLabel: string,\n currentCell: HTMLTableCellElement,\n) {\n const formulaContext = getFormulaEditingTableContext(view);\n const blocked = formulaContext\n ? isBlockedFormulaReference(formulaContext.tableNode, pickState.formulaCellLabel, nextLabel)\n : false;\n if (blocked) {\n return {\n ...pickState,\n blocked: true,\n currentCell,\n };\n }\n if (nextLabel === pickState.currentLabel && currentCell === pickState.currentCell && !pickState.blocked) return pickState;\n if (nextLabel === pickState.currentLabel) {\n return {\n ...pickState,\n blocked: false,\n currentCell,\n };\n }\n\n let tr = view.state.tr.insertText(nextLabel, pickState.insertedFrom, pickState.insertedTo);\n const nextTo = pickState.insertedFrom + nextLabel.length;\n tr = tr.setSelection(TextSelection.create(tr.doc, nextTo));\n view.dispatch(tr);\n\n return {\n ...pickState,\n blocked: false,\n insertedTo: nextTo,\n currentLabel: nextLabel,\n currentCell,\n };\n}\n\nexport function beginFormulaRangePick(view: EditorView, event: MouseEvent): FormulaRangePickState | null {\n if (event.button !== 0) return null;\n\n const formulaCell = getFormulaEditingTableContext(view);\n if (!formulaCell) return null;\n\n const picked = getFormulaTableCellInfo(view, event.target, formulaCell.tablePos);\n if (!picked || picked.cell === formulaCell.cellDom) return null;\n\n const blocked = isBlockedFormulaReference(formulaCell.tableNode, formulaCell.formulaCellLabel, picked.label);\n if (blocked) {\n event.preventDefault();\n event.stopPropagation();\n return {\n anchorLabel: picked.label,\n anchorCell: picked.cell,\n tablePos: formulaCell.tablePos,\n insertedFrom: view.state.selection.from,\n insertedTo: view.state.selection.from,\n currentLabel: \"\",\n currentCell: picked.cell,\n blocked: true,\n formulaCellLabel: formulaCell.formulaCellLabel,\n };\n }\n\n const { from, to } = view.state.selection;\n const prefix = from === to ? getReferenceInsertionPrefix(view, formulaCell.cellContentStart, from) : \"\";\n const insertedText = `${prefix}${picked.label}`;\n const insertedFrom = from + prefix.length;\n let tr = view.state.tr.insertText(insertedText, from, to);\n tr = tr.setSelection(TextSelection.create(tr.doc, from + insertedText.length));\n view.dispatch(tr);\n view.focus();\n\n event.preventDefault();\n event.stopPropagation();\n\n return {\n anchorLabel: picked.label,\n anchorCell: picked.cell,\n tablePos: formulaCell.tablePos,\n insertedFrom,\n insertedTo: insertedFrom + picked.label.length,\n currentLabel: picked.label,\n currentCell: picked.cell,\n blocked: false,\n formulaCellLabel: formulaCell.formulaCellLabel,\n };\n}\n\nexport function updateFormulaRangePick(view: EditorView, pickState: FormulaRangePickState, event: MouseEvent) {\n const picked = getFormulaTableCellInfo(view, event.target, pickState.tablePos);\n if (!picked) return pickState;\n\n event.preventDefault();\n event.stopPropagation();\n\n return replacePickedLabel(\n view,\n pickState,\n normalizeFormulaRangeLabel(pickState.anchorLabel, picked.label),\n picked.cell,\n );\n}\n\nexport function getFormulaRangePickHighlight(\n container: HTMLElement,\n pickState: FormulaRangePickState,\n): FormulaRangePickHighlight | null {\n if (!container.contains(pickState.anchorCell) || !container.contains(pickState.currentCell)) return null;\n\n const containerRect = container.getBoundingClientRect();\n const anchorRect = pickState.anchorCell.getBoundingClientRect();\n const currentRect = pickState.currentCell.getBoundingClientRect();\n\n const left = Math.min(anchorRect.left, currentRect.left) - containerRect.left + container.scrollLeft;\n const top = Math.min(anchorRect.top, currentRect.top) - containerRect.top + container.scrollTop;\n const right = Math.max(anchorRect.right, currentRect.right) - containerRect.left + container.scrollLeft;\n const bottom = Math.max(anchorRect.bottom, currentRect.bottom) - containerRect.top + container.scrollTop;\n\n return {\n left,\n top,\n width: Math.max(0, right - left),\n height: Math.max(0, bottom - top),\n blocked: pickState.blocked,\n };\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/core\";\nimport { useEditorState } from \"@tiptap/react\";\nimport { AlertCircle, Check, Hash, Sigma, Trash2 } from \"lucide-react\";\nimport { useSmartTranslations } from \"../../hooks/useSmartTranslations\";\nimport {\n clearSelectedTableCellFormula,\n convertSelectedTableCellFormulaToValue,\n getSelectedTableFormulaCell,\n normalizeFormulaInput,\n setSelectedTableCellFormula,\n} from \"./table-formula-commands\";\nimport { resolveEventElement } from \"./table-dom-utils\";\nimport { formControlOutlineClass } from \"../../constants/form-control-size\";\n\ntype FormulaDraftState = {\n cellKey: string;\n sourceFormula: string;\n value: string;\n};\n\nexport function TableFormulaBar({ editor }: { editor: Editor }) {\n const t = useSmartTranslations(\"UEditor\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [draftState, setDraftState] = useState<FormulaDraftState | null>(null);\n const selectedFormulaState = useEditorState({\n editor,\n selector: ({ editor: currentEditor }) => {\n const cell = getSelectedTableFormulaCell(currentEditor);\n if (!cell) return null;\n\n return {\n cellPos: cell.cellPos,\n column: cell.column,\n computedValue: cell.computedValue,\n formula: cell.formula,\n formulaState: cell.formulaState,\n label: cell.label,\n row: cell.row,\n tablePos: cell.tablePos,\n };\n },\n });\n const selectedCell = selectedFormulaState ? getSelectedTableFormulaCell(editor) : null;\n\n useEffect(() => {\n const focusFormulaInput = () => {\n inputRef.current?.focus();\n };\n const handleDoubleClick = (event: MouseEvent) => {\n const target = resolveEventElement(event.target);\n if (!target?.closest?.(\"td[data-formula],th[data-formula]\")) return;\n event.preventDefault();\n focusFormulaInput();\n };\n\n editor.view.dom.addEventListener(\"dblclick\", handleDoubleClick);\n return () => {\n editor.view.dom.removeEventListener(\"dblclick\", handleDoubleClick);\n };\n }, [editor]);\n\n if (!selectedCell) return null;\n\n const selectedCellKey = `${selectedCell.tablePos}:${selectedCell.row}:${selectedCell.column}`;\n const draft =\n draftState?.cellKey === selectedCellKey && draftState.sourceFormula === selectedCell.formula\n ? draftState.value\n : selectedCell.formula;\n const setDraft = (value: string) => {\n setDraftState({\n cellKey: selectedCellKey,\n sourceFormula: selectedCell.formula,\n value,\n });\n };\n const applyDraft = () => {\n const normalized = normalizeFormulaInput(draft);\n if (normalized) {\n setSelectedTableCellFormula(editor, normalized);\n } else {\n clearSelectedTableCellFormula(editor);\n }\n setDraftState(null);\n };\n const cancelDraft = () => {\n setDraftState(null);\n window.setTimeout(() => {\n if (!editor.isDestroyed) editor.commands.focus();\n }, 0);\n };\n\n return (\n <div\n data-ueditor-formula-bar=\"\"\n role=\"toolbar\"\n aria-label={t(\"tableMenu.formulaBar\")}\n className=\"flex min-h-10 items-center gap-2 border-b border-border/60 bg-muted/25 px-2 py-1.5\"\n >\n <span\n data-ueditor-formula-cell-label=\"\"\n className=\"flex h-7 min-w-12 items-center justify-center rounded-md border border-border/60 bg-background px-2 font-mono text-xs font-semibold text-foreground\"\n >\n {selectedCell.label}\n </span>\n <Sigma aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 text-primary\" />\n <input\n ref={inputRef}\n data-ueditor-formula-input=\"\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") {\n event.preventDefault();\n applyDraft();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n cancelDraft();\n }\n }}\n aria-label={t(\"tableMenu.editFormula\")}\n className={`h-7 min-w-0 flex-1 rounded-md bg-background px-2 font-mono text-sm text-foreground ${formControlOutlineClass}`}\n />\n {selectedCell.formulaState === \"error\" && (\n <span\n role=\"status\"\n className=\"hidden shrink-0 items-center gap-1 text-xs font-medium text-destructive sm:inline-flex\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n {t(\"tableMenu.formulaError\")}\n </span>\n )}\n <button\n type=\"button\"\n onClick={applyDraft}\n aria-label={t(\"tableMenu.apply\")}\n title={t(\"tableMenu.apply\")}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n <Check aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => {\n convertSelectedTableCellFormulaToValue(editor);\n setDraftState(null);\n }}\n aria-label={t(\"tableMenu.convertToValue\")}\n title={t(\"tableMenu.convertToValue\")}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-border/60 bg-background text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <Hash aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => {\n clearSelectedTableCellFormula(editor);\n setDraftState(null);\n }}\n aria-label={t(\"tableMenu.clearCell\")}\n title={t(\"tableMenu.clearCell\")}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-destructive/30 bg-background text-destructive transition-colors hover:bg-destructive/10\"\n >\n <Trash2 aria-hidden=\"true\" className=\"h-4 w-4\" />\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { Editor } from \"@tiptap/core\";\n\ntype UEditorOutputCallbacks = {\n onChange?: (content: string) => void;\n onHtmlChange?: (html: string) => void;\n onJsonChange?: (json: object) => void;\n};\n\nfunction normalizeDebounceMs(value: number | undefined) {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nexport function useUEditorOutput({\n onChange,\n onHtmlChange,\n onJsonChange,\n outputDebounceMs,\n}: UEditorOutputCallbacks & { outputDebounceMs?: number }) {\n const callbacksRef = React.useRef<UEditorOutputCallbacks>({\n onChange,\n onHtmlChange,\n onJsonChange,\n });\n const pendingEditorRef = React.useRef<Editor | null>(null);\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const debounceMs = normalizeDebounceMs(outputDebounceMs);\n\n // Refresh subscriptions before the browser can dispatch another event while\n // keeping render pure for React Compiler.\n React.useLayoutEffect(() => {\n callbacksRef.current = { onChange, onHtmlChange, onJsonChange };\n }, [onChange, onHtmlChange, onJsonChange]);\n\n const flushOutputUpdates = React.useCallback(() => {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n const editor = pendingEditorRef.current;\n pendingEditorRef.current = null;\n if (!editor || editor.isDestroyed) return;\n\n const callbacks = callbacksRef.current;\n if (callbacks.onChange || callbacks.onHtmlChange) {\n const html = editor.getHTML();\n callbacks.onChange?.(html);\n callbacks.onHtmlChange?.(html);\n }\n if (callbacks.onJsonChange) {\n callbacks.onJsonChange(editor.getJSON());\n }\n }, []);\n\n const scheduleOutputUpdate = React.useCallback((editor: Editor) => {\n const callbacks = callbacksRef.current;\n if (!callbacks.onChange && !callbacks.onHtmlChange && !callbacks.onJsonChange) return;\n\n pendingEditorRef.current = editor;\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n if (debounceMs === 0) {\n flushOutputUpdates();\n return;\n }\n\n timeoutRef.current = setTimeout(flushOutputUpdates, debounceMs);\n }, [debounceMs, flushOutputUpdates]);\n\n React.useEffect(() => {\n if (!pendingEditorRef.current || timeoutRef.current === null) return;\n\n clearTimeout(timeoutRef.current);\n timeoutRef.current = debounceMs === 0\n ? null\n : setTimeout(flushOutputUpdates, debounceMs);\n if (debounceMs === 0) flushOutputUpdates();\n }, [debounceMs, flushOutputUpdates]);\n\n React.useEffect(() => () => {\n flushOutputUpdates();\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n pendingEditorRef.current = null;\n }, [flushOutputUpdates]);\n\n return {\n flushOutputUpdates,\n scheduleOutputUpdate,\n };\n}\n"],"mappings":"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","names":["url","React","useEffect","useImperativeHandle","useMemo","useRef","mergeAttributes","ReactNodeViewRenderer","EmojiPicker","jsx","Node","mergeAttributes","ReactNodeViewRenderer","React","NodeViewWrapper","jsx","jsxs","React","NodeViewWrapper","Node","mergeAttributes","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","useEffect","useState","NodeViewWrapper","RefreshCw","jsx","jsxs","useState","useEffect","NodeViewWrapper","RefreshCw","Node","mergeAttributes","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","NodeViewWrapper","jsx","NodeViewWrapper","Node","mergeAttributes","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","NodeViewWrapper","jsx","jsxs","NodeViewWrapper","Node","mergeAttributes","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","React","NodeViewWrapper","jsx","Node","mergeAttributes","ReactNodeViewRenderer","React","useEffect","useRef","jsx","jsxs","React","useRef","useEffect","Extension","Suggestion","ReactRenderer","PluginKey","React","forwardRef","useImperativeHandle","jsx","jsxs","useResettingIndex","React","forwardRef","useImperativeHandle","Extension","Suggestion","PluginKey","ReactRenderer","Extension","Suggestion","ReactRenderer","PluginKey","React","forwardRef","useImperativeHandle","jsx","jsxs","forwardRef","React","useImperativeHandle","Extension","Suggestion","PluginKey","ReactRenderer","Extension","Plugin","PluginKey","hasTable","useEffect","useRef","useState","Image","mergeAttributes","NodeViewWrapper","ReactNodeViewRenderer","jsx","jsxs","useRef","useState","dispatchTableLayoutChange","useEffect","NodeViewWrapper","Image","mergeAttributes","ReactNodeViewRenderer","Extension","Extension","Extension","Extension","Extension","mergeAttributes","Table","Plugin","PluginKey","Table","mergeAttributes","Plugin","PluginKey","React","useState","NodeViewWrapper","NodeViewContent","Check","jsx","jsxs","useState","React","NodeViewWrapper","Check","NodeViewContent","Plugin","PluginKey","Decoration","DecorationSet","Extension","Plugin","TextSelection","selectedRect","TextSelection","selectedRect","Extension","Plugin","mergeAttributes","ReactNodeViewRenderer","useEffect","useRef","useState","setCellAttr","ChevronDown","Type","ExternalLink","Sigma","selectedRect","jsx","jsxs","useRef","useEffect","useState","setCellAttr","isInTable","ChevronDown","Sigma","Type","ExternalLink","setPosition","context","jsxs","React","AlignCenter","AlignLeft","AlignRight","ArrowDown","ArrowRight","Copy","Grid","Trash2","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","Fragment","jsx","Fragment","jsx","jsxs","Fragment","jsx","jsxs","clamp","React","surface","nextTable","AlignLeft","AlignCenter","AlignRight","Grid","ArrowRight","ArrowDown","Trash2","Copy","React","useEffect","useRef","React","useRef","useRef","React","useRef","React","useEffect","useEffect","useRef","TableMap","TextSelection","TableMap","getCellText","TableMap","TextSelection","useRef","useEffect","TableMap","useEffect","useRef","useState","useEditorState","AlertCircle","Check","Sigma","Trash2","jsx","jsxs","useRef","useState","useEditorState","useEffect","Sigma","AlertCircle","Check","Trash2","React","jsx","jsxs","React","useRef","useEffect","editor","useMemo","activeEditor","useImperativeHandle"]}
|