teem-editor 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"teem-editor.cjs","sources":["../src/icons.jsx","../src/i18n.js","../src/Toolbar.jsx","../src/Dialogs.jsx","../src/sanitize.js","../src/upload.js","../src/history.js","../src/commands.js","../src/TeemEditor.jsx"],"sourcesContent":["const stroke = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.8,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\nfunction Icon({ children, size = 18 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport const Icons = {\n undo: (\n <Icon>\n <path {...stroke} d=\"M9 14L4 9l5-5\" />\n <path {...stroke} d=\"M4 9h10a6 6 0 010 12h-3\" />\n </Icon>\n ),\n redo: (\n <Icon>\n <path {...stroke} d=\"M15 14l5-5-5-5\" />\n <path {...stroke} d=\"M20 9H10a6 6 0 000 12h3\" />\n </Icon>\n ),\n bold: (\n <Icon>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 5h6a3.5 3.5 0 010 7H7z\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 12h7a3.5 3.5 0 010 7H7z\"\n />\n </Icon>\n ),\n italic: (\n <Icon>\n <path {...stroke} d=\"M10 5h8\" />\n <path {...stroke} d=\"M6 19h8\" />\n <path {...stroke} d=\"M14 5l-4 14\" />\n </Icon>\n ),\n strike: (\n <Icon>\n <path {...stroke} d=\"M5 12h14\" />\n <path {...stroke} d=\"M16 7.5A4 4 0 0012 6c-2.8 0-4.5 1.5-4.5 3.2 0 3.3 7.5 1.7 7.5 5.1A3.4 3.4 0 0112 18c-2.2 0-4-1-4.8-2.4\" />\n </Icon>\n ),\n ul: (\n <Icon>\n <path {...stroke} d=\"M9 6h11M9 12h11M9 18h11\" />\n <circle cx=\"5\" cy=\"6\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"5\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" />\n </Icon>\n ),\n ol: (\n <Icon>\n <path {...stroke} d=\"M11 6h9M11 12h9M11 18h9\" />\n <g\n fill=\"currentColor\"\n stroke=\"none\"\n fontSize=\"8\"\n fontWeight=\"700\"\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n <text x=\"3.5\" y=\"8\">\n 1\n </text>\n <text x=\"3.5\" y=\"14.2\">\n 2\n </text>\n <text x=\"3.5\" y=\"20.4\">\n 3\n </text>\n </g>\n </Icon>\n ),\n quote: (\n <Icon>\n <path fill=\"currentColor\" stroke=\"none\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </Icon>\n ),\n alignRight: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M8 12h12M4 18h16\" />\n </Icon>\n ),\n alignCenter: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M7 12h10M4 18h16\" />\n </Icon>\n ),\n alignLeft: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M4 12h12M4 18h16\" />\n </Icon>\n ),\n link: (\n <Icon>\n <path {...stroke} d=\"M10 13a5 5 0 007.07 0l1.41-1.41a5 5 0 00-7.07-7.07L10 5.93\" />\n <path {...stroke} d=\"M14 11a5 5 0 00-7.07 0L5.52 12.4a5 5 0 007.07 7.07L14 18.07\" />\n </Icon>\n ),\n image: (\n <Icon>\n <rect {...stroke} x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n <path {...stroke} d=\"M3 16l5-4 4 3 3-2 6 3\" />\n </Icon>\n ),\n rtl: (\n <Icon>\n {/* q (standard pilcrow) */}\n <path\n fill=\"currentColor\"\n stroke=\"none\"\n d=\"M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4z\"\n />\n {/* arrow left */}\n <path fill=\"currentColor\" stroke=\"none\" d=\"M3 18l4-4v3H19v2H7v3l-4-4z\" />\n </Icon>\n ),\n ltr: (\n <Icon>\n {/* P = mirrored pilcrow */}\n <g transform=\"translate(24 0) scale(-1 1)\">\n <path\n fill=\"currentColor\"\n stroke=\"none\"\n d=\"M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4z\"\n />\n </g>\n {/* arrow right */}\n <path fill=\"currentColor\" stroke=\"none\" d=\"M21 18l-4-4v3H5v2h12v3l4-4z\" />\n </Icon>\n ),\n hr: (\n <Icon>\n <path {...stroke} d=\"M4 12h16\" />\n </Icon>\n ),\n indent: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M12 12h8M4 18h16\" />\n <path {...stroke} d=\"M4 9l4 3-4 3\" />\n </Icon>\n ),\n outdent: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M12 12h8M4 18h16\" />\n <path {...stroke} d=\"M8 9L4 12l4 3\" />\n </Icon>\n ),\n textColor: (\n <Icon>\n <path {...stroke} d=\"M6 16l3.5-9h1L14 16\" />\n <path {...stroke} d=\"M7.5 13h5\" />\n </Icon>\n ),\n bgColor: (\n <Icon>\n <path {...stroke} d=\"M8 4l8 8-4 4-8-8z\" />\n <path {...stroke} d=\"M5 19h10\" />\n </Icon>\n ),\n chevronDown: (\n <Icon size={12}>\n <path {...stroke} d=\"M6 9l6 6 6-6\" />\n </Icon>\n ),\n code: (\n <Icon>\n <path {...stroke} d=\"M8 8L4 12l4 4\" />\n <path {...stroke} d=\"M16 8l4 4-4 4\" />\n <path {...stroke} d=\"M14 5l-4 14\" />\n </Icon>\n ),\n close: (\n <Icon size={16}>\n <path {...stroke} d=\"M6 6l12 12M18 6L6 18\" />\n </Icon>\n ),\n};\n","const en = {\n placeholder: 'Write something…',\n toolbar: 'TeemEditor toolbar',\n undo: 'Undo',\n redo: 'Redo',\n blockType: 'Block type',\n paragraph: 'Paragraph',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n heading5: 'Heading 5',\n heading6: 'Heading 6',\n quote: 'Quote',\n preformatted: 'Preformatted',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n bulletList: 'Bullet list',\n numberedList: 'Numbered list',\n alignRight: 'Align right',\n alignCenter: 'Align center',\n alignLeft: 'Align left',\n alignImageRight: 'Align image right',\n alignImageCenter: 'Align image center',\n alignImageLeft: 'Align image left',\n rtl: 'Right to left',\n ltr: 'Left to right',\n indent: 'Indent',\n outdent: 'Outdent',\n insertLink: 'Insert link',\n insertImage: 'Insert image',\n horizontalRule: 'Horizontal rule',\n textColor: 'Text color',\n bgColor: 'Highlight color',\n applyCurrentColor: 'Apply current color',\n openPalette: 'Open color palette',\n noColor: 'No color',\n customColor: 'Custom color',\n pickCustomColor: 'Pick custom color',\n sourceMode: 'Edit HTML',\n visualMode: 'Back to visual editor',\n editorLabel: 'Rich text editor',\n sourceLabel: 'HTML source editor',\n close: 'Close',\n cancel: 'Cancel',\n save: 'Save',\n linkTitle: 'Insert link',\n linkUrl: 'URL',\n linkText: 'Display text (optional)',\n linkTextPlaceholder: 'Link text',\n linkSubmit: 'Insert link',\n linkUrlRequired: 'Please enter a link URL.',\n linkInvalid: 'Invalid link.',\n linkUnsafe: 'The link URL is invalid or unsafe.',\n imageTitle: 'Insert image',\n imageSubmit: 'Insert image',\n imageBusy: 'Processing…',\n imageUploadTab: 'Upload file',\n imageUrlTab: 'From URL',\n imageFile: 'Image file',\n imageUrl: 'Image URL',\n imageAlt: 'Alt text',\n imageAltPlaceholder: 'Short image description',\n imageHint: 'Only jpg, png, gif, and webp — max 2 MB',\n imagePickFile: 'Please select an image file.',\n imageInsertFailed: 'Failed to insert image.',\n imageUploadFailed: 'Image upload failed.',\n imageUnsafe: 'The image URL is invalid or unsafe.',\n altTitle: 'Edit image alt text',\n altLabel: 'Alt text',\n altPlaceholder: 'Short description for accessibility and SEO',\n altHint:\n 'Shown when the image cannot load, and used by screen readers.',\n editAlt: 'Edit Alt',\n editAltTitle: 'Edit image alt text',\n fileInvalid: 'Invalid file.',\n fileEmpty: 'File is empty.',\n fileTooLarge: (mb) => `File size must not exceed ${mb} MB.`,\n fileBadExtension: 'File extension is not allowed. Only jpg, png, gif, and webp.',\n fileBadMime: 'File type is not allowed.',\n fileBadContent: 'File content is not a valid image.',\n fileMimeMismatch: 'Declared file type does not match actual content.',\n fileReadError: 'Failed to read the file.',\n};\n\nconst fa = {\n placeholder: 'متن خود را بنویسید…',\n toolbar: 'نوار ابزار ویرایشگر',\n undo: 'قبل (واگرد)',\n redo: 'بعد (بازگردانی)',\n blockType: 'نوع بلوک',\n paragraph: 'پاراگراف',\n heading1: 'عنوان ۱',\n heading2: 'عنوان ۲',\n heading3: 'عنوان ۳',\n heading4: 'عنوان ۴',\n heading5: 'عنوان ۵',\n heading6: 'عنوان ۶',\n quote: 'نقل‌قول',\n preformatted: 'پیش‌قالب‌بندی‌شده',\n bold: 'ضخیم',\n italic: 'کج',\n strike: 'خط‌خورده',\n bulletList: 'فهرست نقطه‌ای',\n numberedList: 'فهرست عددی',\n alignRight: 'راست‌چین',\n alignCenter: 'وسط‌چین',\n alignLeft: 'چپ‌چین',\n alignImageRight: 'تراز راست تصویر',\n alignImageCenter: 'تراز وسط تصویر',\n alignImageLeft: 'تراز چپ تصویر',\n rtl: 'راست به چپ',\n ltr: 'چپ به راست',\n indent: 'فرورفتگی',\n outdent: 'بیرون‌آمدگی',\n insertLink: 'درج لینک',\n insertImage: 'درج تصویر',\n horizontalRule: 'خط افقی',\n textColor: 'رنگ متن',\n bgColor: 'رنگ پس‌زمینه',\n applyCurrentColor: 'اعمال رنگ فعلی',\n openPalette: 'باز کردن پالت رنگ',\n noColor: 'بدون رنگ',\n customColor: 'رنگ دلخواه',\n pickCustomColor: 'انتخاب رنگ دلخواه',\n sourceMode: 'ویرایش HTML',\n visualMode: 'بازگشت به حالت دیداری',\n editorLabel: 'ویرایشگر متن',\n sourceLabel: 'ویرایشگر کد HTML',\n close: 'بستن',\n cancel: 'انصراف',\n save: 'ذخیره',\n linkTitle: 'درج لینک',\n linkUrl: 'آدرس',\n linkText: 'متن نمایشی (اختیاری)',\n linkTextPlaceholder: 'متن لینک',\n linkSubmit: 'درج لینک',\n linkUrlRequired: 'آدرس لینک را وارد کنید.',\n linkInvalid: 'لینک نامعتبر است.',\n linkUnsafe: 'آدرس لینک نامعتبر یا ناامن است.',\n imageTitle: 'درج تصویر',\n imageSubmit: 'درج تصویر',\n imageBusy: 'در حال پردازش…',\n imageUploadTab: 'آپلود فایل',\n imageUrlTab: 'از آدرس',\n imageFile: 'فایل تصویر',\n imageUrl: 'آدرس تصویر',\n imageAlt: 'متن جایگزین',\n imageAltPlaceholder: 'توضیح کوتاه تصویر',\n imageHint: 'فقط jpg، png، gif و webp — حداکثر ۲ مگابایت',\n imagePickFile: 'یک فایل تصویر انتخاب کنید.',\n imageInsertFailed: 'درج تصویر ناموفق بود.',\n imageUploadFailed: 'آپلود تصویر ناموفق بود.',\n imageUnsafe: 'آدرس تصویر نامعتبر یا ناامن است.',\n altTitle: 'ویرایش متن جایگزین تصویر',\n altLabel: 'متن جایگزین (Alt)',\n altPlaceholder: 'توضیح کوتاه تصویر برای دسترس‌پذیری و SEO',\n altHint:\n 'این متن وقتی تصویر لود نشود نمایش داده می‌شود و برای خواننده‌های صفحه مهم است.',\n editAlt: 'ویرایش Alt',\n editAltTitle: 'ویرایش متن جایگزین تصویر',\n fileInvalid: 'فایل نامعتبر است.',\n fileEmpty: 'فایل خالی است.',\n fileTooLarge: (mb) => `حجم فایل نباید بیشتر از ${mb} مگابایت باشد.`,\n fileBadExtension: 'پسوند فایل مجاز نیست. فقط jpg، png، gif و webp.',\n fileBadMime: 'نوع فایل مجاز نیست.',\n fileBadContent: 'محتوای فایل تصویر معتبر نیست.',\n fileMimeMismatch: 'نوع اعلام‌شده فایل با محتوای واقعی هم‌خوانی ندارد.',\n fileReadError: 'خواندن فایل با خطا مواجه شد.',\n};\n\nconst ar = {\n placeholder: 'اكتب شيئاً…',\n toolbar: 'شريط أدوات المحرر',\n undo: 'تراجع',\n redo: 'إعادة',\n blockType: 'نوع الكتلة',\n paragraph: 'فقرة',\n heading1: 'عنوان 1',\n heading2: 'عنوان 2',\n heading3: 'عنوان 3',\n heading4: 'عنوان 4',\n heading5: 'عنوان 5',\n heading6: 'عنوان 6',\n quote: 'اقتباس',\n preformatted: 'نص منسق مسبقاً',\n bold: 'عريض',\n italic: 'مائل',\n strike: 'يتوسطه خط',\n bulletList: 'قائمة نقطية',\n numberedList: 'قائمة مرقمة',\n alignRight: 'محاذاة لليمين',\n alignCenter: 'محاذاة للوسط',\n alignLeft: 'محاذاة لليسار',\n alignImageRight: 'محاذاة الصورة لليمين',\n alignImageCenter: 'محاذاة الصورة للوسط',\n alignImageLeft: 'محاذاة الصورة لليسار',\n rtl: 'من اليمين إلى اليسار',\n ltr: 'من اليسار إلى اليمين',\n indent: 'زيادة المسافة البادئة',\n outdent: 'إنقاص المسافة البادئة',\n insertLink: 'إدراج رابط',\n insertImage: 'إدراج صورة',\n horizontalRule: 'خط أفقي',\n textColor: 'لون النص',\n bgColor: 'لون التمييز',\n applyCurrentColor: 'تطبيق اللون الحالي',\n openPalette: 'فتح لوحة الألوان',\n noColor: 'بدون لون',\n customColor: 'لون مخصص',\n pickCustomColor: 'اختيار لون مخصص',\n sourceMode: 'تحرير HTML',\n visualMode: 'العودة إلى المحرر المرئي',\n editorLabel: 'محرر النص',\n sourceLabel: 'محرر مصدر HTML',\n close: 'إغلاق',\n cancel: 'إلغاء',\n save: 'حفظ',\n linkTitle: 'إدراج رابط',\n linkUrl: 'العنوان',\n linkText: 'نص العرض (اختياري)',\n linkTextPlaceholder: 'نص الرابط',\n linkSubmit: 'إدراج الرابط',\n linkUrlRequired: 'يرجى إدخال عنوان الرابط.',\n linkInvalid: 'رابط غير صالح.',\n linkUnsafe: 'عنوان الرابط غير صالح أو غير آمن.',\n imageTitle: 'إدراج صورة',\n imageSubmit: 'إدراج الصورة',\n imageBusy: 'جارٍ المعالجة…',\n imageUploadTab: 'رفع ملف',\n imageUrlTab: 'من رابط',\n imageFile: 'ملف الصورة',\n imageUrl: 'رابط الصورة',\n imageAlt: 'النص البديل',\n imageAltPlaceholder: 'وصف قصير للصورة',\n imageHint: 'فقط jpg و png و gif و webp — بحد أقصى 2 ميجابايت',\n imagePickFile: 'يرجى اختيار ملف صورة.',\n imageInsertFailed: 'فشل إدراج الصورة.',\n imageUploadFailed: 'فشل رفع الصورة.',\n imageUnsafe: 'رابط الصورة غير صالح أو غير آمن.',\n altTitle: 'تحرير النص البديل للصورة',\n altLabel: 'النص البديل (Alt)',\n altPlaceholder: 'وصف قصير لإمكانية الوصول و SEO',\n altHint:\n 'يظهر عندما يتعذر تحميل الصورة، ويستخدمه قارئات الشاشة.',\n editAlt: 'تحرير Alt',\n editAltTitle: 'تحرير النص البديل للصورة',\n fileInvalid: 'ملف غير صالح.',\n fileEmpty: 'الملف فارغ.',\n fileTooLarge: (mb) => `يجب ألا يتجاوز حجم الملف ${mb} ميجابايت.`,\n fileBadExtension: 'امتداد الملف غير مسموح. فقط jpg و png و gif و webp.',\n fileBadMime: 'نوع الملف غير مسموح.',\n fileBadContent: 'محتوى الملف ليس صورة صالحة.',\n fileMimeMismatch: 'نوع الملف المعلن لا يطابق المحتوى الفعلي.',\n fileReadError: 'فشل قراءة الملف.',\n};\n\nconst locales = { en, fa, ar };\n\nconst RTL_LANGS = new Set(['fa', 'ar']);\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function resolveLanguage(language = 'en') {\n const key = String(language || 'en').toLowerCase();\n if (locales[key]) return key;\n return 'en';\n}\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function getMessages(language = 'en') {\n return locales[resolveLanguage(language)];\n}\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function getDefaultDir(language = 'en') {\n return RTL_LANGS.has(resolveLanguage(language)) ? 'rtl' : 'ltr';\n}\n\nexport function getBlockOptions(t) {\n return [\n { value: 'p', label: t.paragraph },\n { value: 'h1', label: t.heading1 },\n { value: 'h2', label: t.heading2 },\n { value: 'h3', label: t.heading3 },\n { value: 'h4', label: t.heading4 },\n { value: 'h5', label: t.heading5 },\n { value: 'h6', label: t.heading6 },\n { value: 'blockquote', label: t.quote },\n { value: 'pre', label: t.preformatted },\n ];\n}\n\nexport { locales, en, fa, ar };\n","import { useEffect, useRef, useState } from 'react';\nimport { Icons } from './icons.jsx';\nimport { getBlockOptions } from './i18n.js';\n\nconst TEXT_COLORS = [\n '#111827',\n '#dc2626',\n '#ea580c',\n '#ca8a04',\n '#16a34a',\n '#2563eb',\n '#7c3aed',\n '#db2777',\n '#ffffff',\n];\n\nconst BG_COLORS = [\n 'transparent',\n '#fef08a',\n '#bbf7d0',\n '#bfdbfe',\n '#fecaca',\n '#e9d5ff',\n '#fed7aa',\n '#e5e7eb',\n '#111827',\n];\n\nfunction ToolButton({ label, active, disabled, onClick, children, className = '' }) {\n return (\n <button\n type=\"button\"\n className={`te-tool${active ? ' is-active' : ''}${className ? ` ${className}` : ''}`}\n title={label}\n aria-label={label}\n aria-pressed={!!active}\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction Divider() {\n return <span className=\"te-toolbar__divider\" aria-hidden=\"true\" />;\n}\n\nfunction ColorSplitButton({\n label,\n icon,\n colors,\n value,\n onChange,\n onRememberSelection,\n allowTransparent = false,\n disabled = false,\n t,\n}) {\n const [open, setOpen] = useState(false);\n const [preview, setPreview] = useState(null);\n const rootRef = useRef(null);\n const pickingCustomRef = useRef(false);\n const activeColor = preview ?? value;\n const underline =\n !activeColor || activeColor === 'transparent'\n ? allowTransparent\n ? 'repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%) 50% / 6px 6px'\n : '#111827'\n : activeColor;\n\n useEffect(() => {\n if (!open || disabled) {\n setPreview(null);\n if (disabled) setOpen(false);\n return undefined;\n }\n\n const onDoc = (e) => {\n if (pickingCustomRef.current) return;\n if (!rootRef.current?.contains(e.target)) setOpen(false);\n };\n const onKey = (e) => {\n if (e.key === 'Escape' && !pickingCustomRef.current) setOpen(false);\n };\n const onWindowFocus = () => {\n window.setTimeout(() => {\n pickingCustomRef.current = false;\n }, 50);\n };\n\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('focus', onWindowFocus);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('focus', onWindowFocus);\n };\n }, [open, disabled]);\n\n const apply = (color, { close = true } = {}) => {\n if (disabled) return;\n onRememberSelection?.();\n onChange(color);\n setPreview(null);\n if (close) setOpen(false);\n };\n\n return (\n <div className={`te-color${open ? ' is-open' : ''}${disabled ? ' is-disabled' : ''}`} ref={rootRef}>\n <div className=\"te-color__split\">\n <button\n type=\"button\"\n className=\"te-tool te-color__apply\"\n title={`${label} — ${t.applyCurrentColor}`}\n aria-label={`${label} — ${t.applyCurrentColor}`}\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n if (disabled) return;\n onRememberSelection?.();\n onChange(value);\n }}\n >\n <span className=\"te-color__icon\">{icon}</span>\n <span\n className=\"te-color__bar\"\n style={{ background: underline }}\n aria-hidden=\"true\"\n />\n </button>\n <button\n type=\"button\"\n className={`te-tool te-color__caret${open ? ' is-active' : ''}`}\n title={`${t.openPalette}: ${label}`}\n aria-label={`${t.openPalette}: ${label}`}\n aria-expanded={open}\n aria-haspopup=\"true\"\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n if (disabled) return;\n onRememberSelection?.();\n setOpen((v) => !v);\n }}\n >\n {Icons.chevronDown}\n </button>\n </div>\n\n {open && !disabled ? (\n <div\n className=\"te-color__swatches\"\n role=\"group\"\n aria-label={label}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`te-swatch${value === c ? ' is-selected' : ''}`}\n style={{\n background:\n c === 'transparent'\n ? 'repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%) 50% / 8px 8px'\n : c,\n borderColor: c === '#ffffff' ? '#d1d5db' : undefined,\n }}\n title={c === 'transparent' ? t.noColor : c}\n aria-label={c === 'transparent' ? t.noColor : c}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n apply(c);\n }}\n />\n ))}\n <label\n className=\"te-swatch te-swatch--picker\"\n title={t.customColor}\n onMouseDown={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n onRememberSelection?.();\n }}\n >\n <input\n type=\"color\"\n value={activeColor && activeColor !== 'transparent' ? activeColor : '#111827'}\n onMouseDown={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n }}\n onClick={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n }}\n onInput={(e) => {\n setPreview(e.target.value);\n }}\n onChange={(e) => {\n apply(e.target.value, { close: false });\n pickingCustomRef.current = false;\n }}\n onBlur={() => {\n window.setTimeout(() => {\n pickingCustomRef.current = false;\n setPreview(null);\n }, 50);\n }}\n aria-label={`${t.pickCustomColor}: ${label}`}\n />\n </label>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function Toolbar({\n t,\n states,\n canUndo,\n canRedo,\n onCommand,\n onBlockChange,\n onOpenLink,\n onOpenImage,\n onUndo,\n onRedo,\n onRememberSelection,\n sourceMode = false,\n onToggleSource,\n}) {\n const [textColor, setTextColor] = useState('#111827');\n const [bgColor, setBgColor] = useState('#fef08a');\n const formattingDisabled = sourceMode;\n const blockOptions = getBlockOptions(t);\n\n return (\n <div className=\"te-toolbar\" role=\"toolbar\" aria-label={t.toolbar}>\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.undo} disabled={formattingDisabled || !canUndo} onClick={onUndo}>\n {Icons.undo}\n </ToolButton>\n <ToolButton label={t.redo} disabled={formattingDisabled || !canRedo} onClick={onRedo}>\n {Icons.redo}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <label className=\"te-select-wrap\">\n <span className=\"te-sr-only\">{t.blockType}</span>\n <select\n className=\"te-select\"\n value={states.format || 'p'}\n disabled={formattingDisabled}\n onChange={(e) => onBlockChange(e.target.value)}\n onMouseDown={(e) => {\n e.stopPropagation();\n onRememberSelection?.();\n }}\n >\n {blockOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.bold}\n active={states.bold}\n disabled={formattingDisabled}\n onClick={() => onCommand('bold')}\n >\n {Icons.bold}\n </ToolButton>\n <ToolButton\n label={t.italic}\n active={states.italic}\n disabled={formattingDisabled}\n onClick={() => onCommand('italic')}\n >\n {Icons.italic}\n </ToolButton>\n <ToolButton\n label={t.strike}\n active={states.strikeThrough}\n disabled={formattingDisabled}\n onClick={() => onCommand('strikeThrough')}\n >\n {Icons.strike}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.bulletList}\n active={states.unorderedList}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertUnorderedList')}\n >\n {Icons.ul}\n </ToolButton>\n <ToolButton\n label={t.numberedList}\n active={states.orderedList}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertOrderedList')}\n >\n {Icons.ol}\n </ToolButton>\n <ToolButton\n label={t.quote}\n active={states.format === 'blockquote'}\n disabled={formattingDisabled}\n onClick={() =>\n onBlockChange(states.format === 'blockquote' ? 'p' : 'blockquote')\n }\n >\n {Icons.quote}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageRight : t.alignRight}\n active={states.justifyRight}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyRight')}\n >\n {Icons.alignRight}\n </ToolButton>\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageCenter : t.alignCenter}\n active={states.justifyCenter}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyCenter')}\n >\n {Icons.alignCenter}\n </ToolButton>\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageLeft : t.alignLeft}\n active={states.justifyLeft}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyLeft')}\n >\n {Icons.alignLeft}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.rtl} disabled={formattingDisabled} onClick={() => onCommand('rtl')}>\n {Icons.rtl}\n </ToolButton>\n <ToolButton label={t.ltr} disabled={formattingDisabled} onClick={() => onCommand('ltr')}>\n {Icons.ltr}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.indent}\n className=\"te-tool--indent\"\n disabled={formattingDisabled}\n onClick={() => onCommand('indent')}\n >\n {Icons.indent}\n </ToolButton>\n <ToolButton\n label={t.outdent}\n className=\"te-tool--outdent\"\n disabled={formattingDisabled}\n onClick={() => onCommand('outdent')}\n >\n {Icons.outdent}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.insertLink} disabled={formattingDisabled} onClick={onOpenLink}>\n {Icons.link}\n </ToolButton>\n <ToolButton label={t.insertImage} disabled={formattingDisabled} onClick={onOpenImage}>\n {Icons.image}\n </ToolButton>\n <ToolButton\n label={t.horizontalRule}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertHorizontalRule')}\n >\n {Icons.hr}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group te-toolbar__colors\">\n <ColorSplitButton\n label={t.textColor}\n icon={Icons.textColor}\n colors={TEXT_COLORS}\n value={textColor}\n disabled={formattingDisabled}\n t={t}\n onRememberSelection={onRememberSelection}\n onChange={(color) => {\n setTextColor(color);\n onCommand('foreColor', color);\n }}\n />\n <ColorSplitButton\n label={t.bgColor}\n icon={Icons.bgColor}\n colors={BG_COLORS}\n value={bgColor}\n allowTransparent\n disabled={formattingDisabled}\n t={t}\n onRememberSelection={onRememberSelection}\n onChange={(color) => {\n setBgColor(color);\n onCommand('hiliteColor', color);\n }}\n />\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={sourceMode ? t.visualMode : t.sourceMode}\n active={sourceMode}\n onClick={onToggleSource}\n >\n {Icons.code}\n </ToolButton>\n </div>\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { Icons } from './icons.jsx';\n\nexport function Modal({ open, title, onClose, children, footer, closeLabel = 'Close' }) {\n const titleId = useId();\n const panelRef = useRef(null);\n\n useEffect(() => {\n if (!open) return undefined;\n\n const onKey = (e) => {\n if (e.key === 'Escape') onClose?.();\n };\n document.addEventListener('keydown', onKey);\n\n const prev = document.activeElement;\n panelRef.current?.querySelector('input,button,textarea,select')?.focus();\n\n return () => {\n document.removeEventListener('keydown', onKey);\n if (prev && typeof prev.focus === 'function') prev.focus();\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div className=\"te-modal-backdrop\" role=\"presentation\" onMouseDown={onClose}>\n <div\n className=\"te-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n ref={panelRef}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"te-modal__header\">\n <h3 id={titleId}>{title}</h3>\n <button\n type=\"button\"\n className=\"te-modal__close\"\n onClick={onClose}\n aria-label={closeLabel}\n >\n {Icons.close}\n </button>\n </div>\n <div className=\"te-modal__body\">{children}</div>\n {footer ? <div className=\"te-modal__footer\">{footer}</div> : null}\n </div>\n </div>\n );\n}\n\nexport function LinkDialog({\n open,\n onClose,\n onSubmit,\n initialUrl = '',\n initialText = '',\n t,\n}) {\n const [url, setUrl] = useState(initialUrl);\n const [text, setText] = useState(initialText);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl);\n setText(initialText);\n setError('');\n }\n }, [open, initialUrl, initialText]);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n const trimmed = url.trim();\n if (!trimmed) {\n setError(t.linkUrlRequired);\n return;\n }\n try {\n onSubmit({ url: trimmed, text: text.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.linkInvalid);\n }\n };\n\n return (\n <Modal\n open={open}\n title={t.linkTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose}>\n {t.cancel}\n </button>\n <button type=\"submit\" form=\"te-link-form\" className=\"te-btn te-btn--primary\">\n {t.linkSubmit}\n </button>\n </>\n }\n >\n <form id=\"te-link-form\" onSubmit={handleSubmit} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.linkUrl}</span>\n <input\n type=\"url\"\n dir=\"ltr\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n required\n />\n </label>\n <label className=\"te-field\">\n <span>{t.linkText}</span>\n <input\n type=\"text\"\n placeholder={t.linkTextPlaceholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n />\n </label>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n </Modal>\n );\n}\n\nexport function ImageDialog({\n open,\n onClose,\n onSubmitUrl,\n onSubmitFile,\n accept = 'image/jpeg,image/png,image/gif,image/webp',\n t,\n}) {\n const [tab, setTab] = useState('file');\n const [url, setUrl] = useState('');\n const [alt, setAlt] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const fileRef = useRef(null);\n\n useEffect(() => {\n if (open) {\n setTab('file');\n setUrl('');\n setAlt('');\n setError('');\n setBusy(false);\n if (fileRef.current) fileRef.current.value = '';\n }\n }, [open]);\n\n const handleUrl = async (e) => {\n e.preventDefault();\n setError('');\n setBusy(true);\n try {\n await onSubmitUrl({ url: url.trim(), alt: alt.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.imageInsertFailed);\n } finally {\n setBusy(false);\n }\n };\n\n const handleFile = async (e) => {\n e.preventDefault();\n const file = fileRef.current?.files?.[0];\n if (!file) {\n setError(t.imagePickFile);\n return;\n }\n setError('');\n setBusy(true);\n try {\n await onSubmitFile({ file, alt: alt.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.imageUploadFailed);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Modal\n open={open}\n title={t.imageTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose} disabled={busy}>\n {t.cancel}\n </button>\n <button\n type=\"submit\"\n form={tab === 'file' ? 'te-image-file-form' : 'te-image-url-form'}\n className=\"te-btn te-btn--primary\"\n disabled={busy}\n >\n {busy ? t.imageBusy : t.imageSubmit}\n </button>\n </>\n }\n >\n <div className=\"te-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'file'}\n className={tab === 'file' ? 'is-active' : ''}\n onClick={() => setTab('file')}\n >\n {t.imageUploadTab}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'url'}\n className={tab === 'url' ? 'is-active' : ''}\n onClick={() => setTab('url')}\n >\n {t.imageUrlTab}\n </button>\n </div>\n\n {tab === 'file' ? (\n <form id=\"te-image-file-form\" onSubmit={handleFile} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.imageFile}</span>\n <input ref={fileRef} type=\"file\" accept={accept} />\n </label>\n <label className=\"te-field\">\n <span>{t.imageAlt}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.imageAltPlaceholder}\n />\n </label>\n <p className=\"te-hint\">{t.imageHint}</p>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n ) : (\n <form id=\"te-image-url-form\" onSubmit={handleUrl} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.imageUrl}</span>\n <input\n type=\"url\"\n dir=\"ltr\"\n placeholder=\"https://...\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n required\n />\n </label>\n <label className=\"te-field\">\n <span>{t.imageAlt}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.imageAltPlaceholder}\n />\n </label>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n )}\n </Modal>\n );\n}\n\nexport function ImageAltDialog({ open, onClose, onSubmit, initialAlt = '', t }) {\n const [alt, setAlt] = useState(initialAlt);\n\n useEffect(() => {\n if (open) setAlt(initialAlt);\n }, [open, initialAlt]);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n onSubmit({ alt: alt.trim() });\n onClose();\n };\n\n return (\n <Modal\n open={open}\n title={t.altTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose}>\n {t.cancel}\n </button>\n <button type=\"submit\" form=\"te-image-alt-form\" className=\"te-btn te-btn--primary\">\n {t.save}\n </button>\n </>\n }\n >\n <form id=\"te-image-alt-form\" onSubmit={handleSubmit} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.altLabel}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.altPlaceholder}\n />\n </label>\n <p className=\"te-hint\">{t.altHint}</p>\n </form>\n </Modal>\n );\n}\n","import DOMPurify from 'dompurify';\n\nconst ALLOWED_TAGS = [\n 'p',\n 'br',\n 'div',\n 'span',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'strong',\n 'b',\n 'em',\n 'i',\n 's',\n 'strike',\n 'del',\n 'blockquote',\n 'pre',\n 'a',\n 'img',\n 'hr',\n 'u',\n 'font',\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'src',\n 'alt',\n 'title',\n 'width',\n 'height',\n 'style',\n 'dir',\n 'class',\n 'color',\n 'face',\n 'size',\n 'contenteditable',\n 'data-align',\n 'loading',\n 'draggable',\n];\n\nconst SAFE_URL_PROTOCOLS = /^(https?:|mailto:|tel:|blob:)/i;\nconst SAFE_IMG_PROTOCOLS = /^(https?:|blob:|data:image\\/(png|jpeg|jpg|gif|webp);base64,)/i;\n\nfunction isSafeUrl(url, forImage = false) {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (trimmed.startsWith('javascript:') || trimmed.startsWith('vbscript:')) {\n return false;\n }\n if (trimmed.startsWith('#') || trimmed.startsWith('/')) return true;\n return forImage\n ? SAFE_IMG_PROTOCOLS.test(trimmed)\n : SAFE_URL_PROTOCOLS.test(trimmed) || trimmed.startsWith('/');\n}\n\nfunction sanitizeStyles(styleValue) {\n if (!styleValue || typeof styleValue !== 'string') return '';\n\n const allowed = new Set([\n 'color',\n 'background-color',\n 'text-align',\n 'direction',\n 'margin',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'margin-inline-start',\n 'margin-inline-end',\n 'padding-right',\n 'padding-left',\n 'padding-inline-start',\n 'padding-inline-end',\n 'text-indent',\n 'font-weight',\n 'font-style',\n 'text-decoration',\n 'text-decoration-line',\n 'display',\n 'float',\n 'max-width',\n 'width',\n 'height',\n 'box-sizing',\n ]);\n\n return styleValue\n .split(';')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const colon = part.indexOf(':');\n if (colon === -1) return null;\n const prop = part.slice(0, colon).trim().toLowerCase();\n const value = part.slice(colon + 1).trim();\n if (!allowed.has(prop)) return null;\n if (/expression|url\\s*\\(|javascript|import/i.test(value)) return null;\n return `${prop}: ${value}`;\n })\n .filter(Boolean)\n .join('; ');\n}\n\n/**\n * Sanitize HTML for safe rendering/storage.\n * Removes scripts, event handlers, and unsafe URLs.\n */\nexport function sanitizeHtml(dirty) {\n if (!dirty) return '';\n\n const clean = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS,\n ALLOWED_ATTR,\n ALLOW_DATA_ATTR: false,\n FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style'],\n FORBID_ATTR: [\n 'onerror',\n 'onload',\n 'onclick',\n 'onmouseover',\n 'onfocus',\n 'onblur',\n 'onchange',\n 'onsubmit',\n ],\n });\n\n if (typeof document === 'undefined') return clean;\n\n const wrapper = document.createElement('div');\n wrapper.innerHTML = clean;\n\n // Convert legacy <font color> (from older content / browsers) to <span style>\n wrapper.querySelectorAll('font').forEach((font) => {\n const span = document.createElement('span');\n const color = font.getAttribute('color');\n if (color) span.style.color = color;\n while (font.firstChild) span.appendChild(font.firstChild);\n font.replaceWith(span);\n });\n\n wrapper.querySelectorAll('a').forEach((a) => {\n const href = a.getAttribute('href') || '';\n if (!isSafeUrl(href, false)) {\n a.removeAttribute('href');\n } else {\n a.setAttribute('rel', 'noopener noreferrer');\n if (/^https?:/i.test(href)) {\n a.setAttribute('target', '_blank');\n }\n }\n });\n\n wrapper.querySelectorAll('img').forEach((img) => {\n const src = img.getAttribute('src') || '';\n if (!isSafeUrl(src, true)) {\n img.remove();\n return;\n }\n img.removeAttribute('onerror');\n img.removeAttribute('onload');\n\n // Keep images inside a selectable alignment wrapper\n if (!img.parentElement?.classList?.contains('te-figure')) {\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n const align =\n img.style.textAlign ||\n img.getAttribute('data-align') ||\n img.parentElement?.style?.textAlign ||\n 'center';\n figure.setAttribute('data-align', align);\n figure.style.textAlign = align;\n img.replaceWith(figure);\n figure.appendChild(img);\n }\n });\n\n wrapper.querySelectorAll('.te-figure').forEach((figure) => {\n figure.setAttribute('contenteditable', 'false');\n if (!figure.getAttribute('data-align')) {\n figure.setAttribute('data-align', figure.style.textAlign || 'center');\n }\n figure.querySelectorAll('.te-figure__alt-btn, button').forEach((btn) => btn.remove());\n figure.classList.remove('is-selected');\n });\n\n wrapper.querySelectorAll('img.is-selected').forEach((img) => {\n img.classList.remove('is-selected');\n });\n\n wrapper.querySelectorAll('[style]').forEach((el) => {\n const next = sanitizeStyles(el.getAttribute('style'));\n if (next) el.setAttribute('style', next);\n else el.removeAttribute('style');\n });\n\n flattenStyleSpans(wrapper);\n\n return wrapper.innerHTML;\n}\n\nfunction unwrapElement(el) {\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n}\n\nfunction styleKeys(el) {\n const keys = [];\n for (let i = 0; i < el.style.length; i += 1) keys.push(el.style.item(i));\n return keys;\n}\n\nfunction isStyleSpan(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE || el.tagName !== 'SPAN') return false;\n const keys = styleKeys(el);\n if (!keys.length) return false;\n return keys.every((k) => k === 'color' || k === 'background-color');\n}\n\n/**\n * Collapse nested color/background spans into clean markup.\n * Turns hundreds of nested <span style=\"color\"> into one span.\n */\nexport function flattenStyleSpans(root) {\n if (!root) return;\n\n let guard = 0;\n let changed = true;\n while (changed && guard < 80) {\n changed = false;\n guard += 1;\n\n [...root.querySelectorAll('span')].forEach((span) => {\n if (!span.isConnected) return;\n\n if (!span.getAttribute('style')?.trim() && !span.className) {\n unwrapElement(span);\n changed = true;\n return;\n }\n\n if (!isStyleSpan(span)) return;\n\n const parent = span.parentElement;\n if (\n parent &&\n isStyleSpan(parent) &&\n parent.childNodes.length === 1 &&\n parent.firstChild === span\n ) {\n if (span.style.color) parent.style.color = span.style.color;\n if (span.style.backgroundColor) {\n parent.style.backgroundColor = span.style.backgroundColor;\n }\n while (span.firstChild) parent.insertBefore(span.firstChild, span);\n span.remove();\n changed = true;\n return;\n }\n\n if (parent && isStyleSpan(parent)) {\n if (span.style.color) parent.style.color = span.style.color;\n if (span.style.backgroundColor) {\n parent.style.backgroundColor = span.style.backgroundColor;\n }\n unwrapElement(span);\n changed = true;\n }\n });\n }\n\n root.querySelectorAll('span').forEach((span) => {\n if (!span.getAttribute('style')?.trim() && !span.className) {\n unwrapElement(span);\n }\n });\n}\n\nexport function isSafeHref(url) {\n return isSafeUrl(url, false);\n}\n\nexport function isSafeImageSrc(url) {\n return isSafeUrl(url, true);\n}\n","import { getMessages } from './i18n.js';\n\n/** Magic-byte signatures for allowed image types */\nconst SIGNATURES = [\n { mime: 'image/jpeg', bytes: [0xff, 0xd8, 0xff] },\n { mime: 'image/png', bytes: [0x89, 0x50, 0x4e, 0x47] },\n {\n mime: 'image/gif',\n bytes: [0x47, 0x49, 0x46, 0x38],\n },\n {\n mime: 'image/webp',\n check: (buf) =>\n buf.length >= 12 &&\n buf[0] === 0x52 &&\n buf[1] === 0x49 &&\n buf[2] === 0x46 &&\n buf[3] === 0x46 &&\n buf[8] === 0x57 &&\n buf[9] === 0x45 &&\n buf[10] === 0x42 &&\n buf[11] === 0x50,\n },\n];\n\nconst DEFAULT_OPTIONS = {\n maxSizeBytes: 2 * 1024 * 1024,\n allowedMimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],\n allowedExtensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp'],\n};\n\nfunction getExtension(name) {\n const i = name.lastIndexOf('.');\n return i === -1 ? '' : name.slice(i).toLowerCase();\n}\n\nfunction sanitizeFileName(name) {\n const base = name\n .replace(/[/\\\\?%*:|\"<>]/g, '_')\n .replace(/\\s+/g, '-')\n .replace(/\\.+/g, '.')\n .slice(0, 100);\n return base || 'image';\n}\n\nasync function readMagicBytes(file, length = 16) {\n const slice = file.slice(0, length);\n const buffer = await slice.arrayBuffer();\n return new Uint8Array(buffer);\n}\n\nfunction detectMimeFromBytes(bytes) {\n for (const sig of SIGNATURES) {\n if (sig.check) {\n if (sig.check(bytes)) return sig.mime;\n } else if (sig.bytes.every((b, i) => bytes[i] === b)) {\n return sig.mime;\n }\n }\n return null;\n}\n\nfunction resolveMessages(options = {}) {\n return options.messages || getMessages(options.language || 'en');\n}\n\n/**\n * Validate an image file before upload.\n * Checks size, extension, claimed MIME, and magic bytes.\n */\nexport async function validateImageFile(file, options = {}) {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const t = resolveMessages(options);\n const errors = [];\n\n if (!file || !(file instanceof Blob)) {\n return { ok: false, errors: [t.fileInvalid] };\n }\n\n if (file.size <= 0) {\n errors.push(t.fileEmpty);\n }\n\n if (file.size > opts.maxSizeBytes) {\n const mb = (opts.maxSizeBytes / (1024 * 1024)).toFixed(1);\n errors.push(t.fileTooLarge(mb));\n }\n\n const ext = getExtension(file.name || '');\n if (!opts.allowedExtensions.includes(ext)) {\n errors.push(t.fileBadExtension);\n }\n\n const claimed = (file.type || '').toLowerCase();\n if (claimed && !opts.allowedMimeTypes.includes(claimed)) {\n errors.push(t.fileBadMime);\n }\n\n let detected = null;\n try {\n const bytes = await readMagicBytes(file);\n detected = detectMimeFromBytes(bytes);\n if (!detected) {\n errors.push(t.fileBadContent);\n } else if (\n claimed &&\n claimed !== detected &&\n !(claimed === 'image/jpg' && detected === 'image/jpeg')\n ) {\n errors.push(t.fileMimeMismatch);\n }\n } catch {\n errors.push(t.fileReadError);\n }\n\n if (errors.length) {\n return { ok: false, errors };\n }\n\n return {\n ok: true,\n mime: detected || claimed,\n safeName: sanitizeFileName(file.name || `image${ext}`),\n errors: [],\n };\n}\n\nfunction fileToDataUrl(file, mime) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result !== 'string' || !result.startsWith('data:image/')) {\n reject(new Error('Failed to encode image.'));\n return;\n }\n // Normalize MIME from validated magic bytes when possible\n if (mime && result.startsWith('data:')) {\n const comma = result.indexOf(',');\n if (comma !== -1) {\n resolve(`data:${mime};base64,${result.slice(comma + 1)}`);\n return;\n }\n }\n resolve(result);\n };\n reader.onerror = () => reject(reader.error || new Error('Failed to read file.'));\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Secure image insert pipeline:\n * 1) validate file\n * 2) call optional onUpload(file) → url\n * 3) otherwise embed as base64 data URL\n */\nexport async function processImageUpload(file, options = {}) {\n const t = resolveMessages(options);\n const validation = await validateImageFile(file, options);\n if (!validation.ok) {\n throw new Error(validation.errors.join(' '));\n }\n\n if (typeof options.onUpload === 'function') {\n const result = await options.onUpload(file, {\n mime: validation.mime,\n safeName: validation.safeName,\n });\n\n if (!result || typeof result !== 'string') {\n throw new Error(t.imageUploadFailed);\n }\n\n return result;\n }\n\n try {\n return await fileToDataUrl(file, validation.mime);\n } catch {\n throw new Error(t.fileReadError);\n }\n}\n\nexport { DEFAULT_OPTIONS as uploadDefaults };\n","/**\n * Lightweight undo/redo history for contenteditable HTML snapshots.\n */\nexport function createHistory(limit = 50) {\n let stack = [];\n let index = -1;\n\n return {\n push(html) {\n if (index >= 0 && stack[index] === html) return;\n stack = stack.slice(0, index + 1);\n stack.push(html);\n if (stack.length > limit) {\n stack.shift();\n } else {\n index += 1;\n }\n if (index >= limit) index = limit - 1;\n index = stack.length - 1;\n },\n undo() {\n if (index <= 0) return null;\n index -= 1;\n return stack[index];\n },\n redo() {\n if (index >= stack.length - 1) return null;\n index += 1;\n return stack[index];\n },\n canUndo() {\n return index > 0;\n },\n canRedo() {\n return index < stack.length - 1;\n },\n current() {\n return index >= 0 ? stack[index] : null;\n },\n reset(html = '') {\n stack = [html];\n index = 0;\n },\n };\n}\n","import { isSafeHref, isSafeImageSrc, flattenStyleSpans } from './sanitize.js';\n\nexport function focusEditor(editor) {\n if (!editor) return;\n editor.focus({ preventScroll: true });\n}\n\nexport function saveSelection(editor) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return null;\n return range.cloneRange();\n}\n\nexport function restoreSelection(range) {\n if (!range) return false;\n const sel = window.getSelection();\n if (!sel) return false;\n try {\n sel.removeAllRanges();\n sel.addRange(range);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction exec(command, value = null) {\n try {\n return document.execCommand(command, false, value);\n } catch {\n return false;\n }\n}\n\nexport function queryCommandState(command) {\n try {\n return document.queryCommandState(command);\n } catch {\n return false;\n }\n}\n\nexport function queryCommandValue(command) {\n try {\n return document.queryCommandValue(command);\n } catch {\n return '';\n }\n}\n\nexport function getBlockFormat() {\n const value = (queryCommandValue('formatBlock') || '').toLowerCase();\n if (!value) return 'p';\n return value.replace(/[<>]/g, '');\n}\n\nfunction ensureCssStyled() {\n try {\n document.execCommand('styleWithCSS', false, true);\n } catch {\n // ignore\n }\n}\n\nfunction getSelectedRange(editor) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return null;\n return range;\n}\n\n/**\n * Apply inline style via <span style=\"...\">.\n * Avoids <font color> from execCommand('foreColor'), which sanitizer strips.\n * Updates an existing color span in place when possible to avoid nesting.\n */\nfunction applyInlineStyle(editor, styles) {\n focusEditor(editor);\n\n let range = getSelectedRange(editor);\n if (!range) return false;\n\n if (range.collapsed) {\n const expanded = expandToWord(range);\n if (expanded) {\n restoreSelection(expanded);\n range = expanded;\n } else {\n const span = document.createElement('span');\n if (styles.color) span.style.color = styles.color;\n if (styles.backgroundColor) span.style.backgroundColor = styles.backgroundColor;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const caret = document.createRange();\n caret.setStart(span.firstChild, 1);\n caret.collapse(true);\n restoreSelection(caret);\n return true;\n }\n }\n\n const updated = updateExistingInlineStyle(range, styles);\n if (updated) {\n flattenStyleSpans(editor);\n return true;\n }\n\n const ok = wrapSelectionWithSpan(editor, styles);\n flattenStyleSpans(editor);\n return ok;\n}\n\nfunction expandToWord(range) {\n const node = range.startContainer;\n if (!node || node.nodeType !== Node.TEXT_NODE) return null;\n const text = node.textContent || '';\n if (!text.trim()) return null;\n\n let start = range.startOffset;\n let end = range.endOffset;\n while (start > 0 && !/\\s/.test(text[start - 1])) start -= 1;\n while (end < text.length && !/\\s/.test(text[end])) end += 1;\n if (start === end) return null;\n\n const next = range.cloneRange();\n next.setStart(node, start);\n next.setEnd(node, end);\n return next;\n}\n\nfunction styleKeys(el) {\n const keys = [];\n for (let i = 0; i < el.style.length; i += 1) keys.push(el.style.item(i));\n return keys;\n}\n\nfunction isStyleSpan(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE || el.tagName !== 'SPAN') return false;\n const keys = styleKeys(el);\n if (!keys.length) return false;\n return keys.every((k) => k === 'color' || k === 'background-color');\n}\n\n/**\n * If selection sits inside / exactly on a style span, mutate that span\n * instead of wrapping again.\n */\nfunction updateExistingInlineStyle(range, styles) {\n let node = range.commonAncestorContainer;\n if (node.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\n let candidate = null;\n let el = node;\n while (el) {\n if (isStyleSpan(el)) {\n const spanRange = document.createRange();\n spanRange.selectNodeContents(el);\n if (\n range.compareBoundaryPoints(Range.START_TO_START, spanRange) >= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, spanRange) <= 0\n ) {\n candidate = el;\n break;\n }\n }\n if (el.classList?.contains('te-editor')) break;\n el = el.parentElement;\n }\n\n if (!candidate) return false;\n\n if (styles.color) candidate.style.color = styles.color;\n if (styles.backgroundColor) {\n if (styles.backgroundColor === 'transparent') {\n candidate.style.backgroundColor = '';\n } else {\n candidate.style.backgroundColor = styles.backgroundColor;\n }\n }\n\n const sel = window.getSelection();\n if (sel) {\n const selectRange = document.createRange();\n selectRange.selectNodeContents(candidate);\n sel.removeAllRanges();\n sel.addRange(selectRange);\n }\n return true;\n}\n\nfunction wrapSelectionWithSpan(editor, styles) {\n const range = getSelectedRange(editor);\n if (!range || range.collapsed) return false;\n\n const span = document.createElement('span');\n if (styles.color) span.style.color = styles.color;\n if (styles.backgroundColor) {\n span.style.backgroundColor = styles.backgroundColor;\n }\n\n try {\n range.surroundContents(span);\n } catch {\n const fragment = range.extractContents();\n const tmp = document.createElement('div');\n tmp.appendChild(fragment);\n flattenStyleSpans(tmp);\n while (tmp.firstChild) span.appendChild(tmp.firstChild);\n range.insertNode(span);\n }\n\n const sel = window.getSelection();\n if (sel) {\n const selectRange = document.createRange();\n selectRange.selectNodeContents(span);\n sel.removeAllRanges();\n sel.addRange(selectRange);\n }\n\n return true;\n}\n\nfunction clearHighlight(editor) {\n focusEditor(editor);\n const range = getSelectedRange(editor);\n if (!range) return;\n\n ensureCssStyled();\n exec('hiliteColor', 'transparent');\n exec('backColor', 'transparent');\n\n editor.querySelectorAll('span[style]').forEach((span) => {\n if (!range.intersectsNode(span)) return;\n span.style.backgroundColor = '';\n if (!span.getAttribute('style')?.trim()) {\n span.removeAttribute('style');\n }\n });\n flattenStyleSpans(editor);\n}\n\nexport function applyFormat(editor, type, value, options = {}) {\n focusEditor(editor);\n ensureCssStyled();\n\n switch (type) {\n case 'bold':\n exec('bold');\n break;\n case 'italic':\n exec('italic');\n break;\n case 'strikeThrough':\n exec('strikeThrough');\n break;\n case 'formatBlock': {\n const tag = value || 'p';\n exec('formatBlock', tag === 'p' ? 'p' : tag);\n break;\n }\n case 'insertUnorderedList':\n exec('insertUnorderedList');\n break;\n case 'insertOrderedList':\n exec('insertOrderedList');\n break;\n case 'justifyRight':\n alignContent(editor, 'right', options.selectedImage);\n break;\n case 'justifyCenter':\n alignContent(editor, 'center', options.selectedImage);\n break;\n case 'justifyLeft':\n alignContent(editor, 'left', options.selectedImage);\n break;\n case 'indent':\n changeIndent(editor, 1);\n break;\n case 'outdent':\n changeIndent(editor, -1);\n break;\n case 'insertHorizontalRule':\n exec('insertHorizontalRule');\n break;\n case 'foreColor':\n applyInlineStyle(editor, { color: value });\n break;\n case 'hiliteColor':\n if (!value || value === 'transparent') {\n clearHighlight(editor);\n } else {\n applyInlineStyle(editor, { backgroundColor: value });\n }\n break;\n case 'removeFormat':\n exec('removeFormat');\n break;\n default:\n break;\n }\n}\n\nfunction getClosestBlock(editor, node) {\n let block = node;\n if (block && block.nodeType === Node.TEXT_NODE) block = block.parentElement;\n while (block && block !== editor) {\n if (\n block.matches?.(\n 'p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre,figure,.te-figure'\n )\n ) {\n return block;\n }\n block = block.parentElement;\n }\n return null;\n}\n\nconst INDENT_STEP_PX = 24;\nconst MAX_INDENT_PX = 240;\n\nfunction readIndentPx(block) {\n const inline = block.style?.marginInlineStart;\n if (inline) {\n const n = parseFloat(inline);\n if (!Number.isNaN(n)) return n;\n }\n const computed = block.ownerDocument?.defaultView\n ?.getComputedStyle(block)\n ?.marginInlineStart;\n if (computed) {\n const n = parseFloat(computed);\n if (!Number.isNaN(n) && n > 0) return n;\n }\n return 0;\n}\n\nfunction collectBlocksInRange(editor, range) {\n const blocks = [];\n const seen = new Set();\n\n const push = (node) => {\n const block = getClosestBlock(editor, node);\n if (!block || block === editor || seen.has(block)) return;\n // Skip structural wrappers that indent shouldn't touch\n if (block.matches?.('figure,.te-figure')) return;\n seen.add(block);\n blocks.push(block);\n };\n\n push(range.startContainer);\n push(range.endContainer);\n\n if (!range.collapsed) {\n try {\n const walker = editor.ownerDocument.createTreeWalker(\n range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? range.commonAncestorContainer\n : range.commonAncestorContainer.parentElement || editor,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode(node) {\n if (!range.intersectsNode(node)) return NodeFilter.FILTER_REJECT;\n if (\n node.matches?.(\n 'p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre'\n )\n ) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n }\n );\n let current = walker.currentNode;\n if (current?.nodeType === Node.ELEMENT_NODE) push(current);\n while ((current = walker.nextNode())) push(current);\n } catch {\n // intersectsNode can throw on detached nodes; start/end are enough\n }\n }\n\n return blocks;\n}\n\n/**\n * Indent/outdent via margin — never uses execCommand('indent'),\n * which browsers implement by wrapping in <blockquote>.\n * List items nest/unnest with DOM moves instead.\n */\nfunction changeIndent(editor, direction) {\n focusEditor(editor);\n const range = getSelectedRange(editor);\n if (!range) return;\n\n const blocks = collectBlocksInRange(editor, range);\n if (!blocks.length) return;\n\n blocks.forEach((block) => {\n if (block.tagName === 'LI') {\n indentListItem(block, direction);\n return;\n }\n\n const current = readIndentPx(block);\n const next = Math.max(\n 0,\n Math.min(MAX_INDENT_PX, current + direction * INDENT_STEP_PX)\n );\n if (next <= 0) {\n block.style.marginInlineStart = '';\n if (!block.getAttribute('style')?.trim()) block.removeAttribute('style');\n } else {\n block.style.marginInlineStart = `${next}px`;\n }\n });\n}\n\nfunction indentListItem(li, direction) {\n const list = li.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return;\n\n if (direction > 0) {\n const prev = li.previousElementSibling;\n if (!prev || prev.tagName !== 'LI') return;\n\n let nested = prev.querySelector(':scope > ul, :scope > ol');\n if (!nested) {\n nested = document.createElement(list.tagName.toLowerCase());\n prev.appendChild(nested);\n }\n nested.appendChild(li);\n return;\n }\n\n // outdent\n const parentLi = list.parentElement;\n if (!parentLi || parentLi.tagName !== 'LI') return;\n const parentList = parentLi.parentElement;\n if (!parentList) return;\n\n parentLi.after(li);\n if (!list.children.length) list.remove();\n}\n\nfunction alignContent(editor, align, selectedImage) {\n const image =\n selectedImage && editor.contains(selectedImage) ? selectedImage : null;\n\n if (image) {\n alignImage(image, align);\n return;\n }\n\n const range = getSelectedRange(editor);\n const node = range?.commonAncestorContainer;\n const maybeImg =\n node?.nodeType === Node.ELEMENT_NODE && node.tagName === 'IMG'\n ? node\n : node?.parentElement?.closest?.('img');\n\n if (maybeImg && editor.contains(maybeImg)) {\n alignImage(maybeImg, align);\n return;\n }\n\n if (align === 'right') exec('justifyRight');\n else if (align === 'center') exec('justifyCenter');\n else exec('justifyLeft');\n}\n\nfunction ensureFigure(img) {\n if (img.parentElement?.classList?.contains('te-figure')) {\n return img.parentElement;\n }\n\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n img.replaceWith(figure);\n figure.appendChild(img);\n return figure;\n}\n\nexport function alignImage(img, align) {\n const figure = ensureFigure(img);\n figure.setAttribute('data-align', align);\n figure.style.textAlign = align;\n figure.style.width = 'fit-content';\n figure.style.maxWidth = '100%';\n\n img.style.display = 'block';\n img.style.float = 'none';\n img.style.marginLeft = '0';\n img.style.marginRight = '0';\n\n if (align === 'center') {\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = 'auto';\n } else if (align === 'left') {\n figure.style.marginLeft = '0';\n figure.style.marginRight = 'auto';\n } else {\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = '0';\n }\n}\n\nexport function selectImage(img, editor, messages) {\n if (!img || !editor) return;\n clearImageSelection(editor);\n const figure = ensureFigure(img);\n figure.classList.add('is-selected');\n img.classList.add('is-selected');\n\n let altBtn = figure.querySelector('.te-figure__alt-btn');\n if (!altBtn) {\n altBtn = document.createElement('button');\n altBtn.type = 'button';\n altBtn.className = 'te-figure__alt-btn';\n altBtn.setAttribute('contenteditable', 'false');\n figure.appendChild(altBtn);\n }\n const t = messages || {};\n const currentAlt = img.getAttribute('alt') || '';\n altBtn.textContent = currentAlt\n ? `Alt: ${currentAlt.length > 28 ? `${currentAlt.slice(0, 28)}…` : currentAlt}`\n : t.editAlt || 'Edit Alt';\n altBtn.title = t.editAltTitle || 'Edit image alt text';\n\n const range = document.createRange();\n range.selectNode(figure);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n focusEditor(editor);\n}\n\nexport function clearImageSelection(editor) {\n if (!editor) return;\n editor.querySelectorAll('.te-figure.is-selected, img.is-selected').forEach((el) => {\n el.classList.remove('is-selected');\n });\n editor.querySelectorAll('.te-figure__alt-btn').forEach((btn) => btn.remove());\n}\n\nexport function updateImageAlt(img, alt, messages) {\n if (!img) return;\n img.setAttribute('alt', alt || '');\n const figure = img.closest?.('.te-figure');\n const btn = figure?.querySelector('.te-figure__alt-btn');\n if (btn) {\n const t = messages || {};\n btn.textContent = alt\n ? `Alt: ${alt.length > 28 ? `${alt.slice(0, 28)}…` : alt}`\n : t.editAlt || 'Edit Alt';\n }\n}\n\nexport function setDirection(editor, dir) {\n focusEditor(editor);\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) {\n editor.setAttribute('dir', dir);\n return;\n }\n\n let node = sel.anchorNode;\n if (node && node.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\n const block = getClosestBlock(editor, node);\n if (block && block !== editor) {\n block.setAttribute('dir', dir);\n block.style.direction = dir;\n } else {\n editor.setAttribute('dir', dir);\n }\n}\n\nexport function insertLink(editor, url, text, messages) {\n focusEditor(editor);\n if (!isSafeHref(url)) {\n throw new Error((messages && messages.linkUnsafe) || 'The link URL is invalid or unsafe.');\n }\n\n const sel = window.getSelection();\n const hasSelection = sel && !sel.isCollapsed && editor.contains(sel.anchorNode);\n\n if (hasSelection) {\n exec('createLink', url);\n const anchors = editor.querySelectorAll('a[href]');\n const last = anchors[anchors.length - 1];\n if (last) {\n last.setAttribute('rel', 'noopener noreferrer');\n if (/^https?:/i.test(url)) last.setAttribute('target', '_blank');\n }\n } else {\n const label = text || url;\n const safe = document.createElement('a');\n safe.href = url;\n safe.textContent = label;\n safe.rel = 'noopener noreferrer';\n if (/^https?:/i.test(url)) safe.target = '_blank';\n insertNode(editor, safe);\n }\n}\n\nexport function insertImage(editor, src, alt = '', messages) {\n focusEditor(editor);\n if (!isSafeImageSrc(src)) {\n throw new Error((messages && messages.imageUnsafe) || 'The image URL is invalid or unsafe.');\n }\n\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n figure.setAttribute('data-align', 'center');\n figure.style.textAlign = 'center';\n figure.style.width = 'fit-content';\n figure.style.maxWidth = '100%';\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = 'auto';\n\n const img = document.createElement('img');\n img.src = src;\n img.alt = alt || '';\n img.setAttribute('loading', 'lazy');\n img.draggable = false;\n img.style.display = 'block';\n img.style.maxWidth = '100%';\n\n figure.appendChild(img);\n insertNode(editor, figure);\n\n // Trailing paragraph for caret after image\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n insertNode(editor, p);\n\n return img;\n}\n\nfunction insertNode(editor, node) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) {\n editor.appendChild(node);\n return;\n }\n\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) {\n editor.appendChild(node);\n return;\n }\n\n range.deleteContents();\n range.insertNode(node);\n range.setStartAfter(node);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\nexport function getActiveStates(editor) {\n const selectedImage = editor?.querySelector?.('.te-figure.is-selected, img.is-selected');\n let imageAlign = null;\n if (selectedImage) {\n const figure = selectedImage.classList?.contains('te-figure')\n ? selectedImage\n : selectedImage.closest?.('.te-figure');\n imageAlign = figure?.getAttribute('data-align') || null;\n }\n\n return {\n bold: queryCommandState('bold'),\n italic: queryCommandState('italic'),\n strikeThrough: queryCommandState('strikeThrough'),\n unorderedList: queryCommandState('insertUnorderedList'),\n orderedList: queryCommandState('insertOrderedList'),\n justifyRight: imageAlign ? imageAlign === 'right' : queryCommandState('justifyRight'),\n justifyCenter: imageAlign ? imageAlign === 'center' : queryCommandState('justifyCenter'),\n justifyLeft: imageAlign ? imageAlign === 'left' : queryCommandState('justifyLeft'),\n format: getBlockFormat(),\n hasSelectedImage: !!selectedImage,\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { Toolbar } from './Toolbar.jsx';\nimport { LinkDialog, ImageDialog, ImageAltDialog } from './Dialogs.jsx';\nimport { sanitizeHtml } from './sanitize.js';\nimport { processImageUpload } from './upload.js';\nimport { createHistory } from './history.js';\nimport { getMessages, getDefaultDir, resolveLanguage } from './i18n.js';\nimport {\n applyFormat,\n getActiveStates,\n insertImage,\n insertLink,\n restoreSelection,\n saveSelection,\n setDirection,\n selectImage,\n clearImageSelection,\n updateImageAlt,\n} from './commands.js';\nimport './styles.css';\n\nfunction normalizeEmpty(html) {\n const trimmed = (html || '').trim();\n if (!trimmed || trimmed === '<br>' || trimmed === '<div><br></div>') {\n return '<p><br></p>';\n }\n return trimmed;\n}\n\nfunction stripSelectionClasses(html) {\n if (typeof document !== 'undefined') {\n const wrap = document.createElement('div');\n wrap.innerHTML = html;\n wrap.querySelectorAll('.te-figure__alt-btn').forEach((el) => el.remove());\n wrap.querySelectorAll('.is-selected').forEach((el) => el.classList.remove('is-selected'));\n wrap.querySelectorAll('[class=\"\"]').forEach((el) => el.removeAttribute('class'));\n return wrap.innerHTML;\n }\n return html\n .replace(/<button[^>]*class=\"[^\"]*te-figure__alt-btn[^\"]*\"[^>]*>.*?<\\/button>/gi, '')\n .replace(/\\s*is-selected/g, '')\n .replace(/\\sclass=\"\"/g, '')\n .replace(/\\sclass=''/g, '');\n}\n\n/**\n * TeemEditor — simple, fast WYSIWYG for React and Next.js with full RTL/LTR support.\n */\nexport const TeemEditor = forwardRef(function TeemEditor(\n {\n value,\n defaultValue = '<p><br></p>',\n onChange,\n placeholder,\n language = 'en',\n dir,\n className = '',\n style,\n minHeight = 220,\n disabled = false,\n onUpload,\n uploadOptions,\n toolbar = true,\n },\n ref\n) {\n const lang = resolveLanguage(language);\n const t = getMessages(lang);\n const resolvedDir = dir || getDefaultDir(lang);\n const resolvedPlaceholder = placeholder ?? t.placeholder;\n\n const rootRef = useRef(null);\n const editorRef = useRef(null);\n const historyRef = useRef(createHistory());\n const savedRangeRef = useRef(null);\n const lastHtmlRef = useRef('');\n const composingRef = useRef(false);\n const selectedImageRef = useRef(null);\n const messagesRef = useRef(t);\n messagesRef.current = t;\n\n const [states, setStates] = useState(() => ({\n bold: false,\n italic: false,\n strikeThrough: false,\n unorderedList: false,\n orderedList: false,\n justifyRight: false,\n justifyCenter: false,\n justifyLeft: false,\n format: 'p',\n hasSelectedImage: false,\n }));\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [linkOpen, setLinkOpen] = useState(false);\n const [imageOpen, setImageOpen] = useState(false);\n const [altOpen, setAltOpen] = useState(false);\n const [altDraft, setAltDraft] = useState('');\n const [isEmpty, setIsEmpty] = useState(true);\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n\n const syncHistoryFlags = useCallback(() => {\n setCanUndo(historyRef.current.canUndo());\n setCanRedo(historyRef.current.canRedo());\n }, []);\n\n const emitChange = useCallback(\n (html, { recordHistory = true } = {}) => {\n const clean = sanitizeHtml(stripSelectionClasses(normalizeEmpty(html)));\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n\n if (recordHistory) {\n historyRef.current.push(clean);\n syncHistoryFlags();\n }\n\n onChange?.(clean);\n },\n [onChange, syncHistoryFlags]\n );\n\n const readHtml = useCallback(() => editorRef.current?.innerHTML || '', []);\n\n const setHtml = useCallback(\n (html, { recordHistory = false } = {}) => {\n if (!editorRef.current) return;\n const clean = sanitizeHtml(normalizeEmpty(html));\n editorRef.current.innerHTML = clean;\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n if (recordHistory) {\n historyRef.current.push(clean);\n syncHistoryFlags();\n }\n },\n [syncHistoryFlags]\n );\n\n useEffect(() => {\n const initial = sanitizeHtml(normalizeEmpty(value ?? defaultValue));\n if (editorRef.current) {\n editorRef.current.innerHTML = initial;\n }\n lastHtmlRef.current = initial;\n historyRef.current.reset(initial);\n setIsEmpty(!initial.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n syncHistoryFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (value === undefined || !editorRef.current) return;\n const clean = sanitizeHtml(normalizeEmpty(value));\n if (clean !== lastHtmlRef.current) {\n const sel = saveSelection(editorRef.current);\n editorRef.current.innerHTML = clean;\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n restoreSelection(sel);\n }\n }, [value]);\n\n const refreshStates = useCallback(() => {\n if (!editorRef.current) return;\n setStates(getActiveStates(editorRef.current));\n }, []);\n\n useEffect(() => {\n const onSel = () => {\n if (!editorRef.current) return;\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n if (editorRef.current.contains(sel.anchorNode)) {\n refreshStates();\n }\n };\n document.addEventListener('selectionchange', onSel);\n return () => document.removeEventListener('selectionchange', onSel);\n }, [refreshStates]);\n\n const rememberSelection = useCallback(() => {\n const live = saveSelection(editorRef.current);\n if (live) savedRangeRef.current = live;\n }, []);\n\n const withSelection = useCallback(\n (fn) => {\n const live = saveSelection(editorRef.current);\n if (live) savedRangeRef.current = live;\n restoreSelection(savedRangeRef.current);\n fn();\n emitChange(readHtml());\n refreshStates();\n },\n [emitChange, readHtml, refreshStates]\n );\n\n const handleCommand = useCallback(\n (type, value) => {\n if (disabled) return;\n withSelection(() => {\n if (type === 'rtl' || type === 'ltr') {\n setDirection(editorRef.current, type);\n } else {\n applyFormat(editorRef.current, type, value, {\n selectedImage: selectedImageRef.current,\n });\n }\n });\n },\n [disabled, withSelection]\n );\n\n const handleBlockChange = useCallback(\n (tag) => {\n if (disabled) return;\n withSelection(() => {\n applyFormat(editorRef.current, 'formatBlock', tag);\n });\n },\n [disabled, withSelection]\n );\n\n const handleUndo = useCallback(() => {\n const html = historyRef.current.undo();\n if (html == null || !editorRef.current) return;\n editorRef.current.innerHTML = html;\n lastHtmlRef.current = html;\n setIsEmpty(!html.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n syncHistoryFlags();\n onChange?.(html);\n refreshStates();\n }, [onChange, refreshStates, syncHistoryFlags]);\n\n const handleRedo = useCallback(() => {\n const html = historyRef.current.redo();\n if (html == null || !editorRef.current) return;\n editorRef.current.innerHTML = html;\n lastHtmlRef.current = html;\n setIsEmpty(!html.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n syncHistoryFlags();\n onChange?.(html);\n refreshStates();\n }, [onChange, refreshStates, syncHistoryFlags]);\n\n const handleInput = useCallback(() => {\n if (composingRef.current) return;\n emitChange(readHtml());\n refreshStates();\n }, [emitChange, readHtml, refreshStates]);\n\n const handlePaste = useCallback(\n (e) => {\n e.preventDefault();\n const text = e.clipboardData?.getData('text/plain') || '';\n const html = e.clipboardData?.getData('text/html');\n if (html) {\n const clean = sanitizeHtml(html);\n document.execCommand('insertHTML', false, clean);\n } else {\n document.execCommand('insertText', false, text);\n }\n emitChange(readHtml());\n },\n [emitChange, readHtml]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n e.preventDefault();\n handleUndo();\n } else if (\n mod &&\n (e.key.toLowerCase() === 'y' || (e.key.toLowerCase() === 'z' && e.shiftKey))\n ) {\n e.preventDefault();\n handleRedo();\n } else if (mod && e.key.toLowerCase() === 'b') {\n e.preventDefault();\n handleCommand('bold');\n } else if (mod && e.key.toLowerCase() === 'i') {\n e.preventDefault();\n handleCommand('italic');\n } else if (e.key === 'Escape' && selectedImageRef.current) {\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n refreshStates();\n }\n },\n [handleCommand, handleRedo, handleUndo, refreshStates]\n );\n\n const openAltEditor = useCallback((img) => {\n if (!img) return;\n selectedImageRef.current = img;\n setAltDraft(img.getAttribute('alt') || '');\n setAltOpen(true);\n }, []);\n\n const handleEditorMouseDown = useCallback(\n (e) => {\n const target = e.target;\n if (!(target instanceof Element) || !editorRef.current) return;\n\n // Alt edit button on selected figure\n if (target.closest('.te-figure__alt-btn')) {\n e.preventDefault();\n e.stopPropagation();\n const figure = target.closest('.te-figure');\n const img = figure?.querySelector('img');\n if (img) openAltEditor(img);\n return;\n }\n\n const img = target.closest('img');\n const figure = target.closest('.te-figure');\n\n if (img && editorRef.current.contains(img)) {\n e.preventDefault();\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n savedRangeRef.current = saveSelection(editorRef.current);\n refreshStates();\n return;\n }\n\n if (figure && editorRef.current.contains(figure)) {\n const innerImg = figure.querySelector('img');\n if (innerImg) {\n e.preventDefault();\n selectImage(innerImg, editorRef.current, messagesRef.current);\n selectedImageRef.current = innerImg;\n savedRangeRef.current = saveSelection(editorRef.current);\n refreshStates();\n return;\n }\n }\n\n if (selectedImageRef.current) {\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n refreshStates();\n }\n },\n [openAltEditor, refreshStates]\n );\n\n const handleEditorDoubleClick = useCallback(\n (e) => {\n const target = e.target;\n if (!(target instanceof Element) || !editorRef.current) return;\n const img = target.closest('img');\n const figure = target.closest('.te-figure');\n const image = img || figure?.querySelector('img');\n if (image && editorRef.current.contains(image)) {\n e.preventDefault();\n selectImage(image, editorRef.current, messagesRef.current);\n openAltEditor(image);\n }\n },\n [openAltEditor]\n );\n\n const openLink = useCallback(() => {\n rememberSelection();\n setLinkOpen(true);\n }, [rememberSelection]);\n\n const openImage = useCallback(() => {\n rememberSelection();\n setImageOpen(true);\n }, [rememberSelection]);\n\n const toggleSourceMode = useCallback(() => {\n if (disabled) return;\n\n if (!sourceMode) {\n // Visual → HTML\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n const html = sanitizeHtml(stripSelectionClasses(readHtml()));\n setSourceCode(html);\n setSourceMode(true);\n return;\n }\n\n // HTML → Visual (sanitize user-edited source)\n const clean = sanitizeHtml(normalizeEmpty(sourceCode));\n if (editorRef.current) {\n editorRef.current.innerHTML = clean;\n }\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n historyRef.current.push(clean);\n syncHistoryFlags();\n onChange?.(clean);\n setSourceMode(false);\n refreshStates();\n }, [\n disabled,\n sourceMode,\n sourceCode,\n readHtml,\n onChange,\n syncHistoryFlags,\n refreshStates,\n ]);\n\n const handleSourceChange = useCallback((e) => {\n setSourceCode(e.target.value);\n }, []);\n\n const handleSourceBlur = useCallback(() => {\n // Keep parent in sync while editing source (sanitized lightly on leave)\n const clean = sanitizeHtml(normalizeEmpty(sourceCode));\n lastHtmlRef.current = clean;\n onChange?.(clean);\n }, [sourceCode, onChange]);\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getHTML: () => sanitizeHtml(stripSelectionClasses(readHtml())),\n setHTML: (html) => {\n setHtml(html, { recordHistory: true });\n onChange?.(sanitizeHtml(normalizeEmpty(html)));\n },\n clear: () => {\n setHtml('<p><br></p>', { recordHistory: true });\n onChange?.(sanitizeHtml('<p><br></p>'));\n },\n getEditorElement: () => editorRef.current,\n }));\n\n return (\n <div\n ref={rootRef}\n className={`te-root${disabled ? ' is-disabled' : ''}${sourceMode ? ' is-source' : ''} te-root--${resolvedDir} ${className}`.trim()}\n style={style}\n dir={resolvedDir}\n lang={lang}\n onMouseDown={(e) => {\n if (e.target.closest?.('.te-toolbar')) {\n rememberSelection();\n }\n }}\n >\n {toolbar ? (\n <Toolbar\n t={t}\n states={states}\n canUndo={canUndo}\n canRedo={canRedo}\n onCommand={handleCommand}\n onBlockChange={handleBlockChange}\n onOpenLink={openLink}\n onOpenImage={openImage}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onRememberSelection={rememberSelection}\n sourceMode={sourceMode}\n onToggleSource={toggleSourceMode}\n />\n ) : null}\n\n <div className=\"te-editor-shell\">\n {!sourceMode && isEmpty ? (\n <div className=\"te-placeholder\">{resolvedPlaceholder}</div>\n ) : null}\n\n <div\n ref={editorRef}\n className=\"te-editor\"\n contentEditable={!disabled && !sourceMode}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={t.editorLabel}\n aria-placeholder={resolvedPlaceholder}\n aria-hidden={sourceMode}\n suppressContentEditableWarning\n style={{ minHeight, display: sourceMode ? 'none' : undefined }}\n dir={resolvedDir}\n onInput={handleInput}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onMouseDown={handleEditorMouseDown}\n onDoubleClick={handleEditorDoubleClick}\n onBlur={() => {\n if (!sourceMode) emitChange(readHtml(), { recordHistory: true });\n }}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n handleInput();\n }}\n onMouseUp={refreshStates}\n onKeyUp={refreshStates}\n />\n\n {sourceMode ? (\n <textarea\n className=\"te-source\"\n value={sourceCode}\n onChange={handleSourceChange}\n onBlur={handleSourceBlur}\n disabled={disabled}\n spellCheck={false}\n dir=\"ltr\"\n aria-label={t.sourceLabel}\n style={{ minHeight }}\n />\n ) : null}\n </div>\n\n <LinkDialog\n open={linkOpen && !sourceMode}\n onClose={() => setLinkOpen(false)}\n t={t}\n onSubmit={({ url, text }) => {\n withSelection(() => {\n insertLink(editorRef.current, url, text, messagesRef.current);\n });\n }}\n />\n\n <ImageDialog\n open={imageOpen && !sourceMode}\n onClose={() => setImageOpen(false)}\n t={t}\n onSubmitUrl={async ({ url, alt }) => {\n withSelection(() => {\n const img = insertImage(editorRef.current, url, alt, messagesRef.current);\n if (img) {\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n }\n });\n }}\n onSubmitFile={async ({ file, alt }) => {\n const src = await processImageUpload(file, {\n ...uploadOptions,\n onUpload,\n language: lang,\n messages: messagesRef.current,\n });\n withSelection(() => {\n const img = insertImage(editorRef.current, src, alt, messagesRef.current);\n if (img) {\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n }\n });\n }}\n />\n\n <ImageAltDialog\n open={altOpen && !sourceMode}\n initialAlt={altDraft}\n onClose={() => setAltOpen(false)}\n t={t}\n onSubmit={({ alt }) => {\n const img = selectedImageRef.current;\n if (!img || !editorRef.current?.contains(img)) return;\n updateImageAlt(img, alt, messagesRef.current);\n emitChange(readHtml());\n refreshStates();\n }}\n />\n </div>\n );\n});\n\nexport default TeemEditor;\n"],"names":["stroke","Icon","children","size","jsx","Icons","jsxs","en","mb","fa","ar","locales","RTL_LANGS","resolveLanguage","language","key","getMessages","getDefaultDir","getBlockOptions","t","TEXT_COLORS","BG_COLORS","ToolButton","label","active","disabled","onClick","className","e","Divider","ColorSplitButton","icon","colors","value","onChange","onRememberSelection","allowTransparent","open","setOpen","useState","preview","setPreview","rootRef","useRef","pickingCustomRef","activeColor","underline","useEffect","onDoc","_a","onKey","onWindowFocus","apply","color","close","v","c","Toolbar","states","canUndo","canRedo","onCommand","onBlockChange","onOpenLink","onOpenImage","onUndo","onRedo","sourceMode","onToggleSource","textColor","setTextColor","bgColor","setBgColor","formattingDisabled","blockOptions","opt","Modal","title","onClose","footer","closeLabel","titleId","useId","panelRef","prev","_b","LinkDialog","onSubmit","initialUrl","initialText","url","setUrl","text","setText","error","setError","handleSubmit","trimmed","err","Fragment","ImageDialog","onSubmitUrl","onSubmitFile","accept","tab","setTab","alt","setAlt","busy","setBusy","fileRef","handleUrl","handleFile","file","ImageAltDialog","initialAlt","ALLOWED_TAGS","ALLOWED_ATTR","SAFE_URL_PROTOCOLS","SAFE_IMG_PROTOCOLS","isSafeUrl","forImage","sanitizeStyles","styleValue","allowed","part","colon","prop","sanitizeHtml","dirty","clean","DOMPurify","wrapper","font","span","a","href","img","src","figure","align","_d","_c","btn","el","next","flattenStyleSpans","unwrapElement","parent","styleKeys","keys","i","isStyleSpan","k","root","guard","changed","isSafeHref","isSafeImageSrc","SIGNATURES","buf","DEFAULT_OPTIONS","getExtension","name","sanitizeFileName","readMagicBytes","length","buffer","detectMimeFromBytes","bytes","sig","b","resolveMessages","options","validateImageFile","opts","errors","ext","claimed","detected","fileToDataUrl","mime","resolve","reject","reader","result","comma","processImageUpload","validation","createHistory","limit","stack","index","html","focusEditor","editor","saveSelection","sel","range","restoreSelection","exec","command","queryCommandState","queryCommandValue","getBlockFormat","ensureCssStyled","getSelectedRange","applyInlineStyle","styles","expanded","expandToWord","caret","updateExistingInlineStyle","ok","wrapSelectionWithSpan","node","start","end","candidate","spanRange","selectRange","fragment","tmp","clearHighlight","applyFormat","type","tag","alignContent","changeIndent","getClosestBlock","block","INDENT_STEP_PX","MAX_INDENT_PX","readIndentPx","inline","n","computed","collectBlocksInRange","blocks","seen","push","walker","current","direction","indentListItem","li","list","nested","parentLi","selectedImage","image","alignImage","maybeImg","ensureFigure","selectImage","messages","clearImageSelection","altBtn","currentAlt","updateImageAlt","setDirection","dir","insertLink","anchors","last","safe","insertNode","insertImage","p","getActiveStates","imageAlign","normalizeEmpty","stripSelectionClasses","wrap","TeemEditor","forwardRef","defaultValue","placeholder","style","minHeight","onUpload","uploadOptions","toolbar","ref","lang","resolvedDir","resolvedPlaceholder","editorRef","historyRef","savedRangeRef","lastHtmlRef","composingRef","selectedImageRef","messagesRef","setStates","setCanUndo","setCanRedo","linkOpen","setLinkOpen","imageOpen","setImageOpen","altOpen","setAltOpen","altDraft","setAltDraft","isEmpty","setIsEmpty","setSourceMode","sourceCode","setSourceCode","syncHistoryFlags","useCallback","emitChange","recordHistory","readHtml","setHtml","initial","refreshStates","onSel","rememberSelection","live","withSelection","fn","handleCommand","handleBlockChange","handleUndo","handleRedo","handleInput","handlePaste","handleKeyDown","mod","openAltEditor","handleEditorMouseDown","target","innerImg","handleEditorDoubleClick","openLink","openImage","toggleSourceMode","handleSourceChange","handleSourceBlur","useImperativeHandle"],"mappings":"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"}
1
+ {"version":3,"file":"teem-editor.cjs","sources":["../src/icons.jsx","../src/i18n.js","../src/Toolbar.jsx","../src/Dialogs.jsx","../src/sanitize.js","../src/upload.js","../src/history.js","../src/commands.js","../src/TeemEditor.jsx"],"sourcesContent":["const stroke = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.8,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\nfunction Icon({ children, size = 18 }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport const Icons = {\n undo: (\n <Icon>\n <path {...stroke} d=\"M9 14L4 9l5-5\" />\n <path {...stroke} d=\"M4 9h10a6 6 0 010 12h-3\" />\n </Icon>\n ),\n redo: (\n <Icon>\n <path {...stroke} d=\"M15 14l5-5-5-5\" />\n <path {...stroke} d=\"M20 9H10a6 6 0 000 12h3\" />\n </Icon>\n ),\n bold: (\n <Icon>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 5h6a3.5 3.5 0 010 7H7z\"\n />\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7 12h7a3.5 3.5 0 010 7H7z\"\n />\n </Icon>\n ),\n italic: (\n <Icon>\n <path {...stroke} d=\"M10 5h8\" />\n <path {...stroke} d=\"M6 19h8\" />\n <path {...stroke} d=\"M14 5l-4 14\" />\n </Icon>\n ),\n strike: (\n <Icon>\n <path {...stroke} d=\"M5 12h14\" />\n <path {...stroke} d=\"M16 7.5A4 4 0 0012 6c-2.8 0-4.5 1.5-4.5 3.2 0 3.3 7.5 1.7 7.5 5.1A3.4 3.4 0 0112 18c-2.2 0-4-1-4.8-2.4\" />\n </Icon>\n ),\n ul: (\n <Icon>\n <path {...stroke} d=\"M9 6h11M9 12h11M9 18h11\" />\n <circle cx=\"5\" cy=\"6\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"5\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" />\n <circle cx=\"5\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" />\n </Icon>\n ),\n ol: (\n <Icon>\n <path {...stroke} d=\"M11 6h9M11 12h9M11 18h9\" />\n <g\n fill=\"currentColor\"\n stroke=\"none\"\n fontSize=\"8\"\n fontWeight=\"700\"\n fontFamily=\"system-ui, -apple-system, sans-serif\"\n >\n <text x=\"3.5\" y=\"8\">\n 1\n </text>\n <text x=\"3.5\" y=\"14.2\">\n 2\n </text>\n <text x=\"3.5\" y=\"20.4\">\n 3\n </text>\n </g>\n </Icon>\n ),\n quote: (\n <Icon>\n <path fill=\"currentColor\" stroke=\"none\" d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </Icon>\n ),\n alignRight: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M8 12h12M4 18h16\" />\n </Icon>\n ),\n alignCenter: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M7 12h10M4 18h16\" />\n </Icon>\n ),\n alignLeft: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M4 12h12M4 18h16\" />\n </Icon>\n ),\n link: (\n <Icon>\n <path {...stroke} d=\"M10 13a5 5 0 007.07 0l1.41-1.41a5 5 0 00-7.07-7.07L10 5.93\" />\n <path {...stroke} d=\"M14 11a5 5 0 00-7.07 0L5.52 12.4a5 5 0 007.07 7.07L14 18.07\" />\n </Icon>\n ),\n image: (\n <Icon>\n <rect {...stroke} x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.5\" fill=\"currentColor\" />\n <path {...stroke} d=\"M3 16l5-4 4 3 3-2 6 3\" />\n </Icon>\n ),\n rtl: (\n <Icon>\n {/* q (standard pilcrow) */}\n <path\n fill=\"currentColor\"\n stroke=\"none\"\n d=\"M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4z\"\n />\n {/* arrow left */}\n <path fill=\"currentColor\" stroke=\"none\" d=\"M3 18l4-4v3H19v2H7v3l-4-4z\" />\n </Icon>\n ),\n ltr: (\n <Icon>\n {/* P = mirrored pilcrow */}\n <g transform=\"translate(24 0) scale(-1 1)\">\n <path\n fill=\"currentColor\"\n stroke=\"none\"\n d=\"M9 10v5h2V4h2v11h2V4h2V2H9C6.79 2 5 3.79 5 6s1.79 4 4 4z\"\n />\n </g>\n {/* arrow right */}\n <path fill=\"currentColor\" stroke=\"none\" d=\"M21 18l-4-4v3H5v2h12v3l4-4z\" />\n </Icon>\n ),\n hr: (\n <Icon>\n <path {...stroke} d=\"M4 12h16\" />\n </Icon>\n ),\n indent: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M12 12h8M4 18h16\" />\n <path {...stroke} d=\"M4 9l4 3-4 3\" />\n </Icon>\n ),\n outdent: (\n <Icon>\n <path {...stroke} d=\"M4 6h16M12 12h8M4 18h16\" />\n <path {...stroke} d=\"M8 9L4 12l4 3\" />\n </Icon>\n ),\n textColor: (\n <Icon>\n <path {...stroke} d=\"M6 16l3.5-9h1L14 16\" />\n <path {...stroke} d=\"M7.5 13h5\" />\n </Icon>\n ),\n bgColor: (\n <Icon>\n <path {...stroke} d=\"M8 4l8 8-4 4-8-8z\" />\n <path {...stroke} d=\"M5 19h10\" />\n </Icon>\n ),\n chevronDown: (\n <Icon size={12}>\n <path {...stroke} d=\"M6 9l6 6 6-6\" />\n </Icon>\n ),\n code: (\n <Icon>\n <path {...stroke} d=\"M8 8L4 12l4 4\" />\n <path {...stroke} d=\"M16 8l4 4-4 4\" />\n <path {...stroke} d=\"M14 5l-4 14\" />\n </Icon>\n ),\n close: (\n <Icon size={16}>\n <path {...stroke} d=\"M6 6l12 12M18 6L6 18\" />\n </Icon>\n ),\n};\n","const en = {\n placeholder: 'Write something…',\n toolbar: 'TeemEditor toolbar',\n undo: 'Undo',\n redo: 'Redo',\n blockType: 'Block type',\n paragraph: 'Paragraph',\n heading1: 'Heading 1',\n heading2: 'Heading 2',\n heading3: 'Heading 3',\n heading4: 'Heading 4',\n heading5: 'Heading 5',\n heading6: 'Heading 6',\n quote: 'Quote',\n preformatted: 'Preformatted',\n bold: 'Bold',\n italic: 'Italic',\n strike: 'Strikethrough',\n bulletList: 'Bullet list',\n numberedList: 'Numbered list',\n alignRight: 'Align right',\n alignCenter: 'Align center',\n alignLeft: 'Align left',\n alignImageRight: 'Align image right',\n alignImageCenter: 'Align image center',\n alignImageLeft: 'Align image left',\n rtl: 'Right to left',\n ltr: 'Left to right',\n indent: 'Indent',\n outdent: 'Outdent',\n insertLink: 'Insert link',\n insertImage: 'Insert image',\n horizontalRule: 'Horizontal rule',\n textColor: 'Text color',\n bgColor: 'Highlight color',\n applyCurrentColor: 'Apply current color',\n openPalette: 'Open color palette',\n noColor: 'No color',\n customColor: 'Custom color',\n pickCustomColor: 'Pick custom color',\n sourceMode: 'Edit HTML',\n visualMode: 'Back to visual editor',\n editorLabel: 'Rich text editor',\n sourceLabel: 'HTML source editor',\n close: 'Close',\n cancel: 'Cancel',\n save: 'Save',\n linkTitle: 'Insert link',\n linkUrl: 'URL',\n linkText: 'Display text (optional)',\n linkTextPlaceholder: 'Link text',\n linkSubmit: 'Insert link',\n linkUrlRequired: 'Please enter a link URL.',\n linkInvalid: 'Invalid link.',\n linkUnsafe: 'The link URL is invalid or unsafe.',\n imageTitle: 'Insert image',\n imageSubmit: 'Insert image',\n imageBusy: 'Processing…',\n imageUploadTab: 'Upload file',\n imageUrlTab: 'From URL',\n imageFile: 'Image file',\n imageUrl: 'Image URL',\n imageAlt: 'Alt text',\n imageAltPlaceholder: 'Short image description',\n imageHint: 'Only jpg, png, gif, and webp — max 2 MB',\n imagePickFile: 'Please select an image file.',\n imageInsertFailed: 'Failed to insert image.',\n imageUploadFailed: 'Image upload failed.',\n imageUnsafe: 'The image URL is invalid or unsafe.',\n altTitle: 'Edit image alt text',\n altLabel: 'Alt text',\n altPlaceholder: 'Short description for accessibility and SEO',\n altHint:\n 'Shown when the image cannot load, and used by screen readers.',\n editAlt: 'Edit Alt',\n editAltTitle: 'Edit image alt text',\n fileInvalid: 'Invalid file.',\n fileEmpty: 'File is empty.',\n fileTooLarge: (mb) => `File size must not exceed ${mb} MB.`,\n fileBadExtension: 'File extension is not allowed. Only jpg, png, gif, and webp.',\n fileBadMime: 'File type is not allowed.',\n fileBadContent: 'File content is not a valid image.',\n fileMimeMismatch: 'Declared file type does not match actual content.',\n fileReadError: 'Failed to read the file.',\n};\n\nconst fa = {\n placeholder: 'متن خود را بنویسید…',\n toolbar: 'نوار ابزار ویرایشگر',\n undo: 'قبل (واگرد)',\n redo: 'بعد (بازگردانی)',\n blockType: 'نوع بلوک',\n paragraph: 'پاراگراف',\n heading1: 'عنوان ۱',\n heading2: 'عنوان ۲',\n heading3: 'عنوان ۳',\n heading4: 'عنوان ۴',\n heading5: 'عنوان ۵',\n heading6: 'عنوان ۶',\n quote: 'نقل‌قول',\n preformatted: 'پیش‌قالب‌بندی‌شده',\n bold: 'ضخیم',\n italic: 'کج',\n strike: 'خط‌خورده',\n bulletList: 'فهرست نقطه‌ای',\n numberedList: 'فهرست عددی',\n alignRight: 'راست‌چین',\n alignCenter: 'وسط‌چین',\n alignLeft: 'چپ‌چین',\n alignImageRight: 'تراز راست تصویر',\n alignImageCenter: 'تراز وسط تصویر',\n alignImageLeft: 'تراز چپ تصویر',\n rtl: 'راست به چپ',\n ltr: 'چپ به راست',\n indent: 'فرورفتگی',\n outdent: 'بیرون‌آمدگی',\n insertLink: 'درج لینک',\n insertImage: 'درج تصویر',\n horizontalRule: 'خط افقی',\n textColor: 'رنگ متن',\n bgColor: 'رنگ پس‌زمینه',\n applyCurrentColor: 'اعمال رنگ فعلی',\n openPalette: 'باز کردن پالت رنگ',\n noColor: 'بدون رنگ',\n customColor: 'رنگ دلخواه',\n pickCustomColor: 'انتخاب رنگ دلخواه',\n sourceMode: 'ویرایش HTML',\n visualMode: 'بازگشت به حالت دیداری',\n editorLabel: 'ویرایشگر متن',\n sourceLabel: 'ویرایشگر کد HTML',\n close: 'بستن',\n cancel: 'انصراف',\n save: 'ذخیره',\n linkTitle: 'درج لینک',\n linkUrl: 'آدرس',\n linkText: 'متن نمایشی (اختیاری)',\n linkTextPlaceholder: 'متن لینک',\n linkSubmit: 'درج لینک',\n linkUrlRequired: 'آدرس لینک را وارد کنید.',\n linkInvalid: 'لینک نامعتبر است.',\n linkUnsafe: 'آدرس لینک نامعتبر یا ناامن است.',\n imageTitle: 'درج تصویر',\n imageSubmit: 'درج تصویر',\n imageBusy: 'در حال پردازش…',\n imageUploadTab: 'آپلود فایل',\n imageUrlTab: 'از آدرس',\n imageFile: 'فایل تصویر',\n imageUrl: 'آدرس تصویر',\n imageAlt: 'متن جایگزین',\n imageAltPlaceholder: 'توضیح کوتاه تصویر',\n imageHint: 'فقط jpg، png، gif و webp — حداکثر ۲ مگابایت',\n imagePickFile: 'یک فایل تصویر انتخاب کنید.',\n imageInsertFailed: 'درج تصویر ناموفق بود.',\n imageUploadFailed: 'آپلود تصویر ناموفق بود.',\n imageUnsafe: 'آدرس تصویر نامعتبر یا ناامن است.',\n altTitle: 'ویرایش متن جایگزین تصویر',\n altLabel: 'متن جایگزین (Alt)',\n altPlaceholder: 'توضیح کوتاه تصویر برای دسترس‌پذیری و SEO',\n altHint:\n 'این متن وقتی تصویر لود نشود نمایش داده می‌شود و برای خواننده‌های صفحه مهم است.',\n editAlt: 'ویرایش Alt',\n editAltTitle: 'ویرایش متن جایگزین تصویر',\n fileInvalid: 'فایل نامعتبر است.',\n fileEmpty: 'فایل خالی است.',\n fileTooLarge: (mb) => `حجم فایل نباید بیشتر از ${mb} مگابایت باشد.`,\n fileBadExtension: 'پسوند فایل مجاز نیست. فقط jpg، png، gif و webp.',\n fileBadMime: 'نوع فایل مجاز نیست.',\n fileBadContent: 'محتوای فایل تصویر معتبر نیست.',\n fileMimeMismatch: 'نوع اعلام‌شده فایل با محتوای واقعی هم‌خوانی ندارد.',\n fileReadError: 'خواندن فایل با خطا مواجه شد.',\n};\n\nconst ar = {\n placeholder: 'اكتب شيئاً…',\n toolbar: 'شريط أدوات المحرر',\n undo: 'تراجع',\n redo: 'إعادة',\n blockType: 'نوع الكتلة',\n paragraph: 'فقرة',\n heading1: 'عنوان 1',\n heading2: 'عنوان 2',\n heading3: 'عنوان 3',\n heading4: 'عنوان 4',\n heading5: 'عنوان 5',\n heading6: 'عنوان 6',\n quote: 'اقتباس',\n preformatted: 'نص منسق مسبقاً',\n bold: 'عريض',\n italic: 'مائل',\n strike: 'يتوسطه خط',\n bulletList: 'قائمة نقطية',\n numberedList: 'قائمة مرقمة',\n alignRight: 'محاذاة لليمين',\n alignCenter: 'محاذاة للوسط',\n alignLeft: 'محاذاة لليسار',\n alignImageRight: 'محاذاة الصورة لليمين',\n alignImageCenter: 'محاذاة الصورة للوسط',\n alignImageLeft: 'محاذاة الصورة لليسار',\n rtl: 'من اليمين إلى اليسار',\n ltr: 'من اليسار إلى اليمين',\n indent: 'زيادة المسافة البادئة',\n outdent: 'إنقاص المسافة البادئة',\n insertLink: 'إدراج رابط',\n insertImage: 'إدراج صورة',\n horizontalRule: 'خط أفقي',\n textColor: 'لون النص',\n bgColor: 'لون التمييز',\n applyCurrentColor: 'تطبيق اللون الحالي',\n openPalette: 'فتح لوحة الألوان',\n noColor: 'بدون لون',\n customColor: 'لون مخصص',\n pickCustomColor: 'اختيار لون مخصص',\n sourceMode: 'تحرير HTML',\n visualMode: 'العودة إلى المحرر المرئي',\n editorLabel: 'محرر النص',\n sourceLabel: 'محرر مصدر HTML',\n close: 'إغلاق',\n cancel: 'إلغاء',\n save: 'حفظ',\n linkTitle: 'إدراج رابط',\n linkUrl: 'العنوان',\n linkText: 'نص العرض (اختياري)',\n linkTextPlaceholder: 'نص الرابط',\n linkSubmit: 'إدراج الرابط',\n linkUrlRequired: 'يرجى إدخال عنوان الرابط.',\n linkInvalid: 'رابط غير صالح.',\n linkUnsafe: 'عنوان الرابط غير صالح أو غير آمن.',\n imageTitle: 'إدراج صورة',\n imageSubmit: 'إدراج الصورة',\n imageBusy: 'جارٍ المعالجة…',\n imageUploadTab: 'رفع ملف',\n imageUrlTab: 'من رابط',\n imageFile: 'ملف الصورة',\n imageUrl: 'رابط الصورة',\n imageAlt: 'النص البديل',\n imageAltPlaceholder: 'وصف قصير للصورة',\n imageHint: 'فقط jpg و png و gif و webp — بحد أقصى 2 ميجابايت',\n imagePickFile: 'يرجى اختيار ملف صورة.',\n imageInsertFailed: 'فشل إدراج الصورة.',\n imageUploadFailed: 'فشل رفع الصورة.',\n imageUnsafe: 'رابط الصورة غير صالح أو غير آمن.',\n altTitle: 'تحرير النص البديل للصورة',\n altLabel: 'النص البديل (Alt)',\n altPlaceholder: 'وصف قصير لإمكانية الوصول و SEO',\n altHint:\n 'يظهر عندما يتعذر تحميل الصورة، ويستخدمه قارئات الشاشة.',\n editAlt: 'تحرير Alt',\n editAltTitle: 'تحرير النص البديل للصورة',\n fileInvalid: 'ملف غير صالح.',\n fileEmpty: 'الملف فارغ.',\n fileTooLarge: (mb) => `يجب ألا يتجاوز حجم الملف ${mb} ميجابايت.`,\n fileBadExtension: 'امتداد الملف غير مسموح. فقط jpg و png و gif و webp.',\n fileBadMime: 'نوع الملف غير مسموح.',\n fileBadContent: 'محتوى الملف ليس صورة صالحة.',\n fileMimeMismatch: 'نوع الملف المعلن لا يطابق المحتوى الفعلي.',\n fileReadError: 'فشل قراءة الملف.',\n};\n\nconst locales = { en, fa, ar };\n\nconst RTL_LANGS = new Set(['fa', 'ar']);\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function resolveLanguage(language = 'en') {\n const key = String(language || 'en').toLowerCase();\n if (locales[key]) return key;\n return 'en';\n}\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function getMessages(language = 'en') {\n return locales[resolveLanguage(language)];\n}\n\n/**\n * @param {'en' | 'fa' | 'ar' | string} language\n */\nexport function getDefaultDir(language = 'en') {\n return RTL_LANGS.has(resolveLanguage(language)) ? 'rtl' : 'ltr';\n}\n\nexport function getBlockOptions(t) {\n return [\n { value: 'p', label: t.paragraph },\n { value: 'h1', label: t.heading1 },\n { value: 'h2', label: t.heading2 },\n { value: 'h3', label: t.heading3 },\n { value: 'h4', label: t.heading4 },\n { value: 'h5', label: t.heading5 },\n { value: 'h6', label: t.heading6 },\n { value: 'blockquote', label: t.quote },\n { value: 'pre', label: t.preformatted },\n ];\n}\n\nexport { locales, en, fa, ar };\n","import { useEffect, useRef, useState } from 'react';\nimport { Icons } from './icons.jsx';\nimport { getBlockOptions } from './i18n.js';\n\nconst TEXT_COLORS = [\n '#111827',\n '#dc2626',\n '#ea580c',\n '#ca8a04',\n '#16a34a',\n '#2563eb',\n '#7c3aed',\n '#db2777',\n '#ffffff',\n];\n\nconst BG_COLORS = [\n 'transparent',\n '#fef08a',\n '#bbf7d0',\n '#bfdbfe',\n '#fecaca',\n '#e9d5ff',\n '#fed7aa',\n '#e5e7eb',\n '#111827',\n];\n\nfunction ToolButton({ label, active, disabled, onClick, children, className = '' }) {\n return (\n <button\n type=\"button\"\n className={`te-tool${active ? ' is-active' : ''}${className ? ` ${className}` : ''}`}\n title={label}\n aria-label={label}\n aria-pressed={!!active}\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n onClick?.(e);\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction Divider() {\n return <span className=\"te-toolbar__divider\" aria-hidden=\"true\" />;\n}\n\nfunction ColorSplitButton({\n label,\n icon,\n colors,\n value,\n onChange,\n onRememberSelection,\n allowTransparent = false,\n disabled = false,\n t,\n}) {\n const [open, setOpen] = useState(false);\n const [preview, setPreview] = useState(null);\n const rootRef = useRef(null);\n const pickingCustomRef = useRef(false);\n const activeColor = preview ?? value;\n const underline =\n !activeColor || activeColor === 'transparent'\n ? allowTransparent\n ? 'repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%) 50% / 6px 6px'\n : '#111827'\n : activeColor;\n\n useEffect(() => {\n if (!open || disabled) {\n setPreview(null);\n if (disabled) setOpen(false);\n return undefined;\n }\n\n const onDoc = (e) => {\n if (pickingCustomRef.current) return;\n if (!rootRef.current?.contains(e.target)) setOpen(false);\n };\n const onKey = (e) => {\n if (e.key === 'Escape' && !pickingCustomRef.current) setOpen(false);\n };\n const onWindowFocus = () => {\n window.setTimeout(() => {\n pickingCustomRef.current = false;\n }, 50);\n };\n\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n window.addEventListener('focus', onWindowFocus);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n window.removeEventListener('focus', onWindowFocus);\n };\n }, [open, disabled]);\n\n const apply = (color, { close = true } = {}) => {\n if (disabled) return;\n onRememberSelection?.();\n onChange(color);\n setPreview(null);\n if (close) setOpen(false);\n };\n\n return (\n <div className={`te-color${open ? ' is-open' : ''}${disabled ? ' is-disabled' : ''}`} ref={rootRef}>\n <div className=\"te-color__split\">\n <button\n type=\"button\"\n className=\"te-tool te-color__apply\"\n title={`${label} — ${t.applyCurrentColor}`}\n aria-label={`${label} — ${t.applyCurrentColor}`}\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n if (disabled) return;\n onRememberSelection?.();\n onChange(value);\n }}\n >\n <span className=\"te-color__icon\">{icon}</span>\n <span\n className=\"te-color__bar\"\n style={{ background: underline }}\n aria-hidden=\"true\"\n />\n </button>\n <button\n type=\"button\"\n className={`te-tool te-color__caret${open ? ' is-active' : ''}`}\n title={`${t.openPalette}: ${label}`}\n aria-label={`${t.openPalette}: ${label}`}\n aria-expanded={open}\n aria-haspopup=\"true\"\n disabled={disabled}\n onMouseDown={(e) => {\n e.preventDefault();\n if (disabled) return;\n onRememberSelection?.();\n setOpen((v) => !v);\n }}\n >\n {Icons.chevronDown}\n </button>\n </div>\n\n {open && !disabled ? (\n <div\n className=\"te-color__swatches\"\n role=\"group\"\n aria-label={label}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {colors.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`te-swatch${value === c ? ' is-selected' : ''}`}\n style={{\n background:\n c === 'transparent'\n ? 'repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%) 50% / 8px 8px'\n : c,\n borderColor: c === '#ffffff' ? '#d1d5db' : undefined,\n }}\n title={c === 'transparent' ? t.noColor : c}\n aria-label={c === 'transparent' ? t.noColor : c}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n apply(c);\n }}\n />\n ))}\n <label\n className=\"te-swatch te-swatch--picker\"\n title={t.customColor}\n onMouseDown={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n onRememberSelection?.();\n }}\n >\n <input\n type=\"color\"\n value={activeColor && activeColor !== 'transparent' ? activeColor : '#111827'}\n onMouseDown={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n }}\n onClick={(e) => {\n e.stopPropagation();\n pickingCustomRef.current = true;\n }}\n onInput={(e) => {\n setPreview(e.target.value);\n }}\n onChange={(e) => {\n apply(e.target.value, { close: false });\n pickingCustomRef.current = false;\n }}\n onBlur={() => {\n window.setTimeout(() => {\n pickingCustomRef.current = false;\n setPreview(null);\n }, 50);\n }}\n aria-label={`${t.pickCustomColor}: ${label}`}\n />\n </label>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function Toolbar({\n t,\n states,\n canUndo,\n canRedo,\n onCommand,\n onBlockChange,\n onOpenLink,\n onOpenImage,\n onUndo,\n onRedo,\n onRememberSelection,\n sourceMode = false,\n onToggleSource,\n}) {\n const [textColor, setTextColor] = useState('#111827');\n const [bgColor, setBgColor] = useState('#fef08a');\n const formattingDisabled = sourceMode;\n const blockOptions = getBlockOptions(t);\n\n return (\n <div className=\"te-toolbar\" role=\"toolbar\" aria-label={t.toolbar}>\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.undo} disabled={formattingDisabled || !canUndo} onClick={onUndo}>\n {Icons.undo}\n </ToolButton>\n <ToolButton label={t.redo} disabled={formattingDisabled || !canRedo} onClick={onRedo}>\n {Icons.redo}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <label className=\"te-select-wrap\">\n <span className=\"te-sr-only\">{t.blockType}</span>\n <select\n className=\"te-select\"\n value={states.format || 'p'}\n disabled={formattingDisabled}\n onChange={(e) => onBlockChange(e.target.value)}\n onMouseDown={(e) => {\n e.stopPropagation();\n onRememberSelection?.();\n }}\n >\n {blockOptions.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.bold}\n active={states.bold}\n disabled={formattingDisabled}\n onClick={() => onCommand('bold')}\n >\n {Icons.bold}\n </ToolButton>\n <ToolButton\n label={t.italic}\n active={states.italic}\n disabled={formattingDisabled}\n onClick={() => onCommand('italic')}\n >\n {Icons.italic}\n </ToolButton>\n <ToolButton\n label={t.strike}\n active={states.strikeThrough}\n disabled={formattingDisabled}\n onClick={() => onCommand('strikeThrough')}\n >\n {Icons.strike}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.bulletList}\n active={states.unorderedList}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertUnorderedList')}\n >\n {Icons.ul}\n </ToolButton>\n <ToolButton\n label={t.numberedList}\n active={states.orderedList}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertOrderedList')}\n >\n {Icons.ol}\n </ToolButton>\n <ToolButton\n label={t.quote}\n active={states.format === 'blockquote'}\n disabled={formattingDisabled}\n onClick={() =>\n onBlockChange(states.format === 'blockquote' ? 'p' : 'blockquote')\n }\n >\n {Icons.quote}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageRight : t.alignRight}\n active={states.justifyRight}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyRight')}\n >\n {Icons.alignRight}\n </ToolButton>\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageCenter : t.alignCenter}\n active={states.justifyCenter}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyCenter')}\n >\n {Icons.alignCenter}\n </ToolButton>\n <ToolButton\n label={states.hasSelectedImage ? t.alignImageLeft : t.alignLeft}\n active={states.justifyLeft}\n disabled={formattingDisabled}\n onClick={() => onCommand('justifyLeft')}\n >\n {Icons.alignLeft}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.rtl} disabled={formattingDisabled} onClick={() => onCommand('rtl')}>\n {Icons.rtl}\n </ToolButton>\n <ToolButton label={t.ltr} disabled={formattingDisabled} onClick={() => onCommand('ltr')}>\n {Icons.ltr}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={t.indent}\n className=\"te-tool--indent\"\n disabled={formattingDisabled}\n onClick={() => onCommand('indent')}\n >\n {Icons.indent}\n </ToolButton>\n <ToolButton\n label={t.outdent}\n className=\"te-tool--outdent\"\n disabled={formattingDisabled}\n onClick={() => onCommand('outdent')}\n >\n {Icons.outdent}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton label={t.insertLink} disabled={formattingDisabled} onClick={onOpenLink}>\n {Icons.link}\n </ToolButton>\n <ToolButton label={t.insertImage} disabled={formattingDisabled} onClick={onOpenImage}>\n {Icons.image}\n </ToolButton>\n <ToolButton\n label={t.horizontalRule}\n disabled={formattingDisabled}\n onClick={() => onCommand('insertHorizontalRule')}\n >\n {Icons.hr}\n </ToolButton>\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group te-toolbar__colors\">\n <ColorSplitButton\n label={t.textColor}\n icon={Icons.textColor}\n colors={TEXT_COLORS}\n value={textColor}\n disabled={formattingDisabled}\n t={t}\n onRememberSelection={onRememberSelection}\n onChange={(color) => {\n setTextColor(color);\n onCommand('foreColor', color);\n }}\n />\n <ColorSplitButton\n label={t.bgColor}\n icon={Icons.bgColor}\n colors={BG_COLORS}\n value={bgColor}\n allowTransparent\n disabled={formattingDisabled}\n t={t}\n onRememberSelection={onRememberSelection}\n onChange={(color) => {\n setBgColor(color);\n onCommand('hiliteColor', color);\n }}\n />\n </div>\n\n <Divider />\n\n <div className=\"te-toolbar__group\">\n <ToolButton\n label={sourceMode ? t.visualMode : t.sourceMode}\n active={sourceMode}\n onClick={onToggleSource}\n >\n {Icons.code}\n </ToolButton>\n </div>\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { Icons } from './icons.jsx';\n\nexport function Modal({ open, title, onClose, children, footer, closeLabel = 'Close' }) {\n const titleId = useId();\n const panelRef = useRef(null);\n\n useEffect(() => {\n if (!open) return undefined;\n\n const onKey = (e) => {\n if (e.key === 'Escape') onClose?.();\n };\n document.addEventListener('keydown', onKey);\n\n const prev = document.activeElement;\n panelRef.current?.querySelector('input,button,textarea,select')?.focus();\n\n return () => {\n document.removeEventListener('keydown', onKey);\n if (prev && typeof prev.focus === 'function') prev.focus();\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <div className=\"te-modal-backdrop\" role=\"presentation\" onMouseDown={onClose}>\n <div\n className=\"te-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n ref={panelRef}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"te-modal__header\">\n <h3 id={titleId}>{title}</h3>\n <button\n type=\"button\"\n className=\"te-modal__close\"\n onClick={onClose}\n aria-label={closeLabel}\n >\n {Icons.close}\n </button>\n </div>\n <div className=\"te-modal__body\">{children}</div>\n {footer ? <div className=\"te-modal__footer\">{footer}</div> : null}\n </div>\n </div>\n );\n}\n\nexport function LinkDialog({\n open,\n onClose,\n onSubmit,\n initialUrl = '',\n initialText = '',\n t,\n}) {\n const [url, setUrl] = useState(initialUrl);\n const [text, setText] = useState(initialText);\n const [error, setError] = useState('');\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl);\n setText(initialText);\n setError('');\n }\n }, [open, initialUrl, initialText]);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n const trimmed = url.trim();\n if (!trimmed) {\n setError(t.linkUrlRequired);\n return;\n }\n try {\n onSubmit({ url: trimmed, text: text.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.linkInvalid);\n }\n };\n\n return (\n <Modal\n open={open}\n title={t.linkTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose}>\n {t.cancel}\n </button>\n <button type=\"submit\" form=\"te-link-form\" className=\"te-btn te-btn--primary\">\n {t.linkSubmit}\n </button>\n </>\n }\n >\n <form id=\"te-link-form\" onSubmit={handleSubmit} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.linkUrl}</span>\n <input\n type=\"url\"\n dir=\"ltr\"\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n required\n />\n </label>\n <label className=\"te-field\">\n <span>{t.linkText}</span>\n <input\n type=\"text\"\n placeholder={t.linkTextPlaceholder}\n value={text}\n onChange={(e) => setText(e.target.value)}\n />\n </label>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n </Modal>\n );\n}\n\nexport function ImageDialog({\n open,\n onClose,\n onSubmitUrl,\n onSubmitFile,\n accept = 'image/jpeg,image/png,image/gif,image/webp',\n t,\n}) {\n const [tab, setTab] = useState('file');\n const [url, setUrl] = useState('');\n const [alt, setAlt] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const fileRef = useRef(null);\n\n useEffect(() => {\n if (open) {\n setTab('file');\n setUrl('');\n setAlt('');\n setError('');\n setBusy(false);\n if (fileRef.current) fileRef.current.value = '';\n }\n }, [open]);\n\n const handleUrl = async (e) => {\n e.preventDefault();\n setError('');\n setBusy(true);\n try {\n await onSubmitUrl({ url: url.trim(), alt: alt.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.imageInsertFailed);\n } finally {\n setBusy(false);\n }\n };\n\n const handleFile = async (e) => {\n e.preventDefault();\n const file = fileRef.current?.files?.[0];\n if (!file) {\n setError(t.imagePickFile);\n return;\n }\n setError('');\n setBusy(true);\n try {\n await onSubmitFile({ file, alt: alt.trim() });\n onClose();\n } catch (err) {\n setError(err.message || t.imageUploadFailed);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Modal\n open={open}\n title={t.imageTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose} disabled={busy}>\n {t.cancel}\n </button>\n <button\n type=\"submit\"\n form={tab === 'file' ? 'te-image-file-form' : 'te-image-url-form'}\n className=\"te-btn te-btn--primary\"\n disabled={busy}\n >\n {busy ? t.imageBusy : t.imageSubmit}\n </button>\n </>\n }\n >\n <div className=\"te-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'file'}\n className={tab === 'file' ? 'is-active' : ''}\n onClick={() => setTab('file')}\n >\n {t.imageUploadTab}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'url'}\n className={tab === 'url' ? 'is-active' : ''}\n onClick={() => setTab('url')}\n >\n {t.imageUrlTab}\n </button>\n </div>\n\n {tab === 'file' ? (\n <form id=\"te-image-file-form\" onSubmit={handleFile} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.imageFile}</span>\n <input ref={fileRef} type=\"file\" accept={accept} />\n </label>\n <label className=\"te-field\">\n <span>{t.imageAlt}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.imageAltPlaceholder}\n />\n </label>\n <p className=\"te-hint\">{t.imageHint}</p>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n ) : (\n <form id=\"te-image-url-form\" onSubmit={handleUrl} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.imageUrl}</span>\n <input\n type=\"url\"\n dir=\"ltr\"\n placeholder=\"https://...\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n required\n />\n </label>\n <label className=\"te-field\">\n <span>{t.imageAlt}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.imageAltPlaceholder}\n />\n </label>\n {error ? <p className=\"te-error\">{error}</p> : null}\n </form>\n )}\n </Modal>\n );\n}\n\nexport function ImageAltDialog({ open, onClose, onSubmit, initialAlt = '', t }) {\n const [alt, setAlt] = useState(initialAlt);\n\n useEffect(() => {\n if (open) setAlt(initialAlt);\n }, [open, initialAlt]);\n\n const handleSubmit = (e) => {\n e.preventDefault();\n onSubmit({ alt: alt.trim() });\n onClose();\n };\n\n return (\n <Modal\n open={open}\n title={t.altTitle}\n onClose={onClose}\n closeLabel={t.close}\n footer={\n <>\n <button type=\"button\" className=\"te-btn te-btn--ghost\" onClick={onClose}>\n {t.cancel}\n </button>\n <button type=\"submit\" form=\"te-image-alt-form\" className=\"te-btn te-btn--primary\">\n {t.save}\n </button>\n </>\n }\n >\n <form id=\"te-image-alt-form\" onSubmit={handleSubmit} className=\"te-form\">\n <label className=\"te-field\">\n <span>{t.altLabel}</span>\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n placeholder={t.altPlaceholder}\n />\n </label>\n <p className=\"te-hint\">{t.altHint}</p>\n </form>\n </Modal>\n );\n}\n","import DOMPurify from 'dompurify';\n\nconst ALLOWED_TAGS = [\n 'p',\n 'br',\n 'div',\n 'span',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'ul',\n 'ol',\n 'li',\n 'strong',\n 'b',\n 'em',\n 'i',\n 's',\n 'strike',\n 'del',\n 'blockquote',\n 'pre',\n 'a',\n 'img',\n 'hr',\n 'u',\n 'font',\n];\n\nconst ALLOWED_ATTR = [\n 'href',\n 'target',\n 'rel',\n 'src',\n 'alt',\n 'title',\n 'width',\n 'height',\n 'style',\n 'dir',\n 'class',\n 'color',\n 'face',\n 'size',\n 'contenteditable',\n 'data-align',\n 'loading',\n 'draggable',\n];\n\nconst SAFE_URL_PROTOCOLS = /^(https?:|mailto:|tel:|blob:)/i;\nconst SAFE_IMG_PROTOCOLS = /^(https?:|blob:|data:image\\/(png|jpeg|jpg|gif|webp);base64,)/i;\n\nfunction isSafeUrl(url, forImage = false) {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (trimmed.startsWith('javascript:') || trimmed.startsWith('vbscript:')) {\n return false;\n }\n if (trimmed.startsWith('#') || trimmed.startsWith('/')) return true;\n return forImage\n ? SAFE_IMG_PROTOCOLS.test(trimmed)\n : SAFE_URL_PROTOCOLS.test(trimmed) || trimmed.startsWith('/');\n}\n\nfunction sanitizeStyles(styleValue) {\n if (!styleValue || typeof styleValue !== 'string') return '';\n\n const allowed = new Set([\n 'color',\n 'background-color',\n 'text-align',\n 'direction',\n 'margin',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'margin-inline-start',\n 'margin-inline-end',\n 'padding-right',\n 'padding-left',\n 'padding-inline-start',\n 'padding-inline-end',\n 'text-indent',\n 'font-weight',\n 'font-style',\n 'text-decoration',\n 'text-decoration-line',\n 'display',\n 'float',\n 'max-width',\n 'width',\n 'height',\n 'box-sizing',\n ]);\n\n return styleValue\n .split(';')\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const colon = part.indexOf(':');\n if (colon === -1) return null;\n const prop = part.slice(0, colon).trim().toLowerCase();\n const value = part.slice(colon + 1).trim();\n if (!allowed.has(prop)) return null;\n if (/expression|url\\s*\\(|javascript|import/i.test(value)) return null;\n return `${prop}: ${value}`;\n })\n .filter(Boolean)\n .join('; ');\n}\n\n/**\n * Sanitize HTML for safe rendering/storage.\n * Removes scripts, event handlers, and unsafe URLs.\n */\nexport function sanitizeHtml(dirty) {\n if (!dirty) return '';\n\n const clean = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS,\n ALLOWED_ATTR,\n ALLOW_DATA_ATTR: false,\n FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style'],\n FORBID_ATTR: [\n 'onerror',\n 'onload',\n 'onclick',\n 'onmouseover',\n 'onfocus',\n 'onblur',\n 'onchange',\n 'onsubmit',\n ],\n });\n\n if (typeof document === 'undefined') return clean;\n\n const wrapper = document.createElement('div');\n wrapper.innerHTML = clean;\n\n // Convert legacy <font color> (from older content / browsers) to <span style>\n wrapper.querySelectorAll('font').forEach((font) => {\n const span = document.createElement('span');\n const color = font.getAttribute('color');\n if (color) span.style.color = color;\n while (font.firstChild) span.appendChild(font.firstChild);\n font.replaceWith(span);\n });\n\n wrapper.querySelectorAll('a').forEach((a) => {\n const href = a.getAttribute('href') || '';\n if (!isSafeUrl(href, false)) {\n a.removeAttribute('href');\n } else {\n a.setAttribute('rel', 'noopener noreferrer');\n if (/^https?:/i.test(href)) {\n a.setAttribute('target', '_blank');\n }\n }\n });\n\n wrapper.querySelectorAll('img').forEach((img) => {\n const src = img.getAttribute('src') || '';\n if (!isSafeUrl(src, true)) {\n img.remove();\n return;\n }\n img.removeAttribute('onerror');\n img.removeAttribute('onload');\n\n // Keep images inside a selectable alignment wrapper\n if (!img.parentElement?.classList?.contains('te-figure')) {\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n const align =\n img.style.textAlign ||\n img.getAttribute('data-align') ||\n img.parentElement?.style?.textAlign ||\n 'center';\n figure.setAttribute('data-align', align);\n figure.style.textAlign = align;\n img.replaceWith(figure);\n figure.appendChild(img);\n }\n });\n\n wrapper.querySelectorAll('.te-figure').forEach((figure) => {\n figure.setAttribute('contenteditable', 'false');\n if (!figure.getAttribute('data-align')) {\n figure.setAttribute('data-align', figure.style.textAlign || 'center');\n }\n figure.querySelectorAll('.te-figure__alt-btn, button').forEach((btn) => btn.remove());\n figure.classList.remove('is-selected');\n });\n\n wrapper.querySelectorAll('img.is-selected').forEach((img) => {\n img.classList.remove('is-selected');\n });\n\n wrapper.querySelectorAll('[style]').forEach((el) => {\n const next = sanitizeStyles(el.getAttribute('style'));\n if (next) el.setAttribute('style', next);\n else el.removeAttribute('style');\n });\n\n flattenStyleSpans(wrapper);\n\n return wrapper.innerHTML;\n}\n\nfunction unwrapElement(el) {\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n}\n\nfunction styleKeys(el) {\n const keys = [];\n for (let i = 0; i < el.style.length; i += 1) keys.push(el.style.item(i));\n return keys;\n}\n\nfunction isStyleSpan(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE || el.tagName !== 'SPAN') return false;\n const keys = styleKeys(el);\n if (!keys.length) return false;\n return keys.every((k) => k === 'color' || k === 'background-color');\n}\n\n/**\n * Collapse nested color/background spans into clean markup.\n * Turns hundreds of nested <span style=\"color\"> into one span.\n */\nexport function flattenStyleSpans(root) {\n if (!root) return;\n\n let guard = 0;\n let changed = true;\n while (changed && guard < 80) {\n changed = false;\n guard += 1;\n\n [...root.querySelectorAll('span')].forEach((span) => {\n if (!span.isConnected) return;\n\n if (!span.getAttribute('style')?.trim() && !span.className) {\n unwrapElement(span);\n changed = true;\n return;\n }\n\n if (!isStyleSpan(span)) return;\n\n const parent = span.parentElement;\n if (\n parent &&\n isStyleSpan(parent) &&\n parent.childNodes.length === 1 &&\n parent.firstChild === span\n ) {\n if (span.style.color) parent.style.color = span.style.color;\n if (span.style.backgroundColor) {\n parent.style.backgroundColor = span.style.backgroundColor;\n }\n while (span.firstChild) parent.insertBefore(span.firstChild, span);\n span.remove();\n changed = true;\n return;\n }\n\n if (parent && isStyleSpan(parent)) {\n if (span.style.color) parent.style.color = span.style.color;\n if (span.style.backgroundColor) {\n parent.style.backgroundColor = span.style.backgroundColor;\n }\n unwrapElement(span);\n changed = true;\n }\n });\n }\n\n root.querySelectorAll('span').forEach((span) => {\n if (!span.getAttribute('style')?.trim() && !span.className) {\n unwrapElement(span);\n }\n });\n}\n\nexport function isSafeHref(url) {\n return isSafeUrl(url, false);\n}\n\nexport function isSafeImageSrc(url) {\n return isSafeUrl(url, true);\n}\n","import { getMessages } from './i18n.js';\n\n/** Magic-byte signatures for allowed image types */\nconst SIGNATURES = [\n { mime: 'image/jpeg', bytes: [0xff, 0xd8, 0xff] },\n { mime: 'image/png', bytes: [0x89, 0x50, 0x4e, 0x47] },\n {\n mime: 'image/gif',\n bytes: [0x47, 0x49, 0x46, 0x38],\n },\n {\n mime: 'image/webp',\n check: (buf) =>\n buf.length >= 12 &&\n buf[0] === 0x52 &&\n buf[1] === 0x49 &&\n buf[2] === 0x46 &&\n buf[3] === 0x46 &&\n buf[8] === 0x57 &&\n buf[9] === 0x45 &&\n buf[10] === 0x42 &&\n buf[11] === 0x50,\n },\n];\n\nconst DEFAULT_OPTIONS = {\n maxSizeBytes: 2 * 1024 * 1024,\n allowedMimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],\n allowedExtensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp'],\n};\n\nfunction getExtension(name) {\n const i = name.lastIndexOf('.');\n return i === -1 ? '' : name.slice(i).toLowerCase();\n}\n\nfunction sanitizeFileName(name) {\n const base = name\n .replace(/[/\\\\?%*:|\"<>]/g, '_')\n .replace(/\\s+/g, '-')\n .replace(/\\.+/g, '.')\n .slice(0, 100);\n return base || 'image';\n}\n\nasync function readMagicBytes(file, length = 16) {\n const slice = file.slice(0, length);\n const buffer = await slice.arrayBuffer();\n return new Uint8Array(buffer);\n}\n\nfunction detectMimeFromBytes(bytes) {\n for (const sig of SIGNATURES) {\n if (sig.check) {\n if (sig.check(bytes)) return sig.mime;\n } else if (sig.bytes.every((b, i) => bytes[i] === b)) {\n return sig.mime;\n }\n }\n return null;\n}\n\nfunction resolveMessages(options = {}) {\n return options.messages || getMessages(options.language || 'en');\n}\n\n/**\n * Validate an image file before upload.\n * Checks size, extension, claimed MIME, and magic bytes.\n */\nexport async function validateImageFile(file, options = {}) {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const t = resolveMessages(options);\n const errors = [];\n\n if (!file || !(file instanceof Blob)) {\n return { ok: false, errors: [t.fileInvalid] };\n }\n\n if (file.size <= 0) {\n errors.push(t.fileEmpty);\n }\n\n if (file.size > opts.maxSizeBytes) {\n const mb = (opts.maxSizeBytes / (1024 * 1024)).toFixed(1);\n errors.push(t.fileTooLarge(mb));\n }\n\n const ext = getExtension(file.name || '');\n if (!opts.allowedExtensions.includes(ext)) {\n errors.push(t.fileBadExtension);\n }\n\n const claimed = (file.type || '').toLowerCase();\n if (claimed && !opts.allowedMimeTypes.includes(claimed)) {\n errors.push(t.fileBadMime);\n }\n\n let detected = null;\n try {\n const bytes = await readMagicBytes(file);\n detected = detectMimeFromBytes(bytes);\n if (!detected) {\n errors.push(t.fileBadContent);\n } else if (\n claimed &&\n claimed !== detected &&\n !(claimed === 'image/jpg' && detected === 'image/jpeg')\n ) {\n errors.push(t.fileMimeMismatch);\n }\n } catch {\n errors.push(t.fileReadError);\n }\n\n if (errors.length) {\n return { ok: false, errors };\n }\n\n return {\n ok: true,\n mime: detected || claimed,\n safeName: sanitizeFileName(file.name || `image${ext}`),\n errors: [],\n };\n}\n\nfunction fileToDataUrl(file, mime) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result !== 'string' || !result.startsWith('data:image/')) {\n reject(new Error('Failed to encode image.'));\n return;\n }\n // Normalize MIME from validated magic bytes when possible\n if (mime && result.startsWith('data:')) {\n const comma = result.indexOf(',');\n if (comma !== -1) {\n resolve(`data:${mime};base64,${result.slice(comma + 1)}`);\n return;\n }\n }\n resolve(result);\n };\n reader.onerror = () => reject(reader.error || new Error('Failed to read file.'));\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * Secure image insert pipeline:\n * 1) validate file\n * 2) call optional onUpload(file) → url\n * 3) otherwise embed as base64 data URL\n */\nexport async function processImageUpload(file, options = {}) {\n const t = resolveMessages(options);\n const validation = await validateImageFile(file, options);\n if (!validation.ok) {\n throw new Error(validation.errors.join(' '));\n }\n\n if (typeof options.onUpload === 'function') {\n const result = await options.onUpload(file, {\n mime: validation.mime,\n safeName: validation.safeName,\n });\n\n if (!result || typeof result !== 'string') {\n throw new Error(t.imageUploadFailed);\n }\n\n return result;\n }\n\n try {\n return await fileToDataUrl(file, validation.mime);\n } catch {\n throw new Error(t.fileReadError);\n }\n}\n\nexport { DEFAULT_OPTIONS as uploadDefaults };\n","/**\n * Lightweight undo/redo history for contenteditable HTML snapshots.\n */\nexport function createHistory(limit = 50) {\n let stack = [];\n let index = -1;\n\n return {\n push(html) {\n if (index >= 0 && stack[index] === html) return;\n stack = stack.slice(0, index + 1);\n stack.push(html);\n if (stack.length > limit) {\n stack.shift();\n } else {\n index += 1;\n }\n if (index >= limit) index = limit - 1;\n index = stack.length - 1;\n },\n undo() {\n if (index <= 0) return null;\n index -= 1;\n return stack[index];\n },\n redo() {\n if (index >= stack.length - 1) return null;\n index += 1;\n return stack[index];\n },\n canUndo() {\n return index > 0;\n },\n canRedo() {\n return index < stack.length - 1;\n },\n current() {\n return index >= 0 ? stack[index] : null;\n },\n reset(html = '') {\n stack = [html];\n index = 0;\n },\n };\n}\n","import { isSafeHref, isSafeImageSrc, flattenStyleSpans } from './sanitize.js';\n\nexport function focusEditor(editor) {\n if (!editor) return;\n editor.focus({ preventScroll: true });\n}\n\nexport function saveSelection(editor) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return null;\n return range.cloneRange();\n}\n\nexport function restoreSelection(range) {\n if (!range) return false;\n const sel = window.getSelection();\n if (!sel) return false;\n try {\n sel.removeAllRanges();\n sel.addRange(range);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction exec(command, value = null) {\n try {\n return document.execCommand(command, false, value);\n } catch {\n return false;\n }\n}\n\nexport function queryCommandState(command) {\n try {\n return document.queryCommandState(command);\n } catch {\n return false;\n }\n}\n\nexport function queryCommandValue(command) {\n try {\n return document.queryCommandValue(command);\n } catch {\n return '';\n }\n}\n\nexport function getBlockFormat() {\n const value = (queryCommandValue('formatBlock') || '').toLowerCase();\n if (!value) return 'p';\n return value.replace(/[<>]/g, '');\n}\n\nfunction ensureCssStyled() {\n try {\n document.execCommand('styleWithCSS', false, true);\n } catch {\n // ignore\n }\n}\n\nfunction getSelectedRange(editor) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) return null;\n return range;\n}\n\n/**\n * Apply inline style via <span style=\"...\">.\n * Avoids <font color> from execCommand('foreColor'), which sanitizer strips.\n * Updates an existing color span in place when possible to avoid nesting.\n */\nfunction applyInlineStyle(editor, styles) {\n focusEditor(editor);\n\n let range = getSelectedRange(editor);\n if (!range) return false;\n\n if (range.collapsed) {\n const expanded = expandToWord(range);\n if (expanded) {\n restoreSelection(expanded);\n range = expanded;\n } else {\n const span = document.createElement('span');\n if (styles.color) span.style.color = styles.color;\n if (styles.backgroundColor) span.style.backgroundColor = styles.backgroundColor;\n span.appendChild(document.createTextNode('\\u200b'));\n range.insertNode(span);\n const caret = document.createRange();\n caret.setStart(span.firstChild, 1);\n caret.collapse(true);\n restoreSelection(caret);\n return true;\n }\n }\n\n const updated = updateExistingInlineStyle(range, styles);\n if (updated) {\n flattenStyleSpans(editor);\n return true;\n }\n\n const ok = wrapSelectionWithSpan(editor, styles);\n flattenStyleSpans(editor);\n return ok;\n}\n\nfunction expandToWord(range) {\n const node = range.startContainer;\n if (!node || node.nodeType !== Node.TEXT_NODE) return null;\n const text = node.textContent || '';\n if (!text.trim()) return null;\n\n let start = range.startOffset;\n let end = range.endOffset;\n while (start > 0 && !/\\s/.test(text[start - 1])) start -= 1;\n while (end < text.length && !/\\s/.test(text[end])) end += 1;\n if (start === end) return null;\n\n const next = range.cloneRange();\n next.setStart(node, start);\n next.setEnd(node, end);\n return next;\n}\n\nfunction styleKeys(el) {\n const keys = [];\n for (let i = 0; i < el.style.length; i += 1) keys.push(el.style.item(i));\n return keys;\n}\n\nfunction isStyleSpan(el) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE || el.tagName !== 'SPAN') return false;\n const keys = styleKeys(el);\n if (!keys.length) return false;\n return keys.every((k) => k === 'color' || k === 'background-color');\n}\n\n/**\n * If selection sits inside / exactly on a style span, mutate that span\n * instead of wrapping again.\n */\nfunction updateExistingInlineStyle(range, styles) {\n let node = range.commonAncestorContainer;\n if (node.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\n let candidate = null;\n let el = node;\n while (el) {\n if (isStyleSpan(el)) {\n const spanRange = document.createRange();\n spanRange.selectNodeContents(el);\n if (\n range.compareBoundaryPoints(Range.START_TO_START, spanRange) >= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, spanRange) <= 0\n ) {\n candidate = el;\n break;\n }\n }\n if (el.classList?.contains('te-editor')) break;\n el = el.parentElement;\n }\n\n if (!candidate) return false;\n\n if (styles.color) candidate.style.color = styles.color;\n if (styles.backgroundColor) {\n if (styles.backgroundColor === 'transparent') {\n candidate.style.backgroundColor = '';\n } else {\n candidate.style.backgroundColor = styles.backgroundColor;\n }\n }\n\n const sel = window.getSelection();\n if (sel) {\n const selectRange = document.createRange();\n selectRange.selectNodeContents(candidate);\n sel.removeAllRanges();\n sel.addRange(selectRange);\n }\n return true;\n}\n\nfunction wrapSelectionWithSpan(editor, styles) {\n const range = getSelectedRange(editor);\n if (!range || range.collapsed) return false;\n\n const span = document.createElement('span');\n if (styles.color) span.style.color = styles.color;\n if (styles.backgroundColor) {\n span.style.backgroundColor = styles.backgroundColor;\n }\n\n try {\n range.surroundContents(span);\n } catch {\n const fragment = range.extractContents();\n const tmp = document.createElement('div');\n tmp.appendChild(fragment);\n flattenStyleSpans(tmp);\n while (tmp.firstChild) span.appendChild(tmp.firstChild);\n range.insertNode(span);\n }\n\n const sel = window.getSelection();\n if (sel) {\n const selectRange = document.createRange();\n selectRange.selectNodeContents(span);\n sel.removeAllRanges();\n sel.addRange(selectRange);\n }\n\n return true;\n}\n\nfunction clearHighlight(editor) {\n focusEditor(editor);\n const range = getSelectedRange(editor);\n if (!range) return;\n\n ensureCssStyled();\n exec('hiliteColor', 'transparent');\n exec('backColor', 'transparent');\n\n editor.querySelectorAll('span[style]').forEach((span) => {\n if (!range.intersectsNode(span)) return;\n span.style.backgroundColor = '';\n if (!span.getAttribute('style')?.trim()) {\n span.removeAttribute('style');\n }\n });\n flattenStyleSpans(editor);\n}\n\nexport function applyFormat(editor, type, value, options = {}) {\n focusEditor(editor);\n ensureCssStyled();\n\n switch (type) {\n case 'bold':\n exec('bold');\n break;\n case 'italic':\n exec('italic');\n break;\n case 'strikeThrough':\n exec('strikeThrough');\n break;\n case 'formatBlock': {\n const tag = value || 'p';\n exec('formatBlock', tag === 'p' ? 'p' : tag);\n break;\n }\n case 'insertUnorderedList':\n exec('insertUnorderedList');\n break;\n case 'insertOrderedList':\n exec('insertOrderedList');\n break;\n case 'justifyRight':\n alignContent(editor, 'right', options.selectedImage);\n break;\n case 'justifyCenter':\n alignContent(editor, 'center', options.selectedImage);\n break;\n case 'justifyLeft':\n alignContent(editor, 'left', options.selectedImage);\n break;\n case 'indent':\n changeIndent(editor, 1);\n break;\n case 'outdent':\n changeIndent(editor, -1);\n break;\n case 'insertHorizontalRule':\n exec('insertHorizontalRule');\n break;\n case 'foreColor':\n applyInlineStyle(editor, { color: value });\n break;\n case 'hiliteColor':\n if (!value || value === 'transparent') {\n clearHighlight(editor);\n } else {\n applyInlineStyle(editor, { backgroundColor: value });\n }\n break;\n case 'removeFormat':\n exec('removeFormat');\n break;\n default:\n break;\n }\n}\n\nfunction getClosestBlock(editor, node) {\n let block = node;\n if (block && block.nodeType === Node.TEXT_NODE) block = block.parentElement;\n while (block && block !== editor) {\n if (\n block.matches?.(\n 'p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre,figure,.te-figure'\n )\n ) {\n return block;\n }\n block = block.parentElement;\n }\n return null;\n}\n\nconst INDENT_STEP_PX = 24;\nconst MAX_INDENT_PX = 240;\n\nfunction readIndentPx(block) {\n const inline = block.style?.marginInlineStart;\n if (inline) {\n const n = parseFloat(inline);\n if (!Number.isNaN(n)) return n;\n }\n const computed = block.ownerDocument?.defaultView\n ?.getComputedStyle(block)\n ?.marginInlineStart;\n if (computed) {\n const n = parseFloat(computed);\n if (!Number.isNaN(n) && n > 0) return n;\n }\n return 0;\n}\n\nfunction collectBlocksInRange(editor, range) {\n const blocks = [];\n const seen = new Set();\n\n const push = (node) => {\n const block = getClosestBlock(editor, node);\n if (!block || block === editor || seen.has(block)) return;\n // Skip structural wrappers that indent shouldn't touch\n if (block.matches?.('figure,.te-figure')) return;\n seen.add(block);\n blocks.push(block);\n };\n\n push(range.startContainer);\n push(range.endContainer);\n\n if (!range.collapsed) {\n try {\n const walker = editor.ownerDocument.createTreeWalker(\n range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? range.commonAncestorContainer\n : range.commonAncestorContainer.parentElement || editor,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode(node) {\n if (!range.intersectsNode(node)) return NodeFilter.FILTER_REJECT;\n if (\n node.matches?.(\n 'p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre'\n )\n ) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n },\n }\n );\n let current = walker.currentNode;\n if (current?.nodeType === Node.ELEMENT_NODE) push(current);\n while ((current = walker.nextNode())) push(current);\n } catch {\n // intersectsNode can throw on detached nodes; start/end are enough\n }\n }\n\n return blocks;\n}\n\n/**\n * Indent/outdent via margin — never uses execCommand('indent'),\n * which browsers implement by wrapping in <blockquote>.\n * List items nest/unnest with DOM moves instead.\n */\nfunction changeIndent(editor, direction) {\n focusEditor(editor);\n const range = getSelectedRange(editor);\n if (!range) return;\n\n const blocks = collectBlocksInRange(editor, range);\n if (!blocks.length) return;\n\n blocks.forEach((block) => {\n if (block.tagName === 'LI') {\n indentListItem(block, direction);\n return;\n }\n\n const current = readIndentPx(block);\n const next = Math.max(\n 0,\n Math.min(MAX_INDENT_PX, current + direction * INDENT_STEP_PX)\n );\n if (next <= 0) {\n block.style.marginInlineStart = '';\n if (!block.getAttribute('style')?.trim()) block.removeAttribute('style');\n } else {\n block.style.marginInlineStart = `${next}px`;\n }\n });\n}\n\nfunction indentListItem(li, direction) {\n const list = li.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return;\n\n if (direction > 0) {\n const prev = li.previousElementSibling;\n if (!prev || prev.tagName !== 'LI') return;\n\n let nested = prev.querySelector(':scope > ul, :scope > ol');\n if (!nested) {\n nested = document.createElement(list.tagName.toLowerCase());\n prev.appendChild(nested);\n }\n nested.appendChild(li);\n return;\n }\n\n // outdent\n const parentLi = list.parentElement;\n if (!parentLi || parentLi.tagName !== 'LI') return;\n const parentList = parentLi.parentElement;\n if (!parentList) return;\n\n parentLi.after(li);\n if (!list.children.length) list.remove();\n}\n\nfunction alignContent(editor, align, selectedImage) {\n const image =\n selectedImage && editor.contains(selectedImage) ? selectedImage : null;\n\n if (image) {\n alignImage(image, align);\n return;\n }\n\n const range = getSelectedRange(editor);\n const node = range?.commonAncestorContainer;\n const maybeImg =\n node?.nodeType === Node.ELEMENT_NODE && node.tagName === 'IMG'\n ? node\n : node?.parentElement?.closest?.('img');\n\n if (maybeImg && editor.contains(maybeImg)) {\n alignImage(maybeImg, align);\n return;\n }\n\n if (align === 'right') exec('justifyRight');\n else if (align === 'center') exec('justifyCenter');\n else exec('justifyLeft');\n}\n\nfunction ensureFigure(img) {\n if (img.parentElement?.classList?.contains('te-figure')) {\n return img.parentElement;\n }\n\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n img.replaceWith(figure);\n figure.appendChild(img);\n return figure;\n}\n\nexport function alignImage(img, align) {\n const figure = ensureFigure(img);\n figure.setAttribute('data-align', align);\n figure.style.textAlign = align;\n figure.style.width = 'fit-content';\n figure.style.maxWidth = '100%';\n\n img.style.display = 'block';\n img.style.float = 'none';\n img.style.marginLeft = '0';\n img.style.marginRight = '0';\n\n if (align === 'center') {\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = 'auto';\n } else if (align === 'left') {\n figure.style.marginLeft = '0';\n figure.style.marginRight = 'auto';\n } else {\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = '0';\n }\n}\n\nexport function selectImage(img, editor, messages) {\n if (!img || !editor) return;\n clearImageSelection(editor);\n const figure = ensureFigure(img);\n figure.classList.add('is-selected');\n img.classList.add('is-selected');\n\n let altBtn = figure.querySelector('.te-figure__alt-btn');\n if (!altBtn) {\n altBtn = document.createElement('button');\n altBtn.type = 'button';\n altBtn.className = 'te-figure__alt-btn';\n altBtn.setAttribute('contenteditable', 'false');\n figure.appendChild(altBtn);\n }\n const t = messages || {};\n const currentAlt = img.getAttribute('alt') || '';\n altBtn.textContent = currentAlt\n ? `Alt: ${currentAlt.length > 28 ? `${currentAlt.slice(0, 28)}…` : currentAlt}`\n : t.editAlt || 'Edit Alt';\n altBtn.title = t.editAltTitle || 'Edit image alt text';\n\n const range = document.createRange();\n range.selectNode(figure);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n focusEditor(editor);\n}\n\nexport function clearImageSelection(editor) {\n if (!editor) return;\n editor.querySelectorAll('.te-figure.is-selected, img.is-selected').forEach((el) => {\n el.classList.remove('is-selected');\n });\n editor.querySelectorAll('.te-figure__alt-btn').forEach((btn) => btn.remove());\n}\n\nexport function updateImageAlt(img, alt, messages) {\n if (!img) return;\n img.setAttribute('alt', alt || '');\n const figure = img.closest?.('.te-figure');\n const btn = figure?.querySelector('.te-figure__alt-btn');\n if (btn) {\n const t = messages || {};\n btn.textContent = alt\n ? `Alt: ${alt.length > 28 ? `${alt.slice(0, 28)}…` : alt}`\n : t.editAlt || 'Edit Alt';\n }\n}\n\nexport function setDirection(editor, dir) {\n focusEditor(editor);\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) {\n editor.setAttribute('dir', dir);\n return;\n }\n\n let node = sel.anchorNode;\n if (node && node.nodeType === Node.TEXT_NODE) node = node.parentElement;\n\n const block = getClosestBlock(editor, node);\n if (block && block !== editor) {\n block.setAttribute('dir', dir);\n block.style.direction = dir;\n } else {\n editor.setAttribute('dir', dir);\n }\n}\n\nexport function insertLink(editor, url, text, messages) {\n focusEditor(editor);\n if (!isSafeHref(url)) {\n throw new Error((messages && messages.linkUnsafe) || 'The link URL is invalid or unsafe.');\n }\n\n const sel = window.getSelection();\n const hasSelection = sel && !sel.isCollapsed && editor.contains(sel.anchorNode);\n\n if (hasSelection) {\n exec('createLink', url);\n const anchors = editor.querySelectorAll('a[href]');\n const last = anchors[anchors.length - 1];\n if (last) {\n last.setAttribute('rel', 'noopener noreferrer');\n if (/^https?:/i.test(url)) last.setAttribute('target', '_blank');\n }\n } else {\n const label = text || url;\n const safe = document.createElement('a');\n safe.href = url;\n safe.textContent = label;\n safe.rel = 'noopener noreferrer';\n if (/^https?:/i.test(url)) safe.target = '_blank';\n insertNode(editor, safe);\n }\n}\n\nexport function insertImage(editor, src, alt = '', messages) {\n focusEditor(editor);\n if (!isSafeImageSrc(src)) {\n throw new Error((messages && messages.imageUnsafe) || 'The image URL is invalid or unsafe.');\n }\n\n const figure = document.createElement('div');\n figure.className = 'te-figure';\n figure.setAttribute('contenteditable', 'false');\n figure.setAttribute('data-align', 'center');\n figure.style.textAlign = 'center';\n figure.style.width = 'fit-content';\n figure.style.maxWidth = '100%';\n figure.style.marginLeft = 'auto';\n figure.style.marginRight = 'auto';\n\n const img = document.createElement('img');\n img.src = src;\n img.alt = alt || '';\n img.setAttribute('loading', 'lazy');\n img.draggable = false;\n img.style.display = 'block';\n img.style.maxWidth = '100%';\n\n figure.appendChild(img);\n insertNode(editor, figure);\n\n // Trailing paragraph for caret after image\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n insertNode(editor, p);\n\n return img;\n}\n\nfunction insertNode(editor, node) {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) {\n editor.appendChild(node);\n return;\n }\n\n const range = sel.getRangeAt(0);\n if (!editor.contains(range.commonAncestorContainer)) {\n editor.appendChild(node);\n return;\n }\n\n range.deleteContents();\n range.insertNode(node);\n range.setStartAfter(node);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\nexport function getActiveStates(editor) {\n const selectedImage = editor?.querySelector?.('.te-figure.is-selected, img.is-selected');\n let imageAlign = null;\n if (selectedImage) {\n const figure = selectedImage.classList?.contains('te-figure')\n ? selectedImage\n : selectedImage.closest?.('.te-figure');\n imageAlign = figure?.getAttribute('data-align') || null;\n }\n\n return {\n bold: queryCommandState('bold'),\n italic: queryCommandState('italic'),\n strikeThrough: queryCommandState('strikeThrough'),\n unorderedList: queryCommandState('insertUnorderedList'),\n orderedList: queryCommandState('insertOrderedList'),\n justifyRight: imageAlign ? imageAlign === 'right' : queryCommandState('justifyRight'),\n justifyCenter: imageAlign ? imageAlign === 'center' : queryCommandState('justifyCenter'),\n justifyLeft: imageAlign ? imageAlign === 'left' : queryCommandState('justifyLeft'),\n format: getBlockFormat(),\n hasSelectedImage: !!selectedImage,\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { Toolbar } from './Toolbar.jsx';\nimport { LinkDialog, ImageDialog, ImageAltDialog } from './Dialogs.jsx';\nimport { sanitizeHtml } from './sanitize.js';\nimport { processImageUpload } from './upload.js';\nimport { createHistory } from './history.js';\nimport { getMessages, getDefaultDir, resolveLanguage } from './i18n.js';\nimport {\n applyFormat,\n getActiveStates,\n insertImage,\n insertLink,\n restoreSelection,\n saveSelection,\n setDirection,\n selectImage,\n clearImageSelection,\n updateImageAlt,\n} from './commands.js';\nimport { version as TEEM_EDITOR_VERSION } from '../package.json';\nimport './styles.css';\n\nconst NPM_PACKAGE_URL = 'https://www.npmjs.com/package/teem-editor';\n\nfunction normalizeEmpty(html) {\n const trimmed = (html || '').trim();\n if (!trimmed || trimmed === '<br>' || trimmed === '<div><br></div>') {\n return '<p><br></p>';\n }\n return trimmed;\n}\n\nfunction stripSelectionClasses(html) {\n if (typeof document !== 'undefined') {\n const wrap = document.createElement('div');\n wrap.innerHTML = html;\n wrap.querySelectorAll('.te-figure__alt-btn').forEach((el) => el.remove());\n wrap.querySelectorAll('.is-selected').forEach((el) => el.classList.remove('is-selected'));\n wrap.querySelectorAll('[class=\"\"]').forEach((el) => el.removeAttribute('class'));\n return wrap.innerHTML;\n }\n return html\n .replace(/<button[^>]*class=\"[^\"]*te-figure__alt-btn[^\"]*\"[^>]*>.*?<\\/button>/gi, '')\n .replace(/\\s*is-selected/g, '')\n .replace(/\\sclass=\"\"/g, '')\n .replace(/\\sclass=''/g, '');\n}\n\n/**\n * TeemEditor — simple, fast WYSIWYG for React and Next.js with full RTL/LTR support.\n */\nexport const TeemEditor = forwardRef(function TeemEditor(\n {\n value,\n defaultValue = '<p><br></p>',\n onChange,\n placeholder,\n language = 'en',\n dir,\n className = '',\n style,\n minHeight = 220,\n noscroll = false,\n disabled = false,\n onUpload,\n uploadOptions,\n toolbar = true,\n },\n ref\n) {\n const lang = resolveLanguage(language);\n const t = getMessages(lang);\n const resolvedDir = dir || getDefaultDir(lang);\n const resolvedPlaceholder = placeholder ?? t.placeholder;\n\n const rootRef = useRef(null);\n const editorRef = useRef(null);\n const historyRef = useRef(createHistory());\n const savedRangeRef = useRef(null);\n const lastHtmlRef = useRef('');\n const composingRef = useRef(false);\n const selectedImageRef = useRef(null);\n const messagesRef = useRef(t);\n messagesRef.current = t;\n\n const [states, setStates] = useState(() => ({\n bold: false,\n italic: false,\n strikeThrough: false,\n unorderedList: false,\n orderedList: false,\n justifyRight: false,\n justifyCenter: false,\n justifyLeft: false,\n format: 'p',\n hasSelectedImage: false,\n }));\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [linkOpen, setLinkOpen] = useState(false);\n const [imageOpen, setImageOpen] = useState(false);\n const [altOpen, setAltOpen] = useState(false);\n const [altDraft, setAltDraft] = useState('');\n const [isEmpty, setIsEmpty] = useState(true);\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n\n const syncHistoryFlags = useCallback(() => {\n setCanUndo(historyRef.current.canUndo());\n setCanRedo(historyRef.current.canRedo());\n }, []);\n\n const emitChange = useCallback(\n (html, { recordHistory = true } = {}) => {\n const clean = sanitizeHtml(stripSelectionClasses(normalizeEmpty(html)));\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n\n if (recordHistory) {\n historyRef.current.push(clean);\n syncHistoryFlags();\n }\n\n onChange?.(clean);\n },\n [onChange, syncHistoryFlags]\n );\n\n const readHtml = useCallback(() => editorRef.current?.innerHTML || '', []);\n\n const setHtml = useCallback(\n (html, { recordHistory = false } = {}) => {\n if (!editorRef.current) return;\n const clean = sanitizeHtml(normalizeEmpty(html));\n editorRef.current.innerHTML = clean;\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n if (recordHistory) {\n historyRef.current.push(clean);\n syncHistoryFlags();\n }\n },\n [syncHistoryFlags]\n );\n\n useEffect(() => {\n const initial = sanitizeHtml(normalizeEmpty(value ?? defaultValue));\n if (editorRef.current) {\n editorRef.current.innerHTML = initial;\n }\n lastHtmlRef.current = initial;\n historyRef.current.reset(initial);\n setIsEmpty(!initial.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n syncHistoryFlags();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (value === undefined || !editorRef.current) return;\n const clean = sanitizeHtml(normalizeEmpty(value));\n if (clean !== lastHtmlRef.current) {\n const sel = saveSelection(editorRef.current);\n editorRef.current.innerHTML = clean;\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n restoreSelection(sel);\n }\n }, [value]);\n\n const refreshStates = useCallback(() => {\n if (!editorRef.current) return;\n setStates(getActiveStates(editorRef.current));\n }, []);\n\n useEffect(() => {\n const onSel = () => {\n if (!editorRef.current) return;\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n if (editorRef.current.contains(sel.anchorNode)) {\n refreshStates();\n }\n };\n document.addEventListener('selectionchange', onSel);\n return () => document.removeEventListener('selectionchange', onSel);\n }, [refreshStates]);\n\n const rememberSelection = useCallback(() => {\n const live = saveSelection(editorRef.current);\n if (live) savedRangeRef.current = live;\n }, []);\n\n const withSelection = useCallback(\n (fn) => {\n const live = saveSelection(editorRef.current);\n if (live) savedRangeRef.current = live;\n restoreSelection(savedRangeRef.current);\n fn();\n emitChange(readHtml());\n refreshStates();\n },\n [emitChange, readHtml, refreshStates]\n );\n\n const handleCommand = useCallback(\n (type, value) => {\n if (disabled) return;\n withSelection(() => {\n if (type === 'rtl' || type === 'ltr') {\n setDirection(editorRef.current, type);\n } else {\n applyFormat(editorRef.current, type, value, {\n selectedImage: selectedImageRef.current,\n });\n }\n });\n },\n [disabled, withSelection]\n );\n\n const handleBlockChange = useCallback(\n (tag) => {\n if (disabled) return;\n withSelection(() => {\n applyFormat(editorRef.current, 'formatBlock', tag);\n });\n },\n [disabled, withSelection]\n );\n\n const handleUndo = useCallback(() => {\n const html = historyRef.current.undo();\n if (html == null || !editorRef.current) return;\n editorRef.current.innerHTML = html;\n lastHtmlRef.current = html;\n setIsEmpty(!html.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n syncHistoryFlags();\n onChange?.(html);\n refreshStates();\n }, [onChange, refreshStates, syncHistoryFlags]);\n\n const handleRedo = useCallback(() => {\n const html = historyRef.current.redo();\n if (html == null || !editorRef.current) return;\n editorRef.current.innerHTML = html;\n lastHtmlRef.current = html;\n setIsEmpty(!html.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n selectedImageRef.current = null;\n syncHistoryFlags();\n onChange?.(html);\n refreshStates();\n }, [onChange, refreshStates, syncHistoryFlags]);\n\n const handleInput = useCallback(() => {\n if (composingRef.current) return;\n emitChange(readHtml());\n refreshStates();\n }, [emitChange, readHtml, refreshStates]);\n\n const handlePaste = useCallback(\n (e) => {\n e.preventDefault();\n const text = e.clipboardData?.getData('text/plain') || '';\n const html = e.clipboardData?.getData('text/html');\n if (html) {\n const clean = sanitizeHtml(html);\n document.execCommand('insertHTML', false, clean);\n } else {\n document.execCommand('insertText', false, text);\n }\n emitChange(readHtml());\n },\n [emitChange, readHtml]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n e.preventDefault();\n handleUndo();\n } else if (\n mod &&\n (e.key.toLowerCase() === 'y' || (e.key.toLowerCase() === 'z' && e.shiftKey))\n ) {\n e.preventDefault();\n handleRedo();\n } else if (mod && e.key.toLowerCase() === 'b') {\n e.preventDefault();\n handleCommand('bold');\n } else if (mod && e.key.toLowerCase() === 'i') {\n e.preventDefault();\n handleCommand('italic');\n } else if (e.key === 'Escape' && selectedImageRef.current) {\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n refreshStates();\n }\n },\n [handleCommand, handleRedo, handleUndo, refreshStates]\n );\n\n const openAltEditor = useCallback((img) => {\n if (!img) return;\n selectedImageRef.current = img;\n setAltDraft(img.getAttribute('alt') || '');\n setAltOpen(true);\n }, []);\n\n const handleEditorMouseDown = useCallback(\n (e) => {\n const target = e.target;\n if (!(target instanceof Element) || !editorRef.current) return;\n\n // Alt edit button on selected figure\n if (target.closest('.te-figure__alt-btn')) {\n e.preventDefault();\n e.stopPropagation();\n const figure = target.closest('.te-figure');\n const img = figure?.querySelector('img');\n if (img) openAltEditor(img);\n return;\n }\n\n const img = target.closest('img');\n const figure = target.closest('.te-figure');\n\n if (img && editorRef.current.contains(img)) {\n e.preventDefault();\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n savedRangeRef.current = saveSelection(editorRef.current);\n refreshStates();\n return;\n }\n\n if (figure && editorRef.current.contains(figure)) {\n const innerImg = figure.querySelector('img');\n if (innerImg) {\n e.preventDefault();\n selectImage(innerImg, editorRef.current, messagesRef.current);\n selectedImageRef.current = innerImg;\n savedRangeRef.current = saveSelection(editorRef.current);\n refreshStates();\n return;\n }\n }\n\n if (selectedImageRef.current) {\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n refreshStates();\n }\n },\n [openAltEditor, refreshStates]\n );\n\n const handleEditorDoubleClick = useCallback(\n (e) => {\n const target = e.target;\n if (!(target instanceof Element) || !editorRef.current) return;\n const img = target.closest('img');\n const figure = target.closest('.te-figure');\n const image = img || figure?.querySelector('img');\n if (image && editorRef.current.contains(image)) {\n e.preventDefault();\n selectImage(image, editorRef.current, messagesRef.current);\n openAltEditor(image);\n }\n },\n [openAltEditor]\n );\n\n const openLink = useCallback(() => {\n rememberSelection();\n setLinkOpen(true);\n }, [rememberSelection]);\n\n const openImage = useCallback(() => {\n rememberSelection();\n setImageOpen(true);\n }, [rememberSelection]);\n\n const toggleSourceMode = useCallback(() => {\n if (disabled) return;\n\n if (!sourceMode) {\n // Visual → HTML\n clearImageSelection(editorRef.current);\n selectedImageRef.current = null;\n const html = sanitizeHtml(stripSelectionClasses(readHtml()));\n setSourceCode(html);\n setSourceMode(true);\n return;\n }\n\n // HTML → Visual (sanitize user-edited source)\n const clean = sanitizeHtml(normalizeEmpty(sourceCode));\n if (editorRef.current) {\n editorRef.current.innerHTML = clean;\n }\n lastHtmlRef.current = clean;\n setIsEmpty(!clean.replace(/<[^>]+>/g, '').replace(/\\u200b/g, '').trim());\n historyRef.current.push(clean);\n syncHistoryFlags();\n onChange?.(clean);\n setSourceMode(false);\n refreshStates();\n }, [\n disabled,\n sourceMode,\n sourceCode,\n readHtml,\n onChange,\n syncHistoryFlags,\n refreshStates,\n ]);\n\n const handleSourceChange = useCallback((e) => {\n setSourceCode(e.target.value);\n }, []);\n\n const handleSourceBlur = useCallback(() => {\n // Keep parent in sync while editing source (sanitized lightly on leave)\n const clean = sanitizeHtml(normalizeEmpty(sourceCode));\n lastHtmlRef.current = clean;\n onChange?.(clean);\n }, [sourceCode, onChange]);\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getHTML: () => sanitizeHtml(stripSelectionClasses(readHtml())),\n setHTML: (html) => {\n setHtml(html, { recordHistory: true });\n onChange?.(sanitizeHtml(normalizeEmpty(html)));\n },\n clear: () => {\n setHtml('<p><br></p>', { recordHistory: true });\n onChange?.(sanitizeHtml('<p><br></p>'));\n },\n getEditorElement: () => editorRef.current,\n }));\n\n return (\n <div\n ref={rootRef}\n className={`te-root${disabled ? ' is-disabled' : ''}${sourceMode ? ' is-source' : ''}${noscroll ? ' te-root--noscroll' : ''} te-root--${resolvedDir} ${className}`.trim()}\n style={style}\n dir={resolvedDir}\n lang={lang}\n onMouseDown={(e) => {\n if (e.target.closest?.('.te-toolbar')) {\n rememberSelection();\n }\n }}\n >\n {toolbar ? (\n <Toolbar\n t={t}\n states={states}\n canUndo={canUndo}\n canRedo={canRedo}\n onCommand={handleCommand}\n onBlockChange={handleBlockChange}\n onOpenLink={openLink}\n onOpenImage={openImage}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onRememberSelection={rememberSelection}\n sourceMode={sourceMode}\n onToggleSource={toggleSourceMode}\n />\n ) : null}\n\n <div className=\"te-editor-shell\">\n {!sourceMode && isEmpty ? (\n <div className=\"te-placeholder\">{resolvedPlaceholder}</div>\n ) : null}\n\n <div\n ref={editorRef}\n className=\"te-editor\"\n contentEditable={!disabled && !sourceMode}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={t.editorLabel}\n aria-placeholder={resolvedPlaceholder}\n aria-hidden={sourceMode}\n suppressContentEditableWarning\n style={{ minHeight, display: sourceMode ? 'none' : undefined }}\n dir={resolvedDir}\n onInput={handleInput}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onMouseDown={handleEditorMouseDown}\n onDoubleClick={handleEditorDoubleClick}\n onBlur={() => {\n if (!sourceMode) emitChange(readHtml(), { recordHistory: true });\n }}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n handleInput();\n }}\n onMouseUp={refreshStates}\n onKeyUp={refreshStates}\n />\n\n {sourceMode ? (\n <textarea\n className=\"te-source\"\n value={sourceCode}\n onChange={handleSourceChange}\n onBlur={handleSourceBlur}\n disabled={disabled}\n spellCheck={false}\n dir=\"ltr\"\n aria-label={t.sourceLabel}\n style={{ minHeight }}\n />\n ) : null}\n\n <a\n className=\"te-credit\"\n href={NPM_PACKAGE_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n >\n powered by TeemEditor v.{TEEM_EDITOR_VERSION}\n </a>\n </div>\n\n <LinkDialog\n open={linkOpen && !sourceMode}\n onClose={() => setLinkOpen(false)}\n t={t}\n onSubmit={({ url, text }) => {\n withSelection(() => {\n insertLink(editorRef.current, url, text, messagesRef.current);\n });\n }}\n />\n\n <ImageDialog\n open={imageOpen && !sourceMode}\n onClose={() => setImageOpen(false)}\n t={t}\n onSubmitUrl={async ({ url, alt }) => {\n withSelection(() => {\n const img = insertImage(editorRef.current, url, alt, messagesRef.current);\n if (img) {\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n }\n });\n }}\n onSubmitFile={async ({ file, alt }) => {\n const src = await processImageUpload(file, {\n ...uploadOptions,\n onUpload,\n language: lang,\n messages: messagesRef.current,\n });\n withSelection(() => {\n const img = insertImage(editorRef.current, src, alt, messagesRef.current);\n if (img) {\n selectImage(img, editorRef.current, messagesRef.current);\n selectedImageRef.current = img;\n }\n });\n }}\n />\n\n <ImageAltDialog\n open={altOpen && !sourceMode}\n initialAlt={altDraft}\n onClose={() => setAltOpen(false)}\n t={t}\n onSubmit={({ alt }) => {\n const img = selectedImageRef.current;\n if (!img || !editorRef.current?.contains(img)) return;\n updateImageAlt(img, alt, messagesRef.current);\n emitChange(readHtml());\n refreshStates();\n }}\n />\n </div>\n );\n});\n\nexport default TeemEditor;\n"],"names":["stroke","Icon","children","size","jsx","Icons","jsxs","en","mb","fa","ar","locales","RTL_LANGS","resolveLanguage","language","key","getMessages","getDefaultDir","getBlockOptions","t","TEXT_COLORS","BG_COLORS","ToolButton","label","active","disabled","onClick","className","e","Divider","ColorSplitButton","icon","colors","value","onChange","onRememberSelection","allowTransparent","open","setOpen","useState","preview","setPreview","rootRef","useRef","pickingCustomRef","activeColor","underline","useEffect","onDoc","_a","onKey","onWindowFocus","apply","color","close","v","c","Toolbar","states","canUndo","canRedo","onCommand","onBlockChange","onOpenLink","onOpenImage","onUndo","onRedo","sourceMode","onToggleSource","textColor","setTextColor","bgColor","setBgColor","formattingDisabled","blockOptions","opt","Modal","title","onClose","footer","closeLabel","titleId","useId","panelRef","prev","_b","LinkDialog","onSubmit","initialUrl","initialText","url","setUrl","text","setText","error","setError","handleSubmit","trimmed","err","Fragment","ImageDialog","onSubmitUrl","onSubmitFile","accept","tab","setTab","alt","setAlt","busy","setBusy","fileRef","handleUrl","handleFile","file","ImageAltDialog","initialAlt","ALLOWED_TAGS","ALLOWED_ATTR","SAFE_URL_PROTOCOLS","SAFE_IMG_PROTOCOLS","isSafeUrl","forImage","sanitizeStyles","styleValue","allowed","part","colon","prop","sanitizeHtml","dirty","clean","DOMPurify","wrapper","font","span","a","href","img","src","figure","align","_d","_c","btn","el","next","flattenStyleSpans","unwrapElement","parent","styleKeys","keys","i","isStyleSpan","k","root","guard","changed","isSafeHref","isSafeImageSrc","SIGNATURES","buf","DEFAULT_OPTIONS","getExtension","name","sanitizeFileName","readMagicBytes","length","buffer","detectMimeFromBytes","bytes","sig","b","resolveMessages","options","validateImageFile","opts","errors","ext","claimed","detected","fileToDataUrl","mime","resolve","reject","reader","result","comma","processImageUpload","validation","createHistory","limit","stack","index","html","focusEditor","editor","saveSelection","sel","range","restoreSelection","exec","command","queryCommandState","queryCommandValue","getBlockFormat","ensureCssStyled","getSelectedRange","applyInlineStyle","styles","expanded","expandToWord","caret","updateExistingInlineStyle","ok","wrapSelectionWithSpan","node","start","end","candidate","spanRange","selectRange","fragment","tmp","clearHighlight","applyFormat","type","tag","alignContent","changeIndent","getClosestBlock","block","INDENT_STEP_PX","MAX_INDENT_PX","readIndentPx","inline","n","computed","collectBlocksInRange","blocks","seen","push","walker","current","direction","indentListItem","li","list","nested","parentLi","selectedImage","image","alignImage","maybeImg","ensureFigure","selectImage","messages","clearImageSelection","altBtn","currentAlt","updateImageAlt","setDirection","dir","insertLink","anchors","last","safe","insertNode","insertImage","p","getActiveStates","imageAlign","NPM_PACKAGE_URL","normalizeEmpty","stripSelectionClasses","wrap","TeemEditor","forwardRef","defaultValue","placeholder","style","minHeight","noscroll","onUpload","uploadOptions","toolbar","ref","lang","resolvedDir","resolvedPlaceholder","editorRef","historyRef","savedRangeRef","lastHtmlRef","composingRef","selectedImageRef","messagesRef","setStates","setCanUndo","setCanRedo","linkOpen","setLinkOpen","imageOpen","setImageOpen","altOpen","setAltOpen","altDraft","setAltDraft","isEmpty","setIsEmpty","setSourceMode","sourceCode","setSourceCode","syncHistoryFlags","useCallback","emitChange","recordHistory","readHtml","setHtml","initial","refreshStates","onSel","rememberSelection","live","withSelection","fn","handleCommand","handleBlockChange","handleUndo","handleRedo","handleInput","handlePaste","handleKeyDown","mod","openAltEditor","handleEditorMouseDown","target","innerImg","handleEditorDoubleClick","openLink","openImage","toggleSourceMode","handleSourceChange","handleSourceBlur","useImperativeHandle","TEEM_EDITOR_VERSION"],"mappings":"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"}