teem-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teem-editor.js","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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"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "teem-editor",
3
+ "version": "0.1.0",
4
+ "description": "TeemEditor — simple, fast WYSIWYG for React and Next.js with full RTL (Persian, Arabic) and LTR support",
5
+ "license": "MIT",
6
+ "author": "Erfan (https://github.com/erfanatp)",
7
+ "contributors": [
8
+ "Erfan (https://github.com/erfanatp)",
9
+ "Sepehr Pourjozi (https://github.com/133pr)"
10
+ ],
11
+ "homepage": "https://github.com/teemplete/teem-editor#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/teemplete/teem-editor/issues"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/teemplete/teem-editor.git"
18
+ },
19
+ "type": "module",
20
+ "main": "./dist/teem-editor.cjs",
21
+ "module": "./dist/teem-editor.js",
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/teem-editor.js",
27
+ "require": "./dist/teem-editor.cjs"
28
+ },
29
+ "./styles.css": "./dist/teem-editor.css"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "sideEffects": [
37
+ "**/*.css"
38
+ ],
39
+ "scripts": {
40
+ "dev": "vite",
41
+ "build": "vite build && cp src/index.d.ts dist/index.d.ts",
42
+ "prepublishOnly": "npm run build"
43
+ },
44
+ "keywords": [
45
+ "teem-editor",
46
+ "teemeditor",
47
+ "wysiwyg",
48
+ "editor",
49
+ "react",
50
+ "nextjs",
51
+ "rtl",
52
+ "ltr",
53
+ "persian",
54
+ "farsi",
55
+ "arabic",
56
+ "i18n",
57
+ "rich-text",
58
+ "contenteditable",
59
+ "performance"
60
+ ],
61
+ "peerDependencies": {
62
+ "react": ">=17.0.0",
63
+ "react-dom": ">=17.0.0"
64
+ },
65
+ "dependencies": {
66
+ "dompurify": "^3.2.6"
67
+ },
68
+ "devDependencies": {
69
+ "@vitejs/plugin-react": "^4.7.0",
70
+ "react": "^19.1.0",
71
+ "react-dom": "^19.1.0",
72
+ "vite": "^6.3.5"
73
+ }
74
+ }