@overlap/rte 0.1.11 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Icons.tsx","../src/components/Dropdown.tsx","../src/constants.ts","../src/utils/dom.ts","../src/utils/checkbox.ts","../src/hooks/useCheckbox.ts","../src/utils/content.ts","../src/utils/autoLink.ts","../src/utils/listIndent.ts","../src/utils/markdownShortcuts.ts","../src/utils/selection.ts","../src/utils/table.ts","../src/hooks/useEditorEvents.ts","../src/hooks/useEditorInit.ts","../src/components/IconWrapper.tsx","../src/plugins/base.tsx","../src/plugins/blockFormat.tsx","../src/plugins/clearFormatting.tsx","../src/plugins/index.tsx","../src/utils/stateReflection.ts","../src/plugins/colors.tsx","../src/plugins/fontSize.tsx","../src/plugins/image.tsx","../src/utils/clearFormatting.ts","../src/utils/history.ts","../src/utils/sanitize.ts","../src/plugins/alignment.tsx","../src/plugins/linkDialog.tsx","../src/plugins/table.tsx","../src/utils/settings.ts","../src/components/FloatingToolbar.tsx","../src/components/LinkTooltip.tsx","../src/components/Toolbar.tsx","../src/components/Editor.tsx","../src/plugins/headings.tsx","../src/plugins/optional.tsx"],"sourcesContent":["import React from \"react\";\n\ninterface IconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport const BoldIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nexport const ItalicIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\" />\n </svg>\n);\n\nexport const UnderlineIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n </svg>\n);\n\nexport const UndoIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n </svg>\n);\n\nexport const RedoIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n </svg>\n);\n\nexport const ClearFormattingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M6 5v3h5v11h2V8h5V5H6z\" />\n <path d=\"M20.5 3.5L3.5 20.5l1.06 1.06L21.56 4.56z\" />\n </svg>\n);\n\nexport const LinkIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\" />\n </svg>\n);\n\nexport const QuoteIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </svg>\n);\n\nexport const BulletListIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\" />\n </svg>\n);\n\nexport const NumberedListIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 11.9V11H2zm6-5v2h14V6H8zm0 14h14v-2H8v2zm0-6h14v-2H8v2z\" />\n </svg>\n);\n\nexport const TextColorIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 20h20v4H2v-4zm3.49-3h2.42l1.27-3.58h5.64L16.09 17h2.42L13.25 3h-2.5L5.49 17zm4.22-5.61l2.03-5.79h.12l2.03 5.79H9.71z\" />\n </svg>\n);\n\nexport const BackgroundColorIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n {/* Pinsel */}\n <path d=\"M14.5 2.5L21.5 9.5L13 18L6 11L14.5 2.5Z\" />\n <path d=\"M6 11L13 18\" />\n {/* Hintergrund-Farbbereich */}\n <rect\n x=\"2\"\n y=\"16\"\n width=\"8\"\n height=\"6\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n rx=\"1\"\n />\n {/* Pinselspitze */}\n <path d=\"M21.5 9.5L19 7\" />\n </svg>\n);\n\nexport const HeadingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M5 4v3h5.5v12h3V7H19V4H5z\" />\n </svg>\n);\n\nexport const FormatIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n {/* Paragraph symbol */}\n <path d=\"M3 4h18v2H3V4zm0 4h12v2H3V8zm0 4h18v2H3v-2zm0 4h12v2H3v-2z\" />\n </svg>\n);\n\nexport const FontSizeIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v8h3v-8h3V10H3z\" />\n </svg>\n);\n\nexport const ImageIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\" />\n </svg>\n);\n\nexport const CloseIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport const LoadingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\n </svg>\n);\n\nexport const UploadIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" />\n </svg>\n);\n\nexport const IndentIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zM3 8l4 4-4 4V8zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n </svg>\n);\n\nexport const OutdentIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zM11 8l4 4-4 4V8zM3 3v2h18V3H3zm0 4h10v2H3V7zm0 4h10v2H3v-2zm0 4h18v2H3v-2z\" />\n </svg>\n);\n\nexport const CheckboxIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 3H5c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n </svg>\n);\n\nexport const StrikethroughIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n </svg>\n);\n\nexport const SubscriptIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M22 18h-2v1h3v1h-4v-2.5c0-.83.67-1.5 1.5-1.5h1.5v-1h-3v-1h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 18h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 4h-2.68l-3.07 4.99h-.12L8.87 4H6.19l4.32 6.73L5.88 18z\" />\n </svg>\n);\n\nexport const SuperscriptIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M22 7h-2v1h3v1h-4V6.5c0-.83.67-1.5 1.5-1.5h1.5V4h-3V3h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 20h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 6h-2.68l-3.07 4.99h-.12L8.87 6H6.19l4.32 6.73L5.88 20z\" />\n </svg>\n);\n\nexport const CodeIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\" />\n </svg>\n);\n\nexport const AlignLeftIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignCenterIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignRightIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignJustifyIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\" />\n </svg>\n);\n\nexport const TableIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 3v18h18V3H3zm8 16H5v-6h6v6zm0-8H5V5h6v6zm8 8h-6v-6h6v6zm0-8h-6V5h6v6z\" />\n </svg>\n);\n\nexport const HorizontalRuleIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 12h20v2H2z\" />\n </svg>\n);\n\nexport const OpenInNewIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 19H5V5h7V3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\" />\n </svg>\n);\n\nexport const ContentCopyIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </svg>\n);\n\nconst iconMap: Record<string, React.FC<IconProps>> = {\n \"mdi:format-bold\": BoldIcon,\n \"mdi:format-italic\": ItalicIcon,\n \"mdi:format-underline\": UnderlineIcon,\n \"mdi:undo\": UndoIcon,\n \"mdi:redo\": RedoIcon,\n \"mdi:format-clear\": ClearFormattingIcon,\n \"mdi:link\": LinkIcon,\n \"mdi:format-quote-close\": QuoteIcon,\n \"mdi:format-list-bulleted\": BulletListIcon,\n \"mdi:format-list-numbered\": NumberedListIcon,\n \"mdi:format-color-text\": TextColorIcon,\n \"mdi:format-color-fill\": BackgroundColorIcon,\n \"mdi:format-header-1\": HeadingIcon,\n \"mdi:format-paragraph\": FormatIcon,\n \"mdi:format-size\": FontSizeIcon,\n \"mdi:image\": ImageIcon,\n \"mdi:close\": CloseIcon,\n \"mdi:loading\": LoadingIcon,\n \"mdi:upload\": UploadIcon,\n \"mdi:format-indent-increase\": IndentIcon,\n \"mdi:format-indent-decrease\": OutdentIcon,\n \"mdi:checkbox-marked-outline\": CheckboxIcon,\n \"mdi:format-strikethrough\": StrikethroughIcon,\n \"mdi:format-subscript\": SubscriptIcon,\n \"mdi:format-superscript\": SuperscriptIcon,\n \"mdi:code-tags\": CodeIcon,\n \"mdi:format-align-left\": AlignLeftIcon,\n \"mdi:format-align-center\": AlignCenterIcon,\n \"mdi:format-align-right\": AlignRightIcon,\n \"mdi:format-align-justify\": AlignJustifyIcon,\n \"mdi:table\": TableIcon,\n \"mdi:minus\": HorizontalRuleIcon,\n \"mdi:open-in-new\": OpenInNewIcon,\n \"mdi:content-copy\": ContentCopyIcon,\n};\n\nexport const Icon: React.FC<{\n icon: string;\n width?: number;\n height?: number;\n className?: string;\n}> = ({ icon, width = 18, height = 18, className }) => {\n const IconComponent = iconMap[icon];\n if (!IconComponent) {\n return <span style={{ width, height, display: \"inline-block\" }} />;\n }\n return (\n <IconComponent width={width} height={height} className={className} />\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Icon } from './Icons';\n\ninterface DropdownProps {\n icon: string;\n label: string;\n options: Array<{ value: string; label: string; icon?: string; color?: string; preview?: string; headingPreview?: string }>;\n onSelect: (value: string) => void;\n currentValue?: string;\n disabled?: boolean;\n showCustomColorInput?: boolean;\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n icon,\n label,\n options,\n onSelect,\n currentValue,\n disabled,\n showCustomColorInput,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [customColor, setCustomColor] = useState(\"#000000\");\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n const handleSelect = (value: string) => {\n onSelect(value);\n setIsOpen(false);\n };\n\n const currentOption = options.find(opt => opt.value === currentValue);\n\n return (\n <div className=\"rte-dropdown\" ref={dropdownRef} onMouseDown={(e) => e.preventDefault()}>\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`rte-toolbar-button rte-dropdown-button ${currentOption ? 'rte-dropdown-button-has-value' : ''}`}\n title={label}\n aria-label={label}\n >\n <Icon icon={icon} width={18} height={18} />\n {currentOption && (\n <span className=\"rte-dropdown-value\">{currentOption.label}</span>\n )}\n </button>\n {isOpen && (\n <div className=\"rte-dropdown-menu\">\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className={`rte-dropdown-item ${currentValue === option.value ? 'rte-dropdown-item-active' : ''}`}\n onClick={() => handleSelect(option.value)}\n >\n {option.color && (\n <span \n className={`rte-dropdown-color-preview ${currentValue === option.value ? 'active' : ''}`}\n style={{ backgroundColor: option.color }}\n />\n )}\n {option.preview && !option.headingPreview && (\n <span \n className=\"rte-dropdown-fontsize-preview\"\n style={{ fontSize: `${option.preview}px` }}\n >\n Aa\n </span>\n )}\n {option.headingPreview && (\n <span \n className={`rte-dropdown-heading-preview ${option.headingPreview}`}\n >\n {option.headingPreview === 'p' ? 'Normal' : option.headingPreview.toUpperCase()}\n </span>\n )}\n {option.icon && <Icon icon={option.icon} width={16} height={16} />}\n <span style={{ flex: 1, fontWeight: currentValue === option.value ? 600 : 400 }}>\n {option.label}\n </span>\n </button>\n ))}\n {showCustomColorInput && (\n <div\n className=\"rte-color-custom-input\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <input\n type=\"color\"\n value={customColor}\n onChange={(e) => setCustomColor(e.target.value)}\n title=\"Pick a color\"\n />\n <input\n type=\"text\"\n value={customColor}\n onChange={(e) => {\n const v = e.target.value;\n setCustomColor(v);\n }}\n placeholder=\"#000000\"\n maxLength={7}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (/^#[0-9a-fA-F]{3,6}$/.test(customColor)) {\n handleSelect(customColor);\n }\n }\n }}\n />\n <button\n type=\"button\"\n className=\"rte-color-custom-apply\"\n onClick={() => {\n if (/^#[0-9a-fA-F]{3,6}$/.test(customColor)) {\n handleSelect(customColor);\n }\n }}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\n","/** Debounce time for pushing to history after input (ms) */\nexport const HISTORY_DEBOUNCE_MS = 300;\n\n/** Width of the clickable checkbox area in pixels */\nexport const CHECKBOX_CLICK_ZONE_PX = 40;\n\n/** Maximum nesting depth for lists */\nexport const MAX_LIST_DEPTH = 6;\n\n/** Maximum number of history entries */\nexport const MAX_HISTORY_SIZE = 50;\n","/**\n * Pure DOM utility functions.\n * No React dependencies - only native browser APIs.\n */\n\n/**\n * Checks if a UL element is a checkbox list.\n * Detects: own format, Lexical format, and GitHub format.\n */\nexport function isCheckboxList(element: HTMLElement): boolean {\n if (element.tagName !== \"UL\") return false;\n // Own format\n if (element.classList.contains(\"rte-checkbox-list\")) return true;\n // Lexical format (attribute)\n if (element.getAttribute(\"__lexicallisttype\") === \"check\") return true;\n // Lexical theme class (any class containing \"checklist\")\n const hasChecklistClass = Array.from(element.classList).some((cls) =>\n cls.toLowerCase().includes(\"checklist\")\n );\n if (hasChecklistClass) return true;\n // GitHub format\n if (element.classList.contains(\"contains-task-list\")) return true;\n return false;\n}\n\n/**\n * Finds the closest checkbox list ancestor from an element.\n * Works with all supported formats (own, Lexical, GitHub).\n */\nexport function findClosestCheckboxList(\n element: HTMLElement\n): HTMLElement | null {\n let current: HTMLElement | null = element;\n while (current) {\n if (current.tagName === \"UL\" && isCheckboxList(current)) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\n/**\n * Checks if a list item has a nested list as its first child (not a leaf item).\n */\nexport function isNestedListItem(li: HTMLElement): boolean {\n const firstChild = li.firstChild;\n return (\n firstChild instanceof HTMLElement &&\n (firstChild.tagName === \"UL\" || firstChild.tagName === \"OL\")\n );\n}\n\n/**\n * Finds the closest list item from a node.\n */\nexport function findClosestListItem(node: Node): HTMLLIElement | null {\n const element =\n node.nodeType === Node.TEXT_NODE\n ? node.parentElement\n : (node as HTMLElement);\n return (element?.closest(\"li\") as HTMLLIElement) || null;\n}\n\n/**\n * Gets the HTMLElement from a selection range container.\n */\nexport function getElementFromContainer(\n container: Node\n): HTMLElement | null {\n return container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n}\n\n/**\n * Sets cursor position in a text node after an async DOM update.\n */\nexport function setCursorInTextNode(\n textNode: Text,\n position: number,\n editor?: HTMLElement\n): void {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n const range = document.createRange();\n const maxPos = textNode.textContent?.length || 0;\n const safePos = Math.min(Math.max(0, position), maxPos);\n range.setStart(textNode, safePos);\n range.collapse(true);\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n if (editor) editor.focus();\n }\n } catch (_) {\n // Silently fail - cursor positioning is best-effort\n }\n });\n });\n}\n","/**\n * Pure checkbox utility functions for checkbox lists.\n * Supports detection of own format, Lexical format, and GitHub format.\n * No React dependencies.\n */\n\nimport { isCheckboxList, isNestedListItem } from \"./dom\";\n\n/**\n * Updates a list item's checkbox attributes (role, aria-checked, tabindex).\n */\nexport function updateListItemChecked(\n li: HTMLLIElement,\n checked: boolean\n): void {\n const parent = li.parentElement;\n if (\n !parent ||\n parent.tagName !== \"UL\" ||\n !isCheckboxList(parent) ||\n isNestedListItem(li)\n ) {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n return;\n }\n li.setAttribute(\"role\", \"checkbox\");\n li.setAttribute(\"tabIndex\", \"-1\");\n li.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n}\n\n/**\n * Toggles the checked state of a checkbox list item.\n */\nexport function toggleListItemChecked(li: HTMLLIElement): void {\n const currentChecked = li.getAttribute(\"aria-checked\") === \"true\";\n li.setAttribute(\"aria-checked\", currentChecked ? \"false\" : \"true\");\n if (li.getAttribute(\"role\") !== \"checkbox\") {\n li.setAttribute(\"role\", \"checkbox\");\n li.setAttribute(\"tabIndex\", \"-1\");\n }\n}\n\n/**\n * Ensures all checkbox list items in the editor have correct attributes.\n * Normalizes foreign formats (Lexical, GitHub) to internal format.\n */\nexport function ensureAllCheckboxes(editor: HTMLElement): void {\n const allULs = editor.querySelectorAll(\"ul\");\n allULs.forEach((ul) => {\n if (!isCheckboxList(ul)) return;\n\n // Normalize: ensure our class is always present\n if (!ul.classList.contains(\"rte-checkbox-list\")) {\n ul.classList.add(\"rte-checkbox-list\");\n }\n\n // Handle GitHub format: convert <input type=\"checkbox\"> to aria-checked\n ul.querySelectorAll(\":scope > li\").forEach((li) => {\n const input = li.querySelector(\n 'input[type=\"checkbox\"]'\n ) as HTMLInputElement | null;\n if (input) {\n const checked =\n input.checked || input.hasAttribute(\"checked\");\n if (li.getAttribute(\"aria-checked\") === null) {\n (li as HTMLLIElement).setAttribute(\n \"aria-checked\",\n checked ? \"true\" : \"false\"\n );\n }\n input.remove();\n }\n });\n\n const listItems = ul.querySelectorAll(\":scope > li\");\n listItems.forEach((li) => {\n const htmlLi = li as HTMLLIElement;\n if (!isNestedListItem(htmlLi)) {\n const ariaChecked = htmlLi.getAttribute(\"aria-checked\");\n const checked = ariaChecked === \"true\";\n updateListItemChecked(htmlLi, checked);\n } else {\n htmlLi.removeAttribute(\"role\");\n htmlLi.removeAttribute(\"tabIndex\");\n htmlLi.removeAttribute(\"aria-checked\");\n }\n });\n });\n}\n\n/**\n * Returns the currently focused checkbox list item, or null.\n */\nexport function getActiveCheckListItem(): HTMLElement | null {\n const activeElement = document.activeElement;\n if (\n activeElement &&\n activeElement.tagName === \"LI\" &&\n activeElement.parentElement &&\n isCheckboxList(activeElement.parentElement)\n ) {\n return activeElement as HTMLElement;\n }\n return null;\n}\n\n/**\n * Finds the next or previous checkbox list item sibling.\n */\nexport function findCheckListItemSibling(\n li: HTMLLIElement,\n backward: boolean\n): HTMLLIElement | null {\n let sibling = backward\n ? (li.previousElementSibling as HTMLLIElement)\n : (li.nextElementSibling as HTMLLIElement);\n let parent: HTMLLIElement | null = li;\n\n // Walk up the tree to find a non-null sibling\n while (sibling == null && parent) {\n const parentList = parent.parentElement;\n if (parentList && parentList.tagName === \"UL\") {\n const grandParent = parentList.parentElement;\n if (grandParent && grandParent.tagName === \"LI\") {\n parent = grandParent as HTMLLIElement;\n sibling = backward\n ? (parent.previousElementSibling as HTMLLIElement)\n : (parent.nextElementSibling as HTMLLIElement);\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n // Walk down the tree to find the first non-nested list item\n while (sibling && sibling.tagName === \"LI\") {\n const child = backward\n ? sibling.lastElementChild\n : sibling.firstElementChild;\n if (\n child &&\n (child.tagName === \"UL\" || child.tagName === \"OL\")\n ) {\n sibling = backward\n ? (child.lastElementChild as HTMLLIElement)\n : (child.firstElementChild as HTMLLIElement);\n } else {\n return sibling;\n }\n }\n\n return null;\n}\n","import { useCallback, useEffect } from \"react\";\nimport { CHECKBOX_CLICK_ZONE_PX } from \"../constants\";\nimport { EditorContent } from \"../types\";\nimport {\n ensureAllCheckboxes,\n findCheckListItemSibling,\n getActiveCheckListItem,\n toggleListItemChecked,\n updateListItemChecked,\n} from \"../utils/checkbox\";\nimport {\n findClosestCheckboxList,\n findClosestListItem,\n isCheckboxList,\n isNestedListItem,\n setCursorInTextNode,\n} from \"../utils/dom\";\n\ninterface UseCheckboxOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n isUpdatingRef: { current: boolean };\n pushToHistory: (content: EditorContent) => void;\n notifyChange: (content: EditorContent) => void;\n getDomContent: () => EditorContent;\n}\n\n/**\n * Hook that manages all checkbox list interactions.\n * Consolidates click handling, keyboard navigation, and checkbox insertion.\n * Uses event delegation (single listener on editor root) for all checkbox events.\n */\nexport function useCheckbox({\n editorRef,\n isUpdatingRef,\n pushToHistory,\n notifyChange,\n getDomContent,\n}: UseCheckboxOptions) {\n // --- Event Listeners (click + pointerdown) ---\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n const handleClick = (event: Event): void => {\n const clickTarget = event.target;\n if (!(clickTarget instanceof HTMLElement)) return;\n\n const listItem =\n clickTarget.tagName === \"LI\"\n ? (clickTarget as HTMLLIElement)\n : (clickTarget.closest(\"li\") as HTMLLIElement);\n if (!listItem) return;\n\n const parentNode = listItem.parentElement;\n if (!parentNode || !isCheckboxList(parentNode)) return;\n if (listItem.getAttribute(\"role\") !== \"checkbox\") return;\n if (isNestedListItem(listItem)) return;\n\n const rect = listItem.getBoundingClientRect();\n const clientX = (event as MouseEvent).clientX;\n const isInCheckboxArea =\n listItem.dir === \"rtl\"\n ? clientX >= rect.right - CHECKBOX_CLICK_ZONE_PX\n : clientX <= rect.left + CHECKBOX_CLICK_ZONE_PX;\n\n if (isInCheckboxArea) {\n event.preventDefault();\n event.stopPropagation();\n toggleListItemChecked(listItem);\n // Trigger change event\n const changeEvent = new Event(\"input\", { bubbles: true });\n editor.dispatchEvent(changeEvent);\n }\n };\n\n const handlePointerDown = (event: PointerEvent): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n const listItem =\n target.tagName === \"LI\"\n ? target\n : target.closest(\"li\");\n if (!listItem) return;\n if (isNestedListItem(listItem)) return;\n\n const parentNode = listItem.parentElement;\n if (!parentNode || !isCheckboxList(parentNode)) return;\n\n const rect = listItem.getBoundingClientRect();\n const clientX = event.clientX;\n const isInCheckboxArea =\n listItem.dir === \"rtl\"\n ? clientX >= rect.right - CHECKBOX_CLICK_ZONE_PX\n : clientX <= rect.left + CHECKBOX_CLICK_ZONE_PX;\n\n if (isInCheckboxArea) {\n event.preventDefault();\n }\n };\n\n editor.addEventListener(\"click\", handleClick, true);\n editor.addEventListener(\n \"pointerdown\",\n handlePointerDown as EventListener,\n true\n );\n\n return () => {\n editor.removeEventListener(\"click\", handleClick, true);\n editor.removeEventListener(\n \"pointerdown\",\n handlePointerDown as EventListener,\n true\n );\n };\n }, [editorRef]);\n\n // --- Keyboard handlers (called from useEditorEvents) ---\n\n /**\n * Handles checkbox-specific keyboard events.\n * Returns true if the event was handled and should not propagate.\n */\n const handleCheckboxKeyDown = useCallback(\n (e: KeyboardEvent): boolean => {\n // Arrow up/down: navigate between checkbox items\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n const backward = e.key === \"ArrowUp\";\n const nextItem = findCheckListItemSibling(\n activeItem as HTMLLIElement,\n backward\n );\n if (nextItem) {\n e.preventDefault();\n nextItem.focus();\n return true;\n }\n }\n }\n\n // Space: toggle checkbox\n if (e.key === \" \") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n e.preventDefault();\n toggleListItemChecked(activeItem as HTMLLIElement);\n const editorEl = activeItem.closest(\".rte-editor\");\n if (editorEl) {\n editorEl.dispatchEvent(\n new Event(\"input\", { bubbles: true })\n );\n }\n return true;\n }\n }\n\n // Escape: blur from checkbox item\n if (e.key === \"Escape\") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n const editorEl = activeItem.closest(\".rte-editor\");\n if (editorEl instanceof HTMLElement) {\n editorEl.focus();\n }\n return true;\n }\n }\n\n // Arrow left: focus list item when cursor is at the start\n if (e.key === \"ArrowLeft\") {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = findClosestListItem(container);\n if (!listItem) return false;\n\n const parent = listItem.parentElement;\n if (\n parent &&\n isCheckboxList(parent) &&\n range.collapsed &&\n range.startOffset === 0\n ) {\n if (document.activeElement !== listItem) {\n listItem.focus();\n e.preventDefault();\n return true;\n }\n }\n }\n\n return false;\n },\n []\n );\n\n /**\n * Handles Enter key in checkbox lists.\n * Creates a new unchecked item after the current one.\n * Returns true if the event was handled.\n */\n const handleCheckboxEnter = useCallback(\n (e: KeyboardEvent): boolean => {\n if (e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = findClosestListItem(container);\n if (!listItem) return false;\n\n const checkboxList = findClosestCheckboxList(listItem);\n if (!checkboxList) return false;\n\n e.preventDefault();\n\n const editor = editorRef.current;\n\n // If the current item is empty, break out of the list\n const itemText = (listItem.textContent || \"\").trim();\n if (itemText === \"\" || itemText === \"\\u200B\") {\n // Remove the empty list item\n checkboxList.removeChild(listItem);\n\n // If the list is now empty, remove it entirely\n if (checkboxList.children.length === 0) {\n const p = document.createElement(\"p\");\n const br = document.createElement(\"br\");\n p.appendChild(br);\n checkboxList.parentNode?.replaceChild(p, checkboxList);\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n } else {\n // Insert a <p> after the list and place cursor there\n const p = document.createElement(\"p\");\n const br = document.createElement(\"br\");\n p.appendChild(br);\n checkboxList.parentNode?.insertBefore(\n p,\n checkboxList.nextSibling,\n );\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n\n if (editor) {\n const content = getDomContent();\n pushToHistory(content);\n notifyChange(content);\n }\n return true;\n }\n\n // Normal case: create a new checkbox item\n const newLi = document.createElement(\"li\");\n updateListItemChecked(newLi, false);\n const textNode = document.createTextNode(\" \");\n newLi.appendChild(textNode);\n\n if (listItem.nextSibling) {\n checkboxList.insertBefore(newLi, listItem.nextSibling);\n } else {\n checkboxList.appendChild(newLi);\n }\n\n if (editor) ensureAllCheckboxes(editor);\n\n const newRange = document.createRange();\n newRange.setStart(textNode, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n if (editor) {\n const content = getDomContent();\n pushToHistory(content);\n notifyChange(content);\n }\n\n return true;\n },\n [editorRef, getDomContent, pushToHistory, notifyChange],\n );\n\n /**\n * Inserts a new checkbox list at the current cursor position,\n * or removes it if already inside one.\n * Returns true on success.\n */\n const insertCheckboxList = useCallback(\n (editor: HTMLElement): boolean => {\n isUpdatingRef.current = true;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n isUpdatingRef.current = false;\n return false;\n }\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) {\n isUpdatingRef.current = false;\n return false;\n }\n\n // Already in a checkbox list? Remove it.\n const existingList = findClosestCheckboxList(element);\n if (existingList) {\n existingList.classList.remove(\"rte-checkbox-list\");\n existingList\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n isUpdatingRef.current = false;\n return true;\n }\n\n // Create new checkbox list\n const ul = document.createElement(\"ul\");\n ul.classList.add(\"rte-checkbox-list\");\n\n const li = document.createElement(\"li\");\n updateListItemChecked(li, false);\n const textNode = document.createTextNode(\" \");\n li.appendChild(textNode);\n ul.appendChild(li);\n\n // Find block element to replace\n const blockElement = element.closest(\n \"p, div, h1, h2, h3, h4, h5, h6, blockquote\"\n );\n const isValidBlockElement =\n blockElement &&\n blockElement !== editor &&\n editor.contains(blockElement) &&\n blockElement.parentElement;\n\n if (isValidBlockElement) {\n const textContent = blockElement.textContent || \"\";\n blockElement.parentElement!.replaceChild(ul, blockElement);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n finalTextNode.textContent = textContent || \" \";\n const cursorPos = textContent ? textContent.length : 0;\n setCursorInTextNode(finalTextNode, cursorPos, editor);\n }\n } else {\n try {\n range.deleteContents();\n range.insertNode(ul);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n setCursorInTextNode(finalTextNode, 0, editor);\n }\n } catch (_) {\n editor.appendChild(ul);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n setCursorInTextNode(finalTextNode, 0, editor);\n }\n }\n }\n\n // After insertion: ensure attributes and save to history\n setTimeout(() => {\n if (!editor) return;\n ensureAllCheckboxes(editor);\n const content = getDomContent();\n pushToHistory(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n }, 100);\n\n return true;\n },\n [isUpdatingRef, getDomContent, pushToHistory, notifyChange]\n );\n\n return {\n ensureAllCheckboxes,\n insertCheckboxList,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n updateListItemChecked,\n };\n}\n","import React from \"react\";\nimport { EditorContent, EditorNode } from \"../types\";\nimport { ensureAllCheckboxes } from \"./checkbox\";\nimport { isCheckboxList } from \"./dom\";\n\n/**\n * Converts a DOM element (editor root) to EditorContent JSON.\n * Supports own format, Lexical HTML, and GitHub HTML.\n */\nexport function domToContent(element: HTMLElement): EditorContent {\n const blocks: EditorNode[] = [];\n\n // Normalize all checkbox lists before conversion\n ensureAllCheckboxes(element);\n\n function processNode(node: Node): EditorNode | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent;\n if (text === null || text === undefined) return null;\n\n // In checkbox lists, skip whitespace-only text nodes\n // if the LI has other meaningful text\n const isOnlyWhitespace = /^[\\s\\u200B]*$/.test(text);\n const isInCheckboxList =\n node.parentElement?.closest(\"ul.rte-checkbox-list\") !== null;\n\n if (isOnlyWhitespace && isInCheckboxList) {\n const li = node.parentElement?.closest(\"li\");\n if (li) {\n const allText = li.textContent || \"\";\n const textWithoutWhitespace = allText.replace(\n /[\\s\\u200B]/g,\n \"\"\n );\n if (textWithoutWhitespace.length > 0) {\n return null;\n }\n }\n }\n\n return { type: \"text\", text };\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n\n // Skip checkbox input elements (GitHub format remnants)\n if (tagName === \"input\" && el.getAttribute(\"type\") === \"checkbox\") {\n return null;\n }\n\n // Handle <br> as empty text\n if (tagName === \"br\") {\n return null;\n }\n\n if (tagName === \"img\") {\n const attributes: Record<string, string> = {};\n const src = el.getAttribute(\"src\");\n const alt = el.getAttribute(\"alt\");\n const attachmentId = el.getAttribute(\"data-attachment-id\");\n if (src) attributes.src = src;\n if (alt) attributes.alt = alt;\n if (attachmentId) attributes[\"data-attachment-id\"] = attachmentId;\n return {\n type: \"image\",\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Table elements\n if (\n [\"table\", \"thead\", \"tbody\", \"tr\", \"td\", \"th\"].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n const attributes: Record<string, string> = {};\n\n // Preserve class\n const cls = el.getAttribute(\"class\");\n if (cls) attributes.class = cls;\n\n // Table cell attributes\n if (tagName === \"td\" || tagName === \"th\") {\n const colspan = el.getAttribute(\"colspan\");\n const rowspan = el.getAttribute(\"rowspan\");\n if (colspan && colspan !== \"1\") attributes.colspan = colspan;\n if (rowspan && rowspan !== \"1\") attributes.rowspan = rowspan;\n // Preserve text-align on cells\n const textAlign = el.style.textAlign;\n if (textAlign && textAlign !== \"left\" && textAlign !== \"start\") {\n attributes.textAlign = textAlign;\n }\n // Preserve background-color\n const bgColor = el.style.backgroundColor;\n if (bgColor) attributes.backgroundColor = bgColor;\n }\n\n Array.from(el.childNodes).forEach((child) => {\n const processed = processNode(child);\n if (processed) children.push(processed);\n });\n\n return {\n type: tagName,\n children: children.length > 0 ? children : [],\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Block elements\n if (\n [\n \"p\",\n \"div\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"li\",\n ].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n const attributes: Record<string, string> = {};\n\n // Preserve text-align on block elements\n const textAlign = el.style.textAlign;\n if (textAlign && textAlign !== \"left\" && textAlign !== \"start\" && textAlign !== \"\") {\n attributes.textAlign = textAlign;\n }\n\n // Detect checkbox lists (own + Lexical + GitHub formats)\n if (tagName === \"ul\" && isCheckboxList(el)) {\n attributes.class = \"rte-checkbox-list\";\n }\n\n // Detect checkbox list items via aria-checked\n if (tagName === \"li\") {\n const parentUl = el.closest(\"ul\");\n if (\n parentUl &&\n isCheckboxList(parentUl) &&\n el.getAttribute(\"role\") === \"checkbox\"\n ) {\n const ariaChecked = el.getAttribute(\"aria-checked\");\n if (ariaChecked !== null) {\n attributes.checkboxChecked = ariaChecked;\n }\n }\n }\n\n // Process children recursively\n Array.from(el.childNodes).forEach((child) => {\n // Skip checkbox input nodes\n if (\n child.nodeType === Node.ELEMENT_NODE &&\n (child as HTMLElement).tagName.toLowerCase() === \"input\" &&\n (child as HTMLElement).getAttribute(\"type\") === \"checkbox\"\n ) {\n return;\n }\n\n const processed = processNode(child);\n if (processed) {\n children.push(processed);\n }\n });\n\n return {\n type: tagName,\n children: children.length > 0 ? children : [],\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Inline elements\n if (\n [\n \"strong\",\n \"b\",\n \"em\",\n \"i\",\n \"u\",\n \"s\",\n \"del\",\n \"strike\",\n \"a\",\n \"span\",\n \"sub\",\n \"sup\",\n \"code\",\n ].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n Array.from(el.childNodes).forEach((child) => {\n const processed = processNode(child);\n if (processed) children.push(processed);\n });\n\n const attributes: Record<string, string> = {};\n Array.from(el.attributes).forEach((attr) => {\n attributes[attr.name] = attr.value;\n });\n\n // Links — capture all relevant attributes\n if (tagName === \"a\") {\n const linkAttrs: Record<string, string> = {};\n const href = el.getAttribute(\"href\");\n if (href) linkAttrs.href = href;\n const target = el.getAttribute(\"target\");\n if (target) linkAttrs.target = target;\n const rel = el.getAttribute(\"rel\");\n if (rel) linkAttrs.rel = rel;\n const title = el.getAttribute(\"title\");\n if (title) linkAttrs.title = title;\n const pageRef = el.getAttribute(\"data-page-ref\");\n if (pageRef) linkAttrs[\"data-page-ref\"] = pageRef;\n const urlExtra = el.getAttribute(\"data-url-extra\");\n if (urlExtra) linkAttrs[\"data-url-extra\"] = urlExtra;\n return {\n type: \"link\",\n children: children.length > 0 ? children : undefined,\n attributes:\n Object.keys(linkAttrs).length > 0\n ? linkAttrs\n : undefined,\n };\n }\n\n // Spans: handle Lexical's white-space: pre-wrap wrapper\n if (tagName === \"span\") {\n const style = el.getAttribute(\"style\") || \"\";\n const hasSemanticStyle =\n style.includes(\"font-size\") ||\n style.includes(\"color\") ||\n style.includes(\"background-color\");\n\n // Transparent wrapper (e.g. Lexical's <span style=\"white-space: pre-wrap;\">)\n // Return text content directly\n if (!hasSemanticStyle) {\n if (\n el.childNodes.length === 1 &&\n el.firstChild?.nodeType === Node.TEXT_NODE\n ) {\n return {\n type: \"text\",\n text: el.firstChild.textContent || \"\",\n };\n }\n // Multiple children: flatten (return each child as-is)\n if (children.length === 1) {\n return children[0];\n }\n // If multiple children, keep as span but without extra attributes\n if (children.length > 1) {\n return {\n type: \"span\",\n children,\n };\n }\n return null;\n }\n\n // Semantic span: extract meaningful style properties\n if (style) {\n style.split(\";\").forEach((rule) => {\n const [key, value] = rule\n .split(\":\")\n .map((s) => s.trim());\n if (key && value) {\n if (key === \"font-size\") {\n attributes.fontSize = value;\n } else if (key === \"color\") {\n attributes.color = value;\n } else if (key === \"background-color\") {\n attributes.backgroundColor = value;\n }\n }\n });\n }\n }\n\n // Map tag names to semantic types\n const type =\n tagName === \"strong\" || tagName === \"b\"\n ? \"bold\"\n : tagName === \"em\" || tagName === \"i\"\n ? \"italic\"\n : tagName === \"u\"\n ? \"underline\"\n : tagName === \"s\" ||\n tagName === \"del\" ||\n tagName === \"strike\"\n ? \"strikethrough\"\n : tagName === \"sub\"\n ? \"subscript\"\n : tagName === \"sup\"\n ? \"superscript\"\n : tagName === \"code\"\n ? \"code\"\n : tagName;\n\n return {\n type,\n children: children.length > 0 ? children : undefined,\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n return null;\n }\n\n // Process all child nodes of the editor element\n Array.from(element.childNodes).forEach((node) => {\n const processed = processNode(node);\n if (processed) {\n // Wrap bare text nodes in a paragraph\n if (processed.type === \"text\") {\n blocks.push({ type: \"p\", children: [processed] });\n } else {\n blocks.push(processed);\n }\n }\n });\n\n if (blocks.length === 0) {\n blocks.push({ type: \"p\", children: [] });\n }\n\n return { blocks };\n}\n\n/**\n * Converts EditorContent JSON to DOM and appends to the container.\n */\nexport function contentToDOM(\n content: EditorContent,\n container: HTMLElement,\n customLinkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n [key: string]: unknown;\n }>,\n customHeadingRenderer?: (\n level: string,\n children: React.ReactNode\n ) => React.ReactNode\n): void {\n container.innerHTML = \"\";\n\n function createNode(node: EditorNode): Node {\n if (node.type === \"text\" && node.text !== undefined) {\n return document.createTextNode(node.text);\n }\n\n if (node.type === \"image\") {\n const img = document.createElement(\"img\");\n if (node.attributes) {\n if (node.attributes.src)\n img.setAttribute(\"src\", node.attributes.src);\n if (node.attributes.alt)\n img.setAttribute(\"alt\", node.attributes.alt);\n if (node.attributes.uploading === \"true\") {\n img.setAttribute(\"data-uploading\", \"true\");\n }\n }\n img.className = \"rte-image\";\n return img;\n }\n\n const tagMap: Record<string, string> = {\n bold: \"strong\",\n italic: \"em\",\n underline: \"u\",\n strikethrough: \"s\",\n link: \"a\",\n subscript: \"sub\",\n superscript: \"sup\",\n code: \"code\",\n };\n\n let tagName = tagMap[node.type] || node.type;\n\n if (node.type === \"link\" && customLinkComponent) {\n tagName = \"a\";\n if (node.attributes) {\n node.attributes[\"data-custom-link\"] = \"true\";\n }\n }\n\n const element = document.createElement(tagName);\n\n if (node.attributes) {\n Object.entries(node.attributes).forEach(([key, value]) => {\n if (key === \"fontSize\") {\n element.style.fontSize = value;\n } else if (key === \"color\") {\n element.style.color = value;\n } else if (key === \"backgroundColor\") {\n element.style.backgroundColor = value;\n } else if (key === \"textAlign\") {\n element.style.textAlign = value;\n } else if (key === \"href\" && tagName === \"a\") {\n element.setAttribute(\"href\", value);\n } else if (key === \"target\" && tagName === \"a\") {\n element.setAttribute(\"target\", value);\n } else if (key === \"rel\" && tagName === \"a\") {\n element.setAttribute(\"rel\", value);\n } else if (key === \"title\" && tagName === \"a\") {\n element.setAttribute(\"title\", value);\n } else if (key === \"data-page-ref\" && tagName === \"a\") {\n element.setAttribute(\"data-page-ref\", value);\n } else if (key === \"data-url-extra\" && tagName === \"a\") {\n element.setAttribute(\"data-url-extra\", value);\n } else if (key === \"data-attachment-id\") {\n element.setAttribute(\"data-attachment-id\", value);\n } else if (key === \"colspan\") {\n element.setAttribute(\"colspan\", value);\n } else if (key === \"rowspan\") {\n element.setAttribute(\"rowspan\", value);\n } else if (key === \"class\") {\n element.className = value;\n } else if (key === \"checkboxChecked\") {\n // Handled separately below\n } else {\n element.setAttribute(key, value);\n }\n });\n }\n\n // Ensure tables have the rte-table class\n if (node.type === \"table\" && !element.classList.contains(\"rte-table\")) {\n element.classList.add(\"rte-table\");\n }\n\n if (node.children) {\n node.children.forEach((child) => {\n element.appendChild(createNode(child));\n });\n }\n\n // Set checkbox attributes on list items\n if (\n node.type === \"li\" &&\n node.attributes?.checkboxChecked !== undefined\n ) {\n element.setAttribute(\"role\", \"checkbox\");\n element.setAttribute(\"tabIndex\", \"-1\");\n element.setAttribute(\n \"aria-checked\",\n node.attributes.checkboxChecked\n );\n }\n\n return element;\n }\n\n content.blocks.forEach((block) => {\n container.appendChild(createNode(block));\n });\n\n // Normalize all checkbox lists after DOM creation\n ensureAllCheckboxes(container);\n}\n\n/**\n * Creates empty editor content with a single paragraph.\n */\nexport function createEmptyContent(): EditorContent {\n return {\n blocks: [{ type: \"p\", children: [] }],\n };\n}\n\n/**\n * Converts EditorContent to an HTML string.\n */\nexport function contentToHTML(content: EditorContent): string {\n const tempDiv = document.createElement(\"div\");\n contentToDOM(content, tempDiv);\n return tempDiv.innerHTML;\n}\n\n/**\n * Converts an HTML string to EditorContent.\n * Supports Lexical, GitHub, and standard HTML formats.\n */\nexport function htmlToContent(htmlString: string): EditorContent {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = htmlString;\n return domToContent(tempDiv);\n}\n","/**\n * Auto-link utility.\n *\n * Detects URLs in text nodes and wraps them in <a> tags.\n * Triggered after space/enter when the preceding word looks like a URL.\n */\n\nconst URL_REGEX =\n /(?:https?:\\/\\/|www\\.)[^\\s<>'\"]+\\.[^\\s<>'\"]+/i;\n\n/**\n * Check if the word before the cursor is a URL and wrap it in an <a> tag.\n * Called on space/enter keypress in the editor.\n */\nexport function handleAutoLink(editor: HTMLElement, e: KeyboardEvent): boolean {\n if (e.key !== \" \" && e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) return false;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE) return false;\n\n // Don't auto-link if already inside an anchor\n const parentEl =\n node.parentElement;\n if (parentEl?.closest(\"a\")) return false;\n\n const textNode = node as Text;\n const text = textNode.textContent || \"\";\n const offset = range.startOffset;\n\n // Get the text before the cursor\n const textBeforeCursor = text.substring(0, offset);\n\n // Find the last word (separated by whitespace)\n const lastSpaceIdx = textBeforeCursor.lastIndexOf(\" \");\n const lastNewlineIdx = textBeforeCursor.lastIndexOf(\"\\n\");\n const wordStart = Math.max(lastSpaceIdx, lastNewlineIdx) + 1;\n const word = textBeforeCursor.substring(wordStart);\n\n if (!word || !URL_REGEX.test(word)) return false;\n\n // Ensure it has a valid protocol or starts with www.\n let href = word;\n if (href.startsWith(\"www.\")) {\n href = \"https://\" + href;\n }\n\n // Create the link element\n const anchor = document.createElement(\"a\");\n anchor.href = href;\n anchor.textContent = word;\n anchor.target = \"_blank\";\n anchor.rel = \"noopener noreferrer\";\n\n // Split the text node and insert the link\n const beforeText = text.substring(0, wordStart);\n const afterText = text.substring(offset);\n\n const parentNode = textNode.parentNode;\n if (!parentNode) return false;\n\n // Build replacement: [beforeText][<a>word</a>][afterText]\n const frag = document.createDocumentFragment();\n\n if (beforeText) {\n frag.appendChild(document.createTextNode(beforeText));\n }\n frag.appendChild(anchor);\n\n // The space/enter that triggered this will be part of afterText or inserted by the browser\n const afterNode = document.createTextNode(afterText);\n frag.appendChild(afterNode);\n\n parentNode.replaceChild(frag, textNode);\n\n // Place cursor after the link (in the afterText node)\n const newRange = document.createRange();\n newRange.setStart(afterNode, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Don't prevent default -- let the space/enter be typed normally after the link\n return false;\n}\n","/**\n * Increases the indent level of a list item (Tab)\n */\nexport function indentListItem(selection: Selection): boolean {\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest('li')\n : (container as HTMLElement).closest('li');\n\n if (!listItem) return false;\n\n const list = listItem.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return false;\n\n // Check if already nested (max depth check)\n let depth = 0;\n let current: HTMLElement | null = listItem;\n while (current) {\n const parent: HTMLElement | null = current.parentElement;\n if (parent && (parent.tagName === 'UL' || parent.tagName === 'OL')) {\n depth++;\n current = parent.closest('li');\n } else {\n break;\n }\n }\n\n // Max depth: 6 (wie in HTML Standard)\n if (depth >= 6) return false;\n\n // Finde vorheriges List-Item\n const previousItem = listItem.previousElementSibling as HTMLElement | null;\n \n if (previousItem && previousItem.tagName === 'LI') {\n // Erstelle verschachtelte Liste im vorherigen Item\n let nestedList = previousItem.querySelector('ul, ol');\n \n if (!nestedList) {\n // Erstelle neue verschachtelte Liste\n nestedList = document.createElement(list.tagName.toLowerCase() as 'ul' | 'ol');\n previousItem.appendChild(nestedList);\n }\n \n // Verschiebe aktuelles Item in verschachtelte Liste\n nestedList.appendChild(listItem);\n \n // Cursor setzen\n const textNode = listItem.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, 0);\n range.collapse(true);\n } else if (listItem.firstChild) {\n range.setStart(listItem.firstChild, 0);\n range.collapse(true);\n } else {\n const newText = document.createTextNode('');\n listItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n \n return true;\n } else {\n // Kein vorheriges Item - erstelle neue verschachtelte Liste im aktuellen Item\n const nestedList = document.createElement(list.tagName.toLowerCase() as 'ul' | 'ol');\n \n // Verschiebe alle nachfolgenden Items in die verschachtelte Liste\n let nextSibling = listItem.nextElementSibling;\n while (nextSibling && nextSibling.tagName === 'LI') {\n const toMove = nextSibling;\n nextSibling = nextSibling.nextElementSibling;\n nestedList.appendChild(toMove);\n }\n \n if (nestedList.children.length > 0) {\n listItem.appendChild(nestedList);\n } else {\n // Wenn keine nachfolgenden Items, erstelle leeres Sub-Item\n const subItem = document.createElement('li');\n nestedList.appendChild(subItem);\n listItem.appendChild(nestedList);\n \n // Cursor ins Sub-Item setzen\n const newText = document.createTextNode('');\n subItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n \n return true;\n }\n}\n\n/**\n * Decreases the indent level of a list item (Shift+Tab)\n */\nexport function outdentListItem(selection: Selection): boolean {\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest('li')\n : (container as HTMLElement).closest('li');\n\n if (!listItem) return false;\n\n const list = listItem.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return false;\n\n // Check if in nested list\n const parentListItem = list.parentElement;\n if (!parentListItem || parentListItem.tagName !== 'LI') {\n // Bereits auf oberstem Level\n return false;\n }\n\n const parentList = parentListItem.parentElement;\n if (!parentList || (parentList.tagName !== 'UL' && parentList.tagName !== 'OL')) {\n return false;\n }\n\n // Verschiebe Item auf oberes Level\n // Finde Position nach dem Parent-Item\n const insertAfter = parentListItem;\n \n // Verschiebe Item und alle nachfolgenden Items aus der verschachtelten Liste\n const itemsToMove: HTMLElement[] = [listItem];\n let nextSibling = listItem.nextElementSibling;\n while (nextSibling && nextSibling.tagName === 'LI') {\n itemsToMove.push(nextSibling as HTMLElement);\n nextSibling = nextSibling.nextElementSibling;\n }\n\n // Insert items after the parent item\n itemsToMove.forEach(item => {\n parentList.insertBefore(item, insertAfter.nextSibling);\n });\n\n // Entferne leere verschachtelte Liste\n if (list.children.length === 0) {\n list.remove();\n }\n\n // Cursor setzen\n const textNode = listItem.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, 0);\n range.collapse(true);\n } else if (listItem.firstChild) {\n range.setStart(listItem.firstChild, 0);\n range.collapse(true);\n } else {\n const newText = document.createTextNode('');\n listItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n}\n\n","/**\n * Markdown-style input shortcuts.\n *\n * Detects markdown patterns at the start of a block element\n * (after a Space key press) and auto-converts them:\n * # through ###### → H1–H6\n * - or * → Bullet list\n * 1. → Numbered list\n * > → Blockquote\n * [] → Checkbox list\n * ``` → Code block (<pre>)\n * --- → Horizontal rule (<hr>)\n */\n\nexport function handleMarkdownShortcut(\n editor: HTMLElement,\n e: KeyboardEvent,\n): boolean {\n if (e.key !== \" \" && e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) return false;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE) return false;\n\n const textNode = node as Text;\n const text = textNode.textContent || \"\";\n const offset = range.startOffset;\n\n // We only care about text typed at the very start of a block\n const textBeforeCursor = text.substring(0, offset);\n\n // Find the parent block element\n const blockEl =\n textNode.parentElement?.closest(\"p, div, h1, h2, h3, h4, h5, h6\") ||\n textNode.parentElement;\n if (!blockEl || !editor.contains(blockEl)) return false;\n\n // Only trigger when the block starts with just the trigger text\n const blockText = blockEl.textContent || \"\";\n const blockTextBeforeCursor = blockText.substring(\n 0,\n blockText.indexOf(textBeforeCursor) + textBeforeCursor.length,\n );\n\n // Patterns that trigger on Space\n if (e.key === \" \") {\n // Heading shortcuts: # through ######\n const headingMatch = textBeforeCursor.match(/^(#{1,6})$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"formatBlock\", false, `h${level}`);\n return true;\n }\n\n // Bullet list: - or *\n if (textBeforeCursor === \"-\" || textBeforeCursor === \"*\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"insertUnorderedList\");\n return true;\n }\n\n // Numbered list: 1.\n if (textBeforeCursor === \"1.\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"insertOrderedList\");\n return true;\n }\n\n // Blockquote: >\n if (textBeforeCursor === \">\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"formatBlock\", false, \"blockquote\");\n return true;\n }\n\n // Checkbox list: []\n if (textBeforeCursor === \"[]\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n // Insert a checkbox list using the same approach as blockFormat\n document.execCommand(\"insertUnorderedList\");\n // Find the newly created UL and convert to checkbox\n setTimeout(() => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r = sel.getRangeAt(0);\n const container = r.startContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const li = el?.closest(\"li\");\n const ul = li?.parentElement;\n if (ul && ul.tagName === \"UL\") {\n ul.classList.add(\"rte-checkbox-list\");\n const items = ul.querySelectorAll(\"li\");\n items.forEach((item) => {\n item.setAttribute(\"role\", \"checkbox\");\n item.setAttribute(\"aria-checked\", \"false\");\n item.setAttribute(\"tabindex\", \"-1\");\n });\n }\n }, 0);\n return true;\n }\n }\n\n // Patterns that trigger on Enter (backticks, hr)\n if (e.key === \"Enter\") {\n // Code block: ```\n if (blockTextBeforeCursor === \"```\" || textBeforeCursor === \"```\") {\n e.preventDefault();\n clearBlockText(textNode, textBeforeCursor.length);\n document.execCommand(\"formatBlock\", false, \"pre\");\n return true;\n }\n\n // Horizontal rule: ---\n if (blockTextBeforeCursor === \"---\" || textBeforeCursor === \"---\") {\n e.preventDefault();\n clearBlockText(textNode, textBeforeCursor.length);\n // Remove the block contents and insert an HR\n if (blockEl.parentNode) {\n const hr = document.createElement(\"hr\");\n const p = document.createElement(\"p\");\n p.appendChild(document.createElement(\"br\"));\n blockEl.parentNode.insertBefore(hr, blockEl);\n blockEl.parentNode.insertBefore(p, blockEl.nextSibling);\n blockEl.parentNode.removeChild(blockEl);\n // Place cursor in the new paragraph\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n return true;\n }\n }\n\n return false;\n}\n\n/** Remove the trigger characters from the text node before applying formatting. */\nfunction clearBlockText(textNode: Text, charCount: number): void {\n const text = textNode.textContent || \"\";\n textNode.textContent = text.substring(charCount);\n // Reset cursor to start\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.setStart(textNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n","/**\n * Path-based selection serialization and restoration.\n *\n * DOM Range references become invalid after innerHTML replacement (undo/redo).\n * This module converts a live selection into a serializable path representation\n * (child indices from editor root to target node + character offset) and can\n * restore that path back to a live DOM selection after the DOM has been rebuilt\n * with identical structure.\n */\n\nexport interface SelectionPoint {\n path: number[];\n offset: number;\n}\n\nexport interface SelectionState {\n anchor: SelectionPoint;\n focus: SelectionPoint;\n}\n\n/**\n * Build an index path from `editor` down to `node`.\n * Returns null if the node is not inside the editor.\n */\nfunction buildPath(editor: HTMLElement, node: Node): number[] | null {\n const path: number[] = [];\n let current: Node | null = node;\n\n while (current && current !== editor) {\n const parent: Node | null = current.parentNode;\n if (!parent) return null;\n\n const children = parent.childNodes;\n let idx = -1;\n for (let i = 0; i < children.length; i++) {\n if (children[i] === current) {\n idx = i;\n break;\n }\n }\n if (idx === -1) return null;\n\n path.unshift(idx);\n current = parent;\n }\n\n if (current !== editor) return null;\n return path;\n}\n\n/**\n * Walk a child-index path starting from `editor` and return the target node.\n * Returns null if the path is invalid for the current DOM.\n */\nfunction walkPath(editor: HTMLElement, path: number[]): Node | null {\n let current: Node = editor;\n for (const idx of path) {\n if (!current.childNodes || idx >= current.childNodes.length) return null;\n current = current.childNodes[idx];\n }\n return current;\n}\n\n/**\n * Serialize the current window selection relative to `editor`.\n * Returns null if there is no selection or it is outside the editor.\n */\nexport function serializeSelection(\n editor: HTMLElement,\n): SelectionState | null {\n if (typeof window === \"undefined\") return null;\n\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n if (!sel.anchorNode || !sel.focusNode) return null;\n\n if (\n !editor.contains(sel.anchorNode) ||\n !editor.contains(sel.focusNode)\n ) {\n return null;\n }\n\n const anchorPath = buildPath(editor, sel.anchorNode);\n const focusPath = buildPath(editor, sel.focusNode);\n if (!anchorPath || !focusPath) return null;\n\n return {\n anchor: { path: anchorPath, offset: sel.anchorOffset },\n focus: { path: focusPath, offset: sel.focusOffset },\n };\n}\n\n/**\n * Restore a previously serialized selection on `editor`.\n * Silently does nothing if the paths no longer match the DOM.\n */\nexport function restoreSerializedSelection(\n editor: HTMLElement,\n state: SelectionState | null,\n): void {\n if (!state) return;\n if (typeof window === \"undefined\") return;\n\n const anchorNode = walkPath(editor, state.anchor.path);\n const focusNode = walkPath(editor, state.focus.path);\n if (!anchorNode || !focusNode) return;\n\n try {\n const sel = window.getSelection();\n if (!sel) return;\n\n // Clamp offsets to valid range\n const anchorMax =\n anchorNode.nodeType === Node.TEXT_NODE\n ? (anchorNode.textContent?.length ?? 0)\n : anchorNode.childNodes.length;\n const focusMax =\n focusNode.nodeType === Node.TEXT_NODE\n ? (focusNode.textContent?.length ?? 0)\n : focusNode.childNodes.length;\n\n const anchorOffset = Math.min(state.anchor.offset, anchorMax);\n const focusOffset = Math.min(state.focus.offset, focusMax);\n\n sel.removeAllRanges();\n const range = document.createRange();\n range.setStart(anchorNode, anchorOffset);\n range.setEnd(focusNode, focusOffset);\n sel.addRange(range);\n } catch {\n // Silently fail -- cursor positioning is best-effort\n }\n}\n","/**\n * Table DOM manipulation utilities for contentEditable.\n * Pure DOM functions — no React dependency.\n */\n\n/* ── Helpers ──────────────────────────────────────────────────────────── */\n\n/** Get the <td>/<th> cell that contains the current selection. */\nexport function getActiveCell(): HTMLTableCellElement | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return el?.closest(\"td, th\") as HTMLTableCellElement | null;\n}\n\n/** Get the <table> that contains the current selection. */\nexport function getActiveTable(): HTMLTableElement | null {\n const cell = getActiveCell();\n return cell?.closest(\"table\") ?? null;\n}\n\n/** Get the <tr> that contains the current selection. */\nexport function getActiveRow(): HTMLTableRowElement | null {\n const cell = getActiveCell();\n return cell?.closest(\"tr\") ?? null;\n}\n\n/** Place the cursor inside a cell (at the start). */\nexport function focusCell(cell: HTMLTableCellElement): void {\n const range = document.createRange();\n const sel = document.getSelection();\n if (!sel) return;\n\n if (cell.firstChild) {\n range.setStart(cell.firstChild, 0);\n } else {\n // Empty cell — add a <br> so the cursor has something to land on\n const br = document.createElement(\"br\");\n cell.appendChild(br);\n range.setStart(cell, 0);\n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n/** Count the number of columns in a table (from the first row). */\nfunction getColumnCount(table: HTMLTableElement): number {\n const firstRow = table.querySelector(\"tr\");\n return firstRow ? firstRow.cells.length : 0;\n}\n\n/* ── Create ───────────────────────────────────────────────────────────── */\n\n/** Create a new table element with the given dimensions. */\nexport function createTable(\n rows: number,\n cols: number,\n withHeader: boolean = false\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.classList.add(\"rte-table\");\n\n const startRow = withHeader ? 0 : 1;\n\n if (withHeader) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const th = document.createElement(\"th\");\n th.innerHTML = \"<br>\";\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n table.appendChild(thead);\n }\n\n const tbody = document.createElement(\"tbody\");\n const dataRows = withHeader ? rows - 1 : rows;\n for (let r = 0; r < dataRows; r++) {\n const tr = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const td = document.createElement(\"td\");\n td.innerHTML = \"<br>\";\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n\n return table;\n}\n\n/* ── Row operations ───────────────────────────────────────────────────── */\n\n/** Insert a row above or below the currently selected row. */\nexport function insertRow(position: \"above\" | \"below\"): void {\n const row = getActiveRow();\n const table = getActiveTable();\n if (!row || !table) return;\n\n const cols = row.cells.length;\n const newRow = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const td = document.createElement(\"td\");\n td.innerHTML = \"<br>\";\n newRow.appendChild(td);\n }\n\n if (position === \"above\") {\n row.parentNode?.insertBefore(newRow, row);\n } else {\n row.parentNode?.insertBefore(newRow, row.nextSibling);\n }\n\n focusCell(newRow.cells[0]);\n}\n\n/** Delete the row that contains the current selection. */\nexport function deleteRow(): void {\n const row = getActiveRow();\n const table = getActiveTable();\n if (!row || !table) return;\n\n const allRows = table.querySelectorAll(\"tr\");\n if (allRows.length <= 1) {\n // Last row — remove the whole table\n deleteTable();\n return;\n }\n\n // Focus adjacent row before deleting\n const nextRow = (row.nextElementSibling ||\n row.previousElementSibling) as HTMLTableRowElement | null;\n row.remove();\n if (nextRow?.cells[0]) {\n focusCell(nextRow.cells[0]);\n }\n}\n\n/* ── Column operations ────────────────────────────────────────────────── */\n\n/** Insert a column to the left or right of the currently selected cell. */\nexport function insertColumn(position: \"left\" | \"right\"): void {\n const cell = getActiveCell();\n const table = getActiveTable();\n if (!cell || !table) return;\n\n const cellIndex = cell.cellIndex;\n const rows = table.querySelectorAll(\"tr\");\n\n rows.forEach((row) => {\n const tag = row.parentElement?.tagName === \"THEAD\" ? \"th\" : \"td\";\n const newCell = document.createElement(tag);\n newCell.innerHTML = \"<br>\";\n\n const refCell = row.cells[cellIndex];\n if (!refCell) {\n row.appendChild(newCell);\n } else if (position === \"left\") {\n row.insertBefore(newCell, refCell);\n } else {\n row.insertBefore(newCell, refCell.nextSibling);\n }\n });\n}\n\n/** Delete the column that contains the currently selected cell. */\nexport function deleteColumn(): void {\n const cell = getActiveCell();\n const table = getActiveTable();\n if (!cell || !table) return;\n\n const cellIndex = cell.cellIndex;\n const colCount = getColumnCount(table);\n\n if (colCount <= 1) {\n // Last column — remove the whole table\n deleteTable();\n return;\n }\n\n const rows = table.querySelectorAll(\"tr\");\n rows.forEach((row) => {\n if (row.cells[cellIndex]) {\n row.cells[cellIndex].remove();\n }\n });\n\n // Focus an adjacent cell\n const activeRow = getActiveRow();\n if (activeRow) {\n const idx = Math.min(cellIndex, activeRow.cells.length - 1);\n if (activeRow.cells[idx]) focusCell(activeRow.cells[idx]);\n }\n}\n\n/* ── Table delete ─────────────────────────────────────────────────────── */\n\n/** Remove the entire table and place cursor after it. */\nexport function deleteTable(): void {\n const table = getActiveTable();\n if (!table) return;\n\n const parent = table.parentNode;\n const nextSibling = table.nextSibling;\n\n // Create a paragraph to place the cursor\n const p = document.createElement(\"p\");\n p.innerHTML = \"<br>\";\n\n if (nextSibling) {\n parent?.insertBefore(p, nextSibling);\n } else {\n parent?.appendChild(p);\n }\n\n table.remove();\n\n // Focus the new paragraph\n const range = document.createRange();\n const sel = document.getSelection();\n if (sel && p.firstChild) {\n range.setStart(p, 0);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n/* ── Tab navigation ───────────────────────────────────────────────────── */\n\n/**\n * Move focus to the next or previous table cell.\n * Returns true if navigation happened (caller should preventDefault).\n */\nexport function navigateTableCell(direction: \"next\" | \"prev\"): boolean {\n const cell = getActiveCell();\n if (!cell) return false;\n\n const row = cell.closest(\"tr\");\n const table = cell.closest(\"table\");\n if (!row || !table) return false;\n\n const cellIndex = cell.cellIndex;\n const allRows = Array.from(table.querySelectorAll(\"tr\"));\n const rowIndex = allRows.indexOf(row);\n\n let targetCell: HTMLTableCellElement | null = null;\n\n if (direction === \"next\") {\n if (cellIndex < row.cells.length - 1) {\n targetCell = row.cells[cellIndex + 1];\n } else if (rowIndex < allRows.length - 1) {\n targetCell = allRows[rowIndex + 1].cells[0];\n } else {\n // Last cell of last row — add a new row\n insertRow(\"below\");\n return true;\n }\n } else {\n if (cellIndex > 0) {\n targetCell = row.cells[cellIndex - 1];\n } else if (rowIndex > 0) {\n const prevRow = allRows[rowIndex - 1];\n targetCell = prevRow.cells[prevRow.cells.length - 1];\n }\n }\n\n if (targetCell) {\n focusCell(targetCell);\n return true;\n }\n\n return false;\n}\n","import { useEffect } from \"react\";\nimport { HISTORY_DEBOUNCE_MS } from \"../constants\";\nimport { EditorContent } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport { domToContent } from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\nimport { handleAutoLink } from \"../utils/autoLink\";\nimport { indentListItem, outdentListItem } from \"../utils/listIndent\";\nimport { handleMarkdownShortcut } from \"../utils/markdownShortcuts\";\nimport { serializeSelection } from \"../utils/selection\";\nimport { getActiveCell, navigateTableCell } from \"../utils/table\";\n\ninterface UseEditorEventsOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n historyRef: { current: HistoryManager };\n isUpdatingRef: { current: boolean };\n notifyChange: (content: EditorContent) => void;\n handleCheckboxKeyDown: (e: KeyboardEvent) => boolean;\n handleCheckboxEnter: (e: KeyboardEvent) => boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/**\n * Hook that sets up input and keydown event listeners on the editor.\n */\nexport function useEditorEvents({\n editorRef,\n historyRef,\n isUpdatingRef,\n notifyChange,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n undo,\n redo,\n}: UseEditorEventsOptions) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n let inputTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const handleInput = () => {\n setTimeout(() => {\n const content = domToContent(editor);\n notifyChange(content);\n\n if (inputTimeout) clearTimeout(inputTimeout);\n inputTimeout = setTimeout(() => {\n const sel = serializeSelection(editor);\n historyRef.current.push(content, sel);\n inputTimeout = null;\n }, HISTORY_DEBOUNCE_MS);\n }, 0);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isModifierPressed = e.metaKey || e.ctrlKey;\n\n // Markdown-style shortcuts (e.g., # + space → heading)\n if (!isModifierPressed && handleMarkdownShortcut(editor, e)) {\n setTimeout(() => {\n const content = domToContent(editor);\n notifyChange(content);\n }, 0);\n return;\n }\n\n // Auto-link: convert URLs to <a> tags on space/enter\n if (!isModifierPressed && (e.key === \" \" || e.key === \"Enter\")) {\n handleAutoLink(editor, e);\n }\n\n // Checkbox Enter: create new checkbox item\n if (handleCheckboxEnter(e)) return;\n\n // Checkbox keyboard navigation\n if (handleCheckboxKeyDown(e)) return;\n\n // Tab: navigate table cells OR indent/outdent in lists\n if (e.key === \"Tab\" && !isModifierPressed && !e.altKey) {\n // Table tab navigation takes priority\n if (getActiveCell()) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n navigateTableCell(e.shiftKey ? \"prev\" : \"next\");\n setTimeout(() => {\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n if (!editor.contains(container)) return;\n\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n if (listItem && editor.contains(listItem)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n\n if (e.shiftKey) {\n outdentListItem(selection);\n } else {\n indentListItem(selection);\n }\n\n setTimeout(() => {\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n // Not in a list -- let Tab move focus out of the editor\n }\n\n // Cmd/Ctrl+K: trigger link button click (if present in toolbar)\n if (isModifierPressed && e.key === \"k\") {\n e.preventDefault();\n e.stopPropagation();\n // Find and click the link button in the toolbar\n const editorContainer = editor.closest(\".rte-container\");\n if (editorContainer) {\n const linkBtn =\n editorContainer.querySelector(\n 'button[aria-label=\"Link\"], button[aria-label=\"Insert Link\"]'\n ) as HTMLButtonElement | null;\n if (linkBtn) linkBtn.click();\n }\n return;\n }\n\n // Undo/Redo shortcuts\n if (isModifierPressed && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n undo();\n return;\n } else if (\n isModifierPressed &&\n (e.key === \"y\" || (e.key === \"z\" && e.shiftKey))\n ) {\n e.preventDefault();\n e.stopPropagation();\n redo();\n return;\n }\n\n // Formatting shortcuts (Cmd/Ctrl + key)\n // We intercept these to ensure proper history snapshots\n if (isModifierPressed) {\n let command: string | null = null;\n\n if (!e.shiftKey) {\n switch (e.key.toLowerCase()) {\n case \"b\": command = \"bold\"; break;\n case \"i\": command = \"italic\"; break;\n case \"u\": command = \"underline\"; break;\n case \"e\": command = \"code\"; break;\n }\n } else {\n switch (e.key.toLowerCase()) {\n case \"x\": command = \"strikeThrough\"; break;\n case \"7\": command = \"insertOrderedList\"; break;\n case \"8\": command = \"insertUnorderedList\"; break;\n }\n }\n\n if (command) {\n e.preventDefault();\n e.stopPropagation();\n\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n\n if (command === \"code\") {\n // Inline code toggle via surroundContents\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const existingCode = element?.closest(\"code\");\n if (existingCode) {\n const parent = existingCode.parentNode;\n if (parent) {\n while (existingCode.firstChild) {\n parent.insertBefore(existingCode.firstChild, existingCode);\n }\n parent.removeChild(existingCode);\n }\n } else if (!range.collapsed) {\n const code = document.createElement(\"code\");\n try {\n range.surroundContents(code);\n } catch {\n const fragment = range.extractContents();\n code.appendChild(fragment);\n range.insertNode(code);\n }\n }\n }\n } else {\n document.execCommand(command, false);\n }\n\n setTimeout(() => {\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n }\n };\n\n editor.addEventListener(\"input\", handleInput);\n editor.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => {\n editor.removeEventListener(\"input\", handleInput);\n editor.removeEventListener(\"keydown\", handleKeyDown, true);\n if (inputTimeout) clearTimeout(inputTimeout);\n };\n }, [\n editorRef,\n historyRef,\n isUpdatingRef,\n notifyChange,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n undo,\n redo,\n ]);\n}\n","import { useEffect, useRef } from \"react\";\nimport React from \"react\";\nimport { EditorContent } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport { contentToDOM, createEmptyContent } from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\n\ninterface UseEditorInitOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n historyRef: { current: HistoryManager };\n isUpdatingRef: { current: boolean };\n initialContent?: EditorContent;\n notifyChange: (content: EditorContent) => void;\n customLinkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n [key: string]: unknown;\n }>;\n customHeadingRenderer?: (\n level: string,\n children: React.ReactNode\n ) => React.ReactNode;\n}\n\n/**\n * Hook that initializes the editor with initial content and sets up the MutationObserver.\n * Runs once on mount.\n */\nexport function useEditorInit({\n editorRef,\n historyRef,\n isUpdatingRef,\n initialContent,\n customLinkComponent,\n customHeadingRenderer,\n}: UseEditorInitOptions) {\n const isInitializedRef = useRef(false);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || isInitializedRef.current) return;\n\n // Load initial content\n const content = initialContent || createEmptyContent();\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n isInitializedRef.current = true;\n\n // Normalize all checkbox lists (own + Lexical + GitHub formats)\n ensureAllCheckboxes(editor);\n\n // MutationObserver: ensure new checkbox list items get correct attributes\n const observer = new MutationObserver((mutations) => {\n if (isUpdatingRef.current) return;\n\n let needsUpdate = false;\n for (const mutation of mutations) {\n for (let i = 0; i < mutation.addedNodes.length; i++) {\n const node = mutation.addedNodes[i];\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const el = node as HTMLElement;\n if (\n el.tagName === \"LI\" &&\n el.closest(\"ul.rte-checkbox-list\")\n ) {\n needsUpdate = true;\n break;\n }\n if (\n el.tagName === \"UL\" &&\n el.classList.contains(\"rte-checkbox-list\")\n ) {\n needsUpdate = true;\n break;\n }\n if (el.querySelector(\"ul.rte-checkbox-list li\")) {\n needsUpdate = true;\n break;\n }\n }\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n setTimeout(() => ensureAllCheckboxes(editor), 0);\n }\n });\n\n observer.observe(editor, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n };\n // Only run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n","import React from 'react';\nimport { Icon } from './Icons';\n\ninterface IconWrapperProps {\n icon: string;\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport const IconWrapper: React.FC<IconWrapperProps> = ({ icon, width = 18, height = 18, className }) => {\n return <Icon icon={icon} width={width} height={height} className={className} />;\n};\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\n\n/**\n * Base plugin for inline formatting\n */\nexport function createInlinePlugin(\n name: string,\n command: string,\n icon: string,\n label: string\n): Plugin {\n return {\n name,\n type: 'inline',\n command,\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${props.isActive ? 'rte-toolbar-button-active' : ''}`}\n title={label}\n aria-label={label}\n >\n <IconWrapper icon={icon} width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(command);\n },\n isActive: (editor: EditorAPI) => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false;\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n \n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n \n if (!element) return false;\n \n return document.queryCommandState(command);\n },\n canExecute: (editor: EditorAPI) => {\n // Formatting should also work without a selection\n // (z.B. wenn Editor leer ist, wird beim Klick eine Selection erstellt)\n return true;\n },\n };\n}\n\n/**\n * Base plugin for commands\n */\nexport function createCommandPlugin(\n name: string,\n command: string,\n icon: string,\n label: string\n): Plugin {\n return {\n name,\n type: 'command',\n command,\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title={label}\n aria-label={label}\n >\n <IconWrapper icon={icon} width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(command);\n },\n canExecute: (editor: EditorAPI) => {\n if (command === 'undo') return editor.canUndo();\n if (command === 'redo') return editor.canRedo();\n return true;\n },\n };\n}\n\n","import { Dropdown } from \"../components/Dropdown\";\nimport { EditorAPI, Plugin } from \"../types\";\nimport { findClosestCheckboxList } from \"../utils/dom\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\n\nconst headingLabels: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n};\n\nexport interface BlockFormatOptions {\n bulletList?: boolean;\n numberedList?: boolean;\n quote?: boolean;\n codeBlock?: boolean;\n check?: boolean;\n}\n\n/**\n * Creates a Block Format plugin that combines headings, lists, and quote in a dropdown.\n * @param headings - Array of heading levels (e.g. [\"h1\", \"h2\", \"h3\"])\n * @param blockOptions - Toggle individual block types (bulletList, numberedList, quote, check, codeBlock)\n */\nexport function createBlockFormatPlugin(\n headings: string[] = defaultHeadings,\n blockOptions: BlockFormatOptions = {}\n): Plugin {\n // Default all block types to true if not specified\n const showBulletList = blockOptions.bulletList ?? true;\n const showNumberedList = blockOptions.numberedList ?? true;\n const showQuote = blockOptions.quote ?? true;\n const showCodeBlock = blockOptions.codeBlock ?? true;\n const showCheck = blockOptions.check ?? true;\n\n const options: { value: string; label: string; headingPreview?: string; icon?: string }[] = [\n { value: \"p\", label: \"Normal\", headingPreview: \"p\" },\n ...headings.map((h) => ({\n value: h,\n label: headingLabels[h] || h.toUpperCase(),\n headingPreview: h,\n })),\n ];\n\n if (showBulletList) {\n options.push({\n value: \"ul\",\n label: \"Bullet List\",\n icon: \"mdi:format-list-bulleted\",\n });\n }\n if (showNumberedList) {\n options.push({\n value: \"ol\",\n label: \"Numbered List\",\n icon: \"mdi:format-list-numbered\",\n });\n }\n if (showCheck) {\n options.push({\n value: \"checkbox-list\",\n label: \"Checkbox List\",\n icon: \"mdi:checkbox-marked-outline\",\n });\n }\n if (showQuote) {\n options.push({\n value: \"blockquote\",\n label: \"Quote\",\n icon: \"mdi:format-quote-close\",\n });\n }\n if (showCodeBlock) {\n options.push({\n value: \"code\",\n label: \"Code Block\",\n icon: \"mdi:code-tags\",\n });\n }\n\n /** Detects the current block format at the cursor position. */\n function detectCurrentFormat(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n const tagName = element.tagName.toLowerCase();\n\n if (headings.includes(tagName)) return tagName;\n if (element.closest(\"pre\")) return \"code\";\n if (element.closest(\"blockquote\")) return \"blockquote\";\n if (findClosestCheckboxList(element)) return \"checkbox-list\";\n if (element.closest(\"ul\")) return \"ul\";\n if (element.closest(\"ol\")) return \"ol\";\n if (tagName === \"p\") return \"p\";\n\n return undefined;\n }\n\n return {\n name: \"blockFormat\",\n type: \"block\",\n renderButton: (props) => {\n const editor = props.editorAPI as EditorAPI | undefined;\n const onSelect = props.onSelect as\n | ((value: string) => void)\n | undefined;\n let currentValue = props.currentValue as string | undefined;\n\n if (!currentValue && editor) {\n currentValue = detectCurrentFormat(editor);\n }\n\n return (\n <Dropdown\n icon=\"mdi:format-paragraph\"\n label=\"Format\"\n options={options}\n onSelect={(value) => {\n if (onSelect) onSelect(value);\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => detectCurrentFormat(editor),\n execute: (editor: EditorAPI, value?: string) => {\n if (!value) return;\n\n // Helper: get the element at the cursor\n const getCursorElement = (): HTMLElement | null => {\n const sel = editor.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n return container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n };\n\n // Helper: merge all adjacent <pre> elements in the editor into one\n const mergeAdjacentPre = () => {\n const root = document.activeElement;\n if (!root || !root.getAttribute(\"contenteditable\")) return;\n const children = Array.from(root.children);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child.tagName !== \"PRE\" || !child.parentElement)\n continue;\n while (child.nextElementSibling?.tagName === \"PRE\") {\n const next = child.nextElementSibling;\n child.appendChild(document.createTextNode(\"\\n\"));\n while (next.firstChild) {\n child.appendChild(next.firstChild);\n }\n next.remove();\n }\n }\n };\n\n // Helper: if cursor is inside a list, remove the list first\n const escapeListIfNeeded = () => {\n const el = getCursorElement();\n if (!el) return;\n const inCheckbox = findClosestCheckboxList(el);\n const inUl = el.closest(\"ul\");\n const inOl = el.closest(\"ol\");\n if (inCheckbox) {\n inCheckbox.classList.remove(\"rte-checkbox-list\");\n inCheckbox\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n editor.executeCommand(\"insertUnorderedList\");\n } else if (inUl) {\n editor.executeCommand(\"insertUnorderedList\");\n } else if (inOl) {\n editor.executeCommand(\"insertOrderedList\");\n }\n };\n\n if (value === \"checkbox-list\") {\n const el = getCursorElement();\n if (!el) return;\n\n const checkboxList = findClosestCheckboxList(el);\n if (checkboxList) {\n checkboxList.classList.remove(\"rte-checkbox-list\");\n checkboxList\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n } else {\n editor.executeCommand(\"insertCheckboxList\");\n }\n } else if (value === \"ul\") {\n editor.executeCommand(\"insertUnorderedList\");\n } else if (value === \"ol\") {\n editor.executeCommand(\"insertOrderedList\");\n } else if (value === \"blockquote\") {\n const el = getCursorElement();\n if (el?.closest(\"blockquote\")) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", \"<blockquote>\");\n }\n } else if (value === \"code\") {\n const el = getCursorElement();\n if (el?.closest(\"pre\")) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", \"<pre>\");\n mergeAdjacentPre();\n }\n } else {\n // Headings and \"Normal\" (p)\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", `<${value}>`);\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n return (\n headings.includes(tagName) ||\n element.closest(\"pre\") !== null ||\n element.closest(\"blockquote\") !== null ||\n findClosestCheckboxList(element) !== null ||\n element.closest(\"ul\") !== null ||\n element.closest(\"ol\") !== null\n );\n },\n canExecute: () => true,\n };\n}\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\n\n/**\n * Clear Formatting Plugin - Removes all formatting\n */\nexport const clearFormattingPlugin: Plugin = {\n name: 'clearFormatting',\n type: 'command',\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Clear Formatting\"\n aria-label=\"Clear Formatting\"\n >\n <IconWrapper icon=\"mdi:format-clear\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.clearFormatting();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0 && !selection.isCollapsed;\n },\n};\n\n","import { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { createCommandPlugin, createInlinePlugin } from \"./base\";\nimport { createBlockFormatPlugin } from \"./blockFormat\";\nimport { clearFormattingPlugin } from \"./clearFormatting\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\n\n/**\n * Standard Plugins\n */\nexport const boldPlugin: Plugin = createInlinePlugin(\n \"bold\",\n \"bold\",\n \"mdi:format-bold\",\n \"Bold\"\n);\n\nexport const italicPlugin: Plugin = createInlinePlugin(\n \"italic\",\n \"italic\",\n \"mdi:format-italic\",\n \"Italic\"\n);\n\nexport const underlinePlugin: Plugin = createInlinePlugin(\n \"underline\",\n \"underline\",\n \"mdi:format-underline\",\n \"Underline\"\n);\n\nexport const strikethroughPlugin: Plugin = createInlinePlugin(\n \"strikethrough\",\n \"strikeThrough\",\n \"mdi:format-strikethrough\",\n \"Strikethrough\"\n);\n\nexport const subscriptPlugin: Plugin = createInlinePlugin(\n \"subscript\",\n \"subscript\",\n \"mdi:format-subscript\",\n \"Subscript\"\n);\n\nexport const superscriptPlugin: Plugin = createInlinePlugin(\n \"superscript\",\n \"superscript\",\n \"mdi:format-superscript\",\n \"Superscript\"\n);\n\nexport const codeInlinePlugin: Plugin = {\n name: \"codeInline\",\n type: \"inline\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Code\"\n aria-label=\"Code\"\n >\n <IconWrapper icon=\"mdi:code-tags\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const existingCode = element?.closest(\"code\");\n if (existingCode) {\n // Unwrap code\n const parent = existingCode.parentNode;\n if (parent) {\n while (existingCode.firstChild) {\n parent.insertBefore(existingCode.firstChild, existingCode);\n }\n parent.removeChild(existingCode);\n }\n } else if (!range.collapsed) {\n // Wrap in code\n const code = document.createElement(\"code\");\n try {\n range.surroundContents(code);\n } catch {\n // If surroundContents fails (partial selection), use extractContents\n const fragment = range.extractContents();\n code.appendChild(fragment);\n range.insertNode(code);\n }\n }\n },\n isActive: () => {\n if (typeof document === \"undefined\") return false;\n const selection = document.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return element?.closest(\"code\") !== null;\n },\n canExecute: () => true,\n};\n\n/**\n * Horizontal Rule Plugin\n */\nexport const horizontalRulePlugin: Plugin = {\n name: \"horizontalRule\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Horizontal Rule\"\n aria-label=\"Horizontal Rule\"\n >\n <IconWrapper icon=\"mdi:minus\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertHorizontalRule\");\n },\n canExecute: () => true,\n};\n\nexport const undoPlugin: Plugin = createCommandPlugin(\n \"undo\",\n \"undo\",\n \"mdi:undo\",\n \"Undo\"\n);\n\nexport const redoPlugin: Plugin = createCommandPlugin(\n \"redo\",\n \"redo\",\n \"mdi:redo\",\n \"Redo\"\n);\n\n/**\n * Indent List Item Plugin\n */\nconst indentListItemPlugin: Plugin = {\n name: \"indentListItem\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Indent\"\n aria-label=\"Indent\"\n >\n <IconWrapper\n icon=\"mdi:format-indent-increase\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.indentListItem();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n return listItem !== null;\n },\n};\n\n/**\n * Outdent List Item Plugin\n */\nconst outdentListItemPlugin: Plugin = {\n name: \"outdentListItem\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Outdent\"\n aria-label=\"Outdent\"\n >\n <IconWrapper\n icon=\"mdi:format-indent-decrease\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.outdentListItem();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n if (!listItem) return false;\n\n // Check if in nested list\n const list = listItem.parentElement;\n if (!list || (list.tagName !== \"UL\" && list.tagName !== \"OL\"))\n return false;\n\n const parentListItem = list.parentElement;\n return parentListItem !== null && parentListItem.tagName === \"LI\";\n },\n};\n\n// Export plugins for direct use\nexport { indentListItemPlugin, outdentListItemPlugin };\n\n/**\n * Standard Plugin List\n * Plugins are referenced here directly to ensure they are included in defaultPlugins\n */\nconst _indentPlugin = indentListItemPlugin;\nconst _outdentPlugin = outdentListItemPlugin;\n\n/**\n * Standard Block Format Plugin (headings, lists, quote in a dropdown)\n * Uses h1, h2, h3 by default, but can be customized via Editor props\n */\nconst defaultBlockFormatPlugin = createBlockFormatPlugin(defaultHeadings);\n\nexport const defaultPlugins: Plugin[] = [\n undoPlugin,\n redoPlugin,\n defaultBlockFormatPlugin,\n boldPlugin,\n italicPlugin,\n underlinePlugin,\n strikethroughPlugin,\n codeInlinePlugin,\n subscriptPlugin,\n superscriptPlugin,\n horizontalRulePlugin,\n clearFormattingPlugin,\n _indentPlugin,\n _outdentPlugin,\n];\n","import { EditorAPI } from '../types';\n\n/**\n * Liest die aktuelle Font-Size aus dem DOM an der Cursor-Position\n */\nexport function getCurrentFontSize(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with fontSize\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n const fontSize = window.getComputedStyle(current).fontSize;\n if (fontSize && fontSize !== 'inherit' && fontSize !== 'initial') {\n // Konvertiere \"16px\" zu \"16\"\n const size = parseInt(fontSize, 10);\n if (!isNaN(size)) {\n return size.toString();\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current text color from the DOM at the cursor position\n */\nexport function getCurrentTextColor(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with color\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n // Check inline style first (has priority)\n const inlineColor = current.style.color;\n if (inlineColor && inlineColor.trim()) {\n // If already hex, return directly\n if (inlineColor.startsWith('#')) {\n return inlineColor;\n }\n // Wenn RGB/RGBA, konvertieren\n const rgbMatch = inlineColor.match(/\\d+/g);\n if (rgbMatch && rgbMatch.length >= 3) {\n const hex = '#' + rgbMatch.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n \n // Dann computed style\n const color = window.getComputedStyle(current).color;\n if (color && color !== 'inherit' && color !== 'initial' && color !== 'rgb(0, 0, 0)' && color !== 'rgba(0, 0, 0, 0)') {\n // Konvertiere RGB zu Hex\n const rgb = color.match(/\\d+/g);\n if (rgb && rgb.length >= 3) {\n const hex = '#' + rgb.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current background color from the DOM at the cursor position\n */\nexport function getCurrentBackgroundColor(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with backgroundColor\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n // Check inline style first (has priority)\n const inlineBgColor = current.style.backgroundColor;\n if (inlineBgColor && inlineBgColor.trim()) {\n // If already hex, return directly\n if (inlineBgColor.startsWith('#')) {\n return inlineBgColor;\n }\n // Wenn RGB/RGBA, konvertieren\n const rgbMatch = inlineBgColor.match(/\\d+/g);\n if (rgbMatch && rgbMatch.length >= 3) {\n const hex = '#' + rgbMatch.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n \n // Dann computed style\n const bgColor = window.getComputedStyle(current).backgroundColor;\n if (bgColor && bgColor !== 'inherit' && bgColor !== 'initial' && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n // Konvertiere RGB zu Hex\n const rgb = bgColor.match(/\\d+/g);\n if (rgb && rgb.length >= 3) {\n const hex = '#' + rgb.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current heading level from the DOM at the cursor position\n */\nexport function getCurrentHeading(editor: EditorAPI, availableHeadings: string[]): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest block element\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n const tagName = current.tagName.toLowerCase();\n if (availableHeadings.includes(tagName)) {\n return tagName;\n }\n if (tagName === 'p') {\n return 'p';\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { Dropdown } from '../components/Dropdown';\nimport { getCurrentTextColor, getCurrentBackgroundColor } from '../utils/stateReflection';\n\nconst defaultColors = [\n { value: '#000000', label: 'Black', color: '#000000' },\n { value: '#333333', label: 'Dark Gray', color: '#333333' },\n { value: '#666666', label: 'Gray', color: '#666666' },\n { value: '#ff0000', label: 'Red', color: '#ff0000' },\n { value: '#0000ff', label: 'Blue', color: '#0000ff' },\n { value: '#00aa00', label: 'Green', color: '#00aa00' },\n { value: '#ffaa00', label: 'Orange', color: '#ffaa00' },\n { value: '#aa00ff', label: 'Purple', color: '#aa00ff' },\n];\n\nexport function createTextColorPlugin(colors: string[] = defaultColors.map(c => c.value)): Plugin {\n // Find labels for known colors\n const getColorLabel = (color: string): string => {\n const found = defaultColors.find(c => c.value.toLowerCase() === color.toLowerCase());\n return found ? found.label : color;\n };\n \n const colorOptions = colors.map(color => ({\n value: color,\n label: getColorLabel(color),\n color,\n }));\n\n return {\n name: 'textColor',\n type: 'inline',\n renderButton: (props: ButtonProps & { onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n // Current text color from state reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentTextColor(props.editorAPI) : undefined);\n \n return (\n <Dropdown\n icon=\"mdi:format-color-text\"\n label=\"Text Color\"\n options={colorOptions.map(opt => ({\n value: opt.value,\n label: opt.label,\n color: opt.color,\n }))}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n showCustomColorInput\n />\n );\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n editor.executeCommand('foreColor', value);\n }\n },\n canExecute: () => true,\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentTextColor(editor);\n },\n };\n}\n\nexport function createBackgroundColorPlugin(colors: string[] = defaultColors.map(c => c.value)): Plugin {\n // Find labels for known colors\n const getColorLabel = (color: string): string => {\n const found = defaultColors.find(c => c.value.toLowerCase() === color.toLowerCase());\n return found ? found.label : color;\n };\n \n const colorOptions = colors.map(color => ({\n value: color,\n label: getColorLabel(color),\n color,\n }));\n\n return {\n name: 'backgroundColor',\n type: 'inline',\n renderButton: (props: ButtonProps & { onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n // Current background color from state reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentBackgroundColor(props.editorAPI) : undefined);\n \n return (\n <Dropdown\n icon=\"mdi:format-color-fill\"\n label=\"Background Color\"\n options={colorOptions.map(opt => ({\n value: opt.value,\n label: opt.label,\n color: opt.color,\n }))}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n showCustomColorInput\n />\n );\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n editor.executeCommand('backColor', value);\n }\n },\n canExecute: () => true,\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentBackgroundColor(editor);\n },\n };\n}\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { Dropdown } from '../components/Dropdown';\nimport { getCurrentFontSize } from '../utils/stateReflection';\n\nexport function createFontSizePlugin(fontSizes: number[] = [12, 14, 16, 18, 20, 24]): Plugin {\n return {\n name: 'fontSize',\n type: 'inline',\n renderButton: (props: ButtonProps & { fontSizes?: number[]; onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n const sizes = props.fontSizes || fontSizes;\n const options = sizes.map(size => ({\n value: size.toString(),\n label: `${size}px`,\n preview: size.toString(),\n }));\n\n // Aktuelle Font-Size aus State Reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentFontSize(props.editorAPI) : undefined);\n\n return (\n <Dropdown\n icon=\"mdi:format-size\"\n label=\"Font Size\"\n options={options}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentFontSize(editor);\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n // Set inline style for precise size\n const selection = editor.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n let element: HTMLElement | null = null;\n \n if (range.commonAncestorContainer.nodeType === Node.TEXT_NODE) {\n element = range.commonAncestorContainer.parentElement;\n } else {\n element = range.commonAncestorContainer as HTMLElement;\n }\n \n if (element) {\n // Erstelle oder aktualisiere span mit fontSize\n const span = document.createElement('span');\n span.style.fontSize = `${value}px`;\n \n try {\n range.surroundContents(span);\n } catch (e) {\n // If surroundContents fails\n const contents = range.extractContents();\n span.appendChild(contents);\n range.insertNode(span);\n }\n \n // Cursor setzen\n range.setStartAfter(span);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }\n },\n canExecute: () => true,\n };\n}\n\n","import React, { useState, useRef } from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\n\n/**\n * Extracts the display URL from the raw onImageUpload return value.\n * Strips the \"|__aid__:attachmentId\" suffix if present.\n */\nfunction getDisplayUrl(raw: string): string {\n if (raw.includes('|__aid__:')) {\n return raw.substring(0, raw.indexOf('|__aid__:'));\n }\n return raw;\n}\n\n/**\n * Image-Plugin mit URL-Eingabe und File-Upload\n */\nexport function createImagePlugin(onImageUpload?: (file: File) => Promise<string>): Plugin {\n return {\n name: 'image',\n type: 'block',\n renderButton: (props: ButtonProps & { editorAPI?: EditorAPI }) => {\n const [showModal, setShowModal] = useState(false);\n // rawUrl stores the full value returned by onImageUpload (may contain |__aid__:)\n const [rawUrl, setRawUrl] = useState('');\n const [imageUrl, setImageUrl] = useState('');\n const [altText, setAltText] = useState('');\n const [isUploading, setIsUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleInsertImage = () => {\n if (!props.editorAPI) return;\n \n // Use the raw URL (with |__aid__: if present) — createImageElement will parse it\n const src = (rawUrl || imageUrl).trim();\n \n if (!src) {\n alert('Please enter an image URL');\n return;\n }\n\n props.editorAPI.executeCommand('insertImage', src);\n\n // Close modal\n setShowModal(false);\n setRawUrl('');\n setImageUrl('');\n setAltText('');\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onImageUpload) return;\n\n if (!file.type.startsWith('image/')) {\n alert('Please select an image file');\n return;\n }\n\n setIsUploading(true);\n\n try {\n const uploadedUrl = await onImageUpload(file);\n // Store the raw return value (may contain |__aid__:attachmentId)\n setRawUrl(uploadedUrl);\n // Display URL strips the metadata suffix\n setImageUrl(getDisplayUrl(uploadedUrl));\n } catch (error) {\n console.error('Image upload failed:', error);\n alert('Error uploading image');\n } finally {\n setIsUploading(false);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setShowModal(true)}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Insert Image\"\n aria-label=\"Insert Image\"\n >\n <IconWrapper icon=\"mdi:image\" width={18} height={18} />\n </button>\n\n {showModal && (\n <div\n className=\"rte-image-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowModal(false);\n }\n }}\n >\n <div className=\"rte-image-modal\">\n <div className=\"rte-image-modal-header\">\n <h3>Insert Image</h3>\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"rte-image-modal-close\"\n aria-label=\"Close\"\n >\n <IconWrapper icon=\"mdi:close\" width={20} height={20} />\n </button>\n </div>\n\n <div className=\"rte-image-modal-content\">\n {onImageUpload && (\n <div className=\"rte-image-upload-section\">\n <label className=\"rte-image-upload-label\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n <div className=\"rte-image-upload-button\">\n {isUploading ? (\n <>\n <IconWrapper icon=\"mdi:loading\" width={24} height={24} className=\"rte-spin\" />\n <span>Wird hochgeladen...</span>\n </>\n ) : (\n <>\n <IconWrapper icon=\"mdi:upload\" width={24} height={24} />\n <span>Choose File</span>\n </>\n )}\n </div>\n </label>\n </div>\n )}\n\n <div className=\"rte-image-url-section\">\n <label>\n Bild-URL\n <input\n type=\"url\"\n value={imageUrl}\n onChange={(e) => {\n setImageUrl(e.target.value);\n // Clear raw URL when user manually edits\n setRawUrl('');\n }}\n placeholder=\"https://example.com/image.jpg\"\n className=\"rte-image-url-input\"\n />\n </label>\n </div>\n\n <div className=\"rte-image-alt-section\">\n <label>\n Alt-Text (optional)\n <input\n type=\"text\"\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder=\"Image description\"\n className=\"rte-image-alt-input\"\n />\n </label>\n </div>\n\n {imageUrl && (\n <div className=\"rte-image-preview\">\n <img src={imageUrl} alt={altText || 'Preview'} />\n </div>\n )}\n </div>\n\n <div className=\"rte-image-modal-footer\">\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"rte-image-modal-cancel\"\n >\n Abbrechen\n </button>\n <button\n type=\"button\"\n onClick={handleInsertImage}\n disabled={!imageUrl.trim() || isUploading}\n className=\"rte-image-modal-insert\"\n >\n Insert\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n },\n execute: (editor: EditorAPI) => {\n // Handled via renderButton\n },\n canExecute: () => true,\n };\n}\n\n","/**\n * Removes all formatting from the current selection\n */\nexport function clearFormatting(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n \n // Wenn Selection leer ist, nichts zu tun\n if (range.collapsed) return;\n\n try {\n // Use document.execCommand for standard formatting\n document.execCommand('removeFormat', false);\n document.execCommand('unlink', false);\n \n // Remove all inline styles and formatting manually\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el)) {\n const tagName = el.tagName.toLowerCase();\n \n // Remove inline formatting (strong, em, u, span, a, etc.)\n if (['strong', 'b', 'em', 'i', 'u', 'span', 'a', 'font'].includes(tagName)) {\n // Ersetze durch Text-Node\n const text = el.textContent || '';\n const textNode = document.createTextNode(text);\n el.parentNode?.replaceChild(textNode, el);\n }\n \n // Entferne alle Styles\n if (el.style.length > 0) {\n el.removeAttribute('style');\n }\n \n // Konvertiere Headings zu Paragraphs\n if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tagName)) {\n const p = document.createElement('p');\n while (el.firstChild) {\n p.appendChild(el.firstChild);\n }\n el.parentNode?.replaceChild(p, el);\n }\n }\n }\n node = walker.nextNode();\n }\n \n // Normalize: remove empty formatting tags\n const normalizeWalker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n node = normalizeWalker.currentNode as Node;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n \n if (['strong', 'b', 'em', 'i', 'u', 'span'].includes(tagName) && !el.textContent?.trim()) {\n el.parentNode?.removeChild(el);\n }\n }\n node = normalizeWalker.nextNode();\n }\n \n } catch (error) {\n console.error('Error clearing formatting:', error);\n // Fallback: Einfache Methode\n document.execCommand('removeFormat', false);\n document.execCommand('unlink', false);\n }\n}\n\n/**\n * Removes only text color\n */\nexport function clearTextColor(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit color style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.color) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.color = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Removes only background color\n */\nexport function clearBackgroundColor(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit backgroundColor style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.backgroundColor) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.backgroundColor = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Entfernt nur Font-Size\n */\nexport function clearFontSize(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit fontSize style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.fontSize) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.fontSize = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Removes links (keeps text)\n */\nexport function clearLinks(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n \n // Finde alle Links in der Selection\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.tagName.toLowerCase() === 'a' && range.intersectsNode(el)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n \n const links: HTMLAnchorElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).tagName.toLowerCase() === 'a') {\n links.push(node as HTMLAnchorElement);\n }\n node = walker.nextNode();\n }\n \n // Remove links (keep text)\n links.forEach(link => {\n const parent = link.parentNode;\n if (parent) {\n while (link.firstChild) {\n parent.insertBefore(link.firstChild, link);\n }\n parent.removeChild(link);\n }\n });\n}\n\n","import { EditorContent } from '../types';\nimport { SelectionState } from './selection';\n\nexport interface HistoryEntry {\n content: EditorContent;\n selection: SelectionState | null;\n}\n\nexport class HistoryManager {\n private history: HistoryEntry[] = [];\n private currentIndex: number = -1;\n private maxHistorySize: number = 50;\n\n push(content: EditorContent, selection: SelectionState | null = null): void {\n // Remove all entries after currentIndex (when we went back)\n this.history = this.history.slice(0, this.currentIndex + 1);\n\n // Add new entry\n this.history.push({\n content: JSON.parse(JSON.stringify(content)),\n selection: selection ? JSON.parse(JSON.stringify(selection)) : null,\n });\n this.currentIndex++;\n\n // Limit history size\n if (this.history.length > this.maxHistorySize) {\n this.history.shift();\n this.currentIndex--;\n }\n }\n\n undo(): HistoryEntry | null {\n if (this.canUndo()) {\n this.currentIndex--;\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n redo(): HistoryEntry | null {\n if (this.canRedo()) {\n this.currentIndex++;\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n canUndo(): boolean {\n return this.currentIndex > 0;\n }\n\n canRedo(): boolean {\n return this.currentIndex < this.history.length - 1;\n }\n\n getCurrent(): HistoryEntry | null {\n if (this.currentIndex >= 0 && this.currentIndex < this.history.length) {\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n reset(): void {\n this.history = [];\n this.currentIndex = -1;\n }\n}\n","/**\n * Lightweight HTML sanitizer (no external dependencies).\n *\n * Uses an allowlist approach to strip dangerous elements and attributes\n * from pasted/imported HTML before it enters the editor.\n */\n\n/** Tags that are always removed (including their content). */\nconst REMOVE_TAGS = new Set([\n \"script\",\n \"style\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"applet\",\n \"form\",\n \"input\",\n \"textarea\",\n \"select\",\n \"button\",\n \"noscript\",\n \"meta\",\n \"link\",\n \"base\",\n]);\n\n/** Attributes that are always removed (event handlers, dangerous attrs). */\nconst REMOVE_ATTRS_PATTERN = /^on|^data-(?!attachment-id$|placeholder$)/i;\n\n/** Specific dangerous attribute names. */\nconst REMOVE_ATTRS = new Set([\n \"srcdoc\",\n \"formaction\",\n \"xlink:href\",\n \"ping\",\n]);\n\n/** Allowed URL schemes for href/src attributes. */\nconst ALLOWED_SCHEMES = /^(https?:|mailto:|tel:|#|\\/)/i;\n\n/**\n * Sanitize an HTML string by stripping dangerous tags and attributes.\n *\n * @param html - Raw HTML string\n * @returns Sanitized HTML string\n */\nexport function sanitizeHtml(html: string): string {\n // Use the browser's DOMParser to parse the HTML safely\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n\n sanitizeNode(doc.body);\n\n return doc.body.innerHTML;\n}\n\n/** Recursively sanitize a DOM node. */\nfunction sanitizeNode(node: Node): void {\n const childrenToRemove: Node[] = [];\n\n node.childNodes.forEach((child) => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n\n // Remove dangerous tags entirely\n if (REMOVE_TAGS.has(tag)) {\n childrenToRemove.push(child);\n return;\n }\n\n // Remove dangerous attributes\n const attrsToRemove: string[] = [];\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n const name = attr.name.toLowerCase();\n\n if (REMOVE_ATTRS.has(name) || REMOVE_ATTRS_PATTERN.test(name)) {\n attrsToRemove.push(attr.name);\n continue;\n }\n\n // Validate URL attributes\n if (name === \"href\" || name === \"src\" || name === \"action\") {\n const value = attr.value.trim();\n if (value && !ALLOWED_SCHEMES.test(value)) {\n attrsToRemove.push(attr.name);\n }\n }\n\n // Remove javascript: in any attribute value\n if (attr.value.toLowerCase().includes(\"javascript:\")) {\n attrsToRemove.push(attr.name);\n }\n }\n\n attrsToRemove.forEach((attrName) => el.removeAttribute(attrName));\n\n // Recurse into children\n sanitizeNode(child);\n }\n });\n\n // Remove marked children\n childrenToRemove.forEach((child) => {\n node.removeChild(child);\n });\n}\n","import { Dropdown } from \"../components/Dropdown\";\nimport { EditorAPI, Plugin } from \"../types\";\n\nconst alignmentLabels: Record<string, string> = {\n left: \"Left\",\n center: \"Center\",\n right: \"Right\",\n justify: \"Justify\",\n};\n\nconst alignmentIcons: Record<string, string> = {\n left: \"mdi:format-align-left\",\n center: \"mdi:format-align-center\",\n right: \"mdi:format-align-right\",\n justify: \"mdi:format-align-justify\",\n};\n\nconst alignmentCommands: Record<string, string> = {\n left: \"justifyLeft\",\n center: \"justifyCenter\",\n right: \"justifyRight\",\n justify: \"justifyFull\",\n};\n\n/**\n * Detects current text alignment at cursor position.\n */\nfunction detectCurrentAlignment(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n const selection = document.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n // Walk up to find the block-level element\n let block: HTMLElement | null = element;\n const blockTags = new Set([\n \"P\",\n \"DIV\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"LI\",\n \"BLOCKQUOTE\",\n \"TD\",\n \"TH\",\n ]);\n while (block && !blockTags.has(block.tagName)) {\n block = block.parentElement;\n }\n\n if (!block) return undefined;\n\n const align = block.style.textAlign || window.getComputedStyle(block).textAlign;\n if (align === \"center\") return \"center\";\n if (align === \"right\") return \"right\";\n if (align === \"justify\") return \"justify\";\n return \"left\";\n}\n\n/**\n * Creates an alignment plugin with a dropdown.\n * @param alignments - Which alignments to offer, defaults to all four.\n */\nexport function createAlignmentPlugin(\n alignments: string[] = [\"left\", \"center\", \"right\", \"justify\"]\n): Plugin {\n const options = alignments.map((a) => ({\n value: a,\n label: alignmentLabels[a] || a,\n icon: alignmentIcons[a],\n }));\n\n return {\n name: \"alignment\",\n type: \"block\",\n renderButton: (props) => {\n const onSelect = props.onSelect as\n | ((value: string) => void)\n | undefined;\n const currentValue =\n (props.currentValue as string | undefined) ||\n detectCurrentAlignment() ||\n \"left\";\n\n return (\n <Dropdown\n icon={alignmentIcons[currentValue] || \"mdi:format-align-left\"}\n label=\"Alignment\"\n options={options}\n onSelect={(value) => {\n if (onSelect) onSelect(value);\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: () => detectCurrentAlignment(),\n execute: (_editor: EditorAPI, value?: string) => {\n if (!value) return;\n const command = alignmentCommands[value];\n if (command) {\n document.execCommand(command, false);\n }\n },\n isActive: () => {\n const align = detectCurrentAlignment();\n return align !== undefined && align !== \"left\";\n },\n canExecute: () => true,\n };\n}\n\n/** Pre-built alignment plugin with all four options */\nexport const alignmentPlugin: Plugin = createAlignmentPlugin();\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\n/* ══════════════════════════════════════════════════════════════════════════\n Types\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface LinkData {\n url: string;\n target: string;\n /** Values for custom fields, keyed by field.key */\n custom: Record<string, string>;\n}\n\n/**\n * Describes an additional field injected into the link dialog.\n * This allows platform-specific extensions (e.g. page reference, URL extras)\n * without baking them into the core RTE.\n */\nexport interface LinkCustomField {\n /** Unique identifier (used as key in LinkData.custom) */\n key: string;\n /** Display label */\n label: string;\n /** Input placeholder */\n placeholder?: string;\n /** The HTML attribute to read/write on the <a> element (e.g. \"data-page-ref\") */\n dataAttribute: string;\n /** If true, this field's value is appended to the href when saving. */\n appendToHref?: boolean;\n /** If true, the URL input is disabled when this field has a value. */\n disablesUrl?: boolean;\n}\n\nexport interface AdvancedLinkOptions {\n /** Show \"Open in new tab\" checkbox. Defaults to true. */\n enableTarget?: boolean;\n /** Additional custom fields rendered in the advanced section. */\n customFields?: LinkCustomField[];\n}\n\nfunction createEmptyLinkData(fields: LinkCustomField[]): LinkData {\n const custom: Record<string, string> = {};\n for (const f of fields) custom[f.key] = \"\";\n return { url: \"https://\", target: \"_self\", custom };\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Position helper — prefers above the link, falls back to below\n ══════════════════════════════════════════════════════════════════════ */\n\nconst VERTICAL_GAP = 10;\nconst HORIZONTAL_OFFSET = 5;\n\nfunction computePosition(anchorRect: DOMRect) {\n const dialogWidth = 380;\n const estimatedHeight = 260;\n\n const topAbove = anchorRect.top - VERTICAL_GAP - estimatedHeight;\n const topBelow = anchorRect.bottom + VERTICAL_GAP;\n\n const aboveOverflowsTop = topAbove < 8;\n const belowOverflowsBottom =\n topBelow + estimatedHeight > window.innerHeight - 8;\n\n let top: number;\n if (!aboveOverflowsTop) {\n top = topAbove;\n } else if (!belowOverflowsBottom) {\n top = topBelow;\n } else {\n top = Math.max(8, topAbove);\n }\n\n let left = anchorRect.left - HORIZONTAL_OFFSET;\n if (left + dialogWidth > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - dialogWidth - 8);\n }\n\n return { top, left };\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Floating Link Editor — rendered via portal on document.body\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface FloatingLinkEditorProps {\n linkData: LinkData;\n options: Required<Pick<AdvancedLinkOptions, \"enableTarget\">> &\n Pick<AdvancedLinkOptions, \"customFields\">;\n anchorRect: DOMRect;\n isEditing: boolean;\n onSave: (data: LinkData) => void;\n onRemove: () => void;\n onClose: () => void;\n}\n\nconst FloatingLinkEditor: React.FC<FloatingLinkEditorProps> = ({\n linkData: initialData,\n options,\n anchorRect,\n isEditing,\n onSave,\n onRemove,\n onClose,\n}) => {\n const [data, setData] = useState<LinkData>(initialData);\n const customFields = options.customFields ?? [];\n\n const [showAdvanced, setShowAdvanced] = useState(() => {\n // Auto-expand if target is _blank or any custom field has a value\n if (initialData.target === \"_blank\") return true;\n for (const f of customFields) {\n if (initialData.custom[f.key]) return true;\n }\n return false;\n });\n\n const dialogRef = useRef<HTMLDivElement>(null);\n const urlInputRef = useRef<HTMLInputElement>(null);\n\n // Focus URL input on open\n useEffect(() => {\n const timer = setTimeout(() => {\n const input = urlInputRef.current;\n if (input) {\n input.focus();\n input.select();\n }\n }, 30);\n return () => clearTimeout(timer);\n }, []);\n\n // Click-away\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (\n dialogRef.current &&\n !dialogRef.current.contains(e.target as Node)\n ) {\n const target = e.target as HTMLElement;\n if (\n target.closest?.(\"a\") &&\n target.closest?.(\"[contenteditable]\")\n ) {\n return;\n }\n onClose();\n }\n };\n const timer = setTimeout(() => {\n document.addEventListener(\"mousedown\", handler);\n }, 50);\n return () => {\n clearTimeout(timer);\n document.removeEventListener(\"mousedown\", handler);\n };\n }, [onClose]);\n\n // Escape to close\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onSave(data);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n };\n\n const setField = (key: keyof Omit<LinkData, \"custom\">, value: string) =>\n setData((prev) => ({ ...prev, [key]: value }));\n\n const setCustom = (key: string, value: string) =>\n setData((prev) => ({\n ...prev,\n custom: { ...prev.custom, [key]: value },\n }));\n\n // Check if URL input should be disabled (a custom field with disablesUrl has a value)\n const urlDisabledByCustom = customFields.some(\n (f) => f.disablesUrl && !!data.custom[f.key]\n );\n\n const hasAdvancedSection =\n options.enableTarget || customFields.length > 0;\n\n const pos = computePosition(anchorRect);\n\n return createPortal(\n <div\n ref={dialogRef}\n className=\"rte-link-dialog rte-link-dialog-floating\"\n style={{ top: pos.top, left: pos.left, position: \"fixed\" }}\n onKeyDown={handleKeyDown}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n type=\"button\"\n className=\"rte-link-dialog-close\"\n onClick={onClose}\n onMouseDown={(e) => e.preventDefault()}\n aria-label=\"Close\"\n >\n <IconWrapper icon=\"mdi:close\" width={16} height={16} />\n </button>\n\n <div className=\"rte-link-dialog-field\">\n <label className=\"rte-link-dialog-label\">URL</label>\n <input\n ref={urlInputRef}\n type=\"url\"\n className=\"rte-link-dialog-input\"\n value={data.url}\n onChange={(e) => setField(\"url\", e.target.value)}\n placeholder=\"https://...\"\n disabled={urlDisabledByCustom}\n />\n </div>\n\n {hasAdvancedSection && (\n <div className=\"rte-link-dialog-advanced-section\">\n <button\n type=\"button\"\n className=\"rte-link-dialog-toggle\"\n onClick={() => setShowAdvanced(!showAdvanced)}\n onMouseDown={(e) => e.preventDefault()}\n >\n <span>\n {showAdvanced ? \"▾\" : \"▸\"} Erweitert\n </span>\n </button>\n\n {showAdvanced && (\n <div className=\"rte-link-dialog-advanced\">\n {/* Custom fields */}\n {customFields.map((field) => (\n <div\n key={field.key}\n className=\"rte-link-dialog-field\"\n >\n <label className=\"rte-link-dialog-label\">\n {field.label}\n </label>\n <input\n type=\"text\"\n className=\"rte-link-dialog-input\"\n value={data.custom[field.key] || \"\"}\n onChange={(e) =>\n setCustom(\n field.key,\n e.target.value\n )\n }\n placeholder={field.placeholder}\n />\n </div>\n ))}\n\n {/* Target checkbox */}\n {options.enableTarget && (\n <label className=\"rte-link-dialog-checkbox-row\">\n <input\n type=\"checkbox\"\n checked={data.target === \"_blank\"}\n onChange={(e) =>\n setField(\n \"target\",\n e.target.checked\n ? \"_blank\"\n : \"_self\"\n )\n }\n />\n <span>Open in new tab</span>\n </label>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"rte-link-dialog-actions\">\n {isEditing && (\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn rte-link-dialog-btn-danger\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemove}\n >\n Entfernen\n </button>\n )}\n <div style={{ flex: 1 }} />\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onClose}\n >\n Abbrechen\n </button>\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn rte-link-dialog-btn-primary\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onSave(data)}\n disabled={\n !data.url.trim() || data.url.trim() === \"https://\"\n }\n >\n Speichern\n </button>\n </div>\n </div>,\n document.body\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Helpers\n ══════════════════════════════════════════════════════════════════════ */\n\n/** Find the <a> element at the current selection. */\nfunction getSelectedLink(): HTMLAnchorElement | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return el?.closest(\"a\") as HTMLAnchorElement | null;\n}\n\n/** Read link data from an <a> element. */\nfunction readLinkData(\n link: HTMLAnchorElement,\n customFields: LinkCustomField[]\n): LinkData {\n const href = link.getAttribute(\"href\") || \"https://\";\n const custom: Record<string, string> = {};\n\n // Read custom field values from data-attributes\n for (const field of customFields) {\n custom[field.key] = link.getAttribute(field.dataAttribute) || \"\";\n }\n\n // If a field with appendToHref has a value, strip it from the URL\n let url = href;\n for (const field of customFields) {\n if (field.appendToHref && custom[field.key] && href.endsWith(custom[field.key])) {\n url = href.slice(0, href.length - custom[field.key].length);\n }\n }\n\n return {\n url,\n target: link.getAttribute(\"target\") || \"_self\",\n custom,\n };\n}\n\n/** Apply link data attributes to an <a> element. */\nfunction applyLinkData(\n link: HTMLAnchorElement,\n data: LinkData,\n customFields: LinkCustomField[]\n): void {\n // Build href: url + any appendToHref custom fields\n let href = data.url;\n for (const field of customFields) {\n if (field.appendToHref && data.custom[field.key]) {\n href += data.custom[field.key];\n }\n }\n link.setAttribute(\"href\", href);\n\n // Target\n if (data.target && data.target !== \"_self\") {\n link.setAttribute(\"target\", data.target);\n } else {\n link.removeAttribute(\"target\");\n }\n\n // Custom field data-attributes\n for (const field of customFields) {\n const value = data.custom[field.key];\n if (value) {\n link.setAttribute(field.dataAttribute, value);\n } else {\n link.removeAttribute(field.dataAttribute);\n }\n }\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Link Toolbar Button + Floating Editor orchestrator\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface LinkButtonProps extends ButtonProps {\n editorAPI?: EditorAPI;\n enableTarget: boolean;\n customFields: LinkCustomField[];\n}\n\nconst LinkToolbarButton: React.FC<LinkButtonProps> = (props) => {\n const { enableTarget, customFields } = props;\n\n const [showDialog, setShowDialog] = useState(false);\n const [linkData, setLinkData] = useState<LinkData>(() =>\n createEmptyLinkData(customFields)\n );\n const [isEditing, setIsEditing] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n const savedRangeRef = useRef<Range | null>(null);\n const isOpenRef = useRef(false);\n\n useEffect(() => {\n isOpenRef.current = showDialog;\n }, [showDialog]);\n\n // ── Open dialog ─────────────────────────────────────────────────\n const openDialog = useCallback(\n (existingLink?: HTMLAnchorElement | null) => {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n\n savedRangeRef.current = sel.getRangeAt(0).cloneRange();\n\n const link = existingLink || getSelectedLink();\n\n if (link) {\n setIsEditing(true);\n setLinkData(readLinkData(link, customFields));\n setAnchorRect(link.getBoundingClientRect());\n } else {\n setIsEditing(false);\n setLinkData(createEmptyLinkData(customFields));\n const range = sel.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n const node = range.commonAncestorContainer;\n const el =\n node.nodeType === Node.TEXT_NODE\n ? node.parentElement\n : (node as HTMLElement);\n if (el) {\n setAnchorRect(el.getBoundingClientRect());\n }\n } else {\n setAnchorRect(rect);\n }\n }\n\n setShowDialog(true);\n },\n [customFields]\n );\n\n // ── Click on links in the editor ────────────────────────────────\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\") as HTMLAnchorElement | null;\n const editorRoot = target.closest(\"[contenteditable]\");\n\n if (!link || !editorRoot) return;\n\n // Cmd/Ctrl+Click → open in new tab\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n const href = link.getAttribute(\"href\");\n if (href) window.open(href, \"_blank\");\n return;\n }\n\n if (isOpenRef.current) return;\n\n setTimeout(() => {\n if (!isOpenRef.current) {\n openDialog(link);\n }\n }, 10);\n };\n\n document.addEventListener(\"click\", handler);\n return () => document.removeEventListener(\"click\", handler);\n }, [openDialog]);\n\n // ── Restore selection ───────────────────────────────────────────\n const restoreSelection = useCallback(() => {\n if (savedRangeRef.current) {\n const sel = document.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(savedRangeRef.current);\n }\n }\n }, []);\n\n // ── Save ────────────────────────────────────────────────────────\n const handleSave = useCallback(\n (data: LinkData) => {\n setShowDialog(false);\n restoreSelection();\n\n const existingLink = getSelectedLink();\n\n if (existingLink) {\n applyLinkData(existingLink, data, customFields);\n } else {\n let href = data.url;\n for (const field of customFields) {\n if (field.appendToHref && data.custom[field.key]) {\n href += data.custom[field.key];\n }\n }\n document.execCommand(\"createLink\", false, href);\n const newLink = getSelectedLink();\n if (newLink) {\n applyLinkData(newLink, data, customFields);\n }\n }\n\n // Move cursor after the link\n setTimeout(() => {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const link = getSelectedLink();\n if (link) {\n const range = document.createRange();\n range.setStartAfter(link);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }, 0);\n },\n [restoreSelection, customFields]\n );\n\n // ── Remove link ─────────────────────────────────────────────────\n const handleRemove = useCallback(() => {\n setShowDialog(false);\n restoreSelection();\n\n const link = getSelectedLink();\n if (link) {\n const parent = link.parentNode;\n if (parent) {\n while (link.firstChild) {\n parent.insertBefore(link.firstChild, link);\n }\n parent.removeChild(link);\n }\n }\n }, [restoreSelection]);\n\n // ── Close ───────────────────────────────────────────────────────\n const handleClose = useCallback(() => {\n setShowDialog(false);\n restoreSelection();\n\n setTimeout(() => {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const link = getSelectedLink();\n if (link) {\n const lastChild = link.lastChild;\n if (lastChild) {\n const range = document.createRange();\n range.setStartAfter(lastChild);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n }, 0);\n }, [restoreSelection]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => openDialog()}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Link (⌘K)\"\n aria-label=\"Link\"\n >\n <IconWrapper icon=\"mdi:link\" width={18} height={18} />\n </button>\n {showDialog && anchorRect && (\n <FloatingLinkEditor\n linkData={linkData}\n options={{ enableTarget, customFields }}\n anchorRect={anchorRect}\n isEditing={isEditing}\n onSave={handleSave}\n onRemove={handleRemove}\n onClose={handleClose}\n />\n )}\n </>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Plugin factory + export\n ══════════════════════════════════════════════════════════════════════ */\n\n/**\n * Creates an advanced link plugin with a floating dialog.\n *\n * Core features (always available):\n * - URL input\n * - \"Open in new tab\" checkbox (enableTarget)\n * - Cmd/Ctrl+Click → open link in new tab\n * - Click on link → edit it inline\n *\n * Platform-specific fields (injected via `customFields`):\n * - Each field is rendered in the \"Advanced\" section\n * - Values are stored as data-attributes on the <a> element\n * - `appendToHref` fields have their value appended to the href\n * - `disablesUrl` fields disable the URL input when they have a value\n */\nexport function createAdvancedLinkPlugin(\n options: AdvancedLinkOptions = {}\n): Plugin {\n const enableTarget = options.enableTarget ?? true;\n const customFields = options.customFields ?? [];\n\n return {\n name: \"advancedLink\",\n type: \"inline\",\n renderButton: (props: ButtonProps & { [key: string]: unknown }) => (\n <LinkToolbarButton\n {...props}\n editorAPI={props.editorAPI as EditorAPI | undefined}\n enableTarget={enableTarget}\n customFields={customFields}\n />\n ),\n execute: () => {\n // Handled by the dialog component\n },\n isActive: () => {\n if (typeof document === \"undefined\") return false;\n return getSelectedLink() !== null;\n },\n canExecute: () => {\n const sel = document.getSelection();\n return sel !== null && sel.rangeCount > 0;\n },\n };\n}\n\n/** Pre-built link plugin with just target enabled (no custom fields). */\nexport const advancedLinkPlugin: Plugin = createAdvancedLinkPlugin();\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport {\n createTable,\n deleteColumn,\n deleteRow,\n deleteTable,\n getActiveCell,\n getActiveTable,\n insertColumn,\n insertRow,\n} from \"../utils/table\";\n\n/* ══════════════════════════════════════════════════════════════════════════\n Insert Table Dialog — rendered inside the toolbar button\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface InsertDialogProps {\n onInsert: (rows: number, cols: number) => void;\n onClose: () => void;\n}\n\nconst InsertTableDialog: React.FC<InsertDialogProps> = ({\n onInsert,\n onClose,\n}) => {\n const [rows, setRows] = useState(3);\n const [cols, setCols] = useState(3);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (\n dialogRef.current &&\n !dialogRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n return (\n <div className=\"rte-table-insert-dialog\" ref={dialogRef}>\n <div className=\"rte-table-insert-title\">Insert Table</div>\n <div className=\"rte-table-insert-fields\">\n <label className=\"rte-table-insert-label\">\n <span>Zeilen</span>\n <input\n type=\"number\"\n min={1}\n max={20}\n value={rows}\n onChange={(e) =>\n setRows(\n Math.max(\n 1,\n Math.min(20, parseInt(e.target.value) || 1)\n )\n )\n }\n className=\"rte-table-insert-input\"\n />\n </label>\n <label className=\"rte-table-insert-label\">\n <span>Spalten</span>\n <input\n type=\"number\"\n min={1}\n max={10}\n value={cols}\n onChange={(e) =>\n setCols(\n Math.max(\n 1,\n Math.min(10, parseInt(e.target.value) || 1)\n )\n )\n }\n className=\"rte-table-insert-input\"\n />\n </label>\n </div>\n <button\n type=\"button\"\n className=\"rte-table-insert-btn\"\n onClick={() => onInsert(rows, cols)}\n >\n Insert\n </button>\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Context Menu — rendered as a portal when right-clicking in a cell\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface ContextMenuProps {\n x: number;\n y: number;\n onClose: () => void;\n}\n\nconst TableContextMenu: React.FC<ContextMenuProps> = ({\n x,\n y,\n onClose,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n const action = (fn: () => void) => {\n fn();\n onClose();\n };\n\n return (\n <div\n ref={ref}\n className=\"rte-table-context-menu\"\n style={{ position: \"fixed\", left: x, top: y }}\n >\n <button\n type=\"button\"\n onClick={() => action(() => insertRow(\"above\"))}\n >\n Insert row above\n </button>\n <button\n type=\"button\"\n onClick={() => action(() => insertRow(\"below\"))}\n >\n Insert row below\n </button>\n <div className=\"rte-table-context-divider\" />\n <button\n type=\"button\"\n onClick={() => action(() => insertColumn(\"left\"))}\n >\n Insert column left\n </button>\n <button\n type=\"button\"\n onClick={() => action(() => insertColumn(\"right\"))}\n >\n Insert column right\n </button>\n <div className=\"rte-table-context-divider\" />\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteRow)}\n >\n Delete row\n </button>\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteColumn)}\n >\n Delete column\n </button>\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteTable)}\n >\n Delete table\n </button>\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Toolbar Button (stateful — opens insert dialog)\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface TableButtonProps extends ButtonProps {\n editorAPI?: EditorAPI;\n}\n\nconst TableToolbarButton: React.FC<TableButtonProps> = (props) => {\n const [showDialog, setShowDialog] = useState(false);\n\n const handleInsert = useCallback(\n (rows: number, cols: number) => {\n setShowDialog(false);\n if (!props.editorAPI) return;\n\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n // Find the editor's contentEditable root\n const container = range.commonAncestorContainer;\n const editorEl =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const editorRoot = editorEl?.closest(\"[contenteditable]\");\n if (!editorRoot) return;\n\n const table = createTable(rows, cols);\n\n // Insert after the current block element\n let block: HTMLElement | null = editorEl;\n while (\n block &&\n block !== editorRoot &&\n block.parentElement !== editorRoot\n ) {\n block = block.parentElement;\n }\n\n if (block && block !== editorRoot) {\n block.parentNode?.insertBefore(table, block.nextSibling);\n } else {\n editorRoot.appendChild(table);\n }\n\n // Add a paragraph after the table so the user can continue typing\n const p = document.createElement(\"p\");\n p.innerHTML = \"<br>\";\n table.parentNode?.insertBefore(p, table.nextSibling);\n\n // Focus the first cell\n const firstCell = table.querySelector(\"td, th\") as HTMLTableCellElement | null;\n if (firstCell) {\n const newRange = document.createRange();\n newRange.setStart(firstCell, 0);\n newRange.collapse(true);\n sel.removeAllRanges();\n sel.addRange(newRange);\n }\n },\n [props.editorAPI]\n );\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n onClick={() => setShowDialog(!showDialog)}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Table\"\n aria-label=\"Table\"\n >\n <IconWrapper icon=\"mdi:table\" width={18} height={18} />\n </button>\n {showDialog && (\n <InsertTableDialog\n onInsert={handleInsert}\n onClose={() => setShowDialog(false)}\n />\n )}\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Plugin export\n ══════════════════════════════════════════════════════════════════════ */\n\nexport const tablePlugin: Plugin = {\n name: \"table\",\n type: \"command\",\n renderButton: (props: ButtonProps & { [key: string]: unknown }) => (\n <TableToolbarButton\n {...props}\n editorAPI={props.editorAPI as EditorAPI | undefined}\n />\n ),\n execute: () => {\n // Insertion is handled by the dialog component\n },\n isActive: () => getActiveTable() !== null,\n canExecute: () => true,\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n TableContextMenuProvider — wrap the editor to enable right-click menu\n ══════════════════════════════════════════════════════════════════════ */\n\nexport const TableContextMenuProvider: React.FC<{\n children: React.ReactNode;\n}> = ({ children }) => {\n const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const cell = target.closest(\"td, th\");\n const editorRoot = target.closest(\"[contenteditable]\");\n if (cell && editorRoot) {\n e.preventDefault();\n setMenu({ x: e.clientX, y: e.clientY });\n }\n };\n document.addEventListener(\"contextmenu\", handler);\n return () => document.removeEventListener(\"contextmenu\", handler);\n }, []);\n\n return (\n <>\n {children}\n {menu && (\n <TableContextMenu\n x={menu.x}\n y={menu.y}\n onClose={() => setMenu(null)}\n />\n )}\n </>\n );\n};\n","import { Plugin } from \"../types\";\nimport {\n boldPlugin,\n italicPlugin,\n underlinePlugin,\n strikethroughPlugin,\n subscriptPlugin,\n superscriptPlugin,\n codeInlinePlugin,\n undoPlugin,\n redoPlugin,\n indentListItemPlugin,\n outdentListItemPlugin,\n} from \"../plugins\";\nimport { createBlockFormatPlugin } from \"../plugins/blockFormat\";\nimport { clearFormattingPlugin } from \"../plugins/clearFormatting\";\nimport { createTextColorPlugin } from \"../plugins/colors\";\nimport { createFontSizePlugin } from \"../plugins/fontSize\";\nimport { createAlignmentPlugin } from \"../plugins/alignment\";\nimport { createAdvancedLinkPlugin, LinkCustomField } from \"../plugins/linkDialog\";\nimport { tablePlugin } from \"../plugins/table\";\nimport { createImagePlugin } from \"../plugins/image\";\n\n/* ======================================================================\n EditorSettings — matches the Hendriks settings object 1:1\n ====================================================================== */\n\nexport interface EditorSettings {\n format?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n bulletList?: boolean;\n numberedList?: boolean;\n quote?: boolean;\n codeBlock?: boolean;\n check?: boolean;\n /** Heading levels to enable, e.g. [\"h1\", \"h2\", \"h3\"] */\n typography?: string[];\n /** Color palette for text color, e.g. [\"#000\", \"#ff0000\"] */\n colors?: string[];\n /** Enable font size dropdown */\n fontSize?: boolean;\n /** Alignment options, e.g. [\"left\", \"center\", \"right\", \"justify\", \"indent\", \"outdent\"] */\n alignment?: string[];\n };\n link?: {\n external?: boolean;\n internal?: boolean;\n };\n table?: {\n enabled?: boolean;\n };\n image?: {\n enabled?: boolean;\n };\n}\n\n/** Default: everything enabled. */\nexport const defaultEditorSettings: EditorSettings = {\n format: {\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n code: true,\n subscript: true,\n superscript: true,\n bulletList: true,\n numberedList: true,\n quote: true,\n codeBlock: true,\n check: true,\n typography: [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"],\n colors: [\n \"#000000\", \"#434343\", \"#666666\", \"#999999\", \"#b7b7b7\", \"#cccccc\", \"#d9d9d9\", \"#ffffff\",\n \"#ff0000\", \"#ff9900\", \"#ffff00\", \"#00ff00\", \"#00ffff\", \"#0000ff\", \"#9900ff\", \"#ff00ff\",\n ],\n fontSize: true,\n alignment: [\"left\", \"center\", \"right\", \"justify\", \"outdent\", \"indent\"],\n },\n link: {\n external: true,\n internal: true,\n },\n table: {\n enabled: true,\n },\n image: {\n enabled: true,\n },\n};\n\n/* ======================================================================\n buildPluginsFromSettings — convert settings object to Plugin[]\n ====================================================================== */\n\nexport interface BuildPluginsOptions {\n /** Callback for image uploads (required when image.enabled is true). */\n onImageUpload?: (file: File) => Promise<string>;\n /** Custom fields for the advanced link dialog (e.g. urlExtra, pageRef). */\n linkCustomFields?: LinkCustomField[];\n /** Custom font sizes for the font size dropdown. */\n fontSizes?: number[];\n}\n\n/**\n * Builds a Plugin[] array from an EditorSettings object.\n *\n * Usage:\n * ```ts\n * const plugins = buildPluginsFromSettings(settings, {\n * onImageUpload: handleUpload,\n * linkCustomFields: [{ key: 'urlExtra', ... }],\n * });\n * ```\n */\nexport function buildPluginsFromSettings(\n settings: EditorSettings = defaultEditorSettings,\n options: BuildPluginsOptions = {}\n): Plugin[] {\n const fmt = settings.format ?? {};\n const plugins: Plugin[] = [];\n\n // Always: Undo / Redo\n plugins.push(undoPlugin);\n plugins.push(redoPlugin);\n\n // Block format dropdown (headings, lists, quote, checkbox)\n const headings = fmt.typography ?? [];\n plugins.push(\n createBlockFormatPlugin(headings.length > 0 ? headings : undefined, {\n bulletList: fmt.bulletList,\n numberedList: fmt.numberedList,\n quote: fmt.quote,\n codeBlock: fmt.codeBlock,\n check: fmt.check,\n })\n );\n\n // Font size\n if (fmt.fontSize) {\n const sizes = options.fontSizes ?? [12, 14, 16, 18, 20, 24, 28, 32];\n plugins.push(createFontSizePlugin(sizes));\n }\n\n // Inline formatting\n if (fmt.bold !== false) plugins.push(boldPlugin);\n if (fmt.italic !== false) plugins.push(italicPlugin);\n if (fmt.underline !== false) plugins.push(underlinePlugin);\n if (fmt.strikethrough) plugins.push(strikethroughPlugin);\n\n // Link\n if (settings.link?.external || settings.link?.internal) {\n plugins.push(\n createAdvancedLinkPlugin({\n enableTarget: true,\n customFields: options.linkCustomFields,\n })\n );\n }\n\n // Colors\n if (fmt.colors && fmt.colors.length > 0) {\n plugins.push(createTextColorPlugin(fmt.colors));\n }\n\n // Extra inline formatting (code, subscript, superscript)\n if (fmt.code) plugins.push(codeInlinePlugin);\n if (fmt.subscript) plugins.push(subscriptPlugin);\n if (fmt.superscript) plugins.push(superscriptPlugin);\n\n // Table\n if (settings.table?.enabled) {\n plugins.push(tablePlugin);\n }\n\n // Alignment\n if (fmt.alignment && fmt.alignment.length > 0) {\n const supported = [\"left\", \"center\", \"right\", \"justify\"];\n const alignments = fmt.alignment.filter((a) => supported.includes(a));\n if (alignments.length > 0) {\n plugins.push(createAlignmentPlugin(alignments));\n }\n }\n\n // Image\n if (settings.image?.enabled && options.onImageUpload) {\n plugins.push(createImagePlugin(options.onImageUpload));\n }\n\n // Always: Clear formatting\n plugins.push(clearFormattingPlugin);\n\n // Indent / Outdent (controlled by alignment setting)\n const alignArr = fmt.alignment ?? [];\n if (alignArr.includes(\"indent\")) plugins.push(indentListItemPlugin);\n if (alignArr.includes(\"outdent\")) plugins.push(outdentListItemPlugin);\n\n return plugins;\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\ninterface FloatingToolbarProps {\n plugins: Plugin[];\n editorAPI: EditorAPI;\n editorElement: HTMLElement | null;\n}\n\n/**\n * Floating toolbar that appears above the current text selection.\n * Uses position:fixed with viewport coordinates for reliable placement.\n */\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n plugins,\n editorAPI,\n editorElement,\n}) => {\n const [pos, setPos] = useState({ top: 0, left: 0, visible: false });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number | null>(null);\n const visibleRef = useRef(false);\n\n // Keep ref in sync so event handlers never read stale state\n visibleRef.current = pos.visible;\n\n const leftPlugins = plugins.filter((p) => p.name !== \"clearFormatting\");\n const clearFormattingPlugin = plugins.find((p) => p.name === \"clearFormatting\");\n\n // Core: compute position from current selection\n const updatePosition = useCallback(() => {\n if (typeof window === \"undefined\" || !editorElement) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n // Hide when selection is collapsed (just a cursor)\n if (range.collapsed) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n // Hide when selection is outside the editor\n if (!editorElement.contains(range.commonAncestorContainer)) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const rect = range.getBoundingClientRect();\n const toolbarH = toolbarRef.current?.offsetHeight || 40;\n const toolbarW = toolbarRef.current?.offsetWidth || 200;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = 8;\n\n // Prefer above the selection, fall back to below\n let top = rect.top - toolbarH - pad;\n if (top < pad) {\n top = rect.bottom + pad;\n }\n if (top + toolbarH > vh - pad) {\n top = Math.max(pad, rect.top - toolbarH - pad);\n }\n\n // Center horizontally on the selection, clamp to viewport\n let left = rect.left + rect.width / 2 - toolbarW / 2;\n if (left < pad) left = pad;\n if (left + toolbarW > vw - pad) left = vw - toolbarW - pad;\n\n setPos({ top, left, visible: true });\n }, [editorElement]);\n\n // Debounce via requestAnimationFrame for smooth repositioning\n const scheduleUpdate = useCallback(() => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(updatePosition);\n }, [updatePosition]);\n\n // Single set of event listeners -- no deps on visible state\n useEffect(() => {\n // selectionchange covers both mouse and keyboard selection changes\n const onSelectionChange = () => scheduleUpdate();\n\n // Reposition on scroll (capture phase to catch nested scrolls) and resize\n const onScrollOrResize = () => {\n if (visibleRef.current) scheduleUpdate();\n };\n\n document.addEventListener(\"selectionchange\", onSelectionChange);\n window.addEventListener(\"scroll\", onScrollOrResize, true);\n window.addEventListener(\"resize\", onScrollOrResize);\n\n return () => {\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n window.removeEventListener(\"scroll\", onScrollOrResize, true);\n window.removeEventListener(\"resize\", onScrollOrResize);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [scheduleUpdate]);\n\n const handlePluginClick = useCallback(\n (plugin: Plugin, value?: string) => {\n if (plugin.canExecute?.(editorAPI) === false) return;\n\n if (plugin.execute) {\n plugin.execute(editorAPI, value);\n } else if (plugin.command && value !== undefined) {\n editorAPI.executeCommand(plugin.command, value);\n } else if (plugin.command) {\n editorAPI.executeCommand(plugin.command);\n }\n\n // Re-check position after formatting changes\n requestAnimationFrame(() => scheduleUpdate());\n },\n [editorAPI, scheduleUpdate]\n );\n\n const isHidden = !pos.visible || leftPlugins.length === 0;\n\n return (\n <div\n ref={toolbarRef}\n className=\"rte-floating-toolbar\"\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n visibility: isHidden ? \"hidden\" : \"visible\",\n opacity: isHidden ? 0 : 1,\n pointerEvents: isHidden ? \"none\" : \"auto\",\n }}\n // Prevent selection loss when clicking toolbar buttons\n onMouseDown={(e) => e.preventDefault()}\n >\n <div className=\"rte-floating-toolbar-content\">\n <div className=\"rte-toolbar-left\">\n {leftPlugins.map((plugin) => {\n if (!plugin.renderButton) return null;\n\n const isActive = plugin.isActive\n ? plugin.isActive(editorAPI)\n : false;\n const canExecute = plugin.canExecute\n ? plugin.canExecute(editorAPI)\n : true;\n const currentValue = plugin.getCurrentValue\n ? plugin.getCurrentValue(editorAPI)\n : undefined;\n\n const buttonProps: ButtonProps & Record<string, unknown> = {\n isActive,\n onClick: () => handlePluginClick(plugin),\n disabled: !canExecute,\n onSelect: (value: string) =>\n handlePluginClick(plugin, value),\n editorAPI,\n currentValue,\n };\n\n return (\n <React.Fragment key={plugin.name}>\n {plugin.renderButton(buttonProps)}\n </React.Fragment>\n );\n })}\n </div>\n\n {clearFormattingPlugin?.renderButton && (\n <div className=\"rte-toolbar-right\">\n <div className=\"rte-toolbar-divider\" />\n {(() => {\n const isActive = clearFormattingPlugin.isActive\n ? clearFormattingPlugin.isActive(editorAPI)\n : false;\n const canExecute = clearFormattingPlugin.canExecute\n ? clearFormattingPlugin.canExecute(editorAPI)\n : true;\n\n return clearFormattingPlugin.renderButton({\n isActive,\n onClick: () => handlePluginClick(clearFormattingPlugin),\n disabled: !canExecute,\n editorAPI,\n } as ButtonProps & Record<string, unknown>);\n })()}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Icon } from \"./Icons\";\n\ninterface LinkTooltipProps {\n editorElement: HTMLElement | null;\n}\n\ninterface TooltipState {\n visible: boolean;\n top: number;\n left: number;\n href: string;\n anchor: HTMLAnchorElement | null;\n}\n\n/**\n * Shows a tooltip with URL, edit link, and open link actions\n * when hovering over an <a> element in the editor.\n */\nexport const LinkTooltip: React.FC<LinkTooltipProps> = ({ editorElement }) => {\n const [state, setState] = useState<TooltipState>({\n visible: false,\n top: 0,\n left: 0,\n href: \"\",\n anchor: null,\n });\n const tooltipRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const show = useCallback((anchor: HTMLAnchorElement) => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n const rect = anchor.getBoundingClientRect();\n const tooltipH = 36;\n const pad = 6;\n\n let top = rect.bottom + pad;\n if (top + tooltipH > window.innerHeight - pad) {\n top = rect.top - tooltipH - pad;\n }\n\n const left = Math.max(pad, Math.min(rect.left, window.innerWidth - 400 - pad));\n\n setState({\n visible: true,\n top,\n left,\n href: anchor.href,\n anchor,\n });\n }, []);\n\n const scheduleHide = useCallback(() => {\n hideTimeoutRef.current = setTimeout(() => {\n setState((prev) => ({ ...prev, visible: false, anchor: null }));\n }, 200);\n }, []);\n\n useEffect(() => {\n if (!editorElement) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest(\"a\") as HTMLAnchorElement | null;\n if (anchor && editorElement.contains(anchor)) {\n show(anchor);\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = e.relatedTarget as HTMLElement | null;\n if (!target) {\n scheduleHide();\n return;\n }\n // If moving to the tooltip itself, don't hide\n if (tooltipRef.current?.contains(target)) return;\n // If still on a link, don't hide\n if (target.closest?.(\"a\") && editorElement.contains(target)) return;\n scheduleHide();\n };\n\n editorElement.addEventListener(\"mouseover\", handleMouseOver);\n editorElement.addEventListener(\"mouseout\", handleMouseOut);\n\n return () => {\n editorElement.removeEventListener(\"mouseover\", handleMouseOver);\n editorElement.removeEventListener(\"mouseout\", handleMouseOut);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n };\n }, [editorElement, show, scheduleHide]);\n\n const handleTooltipMouseEnter = () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n };\n\n const handleTooltipMouseLeave = () => {\n scheduleHide();\n };\n\n const handleOpen = () => {\n if (state.href) {\n window.open(state.href, \"_blank\", \"noopener,noreferrer\");\n }\n };\n\n const handleCopy = () => {\n if (state.href) {\n navigator.clipboard.writeText(state.href).catch(() => {\n // Fallback: do nothing\n });\n }\n };\n\n if (!state.visible) return null;\n\n return (\n <div\n ref={tooltipRef}\n className=\"rte-link-tooltip\"\n style={{\n position: \"fixed\",\n top: state.top,\n left: state.left,\n }}\n onMouseEnter={handleTooltipMouseEnter}\n onMouseLeave={handleTooltipMouseLeave}\n >\n <span className=\"rte-link-tooltip-url\" title={state.href}>\n {state.href}\n </span>\n <div className=\"rte-link-tooltip-actions\">\n <button\n type=\"button\"\n className=\"rte-link-tooltip-btn\"\n title=\"Open link\"\n aria-label=\"Open link\"\n onClick={handleOpen}\n >\n <Icon icon=\"mdi:open-in-new\" width={14} height={14} />\n </button>\n <button\n type=\"button\"\n className=\"rte-link-tooltip-btn\"\n title=\"Copy link\"\n aria-label=\"Copy link\"\n onClick={handleCopy}\n >\n <Icon icon=\"mdi:content-copy\" width={14} height={14} />\n </button>\n </div>\n </div>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\ninterface ToolbarProps {\n plugins: Plugin[];\n editorAPI: EditorAPI;\n className?: string;\n}\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n plugins,\n editorAPI,\n className,\n}) => {\n const [updateTrigger, setUpdateTrigger] = useState(0);\n const [isClient, setIsClient] = useState(false);\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setIsClient(true);\n \n const handleSelectionChange = () => {\n setUpdateTrigger((prev) => prev + 1);\n };\n\n const handleMouseUp = () => {\n setTimeout(handleSelectionChange, 10);\n };\n\n const handleKeyUp = () => {\n setTimeout(handleSelectionChange, 10);\n };\n\n if (typeof document !== 'undefined') {\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"keyup\", handleKeyUp);\n }\n\n return () => {\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n \"selectionchange\",\n handleSelectionChange\n );\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"keyup\", handleKeyUp);\n }\n };\n }, []);\n\n const handlePluginClick = (plugin: Plugin, value?: string) => {\n if (plugin.canExecute?.(editorAPI) !== false) {\n if (plugin.execute) {\n plugin.execute(editorAPI, value);\n } else if (plugin.command && value !== undefined) {\n editorAPI.executeCommand(plugin.command, value);\n } else if (plugin.command) {\n editorAPI.executeCommand(plugin.command);\n }\n setTimeout(() => setUpdateTrigger((prev) => prev + 1), 50);\n }\n };\n\n const leftPlugins = plugins.filter((p) => p.name !== \"clearFormatting\");\n const clearFormattingPlugin = plugins.find(\n (p) => p.name === \"clearFormatting\"\n );\n\n // Roving tabindex keyboard navigation (ARIA toolbar pattern)\n const handleToolbarKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\" && e.key !== \"Home\" && e.key !== \"End\") return;\n\n const toolbar = toolbarRef.current;\n if (!toolbar) return;\n\n const buttons = Array.from(\n toolbar.querySelectorAll<HTMLButtonElement>(\n \"button:not(:disabled)\"\n )\n );\n if (buttons.length === 0) return;\n\n const currentIndex = buttons.indexOf(\n document.activeElement as HTMLButtonElement\n );\n if (currentIndex === -1) return;\n\n e.preventDefault();\n\n let nextIndex: number;\n switch (e.key) {\n case \"ArrowRight\":\n nextIndex = (currentIndex + 1) % buttons.length;\n break;\n case \"ArrowLeft\":\n nextIndex = (currentIndex - 1 + buttons.length) % buttons.length;\n break;\n case \"Home\":\n nextIndex = 0;\n break;\n case \"End\":\n nextIndex = buttons.length - 1;\n break;\n default:\n return;\n }\n\n buttons[nextIndex].focus();\n }, []);\n\n return (\n <div\n ref={toolbarRef}\n className={`rte-toolbar rte-toolbar-sticky ${className || \"\"}`}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={handleToolbarKeyDown}\n role=\"toolbar\"\n aria-label=\"Text formatting\"\n >\n <div className=\"rte-toolbar-left\">\n {leftPlugins.map((plugin) => {\n if (!plugin.renderButton) return null;\n\n const isActive = isClient && plugin.isActive\n ? plugin.isActive(editorAPI)\n : false;\n const canExecute = isClient && plugin.canExecute\n ? plugin.canExecute(editorAPI)\n : true;\n\n const currentValue = isClient && plugin.getCurrentValue\n ? plugin.getCurrentValue(editorAPI)\n : undefined;\n\n const buttonProps: ButtonProps & { [key: string]: any } = {\n isActive,\n onClick: () => handlePluginClick(plugin),\n disabled: !canExecute,\n onSelect: (value: string) =>\n handlePluginClick(plugin, value),\n editorAPI,\n currentValue,\n };\n\n return (\n <React.Fragment key={plugin.name}>\n {plugin.renderButton(buttonProps)}\n </React.Fragment>\n );\n })}\n </div>\n\n {clearFormattingPlugin && clearFormattingPlugin.renderButton && (\n <div className=\"rte-toolbar-right\">\n <div className=\"rte-toolbar-divider\" />\n {(() => {\n const isActive = isClient && clearFormattingPlugin.isActive\n ? clearFormattingPlugin.isActive(editorAPI)\n : false;\n const canExecute = isClient && clearFormattingPlugin.canExecute\n ? clearFormattingPlugin.canExecute(editorAPI)\n : true;\n\n const buttonProps: ButtonProps & {\n [key: string]: any;\n } = {\n isActive,\n onClick: () =>\n handlePluginClick(clearFormattingPlugin),\n disabled: !canExecute,\n editorAPI,\n };\n\n return (\n <React.Fragment key={clearFormattingPlugin.name}>\n {clearFormattingPlugin.renderButton(\n buttonProps\n )}\n </React.Fragment>\n );\n })()}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCheckbox } from \"../hooks/useCheckbox\";\nimport { useEditorEvents } from \"../hooks/useEditorEvents\";\nimport { useEditorInit } from \"../hooks/useEditorInit\";\nimport { defaultPlugins } from \"../plugins\";\nimport { createBlockFormatPlugin } from \"../plugins/blockFormat\";\nimport {\n createBackgroundColorPlugin,\n createTextColorPlugin,\n} from \"../plugins/colors\";\nimport { createFontSizePlugin } from \"../plugins/fontSize\";\nimport { createImagePlugin } from \"../plugins/image\";\nimport { EditorAPI, EditorContent, EditorProps } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport {\n clearBackgroundColor,\n clearFontSize,\n clearFormatting,\n clearLinks,\n clearTextColor,\n} from \"../utils/clearFormatting\";\nimport {\n contentToDOM,\n contentToHTML,\n createEmptyContent,\n domToContent,\n htmlToContent,\n} from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\nimport { indentListItem, outdentListItem } from \"../utils/listIndent\";\nimport { sanitizeHtml } from \"../utils/sanitize\";\nimport {\n serializeSelection,\n restoreSerializedSelection,\n} from \"../utils/selection\";\nimport { buildPluginsFromSettings } from \"../utils/settings\";\nimport { FloatingToolbar } from \"./FloatingToolbar\";\nimport { LinkTooltip } from \"./LinkTooltip\";\nimport { Toolbar } from \"./Toolbar\";\n\nexport const Editor: React.FC<EditorProps> = ({\n initialContent,\n onChange,\n plugins: providedPlugins,\n placeholder = \"Enter text...\",\n className,\n toolbarClassName,\n editorClassName,\n fontSizes,\n colors,\n headings,\n customLinkComponent,\n customHeadingRenderer,\n customRenderer,\n onEditorAPIReady,\n theme,\n onImageUpload,\n settings,\n settingsOptions,\n readOnly,\n onFocus,\n onBlur,\n maxLength,\n showWordCount,\n}) => {\n // --- Shared Refs ---\n const editorRef = useRef<HTMLDivElement>(null);\n const historyRef = useRef<HistoryManager>(new HistoryManager());\n const isUpdatingRef = useRef(false);\n\n // --- Plugins ---\n const plugins = useMemo(() => {\n // When settings is provided and plugins is not, use buildPluginsFromSettings\n if (settings && !providedPlugins) {\n const opts = {\n ...settingsOptions,\n onImageUpload: settingsOptions?.onImageUpload ?? onImageUpload,\n };\n return buildPluginsFromSettings(settings, opts);\n }\n\n const allPlugins = [...(providedPlugins || defaultPlugins)];\n\n if (headings && headings.length > 0) {\n const blockFormatIndex = allPlugins.findIndex(\n (p) => p.name === \"blockFormat\",\n );\n if (blockFormatIndex !== -1) {\n allPlugins[blockFormatIndex] =\n createBlockFormatPlugin(headings);\n } else {\n const redoIndex = allPlugins.findIndex(\n (p) => p.name === \"redo\",\n );\n if (redoIndex !== -1) {\n allPlugins.splice(\n redoIndex + 1,\n 0,\n createBlockFormatPlugin(headings),\n );\n } else {\n allPlugins.push(createBlockFormatPlugin(headings));\n }\n }\n }\n\n if (fontSizes && fontSizes.length > 0) {\n const blockFormatIndex = allPlugins.findIndex(\n (p) => p.name === \"blockFormat\",\n );\n if (blockFormatIndex !== -1) {\n allPlugins.splice(\n blockFormatIndex + 1,\n 0,\n createFontSizePlugin(fontSizes),\n );\n } else {\n allPlugins.push(createFontSizePlugin(fontSizes));\n }\n }\n\n if (colors && colors.length > 0) {\n allPlugins.push(createTextColorPlugin(colors));\n allPlugins.push(createBackgroundColorPlugin(colors));\n }\n\n allPlugins.push(createImagePlugin(onImageUpload));\n\n return allPlugins;\n }, [\n providedPlugins,\n fontSizes,\n colors,\n headings,\n onImageUpload,\n settings,\n settingsOptions,\n ]);\n\n // --- Callbacks ---\n const notifyChange = useCallback(\n (content: EditorContent) => {\n if (onChange) onChange(content);\n },\n [onChange],\n );\n\n const getDomContent = useCallback((): EditorContent => {\n const editor = editorRef.current;\n if (!editor) return createEmptyContent();\n return domToContent(editor);\n }, []);\n\n const pushToHistory = useCallback((content: EditorContent) => {\n const editor = editorRef.current;\n const sel = editor ? serializeSelection(editor) : null;\n historyRef.current.push(content, sel);\n }, []);\n\n // --- Hooks ---\n const checkbox = useCheckbox({\n editorRef,\n isUpdatingRef,\n pushToHistory,\n notifyChange,\n getDomContent,\n });\n\n // --- Undo / Redo ---\n const undo = useCallback(() => {\n const entry = historyRef.current.undo();\n const editor = editorRef.current;\n if (entry && editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n entry.content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n restoreSerializedSelection(editor, entry.selection);\n isUpdatingRef.current = false;\n notifyChange(entry.content);\n }\n }, [customLinkComponent, customHeadingRenderer, notifyChange]);\n\n const redo = useCallback(() => {\n const entry = historyRef.current.redo();\n const editor = editorRef.current;\n if (entry && editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n entry.content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n restoreSerializedSelection(editor, entry.selection);\n isUpdatingRef.current = false;\n notifyChange(entry.content);\n }\n }, [customLinkComponent, customHeadingRenderer, notifyChange]);\n\n // --- Editor API ---\n const editorAPI = useMemo<EditorAPI>(() => {\n const executeCommand = (command: string, value?: string): boolean => {\n const editor = editorRef.current;\n if (!editor) return false;\n\n // Save history before non-history commands\n if (\n command !== \"undo\" &&\n command !== \"redo\" &&\n command !== \"insertImage\" &&\n command !== \"insertCheckboxList\"\n ) {\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n }\n\n if (command === \"undo\") {\n undo();\n return true;\n }\n\n if (command === \"redo\") {\n redo();\n return true;\n }\n\n if (command === \"insertCheckboxList\") {\n return checkbox.insertCheckboxList(editor);\n }\n\n if (command === \"insertImage\" && value) {\n return handleInsertImage(\n editor,\n value,\n isUpdatingRef,\n historyRef,\n notifyChange,\n );\n }\n\n // General commands via document.execCommand\n ensureEditorFocused(editor);\n\n document.execCommand(command, false, value);\n\n setTimeout(() => {\n if (editor && !isUpdatingRef.current) {\n ensureAllCheckboxes(editor);\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n\n return true;\n };\n\n return {\n executeCommand,\n\n getSelection: (): Selection | null => {\n if (typeof window === \"undefined\") return null;\n return window.getSelection();\n },\n\n getContent: (): EditorContent => {\n const editor = editorRef.current;\n if (!editor) return createEmptyContent();\n ensureAllCheckboxes(editor);\n return domToContent(editor);\n },\n\n setContent: (content: EditorContent): void => {\n const editor = editorRef.current;\n if (!editor) return;\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n },\n\n insertBlock: (\n type: string,\n attributes?: Record<string, string>,\n ): void => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const block = document.createElement(type);\n if (attributes) {\n Object.entries(attributes).forEach(([key, val]) => {\n block.setAttribute(key, val);\n });\n }\n range.insertNode(block);\n const textNode = document.createTextNode(\"\\u200B\");\n block.appendChild(textNode);\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n const editor = editorRef.current;\n if (editor) notifyChange(domToContent(editor));\n },\n\n insertInline: (\n type: string,\n attributes?: Record<string, string>,\n ): void => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const inline = document.createElement(type);\n if (attributes) {\n Object.entries(attributes).forEach(([key, val]) => {\n inline.setAttribute(key, val);\n });\n }\n try {\n range.surroundContents(inline);\n } catch (_) {\n const contents = range.extractContents();\n inline.appendChild(contents);\n range.insertNode(inline);\n }\n range.setStartAfter(inline);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n const editor = editorRef.current;\n if (editor) notifyChange(domToContent(editor));\n },\n\n undo: (): void => undo(),\n redo: (): void => redo(),\n canUndo: (): boolean => historyRef.current.canUndo(),\n canRedo: (): boolean => historyRef.current.canRedo(),\n\n importHtml: (htmlString: string): EditorContent => {\n const content = htmlToContent(htmlString);\n const editor = editorRef.current;\n if (editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n }\n return content;\n },\n\n exportHtml: (): string => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n return contentToHTML(domToContent(editor));\n },\n\n clearFormatting: (): void => {\n executeWithHistory((selection) => clearFormatting(selection));\n },\n clearTextColor: (): void => {\n executeWithHistory((selection) => clearTextColor(selection));\n },\n clearBackgroundColor: (): void => {\n executeWithHistory((selection) =>\n clearBackgroundColor(selection),\n );\n },\n clearFontSize: (): void => {\n executeWithHistory((selection) => clearFontSize(selection));\n },\n clearLinks: (): void => {\n executeWithHistory((selection) => clearLinks(selection));\n },\n indentListItem: (): void => {\n executeWithHistory((selection) => indentListItem(selection));\n },\n outdentListItem: (): void => {\n executeWithHistory((selection) => outdentListItem(selection));\n },\n getTextStats: (): { characters: number; words: number } => {\n const editor = editorRef.current;\n if (!editor) return { characters: 0, words: 0 };\n const text = editor.innerText || \"\";\n const characters = text.length;\n const trimmed = text.trim();\n const words = trimmed.length === 0 ? 0 : trimmed.split(/\\s+/).length;\n return { characters, words };\n },\n };\n\n /** Helper: push history, execute operation, then notify change. */\n function executeWithHistory(\n operation: (selection: Selection) => void,\n ): void {\n const editor = editorRef.current;\n if (!editor) return;\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n operation(selection);\n setTimeout(() => {\n if (editor) notifyChange(domToContent(editor));\n }, 0);\n }\n }, [\n undo,\n redo,\n checkbox,\n notifyChange,\n customLinkComponent,\n customHeadingRenderer,\n ]);\n\n // --- Initialize editor ---\n useEditorInit({\n editorRef,\n historyRef,\n isUpdatingRef,\n initialContent,\n notifyChange,\n customLinkComponent,\n customHeadingRenderer,\n });\n\n // --- Set up event listeners ---\n useEditorEvents({\n editorRef,\n historyRef,\n isUpdatingRef,\n notifyChange,\n handleCheckboxKeyDown: checkbox.handleCheckboxKeyDown,\n handleCheckboxEnter: checkbox.handleCheckboxEnter,\n undo,\n redo,\n });\n\n // --- Expose editor API ---\n useEffect(() => {\n if (onEditorAPIReady) onEditorAPIReady(editorAPI);\n }, [editorAPI, onEditorAPIReady]);\n\n // --- Focus / Blur callbacks ---\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const handleFocus = () => onFocus?.();\n const handleBlur = () => onBlur?.();\n editor.addEventListener(\"focus\", handleFocus);\n editor.addEventListener(\"blur\", handleBlur);\n return () => {\n editor.removeEventListener(\"focus\", handleFocus);\n editor.removeEventListener(\"blur\", handleBlur);\n };\n }, [onFocus, onBlur]);\n\n // --- Max Length enforcement ---\n useEffect(() => {\n if (maxLength === undefined) return;\n const editor = editorRef.current;\n if (!editor) return;\n const handleBeforeInput = (e: Event) => {\n const text = editor.innerText || \"\";\n if (text.length >= maxLength) {\n const inputEvent = e as InputEvent;\n if (inputEvent.inputType?.startsWith(\"insert\")) {\n e.preventDefault();\n }\n }\n };\n editor.addEventListener(\"beforeinput\", handleBeforeInput);\n return () => {\n editor.removeEventListener(\"beforeinput\", handleBeforeInput);\n };\n }, [maxLength]);\n\n // --- Word count state ---\n const [wordCount, setWordCount] = useState({ characters: 0, words: 0 });\n useEffect(() => {\n if (!showWordCount) return;\n const editor = editorRef.current;\n if (!editor) return;\n const updateCount = () => {\n const text = editor.innerText || \"\";\n const characters = text.length;\n const trimmed = text.trim();\n const words = trimmed.length === 0 ? 0 : trimmed.split(/\\s+/).length;\n setWordCount({ characters, words });\n };\n updateCount();\n editor.addEventListener(\"input\", updateCount);\n return () => editor.removeEventListener(\"input\", updateCount);\n }, [showWordCount]);\n\n // --- Helper: insert an image file via the onImageUpload callback ---\n const insertImageFile = useCallback(\n async (file: File) => {\n if (!onImageUpload || !file.type.startsWith(\"image/\")) return;\n const editor = editorRef.current;\n if (!editor) return;\n\n try {\n // Show a placeholder while uploading\n const placeholder = document.createElement(\"img\");\n placeholder.setAttribute(\"data-uploading\", \"true\");\n placeholder.className = \"rte-image rte-image-uploading\";\n // Use a tiny transparent gif as placeholder src\n placeholder.src =\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\";\n placeholder.alt = file.name;\n\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0);\n range.deleteContents();\n range.insertNode(placeholder);\n range.setStartAfter(placeholder);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n editor.appendChild(placeholder);\n }\n\n // Upload\n const url = await onImageUpload(file);\n\n // Parse the \"url|__aid__:attachmentId\" convention\n let realUrl = url;\n if (url.includes(\"|__aid__:\")) {\n const idx = url.indexOf(\"|__aid__:\");\n realUrl = url.substring(0, idx);\n const attachmentId = url.substring(\n idx + \"|__aid__:\".length,\n );\n if (attachmentId) {\n placeholder.setAttribute(\n \"data-attachment-id\",\n attachmentId,\n );\n }\n }\n\n // Replace placeholder with final image\n placeholder.src = realUrl;\n placeholder.removeAttribute(\"data-uploading\");\n placeholder.style.opacity = \"1\";\n\n notifyChange(domToContent(editor));\n } catch (err) {\n console.error(\"Image upload failed:\", err);\n // Remove failed placeholder\n const failedImg = editor.querySelector(\n 'img[data-uploading=\"true\"]',\n );\n failedImg?.remove();\n }\n },\n [onImageUpload, notifyChange],\n );\n\n // --- Paste handler ---\n const handlePaste = (e: React.ClipboardEvent) => {\n // Check for pasted image files first\n const items = e.clipboardData.items;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\")) {\n e.preventDefault();\n const file = item.getAsFile();\n if (file) insertImageFile(file);\n return;\n }\n }\n\n e.preventDefault();\n\n // Plain-text paste: Cmd/Ctrl+Shift+V\n const nativeEvent = e.nativeEvent as ClipboardEvent & { shiftKey?: boolean };\n if (nativeEvent.shiftKey) {\n const text = e.clipboardData.getData(\"text/plain\");\n if (text) {\n document.execCommand(\"insertText\", false, text);\n }\n return;\n }\n\n const rawHtml = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n\n if (rawHtml) {\n try {\n const html = sanitizeHtml(rawHtml);\n const pastedContent = htmlToContent(html);\n const editor = editorRef.current;\n if (!editor) return;\n\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const tempDiv = document.createElement(\"div\");\n contentToDOM(\n pastedContent,\n tempDiv,\n customLinkComponent,\n customHeadingRenderer,\n );\n\n const fragment = document.createDocumentFragment();\n while (tempDiv.firstChild) {\n fragment.appendChild(tempDiv.firstChild);\n }\n\n range.insertNode(fragment);\n if (fragment.lastChild) {\n range.setStartAfter(fragment.lastChild);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n notifyChange(domToContent(editor));\n }\n } catch (_) {\n document.execCommand(\"insertText\", false, text);\n }\n } else if (text) {\n document.execCommand(\"insertText\", false, text);\n }\n };\n\n // --- Theme styles ---\n const containerStyle: React.CSSProperties = theme\n ? {\n ...(theme.borderColor &&\n ({\n \"--rte-border-color\": theme.borderColor,\n } as React.CSSProperties)),\n ...(theme.borderRadius &&\n ({\n \"--rte-border-radius\": `${theme.borderRadius}px`,\n } as React.CSSProperties)),\n ...(theme.toolbarBg &&\n ({\n \"--rte-toolbar-bg\": theme.toolbarBg,\n } as React.CSSProperties)),\n ...(theme.buttonHoverBg &&\n ({\n \"--rte-button-hover-bg\": theme.buttonHoverBg,\n } as React.CSSProperties)),\n ...(theme.contentBg &&\n ({\n \"--rte-content-bg\": theme.contentBg,\n } as React.CSSProperties)),\n ...(theme.primaryColor &&\n ({\n \"--rte-primary-color\": theme.primaryColor,\n } as React.CSSProperties)),\n }\n : {};\n\n return (\n <div\n className={`rte-container ${readOnly ? \"rte-container-readonly\" : \"\"} ${className || \"\"}`}\n style={containerStyle}\n >\n {!readOnly && (\n <Toolbar\n plugins={plugins}\n editorAPI={editorAPI}\n className={toolbarClassName}\n />\n )}\n <div\n ref={editorRef}\n contentEditable={!readOnly}\n className={`rte-editor ${readOnly ? \"rte-editor-readonly\" : \"\"} ${editorClassName || \"\"}`}\n data-placeholder={placeholder}\n onPaste={readOnly ? undefined : handlePaste}\n onDrop={readOnly ? undefined : (e: React.DragEvent) => {\n const files = e.dataTransfer.files;\n for (let i = 0; i < files.length; i++) {\n if (files[i].type.startsWith(\"image/\")) {\n e.preventDefault();\n insertImageFile(files[i]);\n return;\n }\n }\n }}\n onDragOver={readOnly ? undefined : (e: React.DragEvent) => {\n const types = e.dataTransfer.types;\n if (types && Array.from(types).includes(\"Files\")) {\n e.preventDefault();\n }\n }}\n suppressContentEditableWarning\n />\n {!readOnly && (\n <FloatingToolbar\n plugins={plugins}\n editorAPI={editorAPI}\n editorElement={editorRef.current}\n />\n )}\n <LinkTooltip editorElement={editorRef.current} />\n {showWordCount && (\n <div className=\"rte-word-count\">\n {wordCount.words} words &middot; {wordCount.characters} characters\n </div>\n )}\n </div>\n );\n};\n\n// --- Helper: Insert Image ---\nfunction handleInsertImage(\n editor: HTMLElement,\n value: string,\n isUpdatingRef: { current: boolean },\n historyRef: { current: HistoryManager },\n notifyChange: (content: EditorContent) => void,\n): boolean {\n let selection = window.getSelection();\n if (!selection) return false;\n\n if (document.activeElement !== editor) {\n editor.focus();\n }\n\n if (selection.rangeCount === 0) {\n const range = document.createRange();\n if (editor.childNodes.length > 0) {\n const lastChild = editor.childNodes[editor.childNodes.length - 1];\n range.setStartAfter(lastChild);\n range.collapse(true);\n } else {\n const img = createImageElement(value);\n editor.appendChild(img);\n const newRange = document.createRange();\n newRange.setStartAfter(img);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n saveAndNotify(editor, isUpdatingRef, historyRef, notifyChange);\n return true;\n }\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n if (selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n let parentElement: HTMLElement | null = null;\n\n if (container.nodeType === Node.TEXT_NODE) {\n parentElement = container.parentElement;\n } else if (container.nodeType === Node.ELEMENT_NODE) {\n parentElement = container as HTMLElement;\n }\n\n const img = createImageElement(value);\n\n if (\n parentElement &&\n parentElement !== editor &&\n /^(P|DIV|H[1-6])$/.test(parentElement.tagName)\n ) {\n if (parentElement.nextSibling) {\n editor.insertBefore(img, parentElement.nextSibling);\n } else {\n editor.appendChild(img);\n }\n } else {\n try {\n range.insertNode(img);\n } catch (_) {\n editor.appendChild(img);\n }\n }\n\n const newRange = document.createRange();\n newRange.setStartAfter(img);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n saveAndNotify(editor, isUpdatingRef, historyRef, notifyChange);\n return true;\n}\n\n/**\n * Creates an <img> element from a src string.\n *\n * Supports an extended format for passing attachment metadata:\n * \"url|__aid__:attachmentId\"\n * If that format is detected, the real URL is extracted and\n * data-attachment-id is set on the element.\n */\nfunction createImageElement(src: string): HTMLImageElement {\n const img = document.createElement(\"img\");\n\n let realSrc = src;\n // Parse the \"url|__aid__:attachmentId\" convention\n if (src.includes(\"|__aid__:\")) {\n const idx = src.indexOf(\"|__aid__:\");\n realSrc = src.substring(0, idx);\n const attachmentId = src.substring(idx + \"|__aid__:\".length);\n if (attachmentId) {\n img.setAttribute(\"data-attachment-id\", attachmentId);\n }\n }\n\n img.setAttribute(\"src\", realSrc);\n img.setAttribute(\"alt\", \"\");\n img.className = \"rte-image\";\n return img;\n}\n\nfunction saveAndNotify(\n editor: HTMLElement,\n isUpdatingRef: { current: boolean },\n historyRef: { current: HistoryManager },\n notifyChange: (content: EditorContent) => void,\n): void {\n isUpdatingRef.current = true;\n setTimeout(() => {\n const content = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(content, sel);\n isUpdatingRef.current = false;\n notifyChange(content);\n }, 0);\n}\n\n/** Ensures the editor is focused and has a valid selection. */\nfunction ensureEditorFocused(editor: HTMLElement): void {\n const selection = window.getSelection();\n let savedRange: Range | null = null;\n\n if (selection && selection.rangeCount > 0) {\n savedRange = selection.getRangeAt(0).cloneRange();\n }\n\n if (document.activeElement !== editor) {\n editor.focus();\n }\n\n if (!selection || selection.rangeCount === 0) {\n const range = document.createRange();\n if (editor.childNodes.length > 0) {\n const lastChild = editor.childNodes[editor.childNodes.length - 1];\n if (lastChild.nodeType === Node.TEXT_NODE) {\n range.setStart(lastChild, lastChild.textContent?.length || 0);\n range.setEnd(lastChild, lastChild.textContent?.length || 0);\n } else {\n range.selectNodeContents(lastChild);\n range.collapse(false);\n }\n } else {\n const p = document.createElement(\"p\");\n editor.appendChild(p);\n const textNode = document.createTextNode(\"\");\n p.appendChild(textNode);\n range.setStart(textNode, 0);\n range.setEnd(textNode, 0);\n }\n selection?.removeAllRanges();\n selection?.addRange(range);\n } else if (savedRange) {\n selection.removeAllRanges();\n selection.addRange(savedRange);\n }\n}\n","import { Dropdown } from \"../components/Dropdown\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { getCurrentHeading } from \"../utils/stateReflection\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\"];\n\nconst headingLabels: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n};\n\nexport function createHeadingsPlugin(\n headings: string[] = defaultHeadings\n): Plugin {\n const options = [\n { value: \"p\", label: \"Normal\", headingPreview: \"p\" },\n ...headings.map((h) => ({\n value: h,\n label: headingLabels[h] || h.toUpperCase(),\n headingPreview: h,\n })),\n ];\n\n return {\n name: \"headings\",\n type: \"block\",\n renderButton: (\n props: ButtonProps & {\n onSelect?: (value: string) => void;\n editorAPI?: EditorAPI;\n currentValue?: string;\n }\n ) => {\n // Aktuelles Heading aus State Reflection\n const currentValue =\n props.currentValue ||\n (props.editorAPI\n ? getCurrentHeading(props.editorAPI, headings)\n : undefined);\n\n return (\n <Dropdown\n icon=\"mdi:format-header-1\"\n label=\"Heading\"\n options={options}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentHeading(editor, headings);\n },\n execute: (editor: EditorAPI, value?: string) => {\n const tag = value || \"p\";\n editor.executeCommand(\"formatBlock\", `<${tag}>`);\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n return headings.includes(tagName);\n },\n canExecute: () => true,\n };\n}\n","import { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\n/**\n * Link plugin with improved functionality\n */\nexport function createLinkPlugin(): Plugin {\n return {\n name: \"link\",\n type: \"inline\",\n command: \"createLink\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Insert Link\"\n aria-label=\"Insert Link\"\n >\n <IconWrapper icon=\"mdi:link\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n // Check if a link already exists\n const existingLink = element?.closest(\"a\") as HTMLAnchorElement;\n\n if (existingLink) {\n // Link entfernen\n const parent = existingLink.parentNode;\n if (parent) {\n while (existingLink.firstChild) {\n parent.insertBefore(\n existingLink.firstChild,\n existingLink\n );\n }\n parent.removeChild(existingLink);\n // Content aktualisieren\n const editorEl = editor.getSelection()?.anchorNode;\n if (editorEl) {\n const content = editor.getContent();\n editor.setContent(content);\n }\n }\n } else {\n // Insert new link\n const url = prompt(\"Enter URL:\");\n if (url) {\n editor.executeCommand(\"createLink\", url);\n }\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n return element.closest(\"a\") !== null;\n },\n getCurrentValue: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n const link = element.closest(\"a\") as HTMLAnchorElement;\n return link ? link.href : undefined;\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n };\n}\n\nexport const linkPlugin = createLinkPlugin();\n\n/**\n * Blockquote-Plugin\n */\nexport const blockquotePlugin: Plugin = {\n name: \"blockquote\",\n type: \"block\",\n command: \"formatBlock\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Quote\"\n aria-label=\"Quote\"\n >\n <IconWrapper icon=\"mdi:format-quote-close\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return;\n\n const isBlockquote = element.closest(\"blockquote\") !== null;\n\n if (isBlockquote) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n editor.executeCommand(\"formatBlock\", \"<blockquote>\");\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n return element.closest(\"blockquote\") !== null;\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n\n/**\n * Unordered List Plugin\n */\nexport const unorderedListPlugin: Plugin = {\n name: \"unorderedList\",\n type: \"block\",\n command: \"insertUnorderedList\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Bullet List\"\n aria-label=\"Bullet List\"\n >\n <IconWrapper\n icon=\"mdi:format-list-bulleted\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertUnorderedList\");\n },\n isActive: (editor: EditorAPI) => {\n if (typeof document === \"undefined\") return false;\n return document.queryCommandState(\"insertUnorderedList\");\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n\n/**\n * Ordered List Plugin\n */\nexport const orderedListPlugin: Plugin = {\n name: \"orderedList\",\n type: \"block\",\n command: \"insertOrderedList\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Numbered List\"\n aria-label=\"Numbered List\"\n >\n <IconWrapper\n icon=\"mdi:format-list-numbered\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertOrderedList\");\n },\n isActive: (editor: EditorAPI) => {\n if (typeof document === \"undefined\") return false;\n return document.queryCommandState(\"insertOrderedList\");\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n"],"names":["_jsx","_jsxs","useState","useRef","useEffect","useCallback","defaultHeadings","headingLabels","_Fragment","createPortal","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/Icons.tsx","../src/components/Dropdown.tsx","../src/constants.ts","../src/utils/dom.ts","../src/utils/checkbox.ts","../src/hooks/useCheckbox.ts","../src/utils/sanitize.ts","../src/utils/content.ts","../src/utils/autoLink.ts","../src/utils/listIndent.ts","../src/utils/markdownShortcuts.ts","../src/utils/selection.ts","../src/utils/table.ts","../src/hooks/useEditorEvents.ts","../src/hooks/useEditorInit.ts","../src/components/IconWrapper.tsx","../src/plugins/base.tsx","../src/plugins/blockFormat.tsx","../src/plugins/clearFormatting.tsx","../src/plugins/index.tsx","../src/utils/stateReflection.ts","../src/plugins/colors.tsx","../src/plugins/fontSize.tsx","../src/plugins/image.tsx","../src/utils/clearFormatting.ts","../src/utils/history.ts","../src/plugins/alignment.tsx","../src/plugins/linkDialog.tsx","../src/plugins/table.tsx","../src/utils/settings.ts","../src/components/FloatingToolbar.tsx","../src/components/LinkTooltip.tsx","../src/components/Toolbar.tsx","../src/components/Editor.tsx","../src/plugins/headings.tsx","../src/plugins/optional.tsx"],"sourcesContent":["import React from \"react\";\n\ninterface IconProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport const BoldIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\" />\n </svg>\n);\n\nexport const ItalicIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\" />\n </svg>\n);\n\nexport const UnderlineIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n </svg>\n);\n\nexport const UndoIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n </svg>\n);\n\nexport const RedoIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n </svg>\n);\n\nexport const ClearFormattingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M6 5v3h5v11h2V8h5V5H6z\" />\n <path d=\"M20.5 3.5L3.5 20.5l1.06 1.06L21.56 4.56z\" />\n </svg>\n);\n\nexport const LinkIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\" />\n </svg>\n);\n\nexport const QuoteIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z\" />\n </svg>\n);\n\nexport const BulletListIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\" />\n </svg>\n);\n\nexport const NumberedListIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 11.9V11H2zm6-5v2h14V6H8zm0 14h14v-2H8v2zm0-6h14v-2H8v2z\" />\n </svg>\n);\n\nexport const TextColorIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 20h20v4H2v-4zm3.49-3h2.42l1.27-3.58h5.64L16.09 17h2.42L13.25 3h-2.5L5.49 17zm4.22-5.61l2.03-5.79h.12l2.03 5.79H9.71z\" />\n </svg>\n);\n\nexport const BackgroundColorIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n {/* Pinsel */}\n <path d=\"M14.5 2.5L21.5 9.5L13 18L6 11L14.5 2.5Z\" />\n <path d=\"M6 11L13 18\" />\n {/* Hintergrund-Farbbereich */}\n <rect\n x=\"2\"\n y=\"16\"\n width=\"8\"\n height=\"6\"\n fill=\"currentColor\"\n opacity=\"0.6\"\n rx=\"1\"\n />\n {/* Pinselspitze */}\n <path d=\"M21.5 9.5L19 7\" />\n </svg>\n);\n\nexport const HeadingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M5 4v3h5.5v12h3V7H19V4H5z\" />\n </svg>\n);\n\nexport const FormatIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n {/* Paragraph symbol */}\n <path d=\"M3 4h18v2H3V4zm0 4h12v2H3V8zm0 4h18v2H3v-2zm0 4h12v2H3v-2z\" />\n </svg>\n);\n\nexport const FontSizeIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9 4v3h5v12h3V7h5V4H9zm-6 8h3v8h3v-8h3V10H3z\" />\n </svg>\n);\n\nexport const ImageIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\" />\n </svg>\n);\n\nexport const CloseIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport const LoadingIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\n </svg>\n);\n\nexport const UploadIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z\" />\n </svg>\n);\n\nexport const IndentIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zM3 8l4 4-4 4V8zm8 9h10v-2H11v2zM3 3v2h18V3H3zm8 6h10V7H11v2zm0 4h10v-2H11v2z\" />\n </svg>\n);\n\nexport const OutdentIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zM11 8l4 4-4 4V8zM3 3v2h18V3H3zm0 4h10v2H3V7zm0 4h10v2H3v-2zm0 4h18v2H3v-2z\" />\n </svg>\n);\n\nexport const CheckboxIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 3H5c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n </svg>\n);\n\nexport const StrikethroughIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n </svg>\n);\n\nexport const SubscriptIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M22 18h-2v1h3v1h-4v-2.5c0-.83.67-1.5 1.5-1.5h1.5v-1h-3v-1h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 18h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 4h-2.68l-3.07 4.99h-.12L8.87 4H6.19l4.32 6.73L5.88 18z\" />\n </svg>\n);\n\nexport const SuperscriptIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M22 7h-2v1h3v1h-4V6.5c0-.83.67-1.5 1.5-1.5h1.5V4h-3V3h2.5c.83 0 1.5.67 1.5 1.5v1c0 .83-.67 1.5-1.5 1.5zM5.88 20h2.66l3.4-5.42h.12l3.4 5.42h2.66l-4.65-7.27L17.81 6h-2.68l-3.07 4.99h-.12L8.87 6H6.19l4.32 6.73L5.88 20z\" />\n </svg>\n);\n\nexport const CodeIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z\" />\n </svg>\n);\n\nexport const AlignLeftIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignCenterIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignRightIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n </svg>\n);\n\nexport const AlignJustifyIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 21h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18v-2H3v2zm0-4h18V7H3v2zm0-6v2h18V3H3z\" />\n </svg>\n);\n\nexport const TableIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M3 3v18h18V3H3zm8 16H5v-6h6v6zm0-8H5V5h6v6zm8 8h-6v-6h6v6zm0-8h-6V5h6v6z\" />\n </svg>\n);\n\nexport const HorizontalRuleIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2 12h20v2H2z\" />\n </svg>\n);\n\nexport const OpenInNewIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M19 19H5V5h7V3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\" />\n </svg>\n);\n\nexport const ContentCopyIcon: React.FC<IconProps> = ({\n width = 18,\n height = 18,\n className,\n}) => (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </svg>\n);\n\nconst iconMap: Record<string, React.FC<IconProps>> = {\n \"mdi:format-bold\": BoldIcon,\n \"mdi:format-italic\": ItalicIcon,\n \"mdi:format-underline\": UnderlineIcon,\n \"mdi:undo\": UndoIcon,\n \"mdi:redo\": RedoIcon,\n \"mdi:format-clear\": ClearFormattingIcon,\n \"mdi:link\": LinkIcon,\n \"mdi:format-quote-close\": QuoteIcon,\n \"mdi:format-list-bulleted\": BulletListIcon,\n \"mdi:format-list-numbered\": NumberedListIcon,\n \"mdi:format-color-text\": TextColorIcon,\n \"mdi:format-color-fill\": BackgroundColorIcon,\n \"mdi:format-header-1\": HeadingIcon,\n \"mdi:format-paragraph\": FormatIcon,\n \"mdi:format-size\": FontSizeIcon,\n \"mdi:image\": ImageIcon,\n \"mdi:close\": CloseIcon,\n \"mdi:loading\": LoadingIcon,\n \"mdi:upload\": UploadIcon,\n \"mdi:format-indent-increase\": IndentIcon,\n \"mdi:format-indent-decrease\": OutdentIcon,\n \"mdi:checkbox-marked-outline\": CheckboxIcon,\n \"mdi:format-strikethrough\": StrikethroughIcon,\n \"mdi:format-subscript\": SubscriptIcon,\n \"mdi:format-superscript\": SuperscriptIcon,\n \"mdi:code-tags\": CodeIcon,\n \"mdi:format-align-left\": AlignLeftIcon,\n \"mdi:format-align-center\": AlignCenterIcon,\n \"mdi:format-align-right\": AlignRightIcon,\n \"mdi:format-align-justify\": AlignJustifyIcon,\n \"mdi:table\": TableIcon,\n \"mdi:minus\": HorizontalRuleIcon,\n \"mdi:open-in-new\": OpenInNewIcon,\n \"mdi:content-copy\": ContentCopyIcon,\n};\n\nexport const Icon: React.FC<{\n icon: string;\n width?: number;\n height?: number;\n className?: string;\n}> = ({ icon, width = 18, height = 18, className }) => {\n const IconComponent = iconMap[icon];\n if (!IconComponent) {\n return <span style={{ width, height, display: \"inline-block\" }} />;\n }\n return (\n <IconComponent width={width} height={height} className={className} />\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Icon } from './Icons';\n\ninterface DropdownProps {\n icon: string;\n label: string;\n options: Array<{ value: string; label: string; icon?: string; color?: string; preview?: string; headingPreview?: string }>;\n onSelect: (value: string) => void;\n currentValue?: string;\n disabled?: boolean;\n showCustomColorInput?: boolean;\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n icon,\n label,\n options,\n onSelect,\n currentValue,\n disabled,\n showCustomColorInput,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [customColor, setCustomColor] = useState(\"#000000\");\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n const handleSelect = (value: string) => {\n onSelect(value);\n setIsOpen(false);\n };\n\n const currentOption = options.find(opt => opt.value === currentValue);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setIsOpen(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen]);\n\n return (\n <div className=\"rte-dropdown\" ref={dropdownRef} onMouseDown={(e) => e.preventDefault()}>\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`rte-toolbar-button rte-dropdown-button ${currentOption ? 'rte-dropdown-button-has-value' : ''}`}\n title={label}\n aria-label={label}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n <Icon icon={icon} width={18} height={18} />\n {currentOption && (\n <span className=\"rte-dropdown-value\">{currentOption.label}</span>\n )}\n </button>\n {isOpen && (\n <div className=\"rte-dropdown-menu\" role=\"listbox\" aria-label={label}>\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n aria-selected={currentValue === option.value}\n className={`rte-dropdown-item ${currentValue === option.value ? 'rte-dropdown-item-active' : ''}`}\n onClick={() => handleSelect(option.value)}\n >\n {option.color && (\n <span \n className={`rte-dropdown-color-preview ${currentValue === option.value ? 'active' : ''}`}\n style={{ backgroundColor: option.color }}\n />\n )}\n {option.preview && !option.headingPreview && (\n <span \n className=\"rte-dropdown-fontsize-preview\"\n style={{ fontSize: `${option.preview}px` }}\n >\n Aa\n </span>\n )}\n {option.headingPreview && (\n <span \n className={`rte-dropdown-heading-preview ${option.headingPreview}`}\n >\n {option.headingPreview === 'p' ? 'Normal' : option.headingPreview.toUpperCase()}\n </span>\n )}\n {option.icon && <Icon icon={option.icon} width={16} height={16} />}\n <span style={{ flex: 1, fontWeight: currentValue === option.value ? 600 : 400 }}>\n {option.label}\n </span>\n </button>\n ))}\n {showCustomColorInput && (\n <div\n className=\"rte-color-custom-input\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <input\n type=\"color\"\n value={customColor}\n onChange={(e) => setCustomColor(e.target.value)}\n title=\"Pick a color\"\n />\n <input\n type=\"text\"\n value={customColor}\n onChange={(e) => {\n const v = e.target.value;\n setCustomColor(v);\n }}\n placeholder=\"#000000\"\n maxLength={7}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (/^#[0-9a-fA-F]{3,6}$/.test(customColor)) {\n handleSelect(customColor);\n }\n }\n }}\n />\n <button\n type=\"button\"\n className=\"rte-color-custom-apply\"\n onClick={() => {\n if (/^#[0-9a-fA-F]{3,6}$/.test(customColor)) {\n handleSelect(customColor);\n }\n }}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\n","/** Debounce time for pushing to history after input (ms) */\nexport const HISTORY_DEBOUNCE_MS = 300;\n\n/** Width of the clickable checkbox area in pixels */\nexport const CHECKBOX_CLICK_ZONE_PX = 40;\n\n/** Maximum nesting depth for lists */\nexport const MAX_LIST_DEPTH = 6;\n\n/** Maximum number of history entries */\nexport const MAX_HISTORY_SIZE = 50;\n","/**\n * Pure DOM utility functions.\n * No React dependencies - only native browser APIs.\n */\n\n/**\n * Checks if a UL element is a checkbox list.\n * Detects: own format, Lexical format, and GitHub format.\n */\nexport function isCheckboxList(element: HTMLElement): boolean {\n if (element.tagName !== \"UL\") return false;\n // Own format\n if (element.classList.contains(\"rte-checkbox-list\")) return true;\n // Lexical format (attribute)\n if (element.getAttribute(\"__lexicallisttype\") === \"check\") return true;\n // Lexical theme class (any class containing \"checklist\")\n const hasChecklistClass = Array.from(element.classList).some((cls) =>\n cls.toLowerCase().includes(\"checklist\")\n );\n if (hasChecklistClass) return true;\n // GitHub format\n if (element.classList.contains(\"contains-task-list\")) return true;\n return false;\n}\n\n/**\n * Finds the closest checkbox list ancestor from an element.\n * Works with all supported formats (own, Lexical, GitHub).\n */\nexport function findClosestCheckboxList(\n element: HTMLElement\n): HTMLElement | null {\n let current: HTMLElement | null = element;\n while (current) {\n if (current.tagName === \"UL\" && isCheckboxList(current)) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\n/**\n * Checks if a list item has a nested list as its first child (not a leaf item).\n */\nexport function isNestedListItem(li: HTMLElement): boolean {\n const firstChild = li.firstChild;\n return (\n firstChild instanceof HTMLElement &&\n (firstChild.tagName === \"UL\" || firstChild.tagName === \"OL\")\n );\n}\n\n/**\n * Finds the closest list item from a node.\n */\nexport function findClosestListItem(node: Node): HTMLLIElement | null {\n const element =\n node.nodeType === Node.TEXT_NODE\n ? node.parentElement\n : (node as HTMLElement);\n return (element?.closest(\"li\") as HTMLLIElement) || null;\n}\n\n/**\n * Gets the HTMLElement from a selection range container.\n */\nexport function getElementFromContainer(\n container: Node\n): HTMLElement | null {\n return container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n}\n\n/**\n * Sets cursor position in a text node after an async DOM update.\n */\nexport function setCursorInTextNode(\n textNode: Text,\n position: number,\n editor?: HTMLElement\n): void {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n const range = document.createRange();\n const maxPos = textNode.textContent?.length || 0;\n const safePos = Math.min(Math.max(0, position), maxPos);\n range.setStart(textNode, safePos);\n range.collapse(true);\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n if (editor) editor.focus();\n }\n } catch (_) {\n // Silently fail - cursor positioning is best-effort\n }\n });\n });\n}\n","/**\n * Pure checkbox utility functions for checkbox lists.\n * Supports detection of own format, Lexical format, and GitHub format.\n * No React dependencies.\n */\n\nimport { isCheckboxList, isNestedListItem } from \"./dom\";\n\n/**\n * Updates a list item's checkbox attributes (role, aria-checked, tabindex).\n */\nexport function updateListItemChecked(\n li: HTMLLIElement,\n checked: boolean\n): void {\n const parent = li.parentElement;\n if (\n !parent ||\n parent.tagName !== \"UL\" ||\n !isCheckboxList(parent) ||\n isNestedListItem(li)\n ) {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n return;\n }\n li.setAttribute(\"role\", \"checkbox\");\n li.setAttribute(\"tabIndex\", \"-1\");\n li.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n}\n\n/**\n * Toggles the checked state of a checkbox list item.\n */\nexport function toggleListItemChecked(li: HTMLLIElement): void {\n const currentChecked = li.getAttribute(\"aria-checked\") === \"true\";\n li.setAttribute(\"aria-checked\", currentChecked ? \"false\" : \"true\");\n if (li.getAttribute(\"role\") !== \"checkbox\") {\n li.setAttribute(\"role\", \"checkbox\");\n li.setAttribute(\"tabIndex\", \"-1\");\n }\n}\n\n/**\n * Ensures all checkbox list items in the editor have correct attributes.\n * Normalizes foreign formats (Lexical, GitHub) to internal format.\n */\nexport function ensureAllCheckboxes(editor: HTMLElement): void {\n const allULs = editor.querySelectorAll(\"ul\");\n allULs.forEach((ul) => {\n if (!isCheckboxList(ul)) return;\n\n // Normalize: ensure our class is always present\n if (!ul.classList.contains(\"rte-checkbox-list\")) {\n ul.classList.add(\"rte-checkbox-list\");\n }\n\n // Handle GitHub format: convert <input type=\"checkbox\"> to aria-checked\n ul.querySelectorAll(\":scope > li\").forEach((li) => {\n const input = li.querySelector(\n 'input[type=\"checkbox\"]'\n ) as HTMLInputElement | null;\n if (input) {\n const checked =\n input.checked || input.hasAttribute(\"checked\");\n if (li.getAttribute(\"aria-checked\") === null) {\n (li as HTMLLIElement).setAttribute(\n \"aria-checked\",\n checked ? \"true\" : \"false\"\n );\n }\n input.remove();\n }\n });\n\n const listItems = ul.querySelectorAll(\":scope > li\");\n listItems.forEach((li) => {\n const htmlLi = li as HTMLLIElement;\n if (!isNestedListItem(htmlLi)) {\n const ariaChecked = htmlLi.getAttribute(\"aria-checked\");\n const checked = ariaChecked === \"true\";\n updateListItemChecked(htmlLi, checked);\n } else {\n htmlLi.removeAttribute(\"role\");\n htmlLi.removeAttribute(\"tabIndex\");\n htmlLi.removeAttribute(\"aria-checked\");\n }\n });\n });\n}\n\n/**\n * Returns the currently focused checkbox list item, or null.\n */\nexport function getActiveCheckListItem(): HTMLElement | null {\n const activeElement = document.activeElement;\n if (\n activeElement &&\n activeElement.tagName === \"LI\" &&\n activeElement.parentElement &&\n isCheckboxList(activeElement.parentElement)\n ) {\n return activeElement as HTMLElement;\n }\n return null;\n}\n\n/**\n * Finds the next or previous checkbox list item sibling.\n */\nexport function findCheckListItemSibling(\n li: HTMLLIElement,\n backward: boolean\n): HTMLLIElement | null {\n let sibling = backward\n ? (li.previousElementSibling as HTMLLIElement)\n : (li.nextElementSibling as HTMLLIElement);\n let parent: HTMLLIElement | null = li;\n\n // Walk up the tree to find a non-null sibling\n while (sibling == null && parent) {\n const parentList = parent.parentElement;\n if (parentList && parentList.tagName === \"UL\") {\n const grandParent = parentList.parentElement;\n if (grandParent && grandParent.tagName === \"LI\") {\n parent = grandParent as HTMLLIElement;\n sibling = backward\n ? (parent.previousElementSibling as HTMLLIElement)\n : (parent.nextElementSibling as HTMLLIElement);\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n // Walk down the tree to find the first non-nested list item\n while (sibling && sibling.tagName === \"LI\") {\n const child = backward\n ? sibling.lastElementChild\n : sibling.firstElementChild;\n if (\n child &&\n (child.tagName === \"UL\" || child.tagName === \"OL\")\n ) {\n sibling = backward\n ? (child.lastElementChild as HTMLLIElement)\n : (child.firstElementChild as HTMLLIElement);\n } else {\n return sibling;\n }\n }\n\n return null;\n}\n","import { useCallback, useEffect } from \"react\";\nimport { CHECKBOX_CLICK_ZONE_PX } from \"../constants\";\nimport { EditorContent } from \"../types\";\nimport {\n ensureAllCheckboxes,\n findCheckListItemSibling,\n getActiveCheckListItem,\n toggleListItemChecked,\n updateListItemChecked,\n} from \"../utils/checkbox\";\nimport {\n findClosestCheckboxList,\n findClosestListItem,\n isCheckboxList,\n isNestedListItem,\n setCursorInTextNode,\n} from \"../utils/dom\";\n\ninterface UseCheckboxOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n isUpdatingRef: { current: boolean };\n pushToHistory: (content: EditorContent) => void;\n notifyChange: (content: EditorContent) => void;\n getDomContent: () => EditorContent;\n}\n\n/**\n * Hook that manages all checkbox list interactions.\n * Consolidates click handling, keyboard navigation, and checkbox insertion.\n * Uses event delegation (single listener on editor root) for all checkbox events.\n */\nexport function useCheckbox({\n editorRef,\n isUpdatingRef,\n pushToHistory,\n notifyChange,\n getDomContent,\n}: UseCheckboxOptions) {\n // --- Event Listeners (click + pointerdown) ---\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n const handleClick = (event: Event): void => {\n const clickTarget = event.target;\n if (!(clickTarget instanceof HTMLElement)) return;\n\n const listItem =\n clickTarget.tagName === \"LI\"\n ? (clickTarget as HTMLLIElement)\n : (clickTarget.closest(\"li\") as HTMLLIElement);\n if (!listItem) return;\n\n const parentNode = listItem.parentElement;\n if (!parentNode || !isCheckboxList(parentNode)) return;\n if (listItem.getAttribute(\"role\") !== \"checkbox\") return;\n if (isNestedListItem(listItem)) return;\n\n const rect = listItem.getBoundingClientRect();\n const clientX = (event as MouseEvent).clientX;\n const isInCheckboxArea =\n listItem.dir === \"rtl\"\n ? clientX >= rect.right - CHECKBOX_CLICK_ZONE_PX\n : clientX <= rect.left + CHECKBOX_CLICK_ZONE_PX;\n\n if (isInCheckboxArea) {\n event.preventDefault();\n event.stopPropagation();\n toggleListItemChecked(listItem);\n // Trigger change event\n const changeEvent = new Event(\"input\", { bubbles: true });\n editor.dispatchEvent(changeEvent);\n }\n };\n\n const handlePointerDown = (event: PointerEvent): void => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n const listItem =\n target.tagName === \"LI\"\n ? target\n : target.closest(\"li\");\n if (!listItem) return;\n if (isNestedListItem(listItem)) return;\n\n const parentNode = listItem.parentElement;\n if (!parentNode || !isCheckboxList(parentNode)) return;\n\n const rect = listItem.getBoundingClientRect();\n const clientX = event.clientX;\n const isInCheckboxArea =\n listItem.dir === \"rtl\"\n ? clientX >= rect.right - CHECKBOX_CLICK_ZONE_PX\n : clientX <= rect.left + CHECKBOX_CLICK_ZONE_PX;\n\n if (isInCheckboxArea) {\n event.preventDefault();\n }\n };\n\n editor.addEventListener(\"click\", handleClick, true);\n editor.addEventListener(\n \"pointerdown\",\n handlePointerDown as EventListener,\n true\n );\n\n return () => {\n editor.removeEventListener(\"click\", handleClick, true);\n editor.removeEventListener(\n \"pointerdown\",\n handlePointerDown as EventListener,\n true\n );\n };\n }, [editorRef]);\n\n // --- Keyboard handlers (called from useEditorEvents) ---\n\n /**\n * Handles checkbox-specific keyboard events.\n * Returns true if the event was handled and should not propagate.\n */\n const handleCheckboxKeyDown = useCallback(\n (e: KeyboardEvent): boolean => {\n // Arrow up/down: navigate between checkbox items\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n const backward = e.key === \"ArrowUp\";\n const nextItem = findCheckListItemSibling(\n activeItem as HTMLLIElement,\n backward\n );\n if (nextItem) {\n e.preventDefault();\n nextItem.focus();\n return true;\n }\n }\n }\n\n // Space: toggle checkbox\n if (e.key === \" \") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n e.preventDefault();\n toggleListItemChecked(activeItem as HTMLLIElement);\n const editorEl = activeItem.closest(\".rte-editor\");\n if (editorEl) {\n editorEl.dispatchEvent(\n new Event(\"input\", { bubbles: true })\n );\n }\n return true;\n }\n }\n\n // Escape: blur from checkbox item\n if (e.key === \"Escape\") {\n const activeItem = getActiveCheckListItem();\n if (activeItem) {\n const editorEl = activeItem.closest(\".rte-editor\");\n if (editorEl instanceof HTMLElement) {\n editorEl.focus();\n }\n return true;\n }\n }\n\n // Arrow left: focus list item when cursor is at the start\n if (e.key === \"ArrowLeft\") {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = findClosestListItem(container);\n if (!listItem) return false;\n\n const parent = listItem.parentElement;\n if (\n parent &&\n isCheckboxList(parent) &&\n range.collapsed &&\n range.startOffset === 0\n ) {\n if (document.activeElement !== listItem) {\n listItem.focus();\n e.preventDefault();\n return true;\n }\n }\n }\n\n return false;\n },\n []\n );\n\n /**\n * Handles Enter key in checkbox lists.\n * Creates a new unchecked item after the current one.\n * Returns true if the event was handled.\n */\n const handleCheckboxEnter = useCallback(\n (e: KeyboardEvent): boolean => {\n if (e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = findClosestListItem(container);\n if (!listItem) return false;\n\n const checkboxList = findClosestCheckboxList(listItem);\n if (!checkboxList) return false;\n\n e.preventDefault();\n\n const editor = editorRef.current;\n\n // If the current item is empty, break out of the list\n const itemText = (listItem.textContent || \"\").trim();\n if (itemText === \"\" || itemText === \"\\u200B\") {\n // Remove the empty list item\n checkboxList.removeChild(listItem);\n\n // If the list is now empty, remove it entirely\n if (checkboxList.children.length === 0) {\n const p = document.createElement(\"p\");\n const br = document.createElement(\"br\");\n p.appendChild(br);\n checkboxList.parentNode?.replaceChild(p, checkboxList);\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n } else {\n // Insert a <p> after the list and place cursor there\n const p = document.createElement(\"p\");\n const br = document.createElement(\"br\");\n p.appendChild(br);\n checkboxList.parentNode?.insertBefore(\n p,\n checkboxList.nextSibling,\n );\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n\n if (editor) {\n const content = getDomContent();\n pushToHistory(content);\n notifyChange(content);\n }\n return true;\n }\n\n // Normal case: create a new checkbox item\n const newLi = document.createElement(\"li\");\n updateListItemChecked(newLi, false);\n const textNode = document.createTextNode(\" \");\n newLi.appendChild(textNode);\n\n if (listItem.nextSibling) {\n checkboxList.insertBefore(newLi, listItem.nextSibling);\n } else {\n checkboxList.appendChild(newLi);\n }\n\n if (editor) ensureAllCheckboxes(editor);\n\n const newRange = document.createRange();\n newRange.setStart(textNode, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n if (editor) {\n const content = getDomContent();\n pushToHistory(content);\n notifyChange(content);\n }\n\n return true;\n },\n [editorRef, getDomContent, pushToHistory, notifyChange],\n );\n\n /**\n * Inserts a new checkbox list at the current cursor position,\n * or removes it if already inside one.\n * Returns true on success.\n */\n const insertCheckboxList = useCallback(\n (editor: HTMLElement): boolean => {\n isUpdatingRef.current = true;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n isUpdatingRef.current = false;\n return false;\n }\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) {\n isUpdatingRef.current = false;\n return false;\n }\n\n // Already in a checkbox list? Remove it.\n const existingList = findClosestCheckboxList(element);\n if (existingList) {\n existingList.classList.remove(\"rte-checkbox-list\");\n existingList\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n isUpdatingRef.current = false;\n return true;\n }\n\n // Create new checkbox list\n const ul = document.createElement(\"ul\");\n ul.classList.add(\"rte-checkbox-list\");\n\n const li = document.createElement(\"li\");\n updateListItemChecked(li, false);\n const textNode = document.createTextNode(\" \");\n li.appendChild(textNode);\n ul.appendChild(li);\n\n // Find block element to replace\n const blockElement = element.closest(\n \"p, div, h1, h2, h3, h4, h5, h6, blockquote\"\n );\n const isValidBlockElement =\n blockElement &&\n blockElement !== editor &&\n editor.contains(blockElement) &&\n blockElement.parentElement;\n\n if (isValidBlockElement) {\n const textContent = blockElement.textContent || \"\";\n blockElement.parentElement!.replaceChild(ul, blockElement);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n finalTextNode.textContent = textContent || \" \";\n const cursorPos = textContent ? textContent.length : 0;\n setCursorInTextNode(finalTextNode, cursorPos, editor);\n }\n } else {\n try {\n range.deleteContents();\n range.insertNode(ul);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n setCursorInTextNode(finalTextNode, 0, editor);\n }\n } catch (_) {\n editor.appendChild(ul);\n const finalTextNode = li.firstChild as Text;\n if (finalTextNode) {\n setCursorInTextNode(finalTextNode, 0, editor);\n }\n }\n }\n\n // After insertion: ensure attributes and save to history\n setTimeout(() => {\n if (!editor) return;\n ensureAllCheckboxes(editor);\n const content = getDomContent();\n pushToHistory(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n }, 100);\n\n return true;\n },\n [isUpdatingRef, getDomContent, pushToHistory, notifyChange]\n );\n\n return {\n ensureAllCheckboxes,\n insertCheckboxList,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n updateListItemChecked,\n };\n}\n","/**\n * Lightweight HTML sanitizer (no external dependencies).\n *\n * Uses an allowlist approach to strip dangerous elements and attributes\n * from pasted/imported HTML before it enters the editor.\n */\n\n/** Tags that are always removed (including their content). */\nconst REMOVE_TAGS = new Set([\n \"script\",\n \"style\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"applet\",\n \"form\",\n \"input\",\n \"textarea\",\n \"select\",\n \"button\",\n \"noscript\",\n \"meta\",\n \"link\",\n \"base\",\n \"svg\",\n \"math\",\n \"template\",\n \"details\",\n \"video\",\n \"audio\",\n \"marquee\",\n]);\n\n/** Attributes that are always removed (event handlers, dangerous data-* attrs). */\nconst REMOVE_ATTRS_PATTERN = /^on|^data-(?!(attachment-id|placeholder)$)/i;\n\n/** Specific dangerous attribute names. */\nconst REMOVE_ATTRS = new Set([\n \"srcdoc\",\n \"formaction\",\n \"xlink:href\",\n \"ping\",\n]);\n\n/** Allowed URL schemes for href/src attributes. */\nconst ALLOWED_SCHEMES = /^(https?:|mailto:|tel:|#|\\/(?!\\/))/i;\n\n/**\n * Check if a URL is safe to set as href/src.\n * Blocks javascript:, data:, vbscript:, and unknown schemes.\n * Strips control characters before checking.\n */\nexport function isUrlSafe(url: string): boolean {\n if (!url) return false;\n // Strip control characters and whitespace that could obfuscate schemes\n const cleaned = url.trim().replace(/[\\x00-\\x1f\\x7f]/g, \"\");\n if (!cleaned) return false;\n // Block protocol-relative URLs (//evil.com)\n if (cleaned.startsWith(\"//\")) return false;\n // Must match an allowed scheme or be a relative path\n return ALLOWED_SCHEMES.test(cleaned);\n}\n\n/**\n * Sanitize an HTML string by stripping dangerous tags and attributes.\n *\n * @param html - Raw HTML string\n * @returns Sanitized HTML string\n */\nexport function sanitizeHtml(html: string): string {\n // Use the browser's DOMParser to parse the HTML safely\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n\n sanitizeNode(doc.body);\n\n return doc.body.innerHTML;\n}\n\n/** Recursively sanitize a DOM node. */\nfunction sanitizeNode(node: Node): void {\n const childrenToRemove: Node[] = [];\n\n node.childNodes.forEach((child) => {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n\n // Remove dangerous tags entirely\n if (REMOVE_TAGS.has(tag)) {\n childrenToRemove.push(child);\n return;\n }\n\n // Remove dangerous attributes\n const attrsToRemove: string[] = [];\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n const name = attr.name.toLowerCase();\n\n if (REMOVE_ATTRS.has(name) || REMOVE_ATTRS_PATTERN.test(name)) {\n attrsToRemove.push(attr.name);\n continue;\n }\n\n // Validate URL attributes\n if (name === \"href\" || name === \"src\" || name === \"action\" || name === \"cite\" || name === \"poster\") {\n const value = attr.value.trim();\n if (value) {\n // Allow data:image/* for img src (matches contentToDOM behavior)\n const isDataImage = name === \"src\" && el.tagName === \"IMG\" && value.startsWith(\"data:image/\");\n if (!isDataImage && !ALLOWED_SCHEMES.test(value)) {\n attrsToRemove.push(attr.name);\n }\n }\n }\n\n // Remove dangerous URI schemes in any attribute value\n const lowerValue = attr.value.toLowerCase().replace(/[\\x00-\\x1f\\x7f\\s]/g, \"\");\n if (\n lowerValue.includes(\"javascript:\") ||\n lowerValue.includes(\"vbscript:\") ||\n lowerValue.includes(\"data:text/html\")\n ) {\n attrsToRemove.push(attr.name);\n }\n }\n\n attrsToRemove.forEach((attrName) => el.removeAttribute(attrName));\n\n // Recurse into children\n sanitizeNode(child);\n }\n });\n\n // Remove marked children\n childrenToRemove.forEach((child) => {\n node.removeChild(child);\n });\n}\n","import React from \"react\";\nimport { EditorContent, EditorNode } from \"../types\";\nimport { ensureAllCheckboxes } from \"./checkbox\";\nimport { isCheckboxList } from \"./dom\";\nimport { isUrlSafe, sanitizeHtml } from \"./sanitize\";\n\n/** Allowed tag names that contentToDOM may create from JSON. */\nconst ALLOWED_CONTENT_TAGS = new Set([\n \"p\", \"div\", \"span\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"ul\", \"ol\", \"li\", \"a\", \"strong\", \"em\", \"u\", \"s\", \"del\",\n \"sub\", \"sup\", \"code\", \"pre\", \"blockquote\", \"br\", \"hr\",\n \"img\", \"table\", \"thead\", \"tbody\", \"tr\", \"th\", \"td\",\n \"b\", \"i\", \"strike\",\n]);\n\n/** Checks if an attribute key is safe to set on a DOM element. */\nfunction isSafeAttribute(key: string): boolean {\n const lower = key.toLowerCase();\n // Block all event handler attributes\n if (lower.startsWith(\"on\")) return false;\n // Block dangerous attributes\n if (lower === \"srcdoc\" || lower === \"formaction\" || lower === \"xlink:href\" || lower === \"ping\") return false;\n return true;\n}\n\n/** Validates style values against expected patterns. */\nfunction isSafeStyleValue(prop: string, value: string): boolean {\n const clean = value.trim().toLowerCase();\n // Block expression(), url(), import, javascript, and other injection vectors\n if (/expression\\s*\\(|url\\s*\\(|@import|javascript:|vbscript:|-moz-binding/i.test(clean)) {\n return false;\n }\n switch (prop) {\n case \"fontSize\":\n return /^[\\d.]+(px|em|rem|pt|%|vw|vh)$/i.test(clean);\n case \"color\":\n case \"backgroundColor\":\n return /^(#[0-9a-f]{3,8}|rgb\\([\\d\\s,.%]+\\)|rgba\\([\\d\\s,.%]+\\)|[a-z]+)$/i.test(clean);\n case \"textAlign\":\n return /^(left|right|center|justify|start|end)$/.test(clean);\n default:\n return true;\n }\n}\n\n/**\n * Converts a DOM element (editor root) to EditorContent JSON.\n * Supports own format, Lexical HTML, and GitHub HTML.\n */\nexport function domToContent(element: HTMLElement): EditorContent {\n const blocks: EditorNode[] = [];\n\n // Normalize all checkbox lists before conversion\n ensureAllCheckboxes(element);\n\n function processNode(node: Node): EditorNode | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent;\n if (text === null || text === undefined) return null;\n\n // In checkbox lists, skip whitespace-only text nodes\n // if the LI has other meaningful text\n const isOnlyWhitespace = /^[\\s\\u200B]*$/.test(text);\n const isInCheckboxList =\n node.parentElement?.closest(\"ul.rte-checkbox-list\") !== null;\n\n if (isOnlyWhitespace && isInCheckboxList) {\n const li = node.parentElement?.closest(\"li\");\n if (li) {\n const allText = li.textContent || \"\";\n const textWithoutWhitespace = allText.replace(\n /[\\s\\u200B]/g,\n \"\"\n );\n if (textWithoutWhitespace.length > 0) {\n return null;\n }\n }\n }\n\n return { type: \"text\", text };\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n\n // Skip checkbox input elements (GitHub format remnants)\n if (tagName === \"input\" && el.getAttribute(\"type\") === \"checkbox\") {\n return null;\n }\n\n // Handle <br> as empty text\n if (tagName === \"br\") {\n return null;\n }\n\n if (tagName === \"img\") {\n const attributes: Record<string, string> = {};\n const src = el.getAttribute(\"src\");\n const alt = el.getAttribute(\"alt\");\n const attachmentId = el.getAttribute(\"data-attachment-id\");\n if (src) attributes.src = src;\n if (alt) attributes.alt = alt;\n if (attachmentId) attributes[\"data-attachment-id\"] = attachmentId;\n return {\n type: \"image\",\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Table elements\n if (\n [\"table\", \"thead\", \"tbody\", \"tr\", \"td\", \"th\"].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n const attributes: Record<string, string> = {};\n\n // Preserve class\n const cls = el.getAttribute(\"class\");\n if (cls) attributes.class = cls;\n\n // Table cell attributes\n if (tagName === \"td\" || tagName === \"th\") {\n const colspan = el.getAttribute(\"colspan\");\n const rowspan = el.getAttribute(\"rowspan\");\n if (colspan && colspan !== \"1\") attributes.colspan = colspan;\n if (rowspan && rowspan !== \"1\") attributes.rowspan = rowspan;\n // Preserve text-align on cells\n const textAlign = el.style.textAlign;\n if (textAlign && textAlign !== \"left\" && textAlign !== \"start\") {\n attributes.textAlign = textAlign;\n }\n // Preserve background-color\n const bgColor = el.style.backgroundColor;\n if (bgColor) attributes.backgroundColor = bgColor;\n }\n\n Array.from(el.childNodes).forEach((child) => {\n const processed = processNode(child);\n if (processed) children.push(processed);\n });\n\n return {\n type: tagName,\n children: children.length > 0 ? children : [],\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Block elements\n if (\n [\n \"p\",\n \"div\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"li\",\n ].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n const attributes: Record<string, string> = {};\n\n // Preserve text-align on block elements\n const textAlign = el.style.textAlign;\n if (textAlign && textAlign !== \"left\" && textAlign !== \"start\" && textAlign !== \"\") {\n attributes.textAlign = textAlign;\n }\n\n // Detect checkbox lists (own + Lexical + GitHub formats)\n if (tagName === \"ul\" && isCheckboxList(el)) {\n attributes.class = \"rte-checkbox-list\";\n }\n\n // Detect checkbox list items via aria-checked\n if (tagName === \"li\") {\n const parentUl = el.closest(\"ul\");\n if (\n parentUl &&\n isCheckboxList(parentUl) &&\n el.getAttribute(\"role\") === \"checkbox\"\n ) {\n const ariaChecked = el.getAttribute(\"aria-checked\");\n if (ariaChecked !== null) {\n attributes.checkboxChecked = ariaChecked;\n }\n }\n }\n\n // Process children recursively\n Array.from(el.childNodes).forEach((child) => {\n // Skip checkbox input nodes\n if (\n child.nodeType === Node.ELEMENT_NODE &&\n (child as HTMLElement).tagName.toLowerCase() === \"input\" &&\n (child as HTMLElement).getAttribute(\"type\") === \"checkbox\"\n ) {\n return;\n }\n\n const processed = processNode(child);\n if (processed) {\n children.push(processed);\n }\n });\n\n return {\n type: tagName,\n children: children.length > 0 ? children : [],\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n // Inline elements\n if (\n [\n \"strong\",\n \"b\",\n \"em\",\n \"i\",\n \"u\",\n \"s\",\n \"del\",\n \"strike\",\n \"a\",\n \"span\",\n \"sub\",\n \"sup\",\n \"code\",\n ].includes(tagName)\n ) {\n const children: EditorNode[] = [];\n Array.from(el.childNodes).forEach((child) => {\n const processed = processNode(child);\n if (processed) children.push(processed);\n });\n\n const attributes: Record<string, string> = {};\n Array.from(el.attributes).forEach((attr) => {\n attributes[attr.name] = attr.value;\n });\n\n // Links — capture all relevant attributes\n if (tagName === \"a\") {\n const linkAttrs: Record<string, string> = {};\n const href = el.getAttribute(\"href\");\n if (href) linkAttrs.href = href;\n const target = el.getAttribute(\"target\");\n if (target) linkAttrs.target = target;\n const rel = el.getAttribute(\"rel\");\n if (rel) linkAttrs.rel = rel;\n const title = el.getAttribute(\"title\");\n if (title) linkAttrs.title = title;\n const pageRef = el.getAttribute(\"data-page-ref\");\n if (pageRef) linkAttrs[\"data-page-ref\"] = pageRef;\n const urlExtra = el.getAttribute(\"data-url-extra\");\n if (urlExtra) linkAttrs[\"data-url-extra\"] = urlExtra;\n return {\n type: \"link\",\n children: children.length > 0 ? children : undefined,\n attributes:\n Object.keys(linkAttrs).length > 0\n ? linkAttrs\n : undefined,\n };\n }\n\n // Spans: handle Lexical's white-space: pre-wrap wrapper\n if (tagName === \"span\") {\n const style = el.getAttribute(\"style\") || \"\";\n const hasSemanticStyle =\n style.includes(\"font-size\") ||\n style.includes(\"color\") ||\n style.includes(\"background-color\");\n\n // Transparent wrapper (e.g. Lexical's <span style=\"white-space: pre-wrap;\">)\n // Return text content directly\n if (!hasSemanticStyle) {\n if (\n el.childNodes.length === 1 &&\n el.firstChild?.nodeType === Node.TEXT_NODE\n ) {\n return {\n type: \"text\",\n text: el.firstChild.textContent || \"\",\n };\n }\n // Multiple children: flatten (return each child as-is)\n if (children.length === 1) {\n return children[0];\n }\n // If multiple children, keep as span but without extra attributes\n if (children.length > 1) {\n return {\n type: \"span\",\n children,\n };\n }\n return null;\n }\n\n // Semantic span: extract meaningful style properties\n if (style) {\n style.split(\";\").forEach((rule) => {\n const [key, value] = rule\n .split(\":\")\n .map((s) => s.trim());\n if (key && value) {\n if (key === \"font-size\") {\n attributes.fontSize = value;\n } else if (key === \"color\") {\n attributes.color = value;\n } else if (key === \"background-color\") {\n attributes.backgroundColor = value;\n }\n }\n });\n }\n }\n\n // Map tag names to semantic types\n const type =\n tagName === \"strong\" || tagName === \"b\"\n ? \"bold\"\n : tagName === \"em\" || tagName === \"i\"\n ? \"italic\"\n : tagName === \"u\"\n ? \"underline\"\n : tagName === \"s\" ||\n tagName === \"del\" ||\n tagName === \"strike\"\n ? \"strikethrough\"\n : tagName === \"sub\"\n ? \"subscript\"\n : tagName === \"sup\"\n ? \"superscript\"\n : tagName === \"code\"\n ? \"code\"\n : tagName;\n\n return {\n type,\n children: children.length > 0 ? children : undefined,\n attributes:\n Object.keys(attributes).length > 0\n ? attributes\n : undefined,\n };\n }\n\n return null;\n }\n\n // Process all child nodes of the editor element\n Array.from(element.childNodes).forEach((node) => {\n const processed = processNode(node);\n if (processed) {\n // Wrap bare text nodes in a paragraph\n if (processed.type === \"text\") {\n blocks.push({ type: \"p\", children: [processed] });\n } else {\n blocks.push(processed);\n }\n }\n });\n\n if (blocks.length === 0) {\n blocks.push({ type: \"p\", children: [] });\n }\n\n return { blocks };\n}\n\n/**\n * Converts EditorContent JSON to DOM and appends to the container.\n */\nexport function contentToDOM(\n content: EditorContent,\n container: HTMLElement,\n customLinkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n [key: string]: unknown;\n }>,\n customHeadingRenderer?: (\n level: string,\n children: React.ReactNode\n ) => React.ReactNode\n): void {\n container.innerHTML = \"\";\n\n function createNode(node: EditorNode): Node {\n if (node.type === \"text\" && node.text !== undefined) {\n return document.createTextNode(node.text);\n }\n\n if (node.type === \"image\") {\n const img = document.createElement(\"img\");\n if (node.attributes) {\n if (node.attributes.src) {\n // Allow data:image/* for placeholders/uploads, otherwise validate\n const imgSrc = node.attributes.src;\n if (isUrlSafe(imgSrc) || imgSrc.startsWith(\"data:image/\")) {\n img.setAttribute(\"src\", imgSrc);\n }\n }\n if (node.attributes.alt)\n img.setAttribute(\"alt\", node.attributes.alt);\n if (node.attributes.uploading === \"true\") {\n img.setAttribute(\"data-uploading\", \"true\");\n }\n }\n img.className = \"rte-image\";\n return img;\n }\n\n const tagMap: Record<string, string> = {\n bold: \"strong\",\n italic: \"em\",\n underline: \"u\",\n strikethrough: \"s\",\n link: \"a\",\n subscript: \"sub\",\n superscript: \"sup\",\n code: \"code\",\n };\n\n let tagName = tagMap[node.type] || node.type;\n\n if (node.type === \"link\" && customLinkComponent) {\n tagName = \"a\";\n if (node.attributes) {\n node.attributes[\"data-custom-link\"] = \"true\";\n }\n }\n\n // Whitelist check: fall back to span for unknown/dangerous tags\n if (!ALLOWED_CONTENT_TAGS.has(tagName)) {\n tagName = \"span\";\n }\n\n const element = document.createElement(tagName);\n\n if (node.attributes) {\n Object.entries(node.attributes).forEach(([key, value]) => {\n if (key === \"fontSize\") {\n if (isSafeStyleValue(\"fontSize\", value)) element.style.fontSize = value;\n } else if (key === \"color\") {\n if (isSafeStyleValue(\"color\", value)) element.style.color = value;\n } else if (key === \"backgroundColor\") {\n if (isSafeStyleValue(\"backgroundColor\", value)) element.style.backgroundColor = value;\n } else if (key === \"textAlign\") {\n if (isSafeStyleValue(\"textAlign\", value)) element.style.textAlign = value;\n } else if (key === \"href\" && tagName === \"a\") {\n if (isUrlSafe(value)) element.setAttribute(\"href\", value);\n } else if (key === \"target\" && tagName === \"a\") {\n element.setAttribute(\"target\", value);\n } else if (key === \"rel\" && tagName === \"a\") {\n element.setAttribute(\"rel\", value);\n } else if (key === \"title\" && tagName === \"a\") {\n element.setAttribute(\"title\", value);\n } else if (key === \"data-page-ref\" && tagName === \"a\") {\n element.setAttribute(\"data-page-ref\", value);\n } else if (key === \"data-url-extra\" && tagName === \"a\") {\n element.setAttribute(\"data-url-extra\", value);\n } else if (key === \"data-attachment-id\") {\n element.setAttribute(\"data-attachment-id\", value);\n } else if (key === \"colspan\") {\n element.setAttribute(\"colspan\", value);\n } else if (key === \"rowspan\") {\n element.setAttribute(\"rowspan\", value);\n } else if (key === \"class\") {\n element.className = value;\n } else if (key === \"checkboxChecked\") {\n // Handled separately below\n } else if (isSafeAttribute(key)) {\n // Validate URL-like attribute values\n const lowerKey = key.toLowerCase();\n if ([\"cite\", \"action\", \"poster\", \"background\"].includes(lowerKey)) {\n if (isUrlSafe(value)) element.setAttribute(key, value);\n } else {\n element.setAttribute(key, value);\n }\n }\n });\n }\n\n // Ensure tables have the rte-table class\n if (node.type === \"table\" && !element.classList.contains(\"rte-table\")) {\n element.classList.add(\"rte-table\");\n }\n\n if (node.children) {\n node.children.forEach((child) => {\n element.appendChild(createNode(child));\n });\n }\n\n // Set checkbox attributes on list items\n if (\n node.type === \"li\" &&\n node.attributes?.checkboxChecked !== undefined\n ) {\n element.setAttribute(\"role\", \"checkbox\");\n element.setAttribute(\"tabIndex\", \"-1\");\n element.setAttribute(\n \"aria-checked\",\n node.attributes.checkboxChecked\n );\n }\n\n return element;\n }\n\n content.blocks.forEach((block) => {\n container.appendChild(createNode(block));\n });\n\n // Normalize all checkbox lists after DOM creation\n ensureAllCheckboxes(container);\n}\n\n/**\n * Creates empty editor content with a single paragraph.\n */\nexport function createEmptyContent(): EditorContent {\n return {\n blocks: [{ type: \"p\", children: [] }],\n };\n}\n\n/**\n * Converts EditorContent to an HTML string.\n */\nexport function contentToHTML(content: EditorContent): string {\n const tempDiv = document.createElement(\"div\");\n contentToDOM(content, tempDiv);\n return tempDiv.innerHTML;\n}\n\n/**\n * Converts an HTML string to EditorContent.\n * Supports Lexical, GitHub, and standard HTML formats.\n * Sanitizes HTML before parsing to prevent XSS.\n */\nexport function htmlToContent(htmlString: string): EditorContent {\n const sanitized = sanitizeHtml(htmlString);\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = sanitized;\n return domToContent(tempDiv);\n}\n","/**\n * Auto-link utility.\n *\n * Detects URLs in text nodes and wraps them in <a> tags.\n * Triggered after space/enter when the preceding word looks like a URL.\n */\n\nimport { isUrlSafe } from \"./sanitize\";\n\nconst URL_REGEX =\n /^(?:https?:\\/\\/|www\\.)[^\\s<>'\"]+\\.[a-z]{2,}[^\\s<>'\"]*$/i;\n\n/**\n * Check if the word before the cursor is a URL and wrap it in an <a> tag.\n * Called on space/enter keypress in the editor.\n */\nexport function handleAutoLink(editor: HTMLElement, e: KeyboardEvent): boolean {\n if (e.key !== \" \" && e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) return false;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE) return false;\n\n // Don't auto-link if already inside an anchor\n const parentEl =\n node.parentElement;\n if (parentEl?.closest(\"a\")) return false;\n\n const textNode = node as Text;\n const text = textNode.textContent || \"\";\n const offset = range.startOffset;\n\n // Get the text before the cursor\n const textBeforeCursor = text.substring(0, offset);\n\n // Find the last word (separated by whitespace)\n const lastSpaceIdx = textBeforeCursor.lastIndexOf(\" \");\n const lastNewlineIdx = textBeforeCursor.lastIndexOf(\"\\n\");\n const wordStart = Math.max(lastSpaceIdx, lastNewlineIdx) + 1;\n const word = textBeforeCursor.substring(wordStart);\n\n if (!word || !URL_REGEX.test(word)) return false;\n\n // Ensure it has a valid protocol or starts with www.\n let href = word;\n if (href.startsWith(\"www.\")) {\n href = \"https://\" + href;\n }\n\n // Validate the URL is safe before creating a link\n if (!isUrlSafe(href)) return false;\n\n // Create the link element\n const anchor = document.createElement(\"a\");\n anchor.href = href;\n anchor.textContent = word;\n anchor.target = \"_blank\";\n anchor.rel = \"noopener noreferrer\";\n\n // Split the text node and insert the link\n const beforeText = text.substring(0, wordStart);\n const afterText = text.substring(offset);\n\n const parentNode = textNode.parentNode;\n if (!parentNode) return false;\n\n // Build replacement: [beforeText][<a>word</a>][afterText]\n const frag = document.createDocumentFragment();\n\n if (beforeText) {\n frag.appendChild(document.createTextNode(beforeText));\n }\n frag.appendChild(anchor);\n\n // The space/enter that triggered this will be part of afterText or inserted by the browser\n const afterNode = document.createTextNode(afterText);\n frag.appendChild(afterNode);\n\n parentNode.replaceChild(frag, textNode);\n\n // Place cursor after the link (in the afterText node)\n const newRange = document.createRange();\n newRange.setStart(afterNode, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n // Don't prevent default -- let the space/enter be typed normally after the link\n return false;\n}\n","/**\n * Increases the indent level of a list item (Tab)\n */\nexport function indentListItem(selection: Selection): boolean {\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest('li')\n : (container as HTMLElement).closest('li');\n\n if (!listItem) return false;\n\n const list = listItem.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return false;\n\n // Check if already nested (max depth check)\n let depth = 0;\n let current: HTMLElement | null = listItem;\n while (current) {\n const parent: HTMLElement | null = current.parentElement;\n if (parent && (parent.tagName === 'UL' || parent.tagName === 'OL')) {\n depth++;\n current = parent.closest('li');\n } else {\n break;\n }\n }\n\n // Max depth: 6 (as per HTML standard)\n if (depth >= 6) return false;\n\n // Find previous list item\n const previousItem = listItem.previousElementSibling as HTMLElement | null;\n \n if (previousItem && previousItem.tagName === 'LI') {\n // Create nested list in the previous item\n let nestedList = previousItem.querySelector('ul, ol');\n \n if (!nestedList) {\n // Create new nested list\n nestedList = document.createElement(list.tagName.toLowerCase() as 'ul' | 'ol');\n previousItem.appendChild(nestedList);\n }\n \n // Move current item into nested list\n nestedList.appendChild(listItem);\n \n // Set cursor position\n const textNode = listItem.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, 0);\n range.collapse(true);\n } else if (listItem.firstChild) {\n range.setStart(listItem.firstChild, 0);\n range.collapse(true);\n } else {\n const newText = document.createTextNode('');\n listItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n \n return true;\n } else {\n // No previous item — create new nested list in current item\n const nestedList = document.createElement(list.tagName.toLowerCase() as 'ul' | 'ol');\n \n // Move all following items into the nested list\n let nextSibling = listItem.nextElementSibling;\n while (nextSibling && nextSibling.tagName === 'LI') {\n const toMove = nextSibling;\n nextSibling = nextSibling.nextElementSibling;\n nestedList.appendChild(toMove);\n }\n \n if (nestedList.children.length > 0) {\n listItem.appendChild(nestedList);\n } else {\n // If no following items, create empty sub-item\n const subItem = document.createElement('li');\n nestedList.appendChild(subItem);\n listItem.appendChild(nestedList);\n \n // Set cursor in sub-item\n const newText = document.createTextNode('');\n subItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n \n return true;\n }\n}\n\n/**\n * Decreases the indent level of a list item (Shift+Tab)\n */\nexport function outdentListItem(selection: Selection): boolean {\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem = container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest('li')\n : (container as HTMLElement).closest('li');\n\n if (!listItem) return false;\n\n const list = listItem.parentElement;\n if (!list || (list.tagName !== 'UL' && list.tagName !== 'OL')) return false;\n\n // Check if in nested list\n const parentListItem = list.parentElement;\n if (!parentListItem || parentListItem.tagName !== 'LI') {\n // Already at top level\n return false;\n }\n\n const parentList = parentListItem.parentElement;\n if (!parentList || (parentList.tagName !== 'UL' && parentList.tagName !== 'OL')) {\n return false;\n }\n\n // Move item to parent level\n // Find position after the parent item\n const insertAfter = parentListItem;\n \n // Move item and all following items out of the nested list\n const itemsToMove: HTMLElement[] = [listItem];\n let nextSibling = listItem.nextElementSibling;\n while (nextSibling && nextSibling.tagName === 'LI') {\n itemsToMove.push(nextSibling as HTMLElement);\n nextSibling = nextSibling.nextElementSibling;\n }\n\n // Insert items after the parent item\n itemsToMove.forEach(item => {\n parentList.insertBefore(item, insertAfter.nextSibling);\n });\n\n // Remove empty nested list\n if (list.children.length === 0) {\n list.remove();\n }\n\n // Set cursor position\n const textNode = listItem.firstChild;\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\n range.setStart(textNode, 0);\n range.collapse(true);\n } else if (listItem.firstChild) {\n range.setStart(listItem.firstChild, 0);\n range.collapse(true);\n } else {\n const newText = document.createTextNode('');\n listItem.appendChild(newText);\n range.setStart(newText, 0);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n}\n\n","/**\n * Markdown-style input shortcuts.\n *\n * Detects markdown patterns at the start of a block element\n * (after a Space key press) and auto-converts them:\n * # through ###### → H1–H6\n * - or * → Bullet list\n * 1. → Numbered list\n * > → Blockquote\n * [] → Checkbox list\n * ``` → Code block (<pre>)\n * --- → Horizontal rule (<hr>)\n */\n\nexport function handleMarkdownShortcut(\n editor: HTMLElement,\n e: KeyboardEvent,\n): boolean {\n if (e.key !== \" \" && e.key !== \"Enter\") return false;\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) return false;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE) return false;\n\n const textNode = node as Text;\n const text = textNode.textContent || \"\";\n const offset = range.startOffset;\n\n // We only care about text typed at the very start of a block\n const textBeforeCursor = text.substring(0, offset);\n\n // Find the parent block element\n const blockEl =\n textNode.parentElement?.closest(\"p, div, h1, h2, h3, h4, h5, h6\") ||\n textNode.parentElement;\n if (!blockEl || !editor.contains(blockEl)) return false;\n\n // Only trigger when the block starts with just the trigger text\n const blockText = blockEl.textContent || \"\";\n const blockTextBeforeCursor = blockText.substring(\n 0,\n blockText.indexOf(textBeforeCursor) + textBeforeCursor.length,\n );\n\n // Patterns that trigger on Space\n if (e.key === \" \") {\n // Heading shortcuts: # through ######\n const headingMatch = textBeforeCursor.match(/^(#{1,6})$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"formatBlock\", false, `h${level}`);\n return true;\n }\n\n // Bullet list: - or *\n if (textBeforeCursor === \"-\" || textBeforeCursor === \"*\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"insertUnorderedList\");\n return true;\n }\n\n // Numbered list: 1.\n if (textBeforeCursor === \"1.\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"insertOrderedList\");\n return true;\n }\n\n // Blockquote: >\n if (textBeforeCursor === \">\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n document.execCommand(\"formatBlock\", false, \"blockquote\");\n return true;\n }\n\n // Checkbox list: []\n if (textBeforeCursor === \"[]\") {\n e.preventDefault();\n clearBlockText(textNode, offset);\n // Insert a checkbox list using the same approach as blockFormat\n document.execCommand(\"insertUnorderedList\");\n // Find the newly created UL and convert to checkbox\n setTimeout(() => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const r = sel.getRangeAt(0);\n const container = r.startContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const li = el?.closest(\"li\");\n const ul = li?.parentElement;\n if (ul && ul.tagName === \"UL\") {\n ul.classList.add(\"rte-checkbox-list\");\n const items = ul.querySelectorAll(\"li\");\n items.forEach((item) => {\n item.setAttribute(\"role\", \"checkbox\");\n item.setAttribute(\"aria-checked\", \"false\");\n item.setAttribute(\"tabindex\", \"-1\");\n });\n }\n }, 0);\n return true;\n }\n }\n\n // Patterns that trigger on Enter (backticks, hr)\n if (e.key === \"Enter\") {\n // Code block: ```\n if (blockTextBeforeCursor === \"```\" || textBeforeCursor === \"```\") {\n e.preventDefault();\n clearBlockText(textNode, textBeforeCursor.length);\n document.execCommand(\"formatBlock\", false, \"pre\");\n return true;\n }\n\n // Horizontal rule: ---\n if (blockTextBeforeCursor === \"---\" || textBeforeCursor === \"---\") {\n e.preventDefault();\n clearBlockText(textNode, textBeforeCursor.length);\n // Remove the block contents and insert an HR\n if (blockEl.parentNode) {\n const hr = document.createElement(\"hr\");\n const p = document.createElement(\"p\");\n p.appendChild(document.createElement(\"br\"));\n blockEl.parentNode.insertBefore(hr, blockEl);\n blockEl.parentNode.insertBefore(p, blockEl.nextSibling);\n blockEl.parentNode.removeChild(blockEl);\n // Place cursor in the new paragraph\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n return true;\n }\n }\n\n return false;\n}\n\n/** Remove the trigger characters from the text node before applying formatting. */\nfunction clearBlockText(textNode: Text, charCount: number): void {\n const text = textNode.textContent || \"\";\n textNode.textContent = text.substring(charCount);\n // Reset cursor to start\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.setStart(textNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n","/**\n * Path-based selection serialization and restoration.\n *\n * DOM Range references become invalid after innerHTML replacement (undo/redo).\n * This module converts a live selection into a serializable path representation\n * (child indices from editor root to target node + character offset) and can\n * restore that path back to a live DOM selection after the DOM has been rebuilt\n * with identical structure.\n */\n\nexport interface SelectionPoint {\n path: number[];\n offset: number;\n}\n\nexport interface SelectionState {\n anchor: SelectionPoint;\n focus: SelectionPoint;\n}\n\n/**\n * Build an index path from `editor` down to `node`.\n * Returns null if the node is not inside the editor.\n */\nfunction buildPath(editor: HTMLElement, node: Node): number[] | null {\n const path: number[] = [];\n let current: Node | null = node;\n\n while (current && current !== editor) {\n const parent: Node | null = current.parentNode;\n if (!parent) return null;\n\n const children = parent.childNodes;\n let idx = -1;\n for (let i = 0; i < children.length; i++) {\n if (children[i] === current) {\n idx = i;\n break;\n }\n }\n if (idx === -1) return null;\n\n path.unshift(idx);\n current = parent;\n }\n\n if (current !== editor) return null;\n return path;\n}\n\n/**\n * Walk a child-index path starting from `editor` and return the target node.\n * Returns null if the path is invalid for the current DOM.\n */\nfunction walkPath(editor: HTMLElement, path: number[]): Node | null {\n let current: Node = editor;\n for (const idx of path) {\n if (!current.childNodes || idx >= current.childNodes.length) return null;\n current = current.childNodes[idx];\n }\n return current;\n}\n\n/**\n * Serialize the current window selection relative to `editor`.\n * Returns null if there is no selection or it is outside the editor.\n */\nexport function serializeSelection(\n editor: HTMLElement,\n): SelectionState | null {\n if (typeof window === \"undefined\") return null;\n\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n if (!sel.anchorNode || !sel.focusNode) return null;\n\n if (\n !editor.contains(sel.anchorNode) ||\n !editor.contains(sel.focusNode)\n ) {\n return null;\n }\n\n const anchorPath = buildPath(editor, sel.anchorNode);\n const focusPath = buildPath(editor, sel.focusNode);\n if (!anchorPath || !focusPath) return null;\n\n return {\n anchor: { path: anchorPath, offset: sel.anchorOffset },\n focus: { path: focusPath, offset: sel.focusOffset },\n };\n}\n\n/**\n * Restore a previously serialized selection on `editor`.\n * Silently does nothing if the paths no longer match the DOM.\n */\nexport function restoreSerializedSelection(\n editor: HTMLElement,\n state: SelectionState | null,\n): void {\n if (!state) return;\n if (typeof window === \"undefined\") return;\n\n const anchorNode = walkPath(editor, state.anchor.path);\n const focusNode = walkPath(editor, state.focus.path);\n if (!anchorNode || !focusNode) return;\n\n try {\n const sel = window.getSelection();\n if (!sel) return;\n\n // Clamp offsets to valid range\n const anchorMax =\n anchorNode.nodeType === Node.TEXT_NODE\n ? (anchorNode.textContent?.length ?? 0)\n : anchorNode.childNodes.length;\n const focusMax =\n focusNode.nodeType === Node.TEXT_NODE\n ? (focusNode.textContent?.length ?? 0)\n : focusNode.childNodes.length;\n\n const anchorOffset = Math.min(state.anchor.offset, anchorMax);\n const focusOffset = Math.min(state.focus.offset, focusMax);\n\n sel.removeAllRanges();\n const range = document.createRange();\n range.setStart(anchorNode, anchorOffset);\n range.setEnd(focusNode, focusOffset);\n sel.addRange(range);\n } catch {\n // Silently fail -- cursor positioning is best-effort\n }\n}\n","/**\n * Table DOM manipulation utilities for contentEditable.\n * Pure DOM functions — no React dependency.\n */\n\n/* ── Helpers ──────────────────────────────────────────────────────────── */\n\n/** Get the <td>/<th> cell that contains the current selection. */\nexport function getActiveCell(): HTMLTableCellElement | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return el?.closest(\"td, th\") as HTMLTableCellElement | null;\n}\n\n/** Get the <table> that contains the current selection. */\nexport function getActiveTable(): HTMLTableElement | null {\n const cell = getActiveCell();\n return cell?.closest(\"table\") ?? null;\n}\n\n/** Get the <tr> that contains the current selection. */\nexport function getActiveRow(): HTMLTableRowElement | null {\n const cell = getActiveCell();\n return cell?.closest(\"tr\") ?? null;\n}\n\n/** Place the cursor inside a cell (at the start). */\nexport function focusCell(cell: HTMLTableCellElement): void {\n const range = document.createRange();\n const sel = document.getSelection();\n if (!sel) return;\n\n if (cell.firstChild) {\n range.setStart(cell.firstChild, 0);\n } else {\n // Empty cell — add a <br> so the cursor has something to land on\n const br = document.createElement(\"br\");\n cell.appendChild(br);\n range.setStart(cell, 0);\n }\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n}\n\n/** Count the number of columns in a table (from the first row). */\nfunction getColumnCount(table: HTMLTableElement): number {\n const firstRow = table.querySelector(\"tr\");\n return firstRow ? firstRow.cells.length : 0;\n}\n\n/* ── Create ───────────────────────────────────────────────────────────── */\n\n/** Create a new table element with the given dimensions. */\nexport function createTable(\n rows: number,\n cols: number,\n withHeader: boolean = false\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.classList.add(\"rte-table\");\n\n const startRow = withHeader ? 0 : 1;\n\n if (withHeader) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const th = document.createElement(\"th\");\n th.innerHTML = \"<br>\";\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n table.appendChild(thead);\n }\n\n const tbody = document.createElement(\"tbody\");\n const dataRows = withHeader ? rows - 1 : rows;\n for (let r = 0; r < dataRows; r++) {\n const tr = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const td = document.createElement(\"td\");\n td.innerHTML = \"<br>\";\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n\n return table;\n}\n\n/* ── Row operations ───────────────────────────────────────────────────── */\n\n/** Insert a row above or below the currently selected row. */\nexport function insertRow(position: \"above\" | \"below\"): void {\n const row = getActiveRow();\n const table = getActiveTable();\n if (!row || !table) return;\n\n const cols = row.cells.length;\n const newRow = document.createElement(\"tr\");\n for (let c = 0; c < cols; c++) {\n const td = document.createElement(\"td\");\n td.innerHTML = \"<br>\";\n newRow.appendChild(td);\n }\n\n if (position === \"above\") {\n row.parentNode?.insertBefore(newRow, row);\n } else {\n row.parentNode?.insertBefore(newRow, row.nextSibling);\n }\n\n focusCell(newRow.cells[0]);\n}\n\n/** Delete the row that contains the current selection. */\nexport function deleteRow(): void {\n const row = getActiveRow();\n const table = getActiveTable();\n if (!row || !table) return;\n\n const allRows = table.querySelectorAll(\"tr\");\n if (allRows.length <= 1) {\n // Last row — remove the whole table\n deleteTable();\n return;\n }\n\n // Focus adjacent row before deleting\n const nextRow = (row.nextElementSibling ||\n row.previousElementSibling) as HTMLTableRowElement | null;\n row.remove();\n if (nextRow?.cells[0]) {\n focusCell(nextRow.cells[0]);\n }\n}\n\n/* ── Column operations ────────────────────────────────────────────────── */\n\n/** Insert a column to the left or right of the currently selected cell. */\nexport function insertColumn(position: \"left\" | \"right\"): void {\n const cell = getActiveCell();\n const table = getActiveTable();\n if (!cell || !table) return;\n\n const cellIndex = cell.cellIndex;\n const rows = table.querySelectorAll(\"tr\");\n\n rows.forEach((row) => {\n const tag = row.parentElement?.tagName === \"THEAD\" ? \"th\" : \"td\";\n const newCell = document.createElement(tag);\n newCell.innerHTML = \"<br>\";\n\n const refCell = row.cells[cellIndex];\n if (!refCell) {\n row.appendChild(newCell);\n } else if (position === \"left\") {\n row.insertBefore(newCell, refCell);\n } else {\n row.insertBefore(newCell, refCell.nextSibling);\n }\n });\n}\n\n/** Delete the column that contains the currently selected cell. */\nexport function deleteColumn(): void {\n const cell = getActiveCell();\n const table = getActiveTable();\n if (!cell || !table) return;\n\n const cellIndex = cell.cellIndex;\n const colCount = getColumnCount(table);\n\n if (colCount <= 1) {\n // Last column — remove the whole table\n deleteTable();\n return;\n }\n\n const rows = table.querySelectorAll(\"tr\");\n rows.forEach((row) => {\n if (row.cells[cellIndex]) {\n row.cells[cellIndex].remove();\n }\n });\n\n // Focus an adjacent cell\n const activeRow = getActiveRow();\n if (activeRow) {\n const idx = Math.min(cellIndex, activeRow.cells.length - 1);\n if (activeRow.cells[idx]) focusCell(activeRow.cells[idx]);\n }\n}\n\n/* ── Table delete ─────────────────────────────────────────────────────── */\n\n/** Remove the entire table and place cursor after it. */\nexport function deleteTable(): void {\n const table = getActiveTable();\n if (!table) return;\n\n const parent = table.parentNode;\n const nextSibling = table.nextSibling;\n\n // Create a paragraph to place the cursor\n const p = document.createElement(\"p\");\n p.innerHTML = \"<br>\";\n\n if (nextSibling) {\n parent?.insertBefore(p, nextSibling);\n } else {\n parent?.appendChild(p);\n }\n\n table.remove();\n\n // Focus the new paragraph\n const range = document.createRange();\n const sel = document.getSelection();\n if (sel && p.firstChild) {\n range.setStart(p, 0);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n/* ── Tab navigation ───────────────────────────────────────────────────── */\n\n/**\n * Move focus to the next or previous table cell.\n * Returns true if navigation happened (caller should preventDefault).\n */\nexport function navigateTableCell(direction: \"next\" | \"prev\"): boolean {\n const cell = getActiveCell();\n if (!cell) return false;\n\n const row = cell.closest(\"tr\");\n const table = cell.closest(\"table\");\n if (!row || !table) return false;\n\n const cellIndex = cell.cellIndex;\n const allRows = Array.from(table.querySelectorAll(\"tr\"));\n const rowIndex = allRows.indexOf(row);\n\n let targetCell: HTMLTableCellElement | null = null;\n\n if (direction === \"next\") {\n if (cellIndex < row.cells.length - 1) {\n targetCell = row.cells[cellIndex + 1];\n } else if (rowIndex < allRows.length - 1) {\n targetCell = allRows[rowIndex + 1].cells[0];\n } else {\n // Last cell of last row — add a new row\n insertRow(\"below\");\n return true;\n }\n } else {\n if (cellIndex > 0) {\n targetCell = row.cells[cellIndex - 1];\n } else if (rowIndex > 0) {\n const prevRow = allRows[rowIndex - 1];\n targetCell = prevRow.cells[prevRow.cells.length - 1];\n }\n }\n\n if (targetCell) {\n focusCell(targetCell);\n return true;\n }\n\n return false;\n}\n","import { useEffect } from \"react\";\nimport { HISTORY_DEBOUNCE_MS } from \"../constants\";\nimport { EditorContent } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport { domToContent } from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\nimport { handleAutoLink } from \"../utils/autoLink\";\nimport { indentListItem, outdentListItem } from \"../utils/listIndent\";\nimport { handleMarkdownShortcut } from \"../utils/markdownShortcuts\";\nimport { serializeSelection } from \"../utils/selection\";\nimport { getActiveCell, navigateTableCell } from \"../utils/table\";\n\ninterface UseEditorEventsOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n historyRef: { current: HistoryManager };\n isUpdatingRef: { current: boolean };\n mountedRef: { current: boolean };\n notifyChange: (content: EditorContent) => void;\n handleCheckboxKeyDown: (e: KeyboardEvent) => boolean;\n handleCheckboxEnter: (e: KeyboardEvent) => boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/**\n * Hook that sets up input and keydown event listeners on the editor.\n */\nexport function useEditorEvents({\n editorRef,\n historyRef,\n isUpdatingRef,\n mountedRef,\n notifyChange,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n undo,\n redo,\n}: UseEditorEventsOptions) {\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n\n let inputTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const handleInput = () => {\n setTimeout(() => {\n if (!mountedRef.current) return;\n const content = domToContent(editor);\n notifyChange(content);\n\n if (inputTimeout) clearTimeout(inputTimeout);\n inputTimeout = setTimeout(() => {\n if (!mountedRef.current) return;\n const sel = serializeSelection(editor);\n historyRef.current.push(content, sel);\n inputTimeout = null;\n }, HISTORY_DEBOUNCE_MS);\n }, 0);\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isModifierPressed = e.metaKey || e.ctrlKey;\n\n // Markdown-style shortcuts (e.g., # + space → heading)\n if (!isModifierPressed && handleMarkdownShortcut(editor, e)) {\n setTimeout(() => {\n if (!mountedRef.current) return;\n const content = domToContent(editor);\n notifyChange(content);\n }, 0);\n return;\n }\n\n // Auto-link: convert URLs to <a> tags on space/enter\n if (!isModifierPressed && (e.key === \" \" || e.key === \"Enter\")) {\n handleAutoLink(editor, e);\n }\n\n // Checkbox Enter: create new checkbox item\n if (handleCheckboxEnter(e)) return;\n\n // Checkbox keyboard navigation\n if (handleCheckboxKeyDown(e)) return;\n\n // Tab: navigate table cells OR indent/outdent in lists\n if (e.key === \"Tab\" && !isModifierPressed && !e.altKey) {\n // Table tab navigation takes priority\n if (getActiveCell()) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n navigateTableCell(e.shiftKey ? \"prev\" : \"next\");\n setTimeout(() => {\n if (!mountedRef.current) return;\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n if (!editor.contains(container)) return;\n\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n if (listItem && editor.contains(listItem)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n\n if (e.shiftKey) {\n outdentListItem(selection);\n } else {\n indentListItem(selection);\n }\n\n setTimeout(() => {\n if (!mountedRef.current) return;\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n // Not in a list -- let Tab move focus out of the editor\n }\n\n // Cmd/Ctrl+K: trigger link button click (if present in toolbar)\n if (isModifierPressed && e.key === \"k\") {\n e.preventDefault();\n e.stopPropagation();\n // Find and click the link button in the toolbar\n const editorContainer = editor.closest(\".rte-container\");\n if (editorContainer) {\n const linkBtn =\n editorContainer.querySelector(\n 'button[aria-label=\"Link\"], button[aria-label=\"Insert Link\"]'\n ) as HTMLButtonElement | null;\n if (linkBtn) linkBtn.click();\n }\n return;\n }\n\n // Undo/Redo shortcuts\n if (isModifierPressed && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n undo();\n return;\n } else if (\n isModifierPressed &&\n (e.key === \"y\" || (e.key === \"z\" && e.shiftKey))\n ) {\n e.preventDefault();\n e.stopPropagation();\n redo();\n return;\n }\n\n // Formatting shortcuts (Cmd/Ctrl + key)\n // We intercept these to ensure proper history snapshots\n if (isModifierPressed) {\n let command: string | null = null;\n\n if (!e.shiftKey) {\n switch (e.key.toLowerCase()) {\n case \"b\": command = \"bold\"; break;\n case \"i\": command = \"italic\"; break;\n case \"u\": command = \"underline\"; break;\n case \"e\": command = \"code\"; break;\n }\n } else {\n switch (e.key.toLowerCase()) {\n case \"x\": command = \"strikeThrough\"; break;\n case \"7\": command = \"insertOrderedList\"; break;\n case \"8\": command = \"insertUnorderedList\"; break;\n }\n }\n\n if (command) {\n e.preventDefault();\n e.stopPropagation();\n\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n\n if (command === \"code\") {\n // Inline code toggle via surroundContents\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const existingCode = element?.closest(\"code\");\n if (existingCode) {\n const parent = existingCode.parentNode;\n if (parent) {\n while (existingCode.firstChild) {\n parent.insertBefore(existingCode.firstChild, existingCode);\n }\n parent.removeChild(existingCode);\n }\n } else if (!range.collapsed) {\n const code = document.createElement(\"code\");\n try {\n range.surroundContents(code);\n } catch {\n const fragment = range.extractContents();\n code.appendChild(fragment);\n range.insertNode(code);\n }\n }\n }\n } else {\n document.execCommand(command, false);\n }\n\n setTimeout(() => {\n if (!mountedRef.current) return;\n if (editor) {\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n return;\n }\n }\n };\n\n editor.addEventListener(\"input\", handleInput);\n editor.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => {\n editor.removeEventListener(\"input\", handleInput);\n editor.removeEventListener(\"keydown\", handleKeyDown, true);\n if (inputTimeout) clearTimeout(inputTimeout);\n };\n }, [\n editorRef,\n historyRef,\n isUpdatingRef,\n notifyChange,\n handleCheckboxKeyDown,\n handleCheckboxEnter,\n undo,\n redo,\n ]);\n}\n","import { useEffect, useRef } from \"react\";\nimport React from \"react\";\nimport { EditorContent } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport { contentToDOM, createEmptyContent } from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\n\ninterface UseEditorInitOptions {\n editorRef: React.RefObject<HTMLDivElement | null>;\n historyRef: { current: HistoryManager };\n isUpdatingRef: { current: boolean };\n initialContent?: EditorContent;\n notifyChange: (content: EditorContent) => void;\n customLinkComponent?: React.ComponentType<{\n href: string;\n children: React.ReactNode;\n [key: string]: unknown;\n }>;\n customHeadingRenderer?: (\n level: string,\n children: React.ReactNode\n ) => React.ReactNode;\n}\n\n/**\n * Hook that initializes the editor with initial content and sets up the MutationObserver.\n * Runs once on mount.\n */\nexport function useEditorInit({\n editorRef,\n historyRef,\n isUpdatingRef,\n initialContent,\n customLinkComponent,\n customHeadingRenderer,\n}: UseEditorInitOptions) {\n const isInitializedRef = useRef(false);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || isInitializedRef.current) return;\n\n // Load initial content\n const content = initialContent || createEmptyContent();\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n isInitializedRef.current = true;\n\n // Normalize all checkbox lists (own + Lexical + GitHub formats)\n ensureAllCheckboxes(editor);\n\n // MutationObserver: ensure new checkbox list items get correct attributes\n let checkboxTimeout: ReturnType<typeof setTimeout> | null = null;\n\n const observer = new MutationObserver((mutations) => {\n if (isUpdatingRef.current) return;\n\n let needsUpdate = false;\n for (const mutation of mutations) {\n for (let i = 0; i < mutation.addedNodes.length; i++) {\n const node = mutation.addedNodes[i];\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const el = node as HTMLElement;\n if (\n el.tagName === \"LI\" &&\n el.closest(\"ul.rte-checkbox-list\")\n ) {\n needsUpdate = true;\n break;\n }\n if (\n el.tagName === \"UL\" &&\n el.classList.contains(\"rte-checkbox-list\")\n ) {\n needsUpdate = true;\n break;\n }\n if (el.querySelector(\"ul.rte-checkbox-list li\")) {\n needsUpdate = true;\n break;\n }\n }\n if (needsUpdate) break;\n }\n\n if (needsUpdate) {\n if (checkboxTimeout) clearTimeout(checkboxTimeout);\n checkboxTimeout = setTimeout(() => ensureAllCheckboxes(editor), 0);\n }\n });\n\n observer.observe(editor, { childList: true, subtree: true });\n\n return () => {\n if (checkboxTimeout) clearTimeout(checkboxTimeout);\n observer.disconnect();\n };\n // Only run once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n","import React from 'react';\nimport { Icon } from './Icons';\n\ninterface IconWrapperProps {\n icon: string;\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport const IconWrapper: React.FC<IconWrapperProps> = ({ icon, width = 18, height = 18, className }) => {\n return <Icon icon={icon} width={width} height={height} className={className} />;\n};\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\n\n/**\n * Base plugin for inline formatting\n */\nexport function createInlinePlugin(\n name: string,\n command: string,\n icon: string,\n label: string\n): Plugin {\n return {\n name,\n type: 'inline',\n command,\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${props.isActive ? 'rte-toolbar-button-active' : ''}`}\n title={label}\n aria-label={label}\n >\n <IconWrapper icon={icon} width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(command);\n },\n isActive: (editor: EditorAPI) => {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false;\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n \n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n \n if (!element) return false;\n \n return document.queryCommandState(command);\n },\n canExecute: (editor: EditorAPI) => {\n // Formatting should also work without a selection\n // (e.g. when the editor is empty, a selection is created on click)\n return true;\n },\n };\n}\n\n/**\n * Base plugin for commands\n */\nexport function createCommandPlugin(\n name: string,\n command: string,\n icon: string,\n label: string\n): Plugin {\n return {\n name,\n type: 'command',\n command,\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title={label}\n aria-label={label}\n >\n <IconWrapper icon={icon} width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(command);\n },\n canExecute: (editor: EditorAPI) => {\n if (command === 'undo') return editor.canUndo();\n if (command === 'redo') return editor.canRedo();\n return true;\n },\n };\n}\n\n","import { Dropdown } from \"../components/Dropdown\";\nimport { EditorAPI, Plugin } from \"../types\";\nimport { findClosestCheckboxList } from \"../utils/dom\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\n\nconst headingLabels: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n};\n\nexport interface BlockFormatOptions {\n bulletList?: boolean;\n numberedList?: boolean;\n quote?: boolean;\n codeBlock?: boolean;\n check?: boolean;\n}\n\n/**\n * Creates a Block Format plugin that combines headings, lists, and quote in a dropdown.\n * @param headings - Array of heading levels (e.g. [\"h1\", \"h2\", \"h3\"])\n * @param blockOptions - Toggle individual block types (bulletList, numberedList, quote, check, codeBlock)\n */\nexport function createBlockFormatPlugin(\n headings: string[] = defaultHeadings,\n blockOptions: BlockFormatOptions = {}\n): Plugin {\n // Default all block types to true if not specified\n const showBulletList = blockOptions.bulletList ?? true;\n const showNumberedList = blockOptions.numberedList ?? true;\n const showQuote = blockOptions.quote ?? true;\n const showCodeBlock = blockOptions.codeBlock ?? true;\n const showCheck = blockOptions.check ?? true;\n\n const options: { value: string; label: string; headingPreview?: string; icon?: string }[] = [\n { value: \"p\", label: \"Normal\", headingPreview: \"p\" },\n ...headings.map((h) => ({\n value: h,\n label: headingLabels[h] || h.toUpperCase(),\n headingPreview: h,\n })),\n ];\n\n if (showBulletList) {\n options.push({\n value: \"ul\",\n label: \"Bullet List\",\n icon: \"mdi:format-list-bulleted\",\n });\n }\n if (showNumberedList) {\n options.push({\n value: \"ol\",\n label: \"Numbered List\",\n icon: \"mdi:format-list-numbered\",\n });\n }\n if (showCheck) {\n options.push({\n value: \"checkbox-list\",\n label: \"Checkbox List\",\n icon: \"mdi:checkbox-marked-outline\",\n });\n }\n if (showQuote) {\n options.push({\n value: \"blockquote\",\n label: \"Quote\",\n icon: \"mdi:format-quote-close\",\n });\n }\n if (showCodeBlock) {\n options.push({\n value: \"code\",\n label: \"Code Block\",\n icon: \"mdi:code-tags\",\n });\n }\n\n /** Detects the current block format at the cursor position. */\n function detectCurrentFormat(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n const tagName = element.tagName.toLowerCase();\n\n if (headings.includes(tagName)) return tagName;\n if (element.closest(\"pre\")) return \"code\";\n if (element.closest(\"blockquote\")) return \"blockquote\";\n if (findClosestCheckboxList(element)) return \"checkbox-list\";\n if (element.closest(\"ul\")) return \"ul\";\n if (element.closest(\"ol\")) return \"ol\";\n if (tagName === \"p\") return \"p\";\n\n return undefined;\n }\n\n return {\n name: \"blockFormat\",\n type: \"block\",\n renderButton: (props) => {\n const editor = props.editorAPI as EditorAPI | undefined;\n const onSelect = props.onSelect as\n | ((value: string) => void)\n | undefined;\n let currentValue = props.currentValue as string | undefined;\n\n if (!currentValue && editor) {\n currentValue = detectCurrentFormat(editor);\n }\n\n return (\n <Dropdown\n icon=\"mdi:format-paragraph\"\n label=\"Format\"\n options={options}\n onSelect={(value) => {\n if (onSelect) onSelect(value);\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => detectCurrentFormat(editor),\n execute: (editor: EditorAPI, value?: string) => {\n if (!value) return;\n\n // Helper: get the element at the cursor\n const getCursorElement = (): HTMLElement | null => {\n const sel = editor.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n return container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n };\n\n // Helper: merge all adjacent <pre> elements in the editor into one\n const mergeAdjacentPre = () => {\n const root = document.activeElement;\n if (!root || !root.getAttribute(\"contenteditable\")) return;\n const children = Array.from(root.children);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child.tagName !== \"PRE\" || !child.parentElement)\n continue;\n while (child.nextElementSibling?.tagName === \"PRE\") {\n const next = child.nextElementSibling;\n child.appendChild(document.createTextNode(\"\\n\"));\n while (next.firstChild) {\n child.appendChild(next.firstChild);\n }\n next.remove();\n }\n }\n };\n\n // Helper: if cursor is inside a list, remove the list first\n const escapeListIfNeeded = () => {\n const el = getCursorElement();\n if (!el) return;\n const inCheckbox = findClosestCheckboxList(el);\n const inUl = el.closest(\"ul\");\n const inOl = el.closest(\"ol\");\n if (inCheckbox) {\n inCheckbox.classList.remove(\"rte-checkbox-list\");\n inCheckbox\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n editor.executeCommand(\"insertUnorderedList\");\n } else if (inUl) {\n editor.executeCommand(\"insertUnorderedList\");\n } else if (inOl) {\n editor.executeCommand(\"insertOrderedList\");\n }\n };\n\n if (value === \"checkbox-list\") {\n const el = getCursorElement();\n if (!el) return;\n\n const checkboxList = findClosestCheckboxList(el);\n if (checkboxList) {\n checkboxList.classList.remove(\"rte-checkbox-list\");\n checkboxList\n .querySelectorAll(\"li[role='checkbox']\")\n .forEach((li) => {\n li.removeAttribute(\"role\");\n li.removeAttribute(\"tabIndex\");\n li.removeAttribute(\"aria-checked\");\n });\n } else {\n editor.executeCommand(\"insertCheckboxList\");\n }\n } else if (value === \"ul\") {\n editor.executeCommand(\"insertUnorderedList\");\n } else if (value === \"ol\") {\n editor.executeCommand(\"insertOrderedList\");\n } else if (value === \"blockquote\") {\n const el = getCursorElement();\n if (el?.closest(\"blockquote\")) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", \"<blockquote>\");\n }\n } else if (value === \"code\") {\n const el = getCursorElement();\n if (el?.closest(\"pre\")) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", \"<pre>\");\n mergeAdjacentPre();\n }\n } else {\n // Headings and \"Normal\" (p)\n escapeListIfNeeded();\n editor.executeCommand(\"formatBlock\", `<${value}>`);\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n return (\n headings.includes(tagName) ||\n element.closest(\"pre\") !== null ||\n element.closest(\"blockquote\") !== null ||\n findClosestCheckboxList(element) !== null ||\n element.closest(\"ul\") !== null ||\n element.closest(\"ol\") !== null\n );\n },\n canExecute: () => true,\n };\n}\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\n\n/**\n * Clear Formatting Plugin - Removes all formatting\n */\nexport const clearFormattingPlugin: Plugin = {\n name: 'clearFormatting',\n type: 'command',\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Clear Formatting\"\n aria-label=\"Clear Formatting\"\n >\n <IconWrapper icon=\"mdi:format-clear\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.clearFormatting();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0 && !selection.isCollapsed;\n },\n};\n\n","import { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { createCommandPlugin, createInlinePlugin } from \"./base\";\nimport { createBlockFormatPlugin } from \"./blockFormat\";\nimport { clearFormattingPlugin } from \"./clearFormatting\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\n\n/**\n * Standard Plugins\n */\nexport const boldPlugin: Plugin = createInlinePlugin(\n \"bold\",\n \"bold\",\n \"mdi:format-bold\",\n \"Bold\"\n);\n\nexport const italicPlugin: Plugin = createInlinePlugin(\n \"italic\",\n \"italic\",\n \"mdi:format-italic\",\n \"Italic\"\n);\n\nexport const underlinePlugin: Plugin = createInlinePlugin(\n \"underline\",\n \"underline\",\n \"mdi:format-underline\",\n \"Underline\"\n);\n\nexport const strikethroughPlugin: Plugin = createInlinePlugin(\n \"strikethrough\",\n \"strikeThrough\",\n \"mdi:format-strikethrough\",\n \"Strikethrough\"\n);\n\nexport const subscriptPlugin: Plugin = createInlinePlugin(\n \"subscript\",\n \"subscript\",\n \"mdi:format-subscript\",\n \"Subscript\"\n);\n\nexport const superscriptPlugin: Plugin = createInlinePlugin(\n \"superscript\",\n \"superscript\",\n \"mdi:format-superscript\",\n \"Superscript\"\n);\n\nexport const codeInlinePlugin: Plugin = {\n name: \"codeInline\",\n type: \"inline\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Code\"\n aria-label=\"Code\"\n >\n <IconWrapper icon=\"mdi:code-tags\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const existingCode = element?.closest(\"code\");\n if (existingCode) {\n // Unwrap code\n const parent = existingCode.parentNode;\n if (parent) {\n while (existingCode.firstChild) {\n parent.insertBefore(existingCode.firstChild, existingCode);\n }\n parent.removeChild(existingCode);\n }\n } else if (!range.collapsed) {\n // Wrap in code\n const code = document.createElement(\"code\");\n try {\n range.surroundContents(code);\n } catch {\n // If surroundContents fails (partial selection), use extractContents\n const fragment = range.extractContents();\n code.appendChild(fragment);\n range.insertNode(code);\n }\n }\n },\n isActive: () => {\n if (typeof document === \"undefined\") return false;\n const selection = document.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return element?.closest(\"code\") !== null;\n },\n canExecute: () => true,\n};\n\n/**\n * Horizontal Rule Plugin\n */\nexport const horizontalRulePlugin: Plugin = {\n name: \"horizontalRule\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Horizontal Rule\"\n aria-label=\"Horizontal Rule\"\n >\n <IconWrapper icon=\"mdi:minus\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertHorizontalRule\");\n },\n canExecute: () => true,\n};\n\nexport const undoPlugin: Plugin = createCommandPlugin(\n \"undo\",\n \"undo\",\n \"mdi:undo\",\n \"Undo\"\n);\n\nexport const redoPlugin: Plugin = createCommandPlugin(\n \"redo\",\n \"redo\",\n \"mdi:redo\",\n \"Redo\"\n);\n\n/**\n * Indent List Item Plugin\n */\nconst indentListItemPlugin: Plugin = {\n name: \"indentListItem\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Indent\"\n aria-label=\"Indent\"\n >\n <IconWrapper\n icon=\"mdi:format-indent-increase\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.indentListItem();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n return listItem !== null;\n },\n};\n\n/**\n * Outdent List Item Plugin\n */\nconst outdentListItemPlugin: Plugin = {\n name: \"outdentListItem\",\n type: \"command\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Outdent\"\n aria-label=\"Outdent\"\n >\n <IconWrapper\n icon=\"mdi:format-indent-decrease\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.outdentListItem();\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const listItem =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"li\")\n : (container as HTMLElement).closest(\"li\");\n\n if (!listItem) return false;\n\n // Check if in nested list\n const list = listItem.parentElement;\n if (!list || (list.tagName !== \"UL\" && list.tagName !== \"OL\"))\n return false;\n\n const parentListItem = list.parentElement;\n return parentListItem !== null && parentListItem.tagName === \"LI\";\n },\n};\n\n// Export plugins for direct use\nexport { indentListItemPlugin, outdentListItemPlugin };\n\n/**\n * Standard Plugin List\n * Plugins are referenced here directly to ensure they are included in defaultPlugins\n */\nconst _indentPlugin = indentListItemPlugin;\nconst _outdentPlugin = outdentListItemPlugin;\n\n/**\n * Standard Block Format Plugin (headings, lists, quote in a dropdown)\n * Uses h1, h2, h3 by default, but can be customized via Editor props\n */\nconst defaultBlockFormatPlugin = createBlockFormatPlugin(defaultHeadings);\n\nexport const defaultPlugins: Plugin[] = [\n undoPlugin,\n redoPlugin,\n defaultBlockFormatPlugin,\n boldPlugin,\n italicPlugin,\n underlinePlugin,\n strikethroughPlugin,\n codeInlinePlugin,\n subscriptPlugin,\n superscriptPlugin,\n horizontalRulePlugin,\n clearFormattingPlugin,\n _indentPlugin,\n _outdentPlugin,\n];\n","import { EditorAPI } from '../types';\n\n/**\n * Liest die aktuelle Font-Size aus dem DOM an der Cursor-Position\n */\nexport function getCurrentFontSize(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with fontSize\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n const fontSize = window.getComputedStyle(current).fontSize;\n if (fontSize && fontSize !== 'inherit' && fontSize !== 'initial') {\n // Konvertiere \"16px\" zu \"16\"\n const size = parseInt(fontSize, 10);\n if (!isNaN(size)) {\n return size.toString();\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current text color from the DOM at the cursor position\n */\nexport function getCurrentTextColor(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with color\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n // Check inline style first (has priority)\n const inlineColor = current.style.color;\n if (inlineColor && inlineColor.trim()) {\n // If already hex, return directly\n if (inlineColor.startsWith('#')) {\n return inlineColor;\n }\n // Wenn RGB/RGBA, konvertieren\n const rgbMatch = inlineColor.match(/\\d+/g);\n if (rgbMatch && rgbMatch.length >= 3) {\n const hex = '#' + rgbMatch.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n \n // Dann computed style\n const color = window.getComputedStyle(current).color;\n if (color && color !== 'inherit' && color !== 'initial' && color !== 'rgb(0, 0, 0)' && color !== 'rgba(0, 0, 0, 0)') {\n // Konvertiere RGB zu Hex\n const rgb = color.match(/\\d+/g);\n if (rgb && rgb.length >= 3) {\n const hex = '#' + rgb.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current background color from the DOM at the cursor position\n */\nexport function getCurrentBackgroundColor(editor: EditorAPI): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest element with backgroundColor\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n // Check inline style first (has priority)\n const inlineBgColor = current.style.backgroundColor;\n if (inlineBgColor && inlineBgColor.trim()) {\n // If already hex, return directly\n if (inlineBgColor.startsWith('#')) {\n return inlineBgColor;\n }\n // Wenn RGB/RGBA, konvertieren\n const rgbMatch = inlineBgColor.match(/\\d+/g);\n if (rgbMatch && rgbMatch.length >= 3) {\n const hex = '#' + rgbMatch.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n \n // Dann computed style\n const bgColor = window.getComputedStyle(current).backgroundColor;\n if (bgColor && bgColor !== 'inherit' && bgColor !== 'initial' && bgColor !== 'rgba(0, 0, 0, 0)' && bgColor !== 'transparent') {\n // Konvertiere RGB zu Hex\n const rgb = bgColor.match(/\\d+/g);\n if (rgb && rgb.length >= 3) {\n const hex = '#' + rgb.slice(0, 3).map(x => {\n const hex = parseInt(x, 10).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n return hex;\n }\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * Reads the current heading level from the DOM at the cursor position\n */\nexport function getCurrentHeading(editor: EditorAPI, availableHeadings: string[]): string | undefined {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element = container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : container as HTMLElement;\n\n if (!element) return undefined;\n\n // Find the nearest block element\n let current: HTMLElement | null = element;\n while (current && current !== document.body) {\n const tagName = current.tagName.toLowerCase();\n if (availableHeadings.includes(tagName)) {\n return tagName;\n }\n if (tagName === 'p') {\n return 'p';\n }\n current = current.parentElement;\n }\n\n return undefined;\n}\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { Dropdown } from '../components/Dropdown';\nimport { getCurrentTextColor, getCurrentBackgroundColor } from '../utils/stateReflection';\n\nconst defaultColors = [\n { value: '#000000', label: 'Black', color: '#000000' },\n { value: '#333333', label: 'Dark Gray', color: '#333333' },\n { value: '#666666', label: 'Gray', color: '#666666' },\n { value: '#ff0000', label: 'Red', color: '#ff0000' },\n { value: '#0000ff', label: 'Blue', color: '#0000ff' },\n { value: '#00aa00', label: 'Green', color: '#00aa00' },\n { value: '#ffaa00', label: 'Orange', color: '#ffaa00' },\n { value: '#aa00ff', label: 'Purple', color: '#aa00ff' },\n];\n\nexport function createTextColorPlugin(colors: string[] = defaultColors.map(c => c.value)): Plugin {\n // Find labels for known colors\n const getColorLabel = (color: string): string => {\n const found = defaultColors.find(c => c.value.toLowerCase() === color.toLowerCase());\n return found ? found.label : color;\n };\n \n const colorOptions = colors.map(color => ({\n value: color,\n label: getColorLabel(color),\n color,\n }));\n\n return {\n name: 'textColor',\n type: 'inline',\n renderButton: (props: ButtonProps & { onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n // Current text color from state reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentTextColor(props.editorAPI) : undefined);\n \n return (\n <Dropdown\n icon=\"mdi:format-color-text\"\n label=\"Text Color\"\n options={colorOptions.map(opt => ({\n value: opt.value,\n label: opt.label,\n color: opt.color,\n }))}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n showCustomColorInput\n />\n );\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n editor.executeCommand('foreColor', value);\n }\n },\n canExecute: () => true,\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentTextColor(editor);\n },\n };\n}\n\nexport function createBackgroundColorPlugin(colors: string[] = defaultColors.map(c => c.value)): Plugin {\n // Find labels for known colors\n const getColorLabel = (color: string): string => {\n const found = defaultColors.find(c => c.value.toLowerCase() === color.toLowerCase());\n return found ? found.label : color;\n };\n \n const colorOptions = colors.map(color => ({\n value: color,\n label: getColorLabel(color),\n color,\n }));\n\n return {\n name: 'backgroundColor',\n type: 'inline',\n renderButton: (props: ButtonProps & { onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n // Current background color from state reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentBackgroundColor(props.editorAPI) : undefined);\n \n return (\n <Dropdown\n icon=\"mdi:format-color-fill\"\n label=\"Background Color\"\n options={colorOptions.map(opt => ({\n value: opt.value,\n label: opt.label,\n color: opt.color,\n }))}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n showCustomColorInput\n />\n );\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n editor.executeCommand('backColor', value);\n }\n },\n canExecute: () => true,\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentBackgroundColor(editor);\n },\n };\n}\n\n","import React from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { Dropdown } from '../components/Dropdown';\nimport { getCurrentFontSize } from '../utils/stateReflection';\n\nexport function createFontSizePlugin(fontSizes: number[] = [12, 14, 16, 18, 20, 24]): Plugin {\n return {\n name: 'fontSize',\n type: 'inline',\n renderButton: (props: ButtonProps & { fontSizes?: number[]; onSelect?: (value: string) => void; editorAPI?: EditorAPI; currentValue?: string }) => {\n const sizes = props.fontSizes || fontSizes;\n const options = sizes.map(size => ({\n value: size.toString(),\n label: `${size}px`,\n preview: size.toString(),\n }));\n\n // Aktuelle Font-Size aus State Reflection\n const currentValue = props.currentValue || (props.editorAPI ? getCurrentFontSize(props.editorAPI) : undefined);\n\n return (\n <Dropdown\n icon=\"mdi:format-size\"\n label=\"Font Size\"\n options={options}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentFontSize(editor);\n },\n execute: (editor: EditorAPI, value?: string) => {\n if (value) {\n // Set inline style for precise size\n const selection = editor.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n let element: HTMLElement | null = null;\n \n if (range.commonAncestorContainer.nodeType === Node.TEXT_NODE) {\n element = range.commonAncestorContainer.parentElement;\n } else {\n element = range.commonAncestorContainer as HTMLElement;\n }\n \n if (element) {\n // Erstelle oder aktualisiere span mit fontSize\n const span = document.createElement('span');\n span.style.fontSize = `${value}px`;\n \n try {\n range.surroundContents(span);\n } catch (e) {\n // If surroundContents fails\n const contents = range.extractContents();\n span.appendChild(contents);\n range.insertNode(span);\n }\n \n // Cursor setzen\n range.setStartAfter(span);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }\n },\n canExecute: () => true,\n };\n}\n\n","import React, { useState, useRef } from 'react';\nimport { Plugin, EditorAPI, ButtonProps } from '../types';\nimport { IconWrapper } from '../components/IconWrapper';\nimport { isUrlSafe } from '../utils/sanitize';\n\n/**\n * Extracts the display URL from the raw onImageUpload return value.\n * Strips the \"|__aid__:attachmentId\" suffix if present.\n */\nfunction getDisplayUrl(raw: string): string {\n if (raw.includes('|__aid__:')) {\n return raw.substring(0, raw.indexOf('|__aid__:'));\n }\n return raw;\n}\n\n/**\n * Image plugin with URL input and file upload support.\n */\nexport function createImagePlugin(onImageUpload?: (file: File) => Promise<string>): Plugin {\n return {\n name: 'image',\n type: 'block',\n renderButton: (props: ButtonProps & { editorAPI?: EditorAPI }) => {\n const [showModal, setShowModal] = useState(false);\n // rawUrl stores the full value returned by onImageUpload (may contain |__aid__:)\n const [rawUrl, setRawUrl] = useState('');\n const [imageUrl, setImageUrl] = useState('');\n const [altText, setAltText] = useState('');\n const [isUploading, setIsUploading] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleInsertImage = () => {\n if (!props.editorAPI) return;\n \n // Use the raw URL (with |__aid__: if present) — createImageElement will parse it\n const src = (rawUrl || imageUrl).trim();\n \n if (!src) {\n alert('Please enter an image URL');\n return;\n }\n\n // Validate URL safety\n const srcWithoutMeta = src.split('|__aid__:')[0];\n if (!isUrlSafe(srcWithoutMeta)) {\n alert('Invalid image URL');\n return;\n }\n\n // Append alt text metadata if provided\n const fullValue = altText.trim()\n ? `${src}|__alt__:${altText.trim()}`\n : src;\n props.editorAPI.executeCommand('insertImage', fullValue);\n\n // Close modal\n setShowModal(false);\n setRawUrl('');\n setImageUrl('');\n setAltText('');\n };\n\n const handleFileSelect = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file || !onImageUpload) return;\n\n if (!file.type.startsWith('image/')) {\n alert('Please select an image file');\n return;\n }\n\n setIsUploading(true);\n\n try {\n const uploadedUrl = await onImageUpload(file);\n // Store the raw return value (may contain |__aid__:attachmentId)\n setRawUrl(uploadedUrl);\n // Display URL strips the metadata suffix\n setImageUrl(getDisplayUrl(uploadedUrl));\n } catch (error) {\n console.error('Image upload failed:', error);\n alert('Error uploading image');\n } finally {\n setIsUploading(false);\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setShowModal(true)}\n disabled={props.disabled}\n className=\"rte-toolbar-button\"\n title=\"Insert Image\"\n aria-label=\"Insert Image\"\n >\n <IconWrapper icon=\"mdi:image\" width={18} height={18} />\n </button>\n\n {showModal && (\n <div\n className=\"rte-image-modal-overlay\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowModal(false);\n }\n }}\n >\n <div className=\"rte-image-modal\">\n <div className=\"rte-image-modal-header\">\n <h3>Insert Image</h3>\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"rte-image-modal-close\"\n aria-label=\"Close\"\n >\n <IconWrapper icon=\"mdi:close\" width={20} height={20} />\n </button>\n </div>\n\n <div className=\"rte-image-modal-content\">\n {onImageUpload && (\n <div className=\"rte-image-upload-section\">\n <label className=\"rte-image-upload-label\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n <div className=\"rte-image-upload-button\">\n {isUploading ? (\n <>\n <IconWrapper icon=\"mdi:loading\" width={24} height={24} className=\"rte-spin\" />\n <span>Uploading...</span>\n </>\n ) : (\n <>\n <IconWrapper icon=\"mdi:upload\" width={24} height={24} />\n <span>Choose File</span>\n </>\n )}\n </div>\n </label>\n </div>\n )}\n\n <div className=\"rte-image-url-section\">\n <label>\n Image URL\n <input\n type=\"url\"\n value={imageUrl}\n onChange={(e) => {\n setImageUrl(e.target.value);\n // Clear raw URL when user manually edits\n setRawUrl('');\n }}\n placeholder=\"https://example.com/image.jpg\"\n className=\"rte-image-url-input\"\n />\n </label>\n </div>\n\n <div className=\"rte-image-alt-section\">\n <label>\n Alt Text (optional)\n <input\n type=\"text\"\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder=\"Image description\"\n className=\"rte-image-alt-input\"\n />\n </label>\n </div>\n\n {imageUrl && (\n <div className=\"rte-image-preview\">\n <img src={imageUrl} alt={altText || 'Preview'} />\n </div>\n )}\n </div>\n\n <div className=\"rte-image-modal-footer\">\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"rte-image-modal-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInsertImage}\n disabled={!imageUrl.trim() || isUploading}\n className=\"rte-image-modal-insert\"\n >\n Insert\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n },\n execute: (editor: EditorAPI) => {\n // Handled via renderButton\n },\n canExecute: () => true,\n };\n}\n\n","/**\n * Removes all formatting from the current selection\n */\nexport function clearFormatting(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n \n // Wenn Selection leer ist, nichts zu tun\n if (range.collapsed) return;\n\n try {\n // Use document.execCommand for standard formatting\n document.execCommand('removeFormat', false);\n document.execCommand('unlink', false);\n \n // Remove all inline styles and formatting manually\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el)) {\n const tagName = el.tagName.toLowerCase();\n \n // Remove inline formatting (strong, em, u, span, a, etc.)\n if (['strong', 'b', 'em', 'i', 'u', 'span', 'a', 'font'].includes(tagName)) {\n // Ersetze durch Text-Node\n const text = el.textContent || '';\n const textNode = document.createTextNode(text);\n el.parentNode?.replaceChild(textNode, el);\n }\n \n // Entferne alle Styles\n if (el.style.length > 0) {\n el.removeAttribute('style');\n }\n \n // Konvertiere Headings zu Paragraphs\n if (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tagName)) {\n const p = document.createElement('p');\n while (el.firstChild) {\n p.appendChild(el.firstChild);\n }\n el.parentNode?.replaceChild(p, el);\n }\n }\n }\n node = walker.nextNode();\n }\n \n // Normalize: remove empty formatting tags\n const normalizeWalker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n node = normalizeWalker.currentNode as Node;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName.toLowerCase();\n \n if (['strong', 'b', 'em', 'i', 'u', 'span'].includes(tagName) && !el.textContent?.trim()) {\n el.parentNode?.removeChild(el);\n }\n }\n node = normalizeWalker.nextNode();\n }\n \n } catch (error) {\n console.error('Error clearing formatting:', error);\n // Fallback: simple method\n document.execCommand('removeFormat', false);\n document.execCommand('unlink', false);\n }\n}\n\n/**\n * Removes only text color\n */\nexport function clearTextColor(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit color style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.color) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.color = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Removes only background color\n */\nexport function clearBackgroundColor(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit backgroundColor style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.backgroundColor) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.backgroundColor = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Entfernt nur Font-Size\n */\nexport function clearFontSize(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n if (range.collapsed) return;\n \n // Finde alle Elemente mit fontSize style\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n null\n );\n \n const elements: HTMLElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (range.intersectsNode(el) && el.style.fontSize) {\n elements.push(el);\n }\n }\n node = walker.nextNode();\n }\n \n elements.forEach(el => {\n el.style.fontSize = '';\n if (!el.style.length) {\n el.removeAttribute('style');\n }\n });\n}\n\n/**\n * Removes links (keeps text)\n */\nexport function clearLinks(selection: Selection): void {\n if (!selection || selection.rangeCount === 0) return;\n \n const range = selection.getRangeAt(0);\n \n // Finde alle Links in der Selection\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if (el.tagName.toLowerCase() === 'a' && range.intersectsNode(el)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n \n const links: HTMLAnchorElement[] = [];\n let node: Node | null = walker.currentNode as Node;\n \n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).tagName.toLowerCase() === 'a') {\n links.push(node as HTMLAnchorElement);\n }\n node = walker.nextNode();\n }\n \n // Remove links (keep text)\n links.forEach(link => {\n const parent = link.parentNode;\n if (parent) {\n while (link.firstChild) {\n parent.insertBefore(link.firstChild, link);\n }\n parent.removeChild(link);\n }\n });\n}\n\n","import { EditorContent } from '../types';\nimport { SelectionState } from './selection';\n\nexport interface HistoryEntry {\n content: EditorContent;\n selection: SelectionState | null;\n}\n\nexport class HistoryManager {\n private history: HistoryEntry[] = [];\n private currentIndex: number = -1;\n private maxHistorySize: number = 50;\n\n push(content: EditorContent, selection: SelectionState | null = null): void {\n // Remove all entries after currentIndex (when we went back)\n this.history = this.history.slice(0, this.currentIndex + 1);\n\n // Add new entry\n this.history.push({\n content: JSON.parse(JSON.stringify(content)),\n selection: selection ? JSON.parse(JSON.stringify(selection)) : null,\n });\n this.currentIndex++;\n\n // Limit history size\n if (this.history.length > this.maxHistorySize) {\n this.history.shift();\n this.currentIndex = Math.max(0, this.currentIndex - 1);\n }\n }\n\n undo(): HistoryEntry | null {\n if (this.canUndo()) {\n this.currentIndex--;\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n redo(): HistoryEntry | null {\n if (this.canRedo()) {\n this.currentIndex++;\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n canUndo(): boolean {\n return this.currentIndex > 0;\n }\n\n canRedo(): boolean {\n return this.currentIndex < this.history.length - 1;\n }\n\n getCurrent(): HistoryEntry | null {\n if (this.currentIndex >= 0 && this.currentIndex < this.history.length) {\n const entry = this.history[this.currentIndex];\n return {\n content: JSON.parse(JSON.stringify(entry.content)),\n selection: entry.selection ? JSON.parse(JSON.stringify(entry.selection)) : null,\n };\n }\n return null;\n }\n\n reset(): void {\n this.history = [];\n this.currentIndex = -1;\n }\n}\n","import { Dropdown } from \"../components/Dropdown\";\nimport { EditorAPI, Plugin } from \"../types\";\n\nconst alignmentLabels: Record<string, string> = {\n left: \"Left\",\n center: \"Center\",\n right: \"Right\",\n justify: \"Justify\",\n};\n\nconst alignmentIcons: Record<string, string> = {\n left: \"mdi:format-align-left\",\n center: \"mdi:format-align-center\",\n right: \"mdi:format-align-right\",\n justify: \"mdi:format-align-justify\",\n};\n\nconst alignmentCommands: Record<string, string> = {\n left: \"justifyLeft\",\n center: \"justifyCenter\",\n right: \"justifyRight\",\n justify: \"justifyFull\",\n};\n\n/**\n * Detects current text alignment at cursor position.\n */\nfunction detectCurrentAlignment(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n const selection = document.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n // Walk up to find the block-level element\n let block: HTMLElement | null = element;\n const blockTags = new Set([\n \"P\",\n \"DIV\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"LI\",\n \"BLOCKQUOTE\",\n \"TD\",\n \"TH\",\n ]);\n while (block && !blockTags.has(block.tagName)) {\n block = block.parentElement;\n }\n\n if (!block) return undefined;\n\n const align = block.style.textAlign || window.getComputedStyle(block).textAlign;\n if (align === \"center\") return \"center\";\n if (align === \"right\") return \"right\";\n if (align === \"justify\") return \"justify\";\n return \"left\";\n}\n\n/**\n * Creates an alignment plugin with a dropdown.\n * @param alignments - Which alignments to offer, defaults to all four.\n */\nexport function createAlignmentPlugin(\n alignments: string[] = [\"left\", \"center\", \"right\", \"justify\"]\n): Plugin {\n const options = alignments.map((a) => ({\n value: a,\n label: alignmentLabels[a] || a,\n icon: alignmentIcons[a],\n }));\n\n return {\n name: \"alignment\",\n type: \"block\",\n renderButton: (props) => {\n const onSelect = props.onSelect as\n | ((value: string) => void)\n | undefined;\n const currentValue =\n (props.currentValue as string | undefined) ||\n detectCurrentAlignment() ||\n \"left\";\n\n return (\n <Dropdown\n icon={alignmentIcons[currentValue] || \"mdi:format-align-left\"}\n label=\"Alignment\"\n options={options}\n onSelect={(value) => {\n if (onSelect) onSelect(value);\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: () => detectCurrentAlignment(),\n execute: (_editor: EditorAPI, value?: string) => {\n if (!value) return;\n const command = alignmentCommands[value];\n if (command) {\n document.execCommand(command, false);\n }\n },\n isActive: () => {\n const align = detectCurrentAlignment();\n return align !== undefined && align !== \"left\";\n },\n canExecute: () => true,\n };\n}\n\n/** Pre-built alignment plugin with all four options */\nexport const alignmentPlugin: Plugin = createAlignmentPlugin();\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { isUrlSafe } from \"../utils/sanitize\";\n\n/* ══════════════════════════════════════════════════════════════════════════\n Types\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface LinkData {\n url: string;\n target: string;\n /** Values for custom fields, keyed by field.key */\n custom: Record<string, string>;\n}\n\n/**\n * Describes an additional field injected into the link dialog.\n * This allows platform-specific extensions (e.g. page reference, URL extras)\n * without baking them into the core RTE.\n */\nexport interface LinkCustomField {\n /** Unique identifier (used as key in LinkData.custom) */\n key: string;\n /** Display label */\n label: string;\n /** Input placeholder */\n placeholder?: string;\n /** The HTML attribute to read/write on the <a> element (e.g. \"data-page-ref\") */\n dataAttribute: string;\n /** If true, this field's value is appended to the href when saving. */\n appendToHref?: boolean;\n /** If true, the URL input is disabled when this field has a value. */\n disablesUrl?: boolean;\n}\n\nexport interface AdvancedLinkOptions {\n /** Show \"Open in new tab\" checkbox. Defaults to true. */\n enableTarget?: boolean;\n /** Additional custom fields rendered in the advanced section. */\n customFields?: LinkCustomField[];\n}\n\nfunction createEmptyLinkData(fields: LinkCustomField[]): LinkData {\n const custom: Record<string, string> = {};\n for (const f of fields) custom[f.key] = \"\";\n return { url: \"https://\", target: \"_self\", custom };\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Position helper — prefers above the link, falls back to below\n ══════════════════════════════════════════════════════════════════════ */\n\nconst VERTICAL_GAP = 10;\nconst HORIZONTAL_OFFSET = 5;\n\nfunction computePosition(anchorRect: DOMRect) {\n const dialogWidth = 380;\n const estimatedHeight = 260;\n\n const topAbove = anchorRect.top - VERTICAL_GAP - estimatedHeight;\n const topBelow = anchorRect.bottom + VERTICAL_GAP;\n\n const aboveOverflowsTop = topAbove < 8;\n const belowOverflowsBottom =\n topBelow + estimatedHeight > window.innerHeight - 8;\n\n let top: number;\n if (!aboveOverflowsTop) {\n top = topAbove;\n } else if (!belowOverflowsBottom) {\n top = topBelow;\n } else {\n top = Math.max(8, topAbove);\n }\n\n let left = anchorRect.left - HORIZONTAL_OFFSET;\n if (left + dialogWidth > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - dialogWidth - 8);\n }\n\n return { top, left };\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Floating Link Editor — rendered via portal on document.body\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface FloatingLinkEditorProps {\n linkData: LinkData;\n options: Required<Pick<AdvancedLinkOptions, \"enableTarget\">> &\n Pick<AdvancedLinkOptions, \"customFields\">;\n anchorRect: DOMRect;\n isEditing: boolean;\n onSave: (data: LinkData) => void;\n onRemove: () => void;\n onClose: () => void;\n}\n\nconst FloatingLinkEditor: React.FC<FloatingLinkEditorProps> = ({\n linkData: initialData,\n options,\n anchorRect,\n isEditing,\n onSave,\n onRemove,\n onClose,\n}) => {\n const [data, setData] = useState<LinkData>(initialData);\n const customFields = options.customFields ?? [];\n\n const [showAdvanced, setShowAdvanced] = useState(() => {\n // Auto-expand if target is _blank or any custom field has a value\n if (initialData.target === \"_blank\") return true;\n for (const f of customFields) {\n if (initialData.custom[f.key]) return true;\n }\n return false;\n });\n\n const dialogRef = useRef<HTMLDivElement>(null);\n const urlInputRef = useRef<HTMLInputElement>(null);\n\n // Focus URL input on open\n useEffect(() => {\n const timer = setTimeout(() => {\n const input = urlInputRef.current;\n if (input) {\n input.focus();\n input.select();\n }\n }, 30);\n return () => clearTimeout(timer);\n }, []);\n\n // Click-away\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (\n dialogRef.current &&\n !dialogRef.current.contains(e.target as Node)\n ) {\n const target = e.target as HTMLElement;\n if (\n target.closest?.(\"a\") &&\n target.closest?.(\"[contenteditable]\")\n ) {\n return;\n }\n onClose();\n }\n };\n const timer = setTimeout(() => {\n document.addEventListener(\"mousedown\", handler);\n }, 50);\n return () => {\n clearTimeout(timer);\n document.removeEventListener(\"mousedown\", handler);\n };\n }, [onClose]);\n\n // Escape to close\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onSave(data);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n };\n\n const setField = (key: keyof Omit<LinkData, \"custom\">, value: string) =>\n setData((prev) => ({ ...prev, [key]: value }));\n\n const setCustom = (key: string, value: string) =>\n setData((prev) => ({\n ...prev,\n custom: { ...prev.custom, [key]: value },\n }));\n\n // Check if URL input should be disabled (a custom field with disablesUrl has a value)\n const urlDisabledByCustom = customFields.some(\n (f) => f.disablesUrl && !!data.custom[f.key]\n );\n\n const hasAdvancedSection =\n options.enableTarget || customFields.length > 0;\n\n const pos = computePosition(anchorRect);\n\n return createPortal(\n <div\n ref={dialogRef}\n className=\"rte-link-dialog rte-link-dialog-floating\"\n style={{ top: pos.top, left: pos.left, position: \"fixed\" }}\n onKeyDown={handleKeyDown}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n type=\"button\"\n className=\"rte-link-dialog-close\"\n onClick={onClose}\n onMouseDown={(e) => e.preventDefault()}\n aria-label=\"Close\"\n >\n <IconWrapper icon=\"mdi:close\" width={16} height={16} />\n </button>\n\n <div className=\"rte-link-dialog-field\">\n <label className=\"rte-link-dialog-label\">URL</label>\n <input\n ref={urlInputRef}\n type=\"url\"\n className=\"rte-link-dialog-input\"\n value={data.url}\n onChange={(e) => setField(\"url\", e.target.value)}\n placeholder=\"https://...\"\n disabled={urlDisabledByCustom}\n />\n </div>\n\n {hasAdvancedSection && (\n <div className=\"rte-link-dialog-advanced-section\">\n <button\n type=\"button\"\n className=\"rte-link-dialog-toggle\"\n onClick={() => setShowAdvanced(!showAdvanced)}\n onMouseDown={(e) => e.preventDefault()}\n >\n <span>\n {showAdvanced ? \"▾\" : \"▸\"} Advanced\n </span>\n </button>\n\n {showAdvanced && (\n <div className=\"rte-link-dialog-advanced\">\n {/* Custom fields */}\n {customFields.map((field) => (\n <div\n key={field.key}\n className=\"rte-link-dialog-field\"\n >\n <label className=\"rte-link-dialog-label\">\n {field.label}\n </label>\n <input\n type=\"text\"\n className=\"rte-link-dialog-input\"\n value={data.custom[field.key] || \"\"}\n onChange={(e) =>\n setCustom(\n field.key,\n e.target.value\n )\n }\n placeholder={field.placeholder}\n />\n </div>\n ))}\n\n {/* Target checkbox */}\n {options.enableTarget && (\n <label className=\"rte-link-dialog-checkbox-row\">\n <input\n type=\"checkbox\"\n checked={data.target === \"_blank\"}\n onChange={(e) =>\n setField(\n \"target\",\n e.target.checked\n ? \"_blank\"\n : \"_self\"\n )\n }\n />\n <span>Open in new tab</span>\n </label>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"rte-link-dialog-actions\">\n {isEditing && (\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn rte-link-dialog-btn-danger\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onRemove}\n >\n Remove\n </button>\n )}\n <div style={{ flex: 1 }} />\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"rte-link-dialog-btn rte-link-dialog-btn-primary\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onSave(data)}\n disabled={\n !data.url.trim() || data.url.trim() === \"https://\"\n }\n >\n Save\n </button>\n </div>\n </div>,\n document.body\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Helpers\n ══════════════════════════════════════════════════════════════════════ */\n\n/** Find the <a> element at the current selection. */\nfunction getSelectedLink(): HTMLAnchorElement | null {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n const range = sel.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const el =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n return el?.closest(\"a\") as HTMLAnchorElement | null;\n}\n\n/** Read link data from an <a> element. */\nfunction readLinkData(\n link: HTMLAnchorElement,\n customFields: LinkCustomField[]\n): LinkData {\n const href = link.getAttribute(\"href\") || \"https://\";\n const custom: Record<string, string> = {};\n\n // Read custom field values from data-attributes\n for (const field of customFields) {\n custom[field.key] = link.getAttribute(field.dataAttribute) || \"\";\n }\n\n // If a field with appendToHref has a value, strip it from the URL\n let url = href;\n for (const field of customFields) {\n if (field.appendToHref && custom[field.key] && href.endsWith(custom[field.key])) {\n url = href.slice(0, href.length - custom[field.key].length);\n }\n }\n\n return {\n url,\n target: link.getAttribute(\"target\") || \"_self\",\n custom,\n };\n}\n\n/** Apply link data attributes to an <a> element. */\nfunction applyLinkData(\n link: HTMLAnchorElement,\n data: LinkData,\n customFields: LinkCustomField[]\n): void {\n // Build href: url + any appendToHref custom fields\n let href = data.url;\n for (const field of customFields) {\n if (field.appendToHref && data.custom[field.key]) {\n href += data.custom[field.key];\n }\n }\n // Validate URL before setting href to prevent javascript: / data: injection\n if (!isUrlSafe(href)) return;\n link.setAttribute(\"href\", href);\n\n // Target\n if (data.target && data.target !== \"_self\") {\n link.setAttribute(\"target\", data.target);\n } else {\n link.removeAttribute(\"target\");\n }\n\n // Custom field data-attributes\n for (const field of customFields) {\n const value = data.custom[field.key];\n if (value) {\n link.setAttribute(field.dataAttribute, value);\n } else {\n link.removeAttribute(field.dataAttribute);\n }\n }\n}\n\n/* ══════════════════════════════════════════════════════════════════════════\n Link Toolbar Button + Floating Editor orchestrator\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface LinkButtonProps extends ButtonProps {\n editorAPI?: EditorAPI;\n enableTarget: boolean;\n customFields: LinkCustomField[];\n}\n\nconst LinkToolbarButton: React.FC<LinkButtonProps> = (props) => {\n const { enableTarget, customFields } = props;\n\n const [showDialog, setShowDialog] = useState(false);\n const [linkData, setLinkData] = useState<LinkData>(() =>\n createEmptyLinkData(customFields)\n );\n const [isEditing, setIsEditing] = useState(false);\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null);\n const savedRangeRef = useRef<Range | null>(null);\n const isOpenRef = useRef(false);\n\n useEffect(() => {\n isOpenRef.current = showDialog;\n }, [showDialog]);\n\n // ── Open dialog ─────────────────────────────────────────────────\n const openDialog = useCallback(\n (existingLink?: HTMLAnchorElement | null) => {\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n\n savedRangeRef.current = sel.getRangeAt(0).cloneRange();\n\n const link = existingLink || getSelectedLink();\n\n if (link) {\n setIsEditing(true);\n setLinkData(readLinkData(link, customFields));\n setAnchorRect(link.getBoundingClientRect());\n } else {\n setIsEditing(false);\n setLinkData(createEmptyLinkData(customFields));\n const range = sel.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n const node = range.commonAncestorContainer;\n const el =\n node.nodeType === Node.TEXT_NODE\n ? node.parentElement\n : (node as HTMLElement);\n if (el) {\n setAnchorRect(el.getBoundingClientRect());\n }\n } else {\n setAnchorRect(rect);\n }\n }\n\n setShowDialog(true);\n },\n [customFields]\n );\n\n // ── Click on links in the editor ────────────────────────────────\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\") as HTMLAnchorElement | null;\n const editorRoot = target.closest(\"[contenteditable]\");\n\n if (!link || !editorRoot) return;\n\n // Cmd/Ctrl+Click → open in new tab\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n const href = link.getAttribute(\"href\");\n if (href && isUrlSafe(href)) window.open(href, \"_blank\");\n return;\n }\n\n if (isOpenRef.current) return;\n\n setTimeout(() => {\n if (!isOpenRef.current) {\n openDialog(link);\n }\n }, 10);\n };\n\n document.addEventListener(\"click\", handler);\n return () => document.removeEventListener(\"click\", handler);\n }, [openDialog]);\n\n // ── Restore selection ───────────────────────────────────────────\n const restoreSelection = useCallback(() => {\n if (savedRangeRef.current) {\n const sel = document.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(savedRangeRef.current);\n }\n }\n }, []);\n\n // ── Save ────────────────────────────────────────────────────────\n const handleSave = useCallback(\n (data: LinkData) => {\n setShowDialog(false);\n restoreSelection();\n\n const existingLink = getSelectedLink();\n\n if (existingLink) {\n applyLinkData(existingLink, data, customFields);\n } else {\n let href = data.url;\n for (const field of customFields) {\n if (field.appendToHref && data.custom[field.key]) {\n href += data.custom[field.key];\n }\n }\n if (!isUrlSafe(href)) return;\n document.execCommand(\"createLink\", false, href);\n const newLink = getSelectedLink();\n if (newLink) {\n applyLinkData(newLink, data, customFields);\n }\n }\n\n // Move cursor after the link\n setTimeout(() => {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const link = getSelectedLink();\n if (link) {\n const range = document.createRange();\n range.setStartAfter(link);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }, 0);\n },\n [restoreSelection, customFields]\n );\n\n // ── Remove link ─────────────────────────────────────────────────\n const handleRemove = useCallback(() => {\n setShowDialog(false);\n restoreSelection();\n\n const link = getSelectedLink();\n if (link) {\n const parent = link.parentNode;\n if (parent) {\n while (link.firstChild) {\n parent.insertBefore(link.firstChild, link);\n }\n parent.removeChild(link);\n }\n }\n }, [restoreSelection]);\n\n // ── Close ───────────────────────────────────────────────────────\n const handleClose = useCallback(() => {\n setShowDialog(false);\n restoreSelection();\n\n setTimeout(() => {\n const sel = document.getSelection();\n if (sel && sel.rangeCount > 0) {\n const link = getSelectedLink();\n if (link) {\n const lastChild = link.lastChild;\n if (lastChild) {\n const range = document.createRange();\n range.setStartAfter(lastChild);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n }, 0);\n }, [restoreSelection]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => openDialog()}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Link (⌘K)\"\n aria-label=\"Link\"\n >\n <IconWrapper icon=\"mdi:link\" width={18} height={18} />\n </button>\n {showDialog && anchorRect && (\n <FloatingLinkEditor\n linkData={linkData}\n options={{ enableTarget, customFields }}\n anchorRect={anchorRect}\n isEditing={isEditing}\n onSave={handleSave}\n onRemove={handleRemove}\n onClose={handleClose}\n />\n )}\n </>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Plugin factory + export\n ══════════════════════════════════════════════════════════════════════ */\n\n/**\n * Creates an advanced link plugin with a floating dialog.\n *\n * Core features (always available):\n * - URL input\n * - \"Open in new tab\" checkbox (enableTarget)\n * - Cmd/Ctrl+Click → open link in new tab\n * - Click on link → edit it inline\n *\n * Platform-specific fields (injected via `customFields`):\n * - Each field is rendered in the \"Advanced\" section\n * - Values are stored as data-attributes on the <a> element\n * - `appendToHref` fields have their value appended to the href\n * - `disablesUrl` fields disable the URL input when they have a value\n */\nexport function createAdvancedLinkPlugin(\n options: AdvancedLinkOptions = {}\n): Plugin {\n const enableTarget = options.enableTarget ?? true;\n const customFields = options.customFields ?? [];\n\n return {\n name: \"advancedLink\",\n type: \"inline\",\n renderButton: (props: ButtonProps & { [key: string]: unknown }) => (\n <LinkToolbarButton\n {...props}\n editorAPI={props.editorAPI as EditorAPI | undefined}\n enableTarget={enableTarget}\n customFields={customFields}\n />\n ),\n execute: () => {\n // Handled by the dialog component\n },\n isActive: () => {\n if (typeof document === \"undefined\") return false;\n return getSelectedLink() !== null;\n },\n canExecute: () => {\n const sel = document.getSelection();\n return sel !== null && sel.rangeCount > 0;\n },\n };\n}\n\n/** Pre-built link plugin with just target enabled (no custom fields). */\nexport const advancedLinkPlugin: Plugin = createAdvancedLinkPlugin();\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport {\n createTable,\n deleteColumn,\n deleteRow,\n deleteTable,\n getActiveCell,\n getActiveTable,\n insertColumn,\n insertRow,\n} from \"../utils/table\";\n\n/* ══════════════════════════════════════════════════════════════════════════\n Insert Table Dialog — rendered inside the toolbar button\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface InsertDialogProps {\n onInsert: (rows: number, cols: number) => void;\n onClose: () => void;\n}\n\nconst InsertTableDialog: React.FC<InsertDialogProps> = ({\n onInsert,\n onClose,\n}) => {\n const [rows, setRows] = useState(3);\n const [cols, setCols] = useState(3);\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (\n dialogRef.current &&\n !dialogRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n return (\n <div className=\"rte-table-insert-dialog\" ref={dialogRef}>\n <div className=\"rte-table-insert-title\">Insert Table</div>\n <div className=\"rte-table-insert-fields\">\n <label className=\"rte-table-insert-label\">\n <span>Zeilen</span>\n <input\n type=\"number\"\n min={1}\n max={20}\n value={rows}\n onChange={(e) =>\n setRows(\n Math.max(\n 1,\n Math.min(20, parseInt(e.target.value) || 1)\n )\n )\n }\n className=\"rte-table-insert-input\"\n />\n </label>\n <label className=\"rte-table-insert-label\">\n <span>Spalten</span>\n <input\n type=\"number\"\n min={1}\n max={10}\n value={cols}\n onChange={(e) =>\n setCols(\n Math.max(\n 1,\n Math.min(10, parseInt(e.target.value) || 1)\n )\n )\n }\n className=\"rte-table-insert-input\"\n />\n </label>\n </div>\n <button\n type=\"button\"\n className=\"rte-table-insert-btn\"\n onClick={() => onInsert(rows, cols)}\n >\n Insert\n </button>\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Context Menu — rendered as a portal when right-clicking in a cell\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface ContextMenuProps {\n x: number;\n y: number;\n onClose: () => void;\n}\n\nconst TableContextMenu: React.FC<ContextMenuProps> = ({\n x,\n y,\n onClose,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n const action = (fn: () => void) => {\n fn();\n onClose();\n };\n\n return (\n <div\n ref={ref}\n className=\"rte-table-context-menu\"\n style={{ position: \"fixed\", left: x, top: y }}\n >\n <button\n type=\"button\"\n onClick={() => action(() => insertRow(\"above\"))}\n >\n Insert row above\n </button>\n <button\n type=\"button\"\n onClick={() => action(() => insertRow(\"below\"))}\n >\n Insert row below\n </button>\n <div className=\"rte-table-context-divider\" />\n <button\n type=\"button\"\n onClick={() => action(() => insertColumn(\"left\"))}\n >\n Insert column left\n </button>\n <button\n type=\"button\"\n onClick={() => action(() => insertColumn(\"right\"))}\n >\n Insert column right\n </button>\n <div className=\"rte-table-context-divider\" />\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteRow)}\n >\n Delete row\n </button>\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteColumn)}\n >\n Delete column\n </button>\n <button\n type=\"button\"\n className=\"rte-table-context-danger\"\n onClick={() => action(deleteTable)}\n >\n Delete table\n </button>\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Toolbar Button (stateful — opens insert dialog)\n ══════════════════════════════════════════════════════════════════════ */\n\ninterface TableButtonProps extends ButtonProps {\n editorAPI?: EditorAPI;\n}\n\nconst TableToolbarButton: React.FC<TableButtonProps> = (props) => {\n const [showDialog, setShowDialog] = useState(false);\n\n const handleInsert = useCallback(\n (rows: number, cols: number) => {\n setShowDialog(false);\n if (!props.editorAPI) return;\n\n const sel = document.getSelection();\n if (!sel || sel.rangeCount === 0) return;\n const range = sel.getRangeAt(0);\n\n // Find the editor's contentEditable root\n const container = range.commonAncestorContainer;\n const editorEl =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n const editorRoot = editorEl?.closest(\"[contenteditable]\");\n if (!editorRoot) return;\n\n const table = createTable(rows, cols);\n\n // Insert after the current block element\n let block: HTMLElement | null = editorEl;\n while (\n block &&\n block !== editorRoot &&\n block.parentElement !== editorRoot\n ) {\n block = block.parentElement;\n }\n\n if (block && block !== editorRoot) {\n block.parentNode?.insertBefore(table, block.nextSibling);\n } else {\n editorRoot.appendChild(table);\n }\n\n // Add a paragraph after the table so the user can continue typing\n const p = document.createElement(\"p\");\n p.innerHTML = \"<br>\";\n table.parentNode?.insertBefore(p, table.nextSibling);\n\n // Focus the first cell\n const firstCell = table.querySelector(\"td, th\") as HTMLTableCellElement | null;\n if (firstCell) {\n const newRange = document.createRange();\n newRange.setStart(firstCell, 0);\n newRange.collapse(true);\n sel.removeAllRanges();\n sel.addRange(newRange);\n }\n },\n [props.editorAPI]\n );\n\n return (\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n onClick={() => setShowDialog(!showDialog)}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Table\"\n aria-label=\"Table\"\n >\n <IconWrapper icon=\"mdi:table\" width={18} height={18} />\n </button>\n {showDialog && (\n <InsertTableDialog\n onInsert={handleInsert}\n onClose={() => setShowDialog(false)}\n />\n )}\n </div>\n );\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n Table Plugin export\n ══════════════════════════════════════════════════════════════════════ */\n\nexport const tablePlugin: Plugin = {\n name: \"table\",\n type: \"command\",\n renderButton: (props: ButtonProps & { [key: string]: unknown }) => (\n <TableToolbarButton\n {...props}\n editorAPI={props.editorAPI as EditorAPI | undefined}\n />\n ),\n execute: () => {\n // Insertion is handled by the dialog component\n },\n isActive: () => getActiveTable() !== null,\n canExecute: () => true,\n};\n\n/* ══════════════════════════════════════════════════════════════════════════\n TableContextMenuProvider — wrap the editor to enable right-click menu\n ══════════════════════════════════════════════════════════════════════ */\n\nexport const TableContextMenuProvider: React.FC<{\n children: React.ReactNode;\n}> = ({ children }) => {\n const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const cell = target.closest(\"td, th\");\n const editorRoot = target.closest(\"[contenteditable]\");\n if (cell && editorRoot) {\n e.preventDefault();\n setMenu({ x: e.clientX, y: e.clientY });\n }\n };\n document.addEventListener(\"contextmenu\", handler);\n return () => document.removeEventListener(\"contextmenu\", handler);\n }, []);\n\n return (\n <>\n {children}\n {menu && (\n <TableContextMenu\n x={menu.x}\n y={menu.y}\n onClose={() => setMenu(null)}\n />\n )}\n </>\n );\n};\n","import { Plugin } from \"../types\";\nimport {\n boldPlugin,\n italicPlugin,\n underlinePlugin,\n strikethroughPlugin,\n subscriptPlugin,\n superscriptPlugin,\n codeInlinePlugin,\n undoPlugin,\n redoPlugin,\n indentListItemPlugin,\n outdentListItemPlugin,\n horizontalRulePlugin,\n} from \"../plugins\";\nimport { createBlockFormatPlugin } from \"../plugins/blockFormat\";\nimport { clearFormattingPlugin } from \"../plugins/clearFormatting\";\nimport { createTextColorPlugin } from \"../plugins/colors\";\nimport { createFontSizePlugin } from \"../plugins/fontSize\";\nimport { createAlignmentPlugin } from \"../plugins/alignment\";\nimport { createAdvancedLinkPlugin, LinkCustomField } from \"../plugins/linkDialog\";\nimport { tablePlugin } from \"../plugins/table\";\nimport { createImagePlugin } from \"../plugins/image\";\n\n/* ======================================================================\n EditorSettings — matches the Hendriks settings object 1:1\n ====================================================================== */\n\nexport interface EditorSettings {\n format?: {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n subscript?: boolean;\n superscript?: boolean;\n bulletList?: boolean;\n numberedList?: boolean;\n quote?: boolean;\n codeBlock?: boolean;\n horizontalRule?: boolean;\n check?: boolean;\n /** Heading levels to enable, e.g. [\"h1\", \"h2\", \"h3\"] */\n typography?: string[];\n /** Color palette for text color, e.g. [\"#000\", \"#ff0000\"] */\n colors?: string[];\n /** Enable font size dropdown */\n fontSize?: boolean;\n /** Alignment options, e.g. [\"left\", \"center\", \"right\", \"justify\", \"indent\", \"outdent\"] */\n alignment?: string[];\n };\n link?: {\n external?: boolean;\n internal?: boolean;\n };\n table?: {\n enabled?: boolean;\n };\n image?: {\n enabled?: boolean;\n };\n}\n\n/** Default: everything enabled. */\nexport const defaultEditorSettings: EditorSettings = {\n format: {\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n code: true,\n subscript: true,\n superscript: true,\n bulletList: true,\n numberedList: true,\n quote: true,\n codeBlock: true,\n horizontalRule: true,\n check: true,\n typography: [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"],\n colors: [\n \"#000000\", \"#434343\", \"#666666\", \"#999999\", \"#b7b7b7\", \"#cccccc\", \"#d9d9d9\", \"#ffffff\",\n \"#ff0000\", \"#ff9900\", \"#ffff00\", \"#00ff00\", \"#00ffff\", \"#0000ff\", \"#9900ff\", \"#ff00ff\",\n ],\n fontSize: true,\n alignment: [\"left\", \"center\", \"right\", \"justify\", \"outdent\", \"indent\"],\n },\n link: {\n external: true,\n internal: true,\n },\n table: {\n enabled: true,\n },\n image: {\n enabled: true,\n },\n};\n\n/* ======================================================================\n buildPluginsFromSettings — convert settings object to Plugin[]\n ====================================================================== */\n\nexport interface BuildPluginsOptions {\n /** Callback for image uploads (required when image.enabled is true). */\n onImageUpload?: (file: File) => Promise<string>;\n /** Custom fields for the advanced link dialog (e.g. urlExtra, pageRef). */\n linkCustomFields?: LinkCustomField[];\n /** Custom font sizes for the font size dropdown. */\n fontSizes?: number[];\n}\n\n/**\n * Builds a Plugin[] array from an EditorSettings object.\n *\n * Usage:\n * ```ts\n * const plugins = buildPluginsFromSettings(settings, {\n * onImageUpload: handleUpload,\n * linkCustomFields: [{ key: 'urlExtra', ... }],\n * });\n * ```\n */\nexport function buildPluginsFromSettings(\n settings: EditorSettings = defaultEditorSettings,\n options: BuildPluginsOptions = {}\n): Plugin[] {\n const fmt = settings.format ?? {};\n const plugins: Plugin[] = [];\n\n // Always: Undo / Redo\n plugins.push(undoPlugin);\n plugins.push(redoPlugin);\n\n // Block format dropdown (headings, lists, quote, checkbox)\n const headings = fmt.typography ?? [];\n plugins.push(\n createBlockFormatPlugin(headings.length > 0 ? headings : undefined, {\n bulletList: fmt.bulletList,\n numberedList: fmt.numberedList,\n quote: fmt.quote,\n codeBlock: fmt.codeBlock,\n check: fmt.check,\n })\n );\n\n // Font size\n if (fmt.fontSize) {\n const sizes = options.fontSizes ?? [12, 14, 16, 18, 20, 24, 28, 32];\n plugins.push(createFontSizePlugin(sizes));\n }\n\n // Inline formatting\n if (fmt.bold !== false) plugins.push(boldPlugin);\n if (fmt.italic !== false) plugins.push(italicPlugin);\n if (fmt.underline !== false) plugins.push(underlinePlugin);\n if (fmt.strikethrough) plugins.push(strikethroughPlugin);\n\n // Link\n if (settings.link?.external || settings.link?.internal) {\n plugins.push(\n createAdvancedLinkPlugin({\n enableTarget: true,\n customFields: options.linkCustomFields,\n })\n );\n }\n\n // Colors\n if (fmt.colors && fmt.colors.length > 0) {\n plugins.push(createTextColorPlugin(fmt.colors));\n }\n\n // Extra inline formatting (code, subscript, superscript)\n if (fmt.code) plugins.push(codeInlinePlugin);\n if (fmt.subscript) plugins.push(subscriptPlugin);\n if (fmt.superscript) plugins.push(superscriptPlugin);\n\n // Horizontal rule\n if (fmt.horizontalRule) plugins.push(horizontalRulePlugin);\n\n // Table\n if (settings.table?.enabled) {\n plugins.push(tablePlugin);\n }\n\n // Alignment\n if (fmt.alignment && fmt.alignment.length > 0) {\n const supported = [\"left\", \"center\", \"right\", \"justify\"];\n const alignments = fmt.alignment.filter((a) => supported.includes(a));\n if (alignments.length > 0) {\n plugins.push(createAlignmentPlugin(alignments));\n }\n }\n\n // Image\n if (settings.image?.enabled && options.onImageUpload) {\n plugins.push(createImagePlugin(options.onImageUpload));\n }\n\n // Always: Clear formatting\n plugins.push(clearFormattingPlugin);\n\n // Indent / Outdent (controlled by alignment setting)\n const alignArr = fmt.alignment ?? [];\n if (alignArr.includes(\"indent\")) plugins.push(indentListItemPlugin);\n if (alignArr.includes(\"outdent\")) plugins.push(outdentListItemPlugin);\n\n return plugins;\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\ninterface FloatingToolbarProps {\n plugins: Plugin[];\n editorAPI: EditorAPI;\n editorElement: HTMLElement | null;\n}\n\n/**\n * Floating toolbar that appears above the current text selection.\n * Uses position:fixed with viewport coordinates for reliable placement.\n */\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n plugins,\n editorAPI,\n editorElement,\n}) => {\n const [pos, setPos] = useState({ top: 0, left: 0, visible: false });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number | null>(null);\n const visibleRef = useRef(false);\n\n // Keep ref in sync so event handlers never read stale state\n visibleRef.current = pos.visible;\n\n const leftPlugins = plugins.filter((p) => p.name !== \"clearFormatting\");\n const clearFormattingPlugin = plugins.find((p) => p.name === \"clearFormatting\");\n\n // Core: compute position from current selection\n const updatePosition = useCallback(() => {\n if (typeof window === \"undefined\" || !editorElement) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n // Hide when selection is collapsed (just a cursor)\n if (range.collapsed) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n // Hide when selection is outside the editor\n if (!editorElement.contains(range.commonAncestorContainer)) {\n setPos((p) => (p.visible ? { ...p, visible: false } : p));\n return;\n }\n\n const rect = range.getBoundingClientRect();\n const toolbarH = toolbarRef.current?.offsetHeight || 40;\n const toolbarW = toolbarRef.current?.offsetWidth || 200;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = 8;\n\n // Prefer above the selection, fall back to below\n let top = rect.top - toolbarH - pad;\n if (top < pad) {\n top = rect.bottom + pad;\n }\n if (top + toolbarH > vh - pad) {\n top = Math.max(pad, rect.top - toolbarH - pad);\n }\n\n // Center horizontally on the selection, clamp to viewport\n let left = rect.left + rect.width / 2 - toolbarW / 2;\n if (left < pad) left = pad;\n if (left + toolbarW > vw - pad) left = vw - toolbarW - pad;\n\n setPos({ top, left, visible: true });\n }, [editorElement]);\n\n // Debounce via requestAnimationFrame for smooth repositioning\n const scheduleUpdate = useCallback(() => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(updatePosition);\n }, [updatePosition]);\n\n // Single set of event listeners -- no deps on visible state\n useEffect(() => {\n // selectionchange covers both mouse and keyboard selection changes\n const onSelectionChange = () => scheduleUpdate();\n\n // Reposition on scroll (capture phase to catch nested scrolls) and resize\n const onScrollOrResize = () => {\n if (visibleRef.current) scheduleUpdate();\n };\n\n document.addEventListener(\"selectionchange\", onSelectionChange);\n window.addEventListener(\"scroll\", onScrollOrResize, true);\n window.addEventListener(\"resize\", onScrollOrResize);\n\n return () => {\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n window.removeEventListener(\"scroll\", onScrollOrResize, true);\n window.removeEventListener(\"resize\", onScrollOrResize);\n if (rafRef.current) cancelAnimationFrame(rafRef.current);\n };\n }, [scheduleUpdate]);\n\n const handlePluginClick = useCallback(\n (plugin: Plugin, value?: string) => {\n if (plugin.canExecute?.(editorAPI) === false) return;\n\n if (plugin.execute) {\n plugin.execute(editorAPI, value);\n } else if (plugin.command && value !== undefined) {\n editorAPI.executeCommand(plugin.command, value);\n } else if (plugin.command) {\n editorAPI.executeCommand(plugin.command);\n }\n\n // Re-check position after formatting changes\n requestAnimationFrame(() => scheduleUpdate());\n },\n [editorAPI, scheduleUpdate]\n );\n\n const isHidden = !pos.visible || leftPlugins.length === 0;\n\n return (\n <div\n ref={toolbarRef}\n className=\"rte-floating-toolbar\"\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n visibility: isHidden ? \"hidden\" : \"visible\",\n opacity: isHidden ? 0 : 1,\n pointerEvents: isHidden ? \"none\" : \"auto\",\n }}\n // Prevent selection loss when clicking toolbar buttons\n onMouseDown={(e) => e.preventDefault()}\n >\n <div className=\"rte-floating-toolbar-content\">\n <div className=\"rte-toolbar-left\">\n {leftPlugins.map((plugin) => {\n if (!plugin.renderButton) return null;\n\n const isActive = plugin.isActive\n ? plugin.isActive(editorAPI)\n : false;\n const canExecute = plugin.canExecute\n ? plugin.canExecute(editorAPI)\n : true;\n const currentValue = plugin.getCurrentValue\n ? plugin.getCurrentValue(editorAPI)\n : undefined;\n\n const buttonProps: ButtonProps & Record<string, unknown> = {\n isActive,\n onClick: () => handlePluginClick(plugin),\n disabled: !canExecute,\n onSelect: (value: string) =>\n handlePluginClick(plugin, value),\n editorAPI,\n currentValue,\n };\n\n return (\n <React.Fragment key={plugin.name}>\n {plugin.renderButton(buttonProps)}\n </React.Fragment>\n );\n })}\n </div>\n\n {clearFormattingPlugin?.renderButton && (\n <div className=\"rte-toolbar-right\">\n <div className=\"rte-toolbar-divider\" />\n {(() => {\n const isActive = clearFormattingPlugin.isActive\n ? clearFormattingPlugin.isActive(editorAPI)\n : false;\n const canExecute = clearFormattingPlugin.canExecute\n ? clearFormattingPlugin.canExecute(editorAPI)\n : true;\n\n return clearFormattingPlugin.renderButton({\n isActive,\n onClick: () => handlePluginClick(clearFormattingPlugin),\n disabled: !canExecute,\n editorAPI,\n } as ButtonProps & Record<string, unknown>);\n })()}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { isUrlSafe } from \"../utils/sanitize\";\nimport { Icon } from \"./Icons\";\n\ninterface LinkTooltipProps {\n editorElement: HTMLElement | null;\n}\n\ninterface TooltipState {\n visible: boolean;\n top: number;\n left: number;\n href: string;\n anchor: HTMLAnchorElement | null;\n}\n\n/**\n * Shows a tooltip with URL, edit link, and open link actions\n * when hovering over an <a> element in the editor.\n */\nexport const LinkTooltip: React.FC<LinkTooltipProps> = ({ editorElement }) => {\n const [state, setState] = useState<TooltipState>({\n visible: false,\n top: 0,\n left: 0,\n href: \"\",\n anchor: null,\n });\n const tooltipRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const show = useCallback((anchor: HTMLAnchorElement) => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n const rect = anchor.getBoundingClientRect();\n const tooltipH = 36;\n const pad = 6;\n\n let top = rect.bottom + pad;\n if (top + tooltipH > window.innerHeight - pad) {\n top = rect.top - tooltipH - pad;\n }\n\n const left = Math.max(pad, Math.min(rect.left, window.innerWidth - 400 - pad));\n\n setState({\n visible: true,\n top,\n left,\n href: anchor.href,\n anchor,\n });\n }, []);\n\n const scheduleHide = useCallback(() => {\n hideTimeoutRef.current = setTimeout(() => {\n setState((prev) => ({ ...prev, visible: false, anchor: null }));\n }, 200);\n }, []);\n\n useEffect(() => {\n if (!editorElement) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest(\"a\") as HTMLAnchorElement | null;\n if (anchor && editorElement.contains(anchor)) {\n show(anchor);\n }\n };\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = e.relatedTarget as HTMLElement | null;\n if (!target) {\n scheduleHide();\n return;\n }\n // If moving to the tooltip itself, don't hide\n if (tooltipRef.current?.contains(target)) return;\n // If still on a link, don't hide\n if (target.closest?.(\"a\") && editorElement.contains(target)) return;\n scheduleHide();\n };\n\n editorElement.addEventListener(\"mouseover\", handleMouseOver);\n editorElement.addEventListener(\"mouseout\", handleMouseOut);\n\n return () => {\n editorElement.removeEventListener(\"mouseover\", handleMouseOver);\n editorElement.removeEventListener(\"mouseout\", handleMouseOut);\n if (hideTimeoutRef.current) clearTimeout(hideTimeoutRef.current);\n };\n }, [editorElement, show, scheduleHide]);\n\n const handleTooltipMouseEnter = () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n };\n\n const handleTooltipMouseLeave = () => {\n scheduleHide();\n };\n\n const handleOpen = () => {\n if (state.href && isUrlSafe(state.href)) {\n window.open(state.href, \"_blank\", \"noopener,noreferrer\");\n }\n };\n\n const handleCopy = () => {\n if (state.href) {\n navigator.clipboard.writeText(state.href).catch(() => {\n // Fallback: do nothing\n });\n }\n };\n\n if (!state.visible) return null;\n\n return (\n <div\n ref={tooltipRef}\n className=\"rte-link-tooltip\"\n style={{\n position: \"fixed\",\n top: state.top,\n left: state.left,\n }}\n onMouseEnter={handleTooltipMouseEnter}\n onMouseLeave={handleTooltipMouseLeave}\n >\n <span className=\"rte-link-tooltip-url\" title={state.href}>\n {state.href}\n </span>\n <div className=\"rte-link-tooltip-actions\">\n <button\n type=\"button\"\n className=\"rte-link-tooltip-btn\"\n title=\"Open link\"\n aria-label=\"Open link\"\n onClick={handleOpen}\n >\n <Icon icon=\"mdi:open-in-new\" width={14} height={14} />\n </button>\n <button\n type=\"button\"\n className=\"rte-link-tooltip-btn\"\n title=\"Copy link\"\n aria-label=\"Copy link\"\n onClick={handleCopy}\n >\n <Icon icon=\"mdi:content-copy\" width={14} height={14} />\n </button>\n </div>\n </div>\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\n\ninterface ToolbarProps {\n plugins: Plugin[];\n editorAPI: EditorAPI;\n className?: string;\n}\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n plugins,\n editorAPI,\n className,\n}) => {\n const [updateTrigger, setUpdateTrigger] = useState(0);\n const [isClient, setIsClient] = useState(false);\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setIsClient(true);\n const timeoutIds: ReturnType<typeof setTimeout>[] = [];\n\n const handleSelectionChange = () => {\n setUpdateTrigger((prev) => prev + 1);\n };\n\n const handleMouseUp = () => {\n timeoutIds.push(setTimeout(handleSelectionChange, 10));\n };\n\n const handleKeyUp = () => {\n timeoutIds.push(setTimeout(handleSelectionChange, 10));\n };\n\n if (typeof document !== 'undefined') {\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.addEventListener(\"keyup\", handleKeyUp);\n }\n\n return () => {\n timeoutIds.forEach(clearTimeout);\n if (typeof document !== 'undefined') {\n document.removeEventListener(\n \"selectionchange\",\n handleSelectionChange,\n );\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.removeEventListener(\"keyup\", handleKeyUp);\n }\n };\n }, []);\n\n const handlePluginClick = (plugin: Plugin, value?: string) => {\n if (plugin.canExecute?.(editorAPI) !== false) {\n if (plugin.execute) {\n plugin.execute(editorAPI, value);\n } else if (plugin.command && value !== undefined) {\n editorAPI.executeCommand(plugin.command, value);\n } else if (plugin.command) {\n editorAPI.executeCommand(plugin.command);\n }\n setTimeout(() => setUpdateTrigger((prev) => prev + 1), 50);\n }\n };\n\n const leftPlugins = plugins.filter((p) => p.name !== \"clearFormatting\");\n const clearFormattingPlugin = plugins.find(\n (p) => p.name === \"clearFormatting\"\n );\n\n // Roving tabindex keyboard navigation (ARIA toolbar pattern)\n const handleToolbarKeyDown = useCallback((e: React.KeyboardEvent) => {\n // Escape: return focus to the editor\n if (e.key === \"Escape\") {\n e.preventDefault();\n const container = toolbarRef.current?.closest(\".rte-container\");\n const editor = container?.querySelector<HTMLElement>(\".rte-editor\");\n if (editor) editor.focus();\n return;\n }\n\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\" && e.key !== \"Home\" && e.key !== \"End\") return;\n\n const toolbar = toolbarRef.current;\n if (!toolbar) return;\n\n const buttons = Array.from(\n toolbar.querySelectorAll<HTMLButtonElement>(\n \"button:not(:disabled)\"\n )\n );\n if (buttons.length === 0) return;\n\n const currentIndex = buttons.indexOf(\n document.activeElement as HTMLButtonElement\n );\n if (currentIndex === -1) return;\n\n e.preventDefault();\n\n let nextIndex: number;\n switch (e.key) {\n case \"ArrowRight\":\n nextIndex = (currentIndex + 1) % buttons.length;\n break;\n case \"ArrowLeft\":\n nextIndex = (currentIndex - 1 + buttons.length) % buttons.length;\n break;\n case \"Home\":\n nextIndex = 0;\n break;\n case \"End\":\n nextIndex = buttons.length - 1;\n break;\n default:\n return;\n }\n\n buttons[nextIndex].focus();\n }, []);\n\n return (\n <div\n ref={toolbarRef}\n className={`rte-toolbar rte-toolbar-sticky ${className || \"\"}`}\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={handleToolbarKeyDown}\n role=\"toolbar\"\n aria-label=\"Text formatting\"\n aria-orientation=\"horizontal\"\n >\n <div className=\"rte-toolbar-left\">\n {leftPlugins.map((plugin) => {\n if (!plugin.renderButton) return null;\n\n const isActive = isClient && plugin.isActive\n ? plugin.isActive(editorAPI)\n : false;\n const canExecute = isClient && plugin.canExecute\n ? plugin.canExecute(editorAPI)\n : true;\n\n const currentValue = isClient && plugin.getCurrentValue\n ? plugin.getCurrentValue(editorAPI)\n : undefined;\n\n const buttonProps: ButtonProps & { [key: string]: any } = {\n isActive,\n onClick: () => handlePluginClick(plugin),\n disabled: !canExecute,\n onSelect: (value: string) =>\n handlePluginClick(plugin, value),\n editorAPI,\n currentValue,\n };\n\n return (\n <React.Fragment key={plugin.name}>\n {plugin.renderButton(buttonProps)}\n </React.Fragment>\n );\n })}\n </div>\n\n {clearFormattingPlugin && clearFormattingPlugin.renderButton && (\n <div className=\"rte-toolbar-right\">\n <div className=\"rte-toolbar-divider\" />\n {(() => {\n const isActive = isClient && clearFormattingPlugin.isActive\n ? clearFormattingPlugin.isActive(editorAPI)\n : false;\n const canExecute = isClient && clearFormattingPlugin.canExecute\n ? clearFormattingPlugin.canExecute(editorAPI)\n : true;\n\n const buttonProps: ButtonProps & {\n [key: string]: any;\n } = {\n isActive,\n onClick: () =>\n handlePluginClick(clearFormattingPlugin),\n disabled: !canExecute,\n editorAPI,\n };\n\n return (\n <React.Fragment key={clearFormattingPlugin.name}>\n {clearFormattingPlugin.renderButton(\n buttonProps\n )}\n </React.Fragment>\n );\n })()}\n </div>\n )}\n </div>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCheckbox } from \"../hooks/useCheckbox\";\nimport { useEditorEvents } from \"../hooks/useEditorEvents\";\nimport { useEditorInit } from \"../hooks/useEditorInit\";\nimport { defaultPlugins } from \"../plugins\";\nimport { createBlockFormatPlugin } from \"../plugins/blockFormat\";\nimport {\n createBackgroundColorPlugin,\n createTextColorPlugin,\n} from \"../plugins/colors\";\nimport { createFontSizePlugin } from \"../plugins/fontSize\";\nimport { createImagePlugin } from \"../plugins/image\";\nimport { EditorAPI, EditorContent, EditorProps } from \"../types\";\nimport { ensureAllCheckboxes } from \"../utils/checkbox\";\nimport {\n clearBackgroundColor,\n clearFontSize,\n clearFormatting,\n clearLinks,\n clearTextColor,\n} from \"../utils/clearFormatting\";\nimport {\n contentToDOM,\n contentToHTML,\n createEmptyContent,\n domToContent,\n htmlToContent,\n} from \"../utils/content\";\nimport { HistoryManager } from \"../utils/history\";\nimport { indentListItem, outdentListItem } from \"../utils/listIndent\";\nimport { isUrlSafe, sanitizeHtml } from \"../utils/sanitize\";\nimport {\n serializeSelection,\n restoreSerializedSelection,\n} from \"../utils/selection\";\nimport { buildPluginsFromSettings } from \"../utils/settings\";\nimport { FloatingToolbar } from \"./FloatingToolbar\";\nimport { LinkTooltip } from \"./LinkTooltip\";\nimport { Toolbar } from \"./Toolbar\";\n\nexport const Editor: React.FC<EditorProps> = ({\n initialContent,\n onChange,\n plugins: providedPlugins,\n placeholder = \"Enter text...\",\n className,\n toolbarClassName,\n editorClassName,\n fontSizes,\n colors,\n headings,\n customLinkComponent,\n customHeadingRenderer,\n customRenderer,\n onEditorAPIReady,\n theme,\n onImageUpload,\n settings,\n settingsOptions,\n readOnly,\n onFocus,\n onBlur,\n maxLength,\n showWordCount,\n}) => {\n // --- Shared Refs ---\n const editorRef = useRef<HTMLDivElement>(null);\n const historyRef = useRef<HistoryManager>(new HistoryManager());\n const isUpdatingRef = useRef(false);\n const mountedRef = useRef(true);\n\n // Track mount status to guard async callbacks\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // --- Plugins ---\n const plugins = useMemo(() => {\n // When settings is provided and plugins is not, use buildPluginsFromSettings\n if (settings && !providedPlugins) {\n const opts = {\n ...settingsOptions,\n onImageUpload: settingsOptions?.onImageUpload ?? onImageUpload,\n };\n return buildPluginsFromSettings(settings, opts);\n }\n\n // When plugins are explicitly provided, use them as-is\n if (providedPlugins) {\n return [...providedPlugins];\n }\n\n // Default plugins path: apply shorthand customizations\n const allPlugins = [...defaultPlugins];\n\n if (headings && headings.length > 0) {\n const blockFormatIndex = allPlugins.findIndex(\n (p) => p.name === \"blockFormat\",\n );\n if (blockFormatIndex !== -1) {\n allPlugins[blockFormatIndex] =\n createBlockFormatPlugin(headings);\n } else {\n const redoIndex = allPlugins.findIndex(\n (p) => p.name === \"redo\",\n );\n if (redoIndex !== -1) {\n allPlugins.splice(\n redoIndex + 1,\n 0,\n createBlockFormatPlugin(headings),\n );\n } else {\n allPlugins.push(createBlockFormatPlugin(headings));\n }\n }\n }\n\n if (fontSizes && fontSizes.length > 0) {\n const blockFormatIndex = allPlugins.findIndex(\n (p) => p.name === \"blockFormat\",\n );\n if (blockFormatIndex !== -1) {\n allPlugins.splice(\n blockFormatIndex + 1,\n 0,\n createFontSizePlugin(fontSizes),\n );\n } else {\n allPlugins.push(createFontSizePlugin(fontSizes));\n }\n }\n\n if (colors && colors.length > 0) {\n allPlugins.push(createTextColorPlugin(colors));\n allPlugins.push(createBackgroundColorPlugin(colors));\n }\n\n allPlugins.push(createImagePlugin(onImageUpload));\n\n return allPlugins;\n }, [\n providedPlugins,\n fontSizes,\n colors,\n headings,\n onImageUpload,\n settings,\n settingsOptions,\n ]);\n\n // --- Callbacks ---\n const notifyChange = useCallback(\n (content: EditorContent) => {\n if (onChange) onChange(content);\n },\n [onChange],\n );\n\n const getDomContent = useCallback((): EditorContent => {\n const editor = editorRef.current;\n if (!editor) return createEmptyContent();\n return domToContent(editor);\n }, []);\n\n const pushToHistory = useCallback((content: EditorContent) => {\n const editor = editorRef.current;\n const sel = editor ? serializeSelection(editor) : null;\n historyRef.current.push(content, sel);\n }, []);\n\n // --- Hooks ---\n const checkbox = useCheckbox({\n editorRef,\n isUpdatingRef,\n pushToHistory,\n notifyChange,\n getDomContent,\n });\n\n // --- Undo / Redo ---\n const undo = useCallback(() => {\n const entry = historyRef.current.undo();\n const editor = editorRef.current;\n if (entry && editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n entry.content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n restoreSerializedSelection(editor, entry.selection);\n isUpdatingRef.current = false;\n notifyChange(entry.content);\n }\n }, [customLinkComponent, customHeadingRenderer, notifyChange]);\n\n const redo = useCallback(() => {\n const entry = historyRef.current.redo();\n const editor = editorRef.current;\n if (entry && editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n entry.content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n restoreSerializedSelection(editor, entry.selection);\n isUpdatingRef.current = false;\n notifyChange(entry.content);\n }\n }, [customLinkComponent, customHeadingRenderer, notifyChange]);\n\n // --- Editor API ---\n const editorAPI = useMemo<EditorAPI>(() => {\n const executeCommand = (command: string, value?: string): boolean => {\n const editor = editorRef.current;\n if (!editor) return false;\n\n // Save history before non-history commands\n if (\n command !== \"undo\" &&\n command !== \"redo\" &&\n command !== \"insertImage\" &&\n command !== \"insertCheckboxList\"\n ) {\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n }\n\n if (command === \"undo\") {\n undo();\n return true;\n }\n\n if (command === \"redo\") {\n redo();\n return true;\n }\n\n if (command === \"insertCheckboxList\") {\n return checkbox.insertCheckboxList(editor);\n }\n\n if (command === \"insertImage\" && value) {\n return handleInsertImage(\n editor,\n value,\n isUpdatingRef,\n historyRef,\n mountedRef,\n notifyChange,\n );\n }\n\n // General commands via document.execCommand\n ensureEditorFocused(editor);\n\n document.execCommand(command, false, value);\n\n setTimeout(() => {\n if (!mountedRef.current) return;\n if (editor && !isUpdatingRef.current) {\n ensureAllCheckboxes(editor);\n const content = domToContent(editor);\n notifyChange(content);\n }\n }, 0);\n\n return true;\n };\n\n return {\n executeCommand,\n\n getSelection: (): Selection | null => {\n if (typeof window === \"undefined\") return null;\n return window.getSelection();\n },\n\n getContent: (): EditorContent => {\n const editor = editorRef.current;\n if (!editor) return createEmptyContent();\n ensureAllCheckboxes(editor);\n return domToContent(editor);\n },\n\n setContent: (content: EditorContent): void => {\n const editor = editorRef.current;\n if (!editor) return;\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n },\n\n insertBlock: (\n type: string,\n attributes?: Record<string, string>,\n ): void => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const block = document.createElement(type);\n if (attributes) {\n Object.entries(attributes).forEach(([key, val]) => {\n // Filter out event handler attributes\n if (key.toLowerCase().startsWith(\"on\")) return;\n block.setAttribute(key, val);\n });\n }\n range.insertNode(block);\n const textNode = document.createTextNode(\"\\u200B\");\n block.appendChild(textNode);\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n const editor = editorRef.current;\n if (editor) notifyChange(domToContent(editor));\n },\n\n insertInline: (\n type: string,\n attributes?: Record<string, string>,\n ): void => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n const inline = document.createElement(type);\n if (attributes) {\n Object.entries(attributes).forEach(([key, val]) => {\n // Filter out event handler attributes\n if (key.toLowerCase().startsWith(\"on\")) return;\n inline.setAttribute(key, val);\n });\n }\n try {\n range.surroundContents(inline);\n } catch (_) {\n const contents = range.extractContents();\n inline.appendChild(contents);\n range.insertNode(inline);\n }\n range.setStartAfter(inline);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n const editor = editorRef.current;\n if (editor) notifyChange(domToContent(editor));\n },\n\n undo: (): void => undo(),\n redo: (): void => redo(),\n canUndo: (): boolean => historyRef.current.canUndo(),\n canRedo: (): boolean => historyRef.current.canRedo(),\n\n importHtml: (htmlString: string): EditorContent => {\n const content = htmlToContent(htmlString);\n const editor = editorRef.current;\n if (editor) {\n isUpdatingRef.current = true;\n contentToDOM(\n content,\n editor,\n customLinkComponent,\n customHeadingRenderer,\n );\n historyRef.current.push(content);\n isUpdatingRef.current = false;\n notifyChange(content);\n }\n return content;\n },\n\n exportHtml: (): string => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n return contentToHTML(domToContent(editor));\n },\n\n clearFormatting: (): void => {\n executeWithHistory((selection) => clearFormatting(selection));\n },\n clearTextColor: (): void => {\n executeWithHistory((selection) => clearTextColor(selection));\n },\n clearBackgroundColor: (): void => {\n executeWithHistory((selection) =>\n clearBackgroundColor(selection),\n );\n },\n clearFontSize: (): void => {\n executeWithHistory((selection) => clearFontSize(selection));\n },\n clearLinks: (): void => {\n executeWithHistory((selection) => clearLinks(selection));\n },\n indentListItem: (): void => {\n executeWithHistory((selection) => indentListItem(selection));\n },\n outdentListItem: (): void => {\n executeWithHistory((selection) => outdentListItem(selection));\n },\n getTextStats: (): { characters: number; words: number } => {\n const editor = editorRef.current;\n if (!editor) return { characters: 0, words: 0 };\n const text = editor.innerText || \"\";\n const characters = text.length;\n const trimmed = text.trim();\n const words = trimmed.length === 0 ? 0 : trimmed.split(/\\s+/).length;\n return { characters, words };\n },\n };\n\n /** Helper: push history, execute operation, then notify change. */\n function executeWithHistory(\n operation: (selection: Selection) => void,\n ): void {\n const editor = editorRef.current;\n if (!editor) return;\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const currentContent = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(currentContent, sel);\n operation(selection);\n setTimeout(() => {\n if (!mountedRef.current) return;\n if (editor) notifyChange(domToContent(editor));\n }, 0);\n }\n }, [\n undo,\n redo,\n checkbox,\n notifyChange,\n customLinkComponent,\n customHeadingRenderer,\n ]);\n\n // --- Initialize editor ---\n useEditorInit({\n editorRef,\n historyRef,\n isUpdatingRef,\n initialContent,\n notifyChange,\n customLinkComponent,\n customHeadingRenderer,\n });\n\n // --- Set up event listeners ---\n useEditorEvents({\n editorRef,\n historyRef,\n isUpdatingRef,\n mountedRef,\n notifyChange,\n handleCheckboxKeyDown: checkbox.handleCheckboxKeyDown,\n handleCheckboxEnter: checkbox.handleCheckboxEnter,\n undo,\n redo,\n });\n\n // --- Expose editor API ---\n useEffect(() => {\n if (onEditorAPIReady) onEditorAPIReady(editorAPI);\n }, [editorAPI, onEditorAPIReady]);\n\n // --- Focus / Blur callbacks ---\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const handleFocus = () => onFocus?.();\n const handleBlur = () => onBlur?.();\n editor.addEventListener(\"focus\", handleFocus);\n editor.addEventListener(\"blur\", handleBlur);\n return () => {\n editor.removeEventListener(\"focus\", handleFocus);\n editor.removeEventListener(\"blur\", handleBlur);\n };\n }, [onFocus, onBlur]);\n\n // --- Max Length enforcement ---\n useEffect(() => {\n if (maxLength === undefined) return;\n const editor = editorRef.current;\n if (!editor) return;\n const handleBeforeInput = (e: Event) => {\n const text = editor.innerText || \"\";\n if (text.length >= maxLength) {\n const inputEvent = e as InputEvent;\n if (inputEvent.inputType?.startsWith(\"insert\")) {\n e.preventDefault();\n }\n }\n };\n editor.addEventListener(\"beforeinput\", handleBeforeInput);\n return () => {\n editor.removeEventListener(\"beforeinput\", handleBeforeInput);\n };\n }, [maxLength]);\n\n // --- Word count state ---\n const [wordCount, setWordCount] = useState({ characters: 0, words: 0 });\n useEffect(() => {\n if (!showWordCount) return;\n const editor = editorRef.current;\n if (!editor) return;\n const updateCount = () => {\n const text = editor.innerText || \"\";\n const characters = text.length;\n const trimmed = text.trim();\n const words = trimmed.length === 0 ? 0 : trimmed.split(/\\s+/).length;\n setWordCount({ characters, words });\n };\n updateCount();\n editor.addEventListener(\"input\", updateCount);\n return () => editor.removeEventListener(\"input\", updateCount);\n }, [showWordCount]);\n\n // --- Helper: insert an image file via the onImageUpload callback ---\n const insertImageFile = useCallback(\n async (file: File) => {\n if (!onImageUpload || !file.type.startsWith(\"image/\")) return;\n const editor = editorRef.current;\n if (!editor) return;\n\n try {\n // Show a placeholder while uploading\n const placeholder = document.createElement(\"img\");\n placeholder.setAttribute(\"data-uploading\", \"true\");\n placeholder.className = \"rte-image rte-image-uploading\";\n // Use a tiny transparent gif as placeholder src\n placeholder.src =\n \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\";\n placeholder.alt = file.name;\n\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0);\n range.deleteContents();\n range.insertNode(placeholder);\n range.setStartAfter(placeholder);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n editor.appendChild(placeholder);\n }\n\n // Upload\n const url = await onImageUpload(file);\n\n // Guard against unmount during async upload\n if (!mountedRef.current) return;\n\n // Parse the \"url|__aid__:attachmentId\" convention\n let realUrl = url;\n if (url.includes(\"|__aid__:\")) {\n const idx = url.indexOf(\"|__aid__:\");\n realUrl = url.substring(0, idx);\n const attachmentId = url.substring(\n idx + \"|__aid__:\".length,\n );\n if (attachmentId) {\n placeholder.setAttribute(\n \"data-attachment-id\",\n attachmentId,\n );\n }\n }\n\n // Validate the returned URL before setting it\n if (!isUrlSafe(realUrl) && !realUrl.startsWith(\"data:image/\")) {\n placeholder.remove();\n return;\n }\n\n // Replace placeholder with final image\n placeholder.src = realUrl;\n placeholder.removeAttribute(\"data-uploading\");\n placeholder.style.opacity = \"1\";\n\n notifyChange(domToContent(editor));\n } catch (err) {\n console.error(\"Image upload failed:\", err);\n // Remove failed placeholder\n const failedImg = editor.querySelector(\n 'img[data-uploading=\"true\"]',\n );\n failedImg?.remove();\n }\n },\n [onImageUpload, notifyChange],\n );\n\n // --- Paste handler ---\n const handlePaste = (e: React.ClipboardEvent) => {\n // Check for pasted image files first\n const items = e.clipboardData.items;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\")) {\n e.preventDefault();\n const file = item.getAsFile();\n if (file) insertImageFile(file);\n return;\n }\n }\n\n e.preventDefault();\n\n // Plain-text paste: Cmd/Ctrl+Shift+V\n const nativeEvent = e.nativeEvent as ClipboardEvent & { shiftKey?: boolean };\n if (nativeEvent.shiftKey) {\n const text = e.clipboardData.getData(\"text/plain\");\n if (text) {\n document.execCommand(\"insertText\", false, text);\n }\n return;\n }\n\n const rawHtml = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n\n if (rawHtml) {\n try {\n const html = sanitizeHtml(rawHtml);\n const pastedContent = htmlToContent(html);\n const editor = editorRef.current;\n if (!editor) return;\n\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const tempDiv = document.createElement(\"div\");\n contentToDOM(\n pastedContent,\n tempDiv,\n customLinkComponent,\n customHeadingRenderer,\n );\n\n const fragment = document.createDocumentFragment();\n while (tempDiv.firstChild) {\n fragment.appendChild(tempDiv.firstChild);\n }\n\n range.insertNode(fragment);\n if (fragment.lastChild) {\n range.setStartAfter(fragment.lastChild);\n range.collapse(true);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n notifyChange(domToContent(editor));\n }\n } catch (_) {\n document.execCommand(\"insertText\", false, text);\n }\n } else if (text) {\n document.execCommand(\"insertText\", false, text);\n }\n };\n\n // --- Theme styles ---\n const containerStyle: React.CSSProperties = theme\n ? {\n ...(theme.borderColor &&\n ({\n \"--rte-border-color\": theme.borderColor,\n } as React.CSSProperties)),\n ...(theme.borderRadius &&\n ({\n \"--rte-border-radius\": `${theme.borderRadius}px`,\n } as React.CSSProperties)),\n ...(theme.toolbarBg &&\n ({\n \"--rte-toolbar-bg\": theme.toolbarBg,\n } as React.CSSProperties)),\n ...(theme.buttonHoverBg &&\n ({\n \"--rte-button-hover-bg\": theme.buttonHoverBg,\n } as React.CSSProperties)),\n ...(theme.contentBg &&\n ({\n \"--rte-content-bg\": theme.contentBg,\n } as React.CSSProperties)),\n ...(theme.primaryColor &&\n ({\n \"--rte-primary-color\": theme.primaryColor,\n } as React.CSSProperties)),\n }\n : {};\n\n return (\n <div\n className={`rte-container ${readOnly ? \"rte-container-readonly\" : \"\"} ${className || \"\"}`}\n style={containerStyle}\n >\n {!readOnly && (\n <Toolbar\n plugins={plugins}\n editorAPI={editorAPI}\n className={toolbarClassName}\n />\n )}\n <div\n ref={editorRef}\n contentEditable={!readOnly}\n className={`rte-editor ${readOnly ? \"rte-editor-readonly\" : \"\"} ${editorClassName || \"\"}`}\n data-placeholder={placeholder}\n onPaste={readOnly ? undefined : handlePaste}\n onDrop={readOnly ? undefined : (e: React.DragEvent) => {\n const files = e.dataTransfer.files;\n for (let i = 0; i < files.length; i++) {\n if (files[i].type.startsWith(\"image/\")) {\n e.preventDefault();\n insertImageFile(files[i]);\n return;\n }\n }\n }}\n onDragOver={readOnly ? undefined : (e: React.DragEvent) => {\n const types = e.dataTransfer.types;\n if (types && Array.from(types).includes(\"Files\")) {\n e.preventDefault();\n }\n }}\n suppressContentEditableWarning\n />\n {!readOnly && (\n <FloatingToolbar\n plugins={plugins}\n editorAPI={editorAPI}\n editorElement={editorRef.current}\n />\n )}\n <LinkTooltip editorElement={editorRef.current} />\n {showWordCount && (\n <div className=\"rte-word-count\">\n {wordCount.words} words &middot; {wordCount.characters} characters\n </div>\n )}\n </div>\n );\n};\n\n// --- Helper: Insert Image ---\nfunction handleInsertImage(\n editor: HTMLElement,\n value: string,\n isUpdatingRef: { current: boolean },\n historyRef: { current: HistoryManager },\n mountedRef: { current: boolean },\n notifyChange: (content: EditorContent) => void,\n): boolean {\n let selection = window.getSelection();\n if (!selection) return false;\n\n if (document.activeElement !== editor) {\n editor.focus();\n }\n\n if (selection.rangeCount === 0) {\n const range = document.createRange();\n if (editor.childNodes.length > 0) {\n const lastChild = editor.childNodes[editor.childNodes.length - 1];\n range.setStartAfter(lastChild);\n range.collapse(true);\n } else {\n const img = createImageElement(value);\n editor.appendChild(img);\n const newRange = document.createRange();\n newRange.setStartAfter(img);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n saveAndNotify(editor, isUpdatingRef, historyRef, mountedRef, notifyChange);\n return true;\n }\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n if (selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n let parentElement: HTMLElement | null = null;\n\n if (container.nodeType === Node.TEXT_NODE) {\n parentElement = container.parentElement;\n } else if (container.nodeType === Node.ELEMENT_NODE) {\n parentElement = container as HTMLElement;\n }\n\n const img = createImageElement(value);\n\n if (\n parentElement &&\n parentElement !== editor &&\n /^(P|DIV|H[1-6])$/.test(parentElement.tagName)\n ) {\n if (parentElement.nextSibling) {\n editor.insertBefore(img, parentElement.nextSibling);\n } else {\n editor.appendChild(img);\n }\n } else {\n try {\n range.insertNode(img);\n } catch (_) {\n editor.appendChild(img);\n }\n }\n\n const newRange = document.createRange();\n newRange.setStartAfter(img);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n saveAndNotify(editor, isUpdatingRef, historyRef, mountedRef, notifyChange);\n return true;\n}\n\n/**\n * Creates an <img> element from a src string.\n *\n * Supports an extended format for passing attachment metadata:\n * \"url|__aid__:attachmentId\"\n * If that format is detected, the real URL is extracted and\n * data-attachment-id is set on the element.\n */\nfunction createImageElement(src: string): HTMLImageElement {\n const img = document.createElement(\"img\");\n\n let realSrc = src;\n let altText = \"\";\n\n // Parse the \"url|__alt__:altText\" convention\n if (realSrc.includes(\"|__alt__:\")) {\n const altIdx = realSrc.indexOf(\"|__alt__:\");\n altText = realSrc.substring(altIdx + \"|__alt__:\".length);\n realSrc = realSrc.substring(0, altIdx);\n }\n\n // Parse the \"url|__aid__:attachmentId\" convention\n if (realSrc.includes(\"|__aid__:\")) {\n const idx = realSrc.indexOf(\"|__aid__:\");\n const attachmentId = realSrc.substring(idx + \"|__aid__:\".length);\n realSrc = realSrc.substring(0, idx);\n if (attachmentId) {\n img.setAttribute(\"data-attachment-id\", attachmentId);\n }\n }\n\n // Validate URL safety — block javascript:, data:, etc.\n if (!isUrlSafe(realSrc) && !realSrc.startsWith(\"data:image/\")) {\n realSrc = \"\";\n }\n\n img.setAttribute(\"src\", realSrc);\n img.setAttribute(\"alt\", altText);\n img.className = \"rte-image\";\n return img;\n}\n\nfunction saveAndNotify(\n editor: HTMLElement,\n isUpdatingRef: { current: boolean },\n historyRef: { current: HistoryManager },\n mountedRef: { current: boolean },\n notifyChange: (content: EditorContent) => void,\n): void {\n isUpdatingRef.current = true;\n setTimeout(() => {\n if (!mountedRef.current) return;\n const content = domToContent(editor);\n const sel = serializeSelection(editor);\n historyRef.current.push(content, sel);\n isUpdatingRef.current = false;\n notifyChange(content);\n }, 0);\n}\n\n/** Ensures the editor is focused and has a valid selection. */\nfunction ensureEditorFocused(editor: HTMLElement): void {\n const selection = window.getSelection();\n let savedRange: Range | null = null;\n\n if (selection && selection.rangeCount > 0) {\n savedRange = selection.getRangeAt(0).cloneRange();\n }\n\n if (document.activeElement !== editor) {\n editor.focus();\n }\n\n if (!selection || selection.rangeCount === 0) {\n const range = document.createRange();\n if (editor.childNodes.length > 0) {\n const lastChild = editor.childNodes[editor.childNodes.length - 1];\n if (lastChild.nodeType === Node.TEXT_NODE) {\n range.setStart(lastChild, lastChild.textContent?.length || 0);\n range.setEnd(lastChild, lastChild.textContent?.length || 0);\n } else {\n range.selectNodeContents(lastChild);\n range.collapse(false);\n }\n } else {\n const p = document.createElement(\"p\");\n editor.appendChild(p);\n const textNode = document.createTextNode(\"\");\n p.appendChild(textNode);\n range.setStart(textNode, 0);\n range.setEnd(textNode, 0);\n }\n selection?.removeAllRanges();\n selection?.addRange(range);\n } else if (savedRange) {\n selection.removeAllRanges();\n selection.addRange(savedRange);\n }\n}\n","import { Dropdown } from \"../components/Dropdown\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { getCurrentHeading } from \"../utils/stateReflection\";\n\nconst defaultHeadings = [\"h1\", \"h2\", \"h3\"];\n\nconst headingLabels: Record<string, string> = {\n h1: \"Heading 1\",\n h2: \"Heading 2\",\n h3: \"Heading 3\",\n h4: \"Heading 4\",\n h5: \"Heading 5\",\n h6: \"Heading 6\",\n};\n\nexport function createHeadingsPlugin(\n headings: string[] = defaultHeadings\n): Plugin {\n const options = [\n { value: \"p\", label: \"Normal\", headingPreview: \"p\" },\n ...headings.map((h) => ({\n value: h,\n label: headingLabels[h] || h.toUpperCase(),\n headingPreview: h,\n })),\n ];\n\n return {\n name: \"headings\",\n type: \"block\",\n renderButton: (\n props: ButtonProps & {\n onSelect?: (value: string) => void;\n editorAPI?: EditorAPI;\n currentValue?: string;\n }\n ) => {\n // Aktuelles Heading aus State Reflection\n const currentValue =\n props.currentValue ||\n (props.editorAPI\n ? getCurrentHeading(props.editorAPI, headings)\n : undefined);\n\n return (\n <Dropdown\n icon=\"mdi:format-header-1\"\n label=\"Heading\"\n options={options}\n onSelect={(value) => {\n if (props.onSelect) {\n props.onSelect(value);\n } else {\n props.onClick();\n }\n }}\n currentValue={currentValue}\n disabled={props.disabled}\n />\n );\n },\n getCurrentValue: (editor: EditorAPI) => {\n return getCurrentHeading(editor, headings);\n },\n execute: (editor: EditorAPI, value?: string) => {\n const tag = value || \"p\";\n editor.executeCommand(\"formatBlock\", `<${tag}>`);\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n return headings.includes(tagName);\n },\n canExecute: () => true,\n };\n}\n","import { IconWrapper } from \"../components/IconWrapper\";\nimport { ButtonProps, EditorAPI, Plugin } from \"../types\";\nimport { isUrlSafe } from \"../utils/sanitize\";\n\n/**\n * Link plugin with improved functionality\n */\nexport function createLinkPlugin(): Plugin {\n return {\n name: \"link\",\n type: \"inline\",\n command: \"createLink\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Insert Link\"\n aria-label=\"Insert Link\"\n >\n <IconWrapper icon=\"mdi:link\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n // Check if a link already exists\n const existingLink = element?.closest(\"a\") as HTMLAnchorElement;\n\n if (existingLink) {\n // Remove link\n const parent = existingLink.parentNode;\n if (parent) {\n while (existingLink.firstChild) {\n parent.insertBefore(\n existingLink.firstChild,\n existingLink\n );\n }\n parent.removeChild(existingLink);\n // Update content\n const editorEl = editor.getSelection()?.anchorNode;\n if (editorEl) {\n const content = editor.getContent();\n editor.setContent(content);\n }\n }\n } else {\n // Insert new link\n const url = prompt(\"Enter URL:\");\n if (url && isUrlSafe(url)) {\n editor.executeCommand(\"createLink\", url);\n }\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n return element.closest(\"a\") !== null;\n },\n getCurrentValue: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return undefined;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return undefined;\n\n const link = element.closest(\"a\") as HTMLAnchorElement;\n return link ? link.href : undefined;\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n };\n}\n\nexport const linkPlugin = createLinkPlugin();\n\n/**\n * Blockquote-Plugin\n */\nexport const blockquotePlugin: Plugin = {\n name: \"blockquote\",\n type: \"block\",\n command: \"formatBlock\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Quote\"\n aria-label=\"Quote\"\n >\n <IconWrapper icon=\"mdi:format-quote-close\" width={18} height={18} />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return;\n\n const isBlockquote = element.closest(\"blockquote\") !== null;\n\n if (isBlockquote) {\n editor.executeCommand(\"formatBlock\", \"<p>\");\n } else {\n editor.executeCommand(\"formatBlock\", \"<blockquote>\");\n }\n },\n isActive: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const element =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement\n : (container as HTMLElement);\n\n if (!element) return false;\n\n return element.closest(\"blockquote\") !== null;\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n\n/**\n * Unordered List Plugin\n */\nexport const unorderedListPlugin: Plugin = {\n name: \"unorderedList\",\n type: \"block\",\n command: \"insertUnorderedList\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Bullet List\"\n aria-label=\"Bullet List\"\n >\n <IconWrapper\n icon=\"mdi:format-list-bulleted\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertUnorderedList\");\n },\n isActive: (editor: EditorAPI) => {\n if (typeof document === \"undefined\") return false;\n return document.queryCommandState(\"insertUnorderedList\");\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n\n/**\n * Ordered List Plugin\n */\nexport const orderedListPlugin: Plugin = {\n name: \"orderedList\",\n type: \"block\",\n command: \"insertOrderedList\",\n renderButton: (props: ButtonProps) => (\n <button\n type=\"button\"\n onClick={props.onClick}\n disabled={props.disabled}\n className={`rte-toolbar-button ${\n props.isActive ? \"rte-toolbar-button-active\" : \"\"\n }`}\n title=\"Numbered List\"\n aria-label=\"Numbered List\"\n >\n <IconWrapper\n icon=\"mdi:format-list-numbered\"\n width={18}\n height={18}\n />\n </button>\n ),\n execute: (editor: EditorAPI) => {\n editor.executeCommand(\"insertOrderedList\");\n },\n isActive: (editor: EditorAPI) => {\n if (typeof document === \"undefined\") return false;\n return document.queryCommandState(\"insertOrderedList\");\n },\n canExecute: (editor: EditorAPI) => {\n const selection = editor.getSelection();\n return selection !== null && selection.rangeCount > 0;\n },\n};\n"],"names":["_jsx","_jsxs","useState","useRef","useEffect","useCallback","defaultHeadings","headingLabels","_Fragment","createPortal","useMemo"],"mappings":"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"}