UNPKG

@onesy/ui-react

Version:
1,907 lines 90.7 kB
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
const _excluded = ["ref", "tonal", "color", "version", "value", "onChange", "render", "miniMenu", "miniMenuInclude", "exclude", "updates", "actions", "fontFamilies", "addFontFamilies", "IconItalic", "IconUnderline", "IconBold", "IconStrikeLine", "IconColor", "IconBackground", "IconAlignLeft", "IconAlignCenter", "IconAlignRight", "IconAlignJustify", "IconIndent", "IconOutdent", "IconSuperscript", "IconSubscript", "IconListOrdered", "IconListUnordered", "IconHorizontalRule", "IconLinkAdd", "IconLinkRemove", "IconQuote", "IconImage", "IconVideo", "IconVideoYoutube", "IconTable", "IconCode", "IconDrawing", "IconCopy", "IconCut", "IconPaste", "IconDelete", "IconClear", "IconSelectAll", "IconSave", "IconPrint", "IconUndo", "IconRedo", "AppendProps", "ToolbarProps", "ToolbarUpdatesProps", "ToolbarActionsProps", "ToggleButtonProps", "ToggleButtonsProps", "DividerProps", "SelectProps", "ListItemProps", "TooltipProps", "MiniMenuProps", "DrawingProps", "IconProps", "ColorTextFieldProps", "Component", "className", "children"],
  _excluded2 = ["open", "name", "children"],
  _excluded3 = ["open", "element", "anchorElement", "onClose", "children"],
  _excluded4 = ["color"],
  _excluded5 = ["ref", "version", "onUpdate", "onClose"],
  _excluded6 = ["ref", "label", "labelButton", "value", "onChange", "onClick", "InputComponent", "InputProps"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
import React from 'react';
import { is, isEnvironment, parse } from '@onesy/utils';
import { classNames, colors, style as styleMethod, useOnesyTheme } from '@onesy/style-react';
import IconMaterialFormatItalic from '@onesy/icons-material-rounded-react/IconMaterialFormatItalicW100';
import IconMaterialFormatUnderlined from '@onesy/icons-material-rounded-react/IconMaterialFormatUnderlinedW100';
import IconMaterialFormatBold from '@onesy/icons-material-rounded-react/IconMaterialFormatBoldW100';
import IconMaterialContentCopy from '@onesy/icons-material-rounded-react/IconMaterialContentCopyW100';
import IconMaterialContentCut from '@onesy/icons-material-rounded-react/IconMaterialContentCutW100';
import IconMaterialContentPaste from '@onesy/icons-material-rounded-react/IconMaterialContentPasteW100';
import IconMaterialFormatAlignLeft from '@onesy/icons-material-rounded-react/IconMaterialFormatAlignLeftW100';
import IconMaterialFormatAlignCenter from '@onesy/icons-material-rounded-react/IconMaterialFormatAlignCenterW100';
import IconMaterialFormatAlignRight from '@onesy/icons-material-rounded-react/IconMaterialFormatAlignRightW100';
import IconMaterialFormatAlignJustify from '@onesy/icons-material-rounded-react/IconMaterialFormatAlignJustifyW100';
import IconMaterialStrikethroughS from '@onesy/icons-material-rounded-react/IconMaterialStrikethroughSW100';
import IconMaterialUndo from '@onesy/icons-material-rounded-react/IconMaterialUndoW100';
import IconMaterialRedo from '@onesy/icons-material-rounded-react/IconMaterialRedoW100';
import IconMaterialFormatClear from '@onesy/icons-material-rounded-react/IconMaterialFormatClearW100';
import IconMaterialSuperscript from '@onesy/icons-material-rounded-react/IconMaterialSuperscriptW100';
import IconMaterialSubscript from '@onesy/icons-material-rounded-react/IconMaterialSubscriptW100';
import IconMaterialFormatIndentIncrease from '@onesy/icons-material-rounded-react/IconMaterialFormatIndentIncreaseW100';
import IconMaterialFormatIndentDecrease from '@onesy/icons-material-rounded-react/IconMaterialFormatIndentDecreaseW100';
import IconMaterialFormatListNumbered from '@onesy/icons-material-rounded-react/IconMaterialFormatListNumberedW100';
import IconMaterialFormatListBulleted from '@onesy/icons-material-rounded-react/IconMaterialFormatListBulletedW100';
import IconMaterialHorizontalRule from '@onesy/icons-material-rounded-react/IconMaterialHorizontalRuleW100';
import IconMaterialFormatColorText from '@onesy/icons-material-rounded-react/IconMaterialFormatColorTextW100';
import IconMaterialFormatColorFill from '@onesy/icons-material-rounded-react/IconMaterialFormatColorFillW100';
import IconMaterialAddLink from '@onesy/icons-material-rounded-react/IconMaterialAddLinkW100';
import IconMaterialLinkOff from '@onesy/icons-material-rounded-react/IconMaterialLinkOffW100';
import IconMaterialImage from '@onesy/icons-material-rounded-react/IconMaterialImageW100';
import IconMaterialFormatQuote from '@onesy/icons-material-rounded-react/IconMaterialFormatQuoteW100';
import IconMaterialVideocam from '@onesy/icons-material-rounded-react/IconMaterialVideocamW100';
import IconMaterialPlayArrow from '@onesy/icons-material-rounded-react/IconMaterialPlayArrowW100';
import IconMaterialCode from '@onesy/icons-material-rounded-react/IconMaterialCodeW100';
import IconMaterialDeleteSweep from '@onesy/icons-material-rounded-react/IconMaterialDeleteSweepW100';
import IconMaterialSelectAll from '@onesy/icons-material-rounded-react/IconMaterialSelectAllW100';
import IconMaterialPrint from '@onesy/icons-material-rounded-react/IconMaterialPrintW100';
import IconMaterialDownload from '@onesy/icons-material-rounded-react/IconMaterialDownloadW100';
import IconMaterialTable from '@onesy/icons-material-rounded-react/IconMaterialTableW100';
import IconMaterialDraw from '@onesy/icons-material-rounded-react/IconMaterialDrawW100';
import TypeElement from '../Type';
import TooltipElement from '../Tooltip';
import FadeElement from '../Fade';
import AppendElement from '../Append';
import SelectElement from '../Select';
import SwitchElement from '../Switch';
import LabelElement from '../Label';
import NumericTextFieldElement from '../NumericTextField';
import ColorTextFieldElement from '../ColorTextField';
import ToggleButtonsElement from '../ToggleButtons';
import ToggleButtonElement from '../ToggleButton';
import DrawingElement from '../Drawing';
import DividerElement from '../Divider';
import ClickListenerElement from '../ClickListener';
import TextFieldElement from '../TextField';
import ButtonElement from '../Button';
import SurfaceElement from '../Surface';
import ListItemElement from '../ListItem';
import LineElement from '../Line';
import { print, save, staticClassName } from '../utils';
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
const useStyle = styleMethod(theme => ({
  root: {
    width: '100%'
  },
  value: {
    padding: theme.methods.space.value(2, 'px'),
    whiteSpace: 'break-spaces',
    '& p': _objectSpread({}, theme.typography.values.b2),
    '& h1': _objectSpread({}, theme.typography.values.h1),
    '& h2': _objectSpread({}, theme.typography.values.h2),
    '& h3': _objectSpread({}, theme.typography.values.h3),
    '& h4': _objectSpread({}, theme.typography.values.t1),
    '& h5': _objectSpread({}, theme.typography.values.t2),
    '& a': {
      color: theme.palette.color.primary.main,
      textDecoration: 'underline'
    },
    '& blockquote': {
      margin: '16px 0',
      marginInlineStart: '16px',
      padding: `${theme.methods.space.value(2.5, 'px')} ${theme.methods.space.value(2, 'px')}`,
      borderInlineStart: `4px solid ${theme.methods.palette.color.colorToRgb(theme.palette.text.default.primary, theme.palette.light ? 0.04 : 0.2)}`,
      background: theme.methods.palette.color.colorToRgb(theme.palette.text.default.primary, theme.palette.light ? 0.02 : 0.14),
      '& > *': {
        margin: '0px'
      },
      '& > $blockquote': {
        marginBlock: '16px'
      }
    },
    '& iframe': {
      display: 'block',
      maxWidth: '100%',
      margin: '16px auto'
    },
    '& video': {
      display: 'block',
      margin: '16px auto'
    },
    '& code': {
      padding: `${theme.methods.space.value(0.25, 'px')} ${theme.methods.space.value(0.5, 'px')}`,
      borderRadius: theme.methods.shape.radius.value(0.5, 'px'),
      color: theme.palette.text.default.primary,
      background: theme.methods.palette.color.colorToRgb(theme.palette.text.default.primary, theme.palette.light ? 0.04 : 0.1)
    },
    '& pre': {
      margin: '16px 0',
      padding: theme.methods.space.value(2, 'px'),
      borderRadius: theme.methods.shape.radius.value(1, 'px'),
      color: theme.palette.text.default.primary,
      background: theme.methods.palette.color.colorToRgb(theme.palette.text.default.primary, theme.palette.light ? 0.04 : 0.1),
      '& code': {
        padding: '0px',
        background: 'transparent'
      }
    },
    '& table': {
      margin: '16px auto',
      borderCollapse: 'collapse',
      border: `1px solid ${theme.palette.light ? theme.palette.color.neutral[80] : theme.palette.color.neutral[30]}`,
      '& th, & td': _objectSpread(_objectSpread({}, theme.typography.values.b2), {}, {
        height: '45px',
        padding: `${theme.methods.space.value(1.5, 'px')} ${theme.methods.space.value(2, 'px')}`,
        borderBottom: `1px solid ${theme.palette.light ? theme.palette.color.neutral[80] : theme.palette.color.neutral[30]}`,
        borderRight: `1px solid ${theme.palette.light ? theme.palette.color.neutral[80] : theme.palette.color.neutral[30]}`
      }),
      '& th': {
        fontWeight: 500,
        borderBottom: `1px solid ${theme.palette.light ? theme.palette.color.neutral[50] : theme.palette.color.neutral[50]}`
      }
    },
    '& .onesy-Drawing-svg': {
      display: 'block',
      margin: '16px auto',
      background: theme.palette.color.neutral[100]
    }
  },
  toolbars: {
    width: '100%'
  },
  toolbar: {
    width: '100%',
    overflowX: 'auto',
    padding: theme.methods.space.value(1, 'px')
  },
  divider: {
    '&.onesy-Divider-root': {
      margin: 0
    }
  },
  divider_middle: {
    '&.onesy-Divider-root': {
      opacity: theme.palette.light ? 0.07 : 0.24
    }
  },
  divider_end: {
    '&.onesy-Divider-root': {
      opacity: theme.palette.light ? 0.14 : 0.4
    }
  },
  select: {
    '& .onesy-TextField-input-wrapper': {
      height: '40px',
      paddingBlock: theme.methods.space.value(1.25, 'px')
    },
    '& .onesy-Select-input': {
      '& > *': _objectSpread(_objectSpread({}, theme.typography.values.b2), {}, {
        fontWeight: 400
      })
    }
  },
  miniMenu: {
    padding: theme.methods.space.value(1.5, 'px'),
    borderRadius: theme.methods.shape.radius.value(140, 'px'),
    boxShadow: theme.shadows.values.default[2]
  },
  palette: {
    padding: theme.methods.space.value(1.5, 'px'),
    borderRadius: theme.methods.shape.radius.value(1, 'px'),
    boxShadow: theme.shadows.values.default[2]
  },
  paletteItem: {
    position: 'relative',
    width: '17px',
    height: '17px',
    cursor: 'pointer',
    borderRadius: theme.methods.shape.radius.value(40, 'px'),
    boxShadow: theme.shadows.values.default[1],
    transition: theme.methods.transitions.make('box-shadow'),
    '&:hover': {
      boxShadow: theme.shadows.values.default[2]
    }
  },
  textFieldColor: {
    flex: '1 1 auto'
  }
}), {
  name: 'onesy-RichTextEditor'
});
const RichTextEditor = props__ => {
  const theme = useOnesyTheme();
  const l = theme.l;
  const props = _objectSpread(_objectSpread(_objectSpread({}, theme?.ui?.elements?.all?.props?.default), theme?.ui?.elements?.onesyRichTextEditor?.props?.default), props__);
  const Line = theme?.elements?.Line || LineElement;
  const Type = theme?.elements?.Type || TypeElement;
  const Tooltip = theme?.elements?.Tooltip || TooltipElement;
  const Fade = theme?.elements?.Fade || FadeElement;
  const Append = theme?.elements?.Append || AppendElement;
  const Select = theme?.elements?.Select || SelectElement;
  const Switch = theme?.elements?.Switch || SwitchElement;
  const Label = theme?.elements?.Label || LabelElement;
  const NumericTextField = theme?.elements?.NumericTextField || NumericTextFieldElement;
  const ColorTextField = theme?.elements?.ColorTextField || ColorTextFieldElement;
  const ToggleButton = theme?.elements?.ToggleButton || ToggleButtonElement;
  const ToggleButtons = theme?.elements?.ToggleButtons || ToggleButtonsElement;
  const Drawing = theme?.elements?.Drawing || DrawingElement;
  const Divider = theme?.elements?.Divider || DividerElement;
  const ClickListener = theme?.elements?.ClickListener || ClickListenerElement;
  const TextField = theme?.elements?.TextField || TextFieldElement;
  const Surface = theme?.elements?.Surface || SurfaceElement;
  const Button = theme?.elements?.Button || ButtonElement;
  const ListItem = theme?.elements?.ListItem || ListItemElement;
  const {
      ref,
      tonal = true,
      color = 'default',
      version = 'filled',
      value,
      onChange,
      render,
      miniMenu = true,
      miniMenuInclude = ['italic', 'underline', 'bold', 'strike-line', 'font-color', 'font-background', 'align-left', 'align-center', 'align-right', 'align-justify', 'link-add', 'link-remove', 'clear'],
      exclude,
      updates = true,
      actions = true,
      fontFamilies = [{
        label: 'Arial',
        value: `Arial, sans-serif`
      }, {
        label: 'Verdana',
        value: `Verdana, sans-serif`
      }, {
        label: 'Helvetica',
        value: `Helvetica, sans-serif`
      }, {
        label: 'Georgia',
        value: `Georgia, sans-serif`
      }, {
        label: 'Roboto',
        value: `Roboto, sans-serif`
      }, {
        label: 'DM Sans',
        value: `DM Sans, sans-serif`
      }],
      addFontFamilies = [],
      // Update
      IconItalic = IconMaterialFormatItalic,
      IconUnderline = IconMaterialFormatUnderlined,
      IconBold = IconMaterialFormatBold,
      IconStrikeLine = IconMaterialStrikethroughS,
      IconColor = IconMaterialFormatColorText,
      IconBackground = IconMaterialFormatColorFill,
      IconAlignLeft = IconMaterialFormatAlignLeft,
      IconAlignCenter = IconMaterialFormatAlignCenter,
      IconAlignRight = IconMaterialFormatAlignRight,
      IconAlignJustify = IconMaterialFormatAlignJustify,
      IconIndent = IconMaterialFormatIndentIncrease,
      IconOutdent = IconMaterialFormatIndentDecrease,
      IconSuperscript = IconMaterialSuperscript,
      IconSubscript = IconMaterialSubscript,
      IconListOrdered = IconMaterialFormatListNumbered,
      IconListUnordered = IconMaterialFormatListBulleted,
      IconHorizontalRule = IconMaterialHorizontalRule,
      IconLinkAdd = IconMaterialAddLink,
      IconLinkRemove = IconMaterialLinkOff,
      IconQuote = IconMaterialFormatQuote,
      IconImage = IconMaterialImage,
      IconVideo = IconMaterialVideocam,
      IconVideoYoutube = IconMaterialPlayArrow,
      IconTable = IconMaterialTable,
      IconCode = IconMaterialCode,
      IconDrawing = IconMaterialDraw,
      // Action
      IconCopy = IconMaterialContentCopy,
      IconCut = IconMaterialContentCut,
      IconPaste = IconMaterialContentPaste,
      IconDelete = IconMaterialDeleteSweep,
      IconClear = IconMaterialFormatClear,
      IconSelectAll = IconMaterialSelectAll,
      IconSave = IconMaterialDownload,
      IconPrint = IconMaterialPrint,
      IconUndo = IconMaterialUndo,
      IconRedo = IconMaterialRedo,
      AppendProps: AppendProps_,
      ToolbarProps,
      ToolbarUpdatesProps,
      ToolbarActionsProps,
      ToggleButtonProps: ToggleButtonProps_,
      ToggleButtonsProps: ToggleButtonsProps_,
      DividerProps: DividerProps_,
      SelectProps: SelectProps_,
      ListItemProps: ListItemProps_,
      TooltipProps: TooltipProps_,
      MiniMenuProps: MiniMenuProps_,
      DrawingProps,
      IconProps: IconProps_,
      ColorTextFieldProps,
      Component = 'div',
      className,
      children
    } = props,
    other = _objectWithoutProperties(props, _excluded);
  const {
    classes
  } = useStyle();
  const [inputValues, setInputValues] = React.useState({});
  const [open, setOpen] = React.useState({});
  const [selected, setSelected] = React.useState([]);
  const [selection, setSelection] = React.useState();
  const refs = {
    root: React.useRef(null),
    value: React.useRef(null),
    range: React.useRef(null),
    inputValues: React.useRef(null),
    open: React.useRef(null),
    props: React.useRef(null),
    selected: React.useRef(null),
    miniMenu: React.useRef(null),
    miniMenuInclude: React.useRef(null),
    miniMenuElements: {
      color: React.useRef(null),
      colorPalette: React.useRef(null),
      background: React.useRef(null),
      backgroundPalette: React.useRef(null),
      linkAdd: React.useRef(null),
      linkAddInput: React.useRef(null),
      linkRemove: React.useRef(null)
    },
    elements: {
      color: React.useRef(null),
      background: React.useRef(null),
      linkAdd: React.useRef(null),
      linkRemove: React.useRef(null),
      quote: React.useRef(null),
      image: React.useRef(null),
      video: React.useRef(null),
      videoYoutube: React.useRef(null),
      table: React.useRef(null),
      drawing: React.useRef(null),
      drawingSvg: React.useRef(null),
      drawingSize: React.useRef(null),
      drawingSelect: React.useRef(null),
      drawingPalette: React.useRef(null),
      code: React.useRef(null)
    },
    rootDocument: React.useRef(null),
    rootWindow: React.useRef(null)
  };
  refs.inputValues.current = inputValues;
  refs.open.current = open;
  refs.props.current = props;
  refs.selected.current = selected;
  refs.miniMenuInclude.current = miniMenuInclude;
  const rootDocument = isEnvironment('browser') && (refs.root.current?.ownerDocument || window.document);
  const rootWindow = rootDocument && (rootDocument.defaultView || window);
  refs.rootDocument.current = rootDocument;
  refs.rootWindow.current = rootWindow;
  React.useEffect(() => {
    // Add value as innerHTML
    refs.value.current.innerHTML = value;
  }, [value]);
  React.useEffect(() => {
    const selection_ = refs.rootWindow.current.getSelection();
    if (selection_ && selection_.anchorNode && !selection_.anchorNode?.className?.includes('TextField')) refs.range.current = selection_.getRangeAt(0);
  }, [open]);
  React.useEffect(() => {
    if (!selection) {
      updateOpen('colorMiniMenu', false);
      updateOpen('backgroundMiniMenu', false);
      updateOpen('linkMiniMenu', false);
    }
  }, [selection]);
  const query = command => {
    return parse(refs.rootDocument.current.queryCommandValue(command));
  };
  const includesMinMenu = (...args) => args.some(item => refs.miniMenuInclude.current.includes(item));
  const clear = (element = refs.value.current) => {
    const children_ = Array.from(element.children);
    const toRemove = [];
    const other_ = [];
    children_.forEach((item_0, index) => {
      item_0.tagName === 'SPAN' && !item_0.innerHTML || item_0.tagName === 'BR' && index > 0 && children_[index - 1].tagName === 'SPAN' && !children_[index - 1].innerHTML ? toRemove.push(item_0) : other_.push(item_0);
    });
    toRemove.forEach(item_1 => item_1.remove());
    other_.forEach(item_2 => clear(item_2));
  };
  const onUpdate = event => {
    // Clear from empty element values
    clear();
    if (is('function', onChange)) onChange(event);
  };
  const updateInputValues = (property, itemValue) => {
    setInputValues(values => _objectSpread(_objectSpread({}, values), {}, {
      [property]: itemValue
    }));
  };
  const updateOpen = (property_0, itemValue_0) => {
    setOpen(values_0 => _objectSpread(_objectSpread({}, values_0), {}, {
      [property_0]: itemValue_0
    }));
  };
  const paste = async () => {
    const value_ = await navigator.clipboard.read();
    if (value_) {
      let values_1 = '';
      for (const item_3 of Array.from(value_)) {
        const valueItem = await item_3.getType('text/html');
        values_1 += await valueItem.text();
      }
      refs.rootDocument.current.execCommand('insertHTML', undefined, values_1);
    }
  };
  const method = command_0 => argument => {
    switch (command_0) {
      // updates
      case 'italic':
        refs.rootDocument.current.execCommand('italic');
        if (query('italic')) setSelected(values_24 => [...values_24, 'italic']);else setSelected(values_25 => values_25.filter(item_21 => item_21 !== 'italic'));
        break;
      case 'underline':
        refs.rootDocument.current.execCommand('underline');
        if (query('underline')) setSelected(values_22 => [...values_22, 'underline']);else setSelected(values_23 => values_23.filter(item_20 => item_20 !== 'underline'));
        break;
      case 'bold':
        refs.rootDocument.current.execCommand('bold');
        if (query('bold')) setSelected(values_20 => [...values_20, 'bold']);else setSelected(values_21 => values_21.filter(item_19 => item_19 !== 'bold'));
        break;
      case 'strike-line':
        refs.rootDocument.current.execCommand('strikeThrough');
        if (query('strikeThrough')) setSelected(values_18 => [...values_18, 'strike-line']);else setSelected(values_19 => values_19.filter(item_18 => item_18 !== 'strike-line'));
        break;
      case 'align-left':
        refs.rootDocument.current.execCommand('justifyLeft');
        if (query('justifyLeft')) setSelected(values_16 => [...values_16.filter(item_16 => !item_16.includes('align')), 'align-left']);else setSelected(values_17 => values_17.filter(item_17 => item_17 !== 'align-left'));
        break;
      case 'align-center':
        refs.rootDocument.current.execCommand('justifyCenter');
        if (query('justifyCenter')) setSelected(values_14 => [...values_14.filter(item_14 => !item_14.includes('align')), 'align-center']);else setSelected(values_15 => values_15.filter(item_15 => item_15 !== 'align-center'));
        break;
      case 'align-right':
        refs.rootDocument.current.execCommand('justifyRight');
        if (query('justifyRight')) setSelected(values_12 => [...values_12.filter(item_12 => !item_12.includes('align')), 'align-right']);else setSelected(values_13 => values_13.filter(item_13 => item_13 !== 'align-right'));
        break;
      case 'align-justify':
        refs.rootDocument.current.execCommand('justifyFull');
        if (query('justifyFull')) setSelected(values_10 => [...values_10.filter(item_10 => !item_10.includes('align')), 'align-justify']);else setSelected(values_11 => values_11.filter(item_11 => item_11 !== 'align-justify'));
        break;
      case 'superscript':
        refs.rootDocument.current.execCommand('superscript');
        if (query('superscript')) setSelected(values_8 => [...values_8, 'superscript']);else setSelected(values_9 => values_9.filter(item_9 => item_9 !== 'superscript'));
        break;
      case 'subscript':
        refs.rootDocument.current.execCommand('subscript');
        if (query('subscript')) setSelected(values_6 => [...values_6, 'subscript']);else setSelected(values_7 => values_7.filter(item_8 => item_8 !== 'subscript'));
        break;
      case 'indent':
        refs.rootDocument.current.execCommand('indent');
        break;
      case 'outdent':
        refs.rootDocument.current.execCommand('outdent');
        break;
      case 'font-version':
        refs.rootDocument.current.execCommand('formatBlock', undefined, argument);
        break;
      case 'font-family':
        refs.rootDocument.current.execCommand('styleWithCSS', true);
        refs.rootDocument.current.execCommand('fontName', undefined, argument);
        refs.rootDocument.current.execCommand('styleWithCSS', false);
        break;
      case 'font-size':
        refs.rootDocument.current.execCommand('styleWithCSS', true);
        refs.rootDocument.current.execCommand('fontSize', undefined, argument);
        refs.rootDocument.current.execCommand('styleWithCSS', false);
        break;
      case 'font-color':
        refs.rootDocument.current.execCommand('styleWithCSS', true);
        refs.rootDocument.current.execCommand('foreColor', undefined, argument);
        refs.rootDocument.current.execCommand('styleWithCSS', false);
        break;
      case 'font-background':
        refs.rootDocument.current.execCommand('styleWithCSS', true);
        refs.rootDocument.current.execCommand('backColor', undefined, argument);
        refs.rootDocument.current.execCommand('styleWithCSS', false);
        break;
      case 'list-ordered':
        refs.rootDocument.current.execCommand('insertOrderedList');
        if (query('insertOrderedList')) setSelected(values_4 => [...values_4.filter(item_6 => !item_6.includes('list')), 'list-ordered']);else setSelected(values_5 => values_5.filter(item_7 => item_7 !== 'list-ordered'));
        break;
      case 'list-unordered':
        refs.rootDocument.current.execCommand('insertUnorderedList');
        if (query('insertUnorderedList')) setSelected(values_2 => [...values_2.filter(item_4 => !item_4.includes('list')), 'list-unordered']);else setSelected(values_3 => values_3.filter(item_5 => item_5 !== 'list-unordered'));
        break;
      case 'horizontal-rule':
        refs.rootDocument.current.execCommand('insertHorizontalRule');
        break;
      case 'link-add':
        refs.rootDocument.current.execCommand('createLink', undefined, argument);
        break;
      case 'link-remove':
        refs.rootDocument.current.execCommand('unlink');
        break;
      case 'image':
        refs.rootDocument.current.execCommand('insertImage', undefined, argument);
        break;
      case 'html':
        refs.rootDocument.current.execCommand('insertHTML', undefined, argument);
        break;

      // actions
      case 'copy':
        refs.rootDocument.current.execCommand('copy');
        break;
      case 'cut':
        refs.rootDocument.current.execCommand('cut');
        break;
      case 'paste':
        if (refs.rootDocument.current.queryCommandSupported('paste')) refs.rootDocument.current.execCommand('paste');else paste();
        break;
      case 'delete':
        refs.rootDocument.current.execCommand('delete');
        break;
      case 'clear':
        refs.rootDocument.current.execCommand('removeFormat');
        break;
      case 'select-all':
        refs.rootDocument.current.execCommand('selectAll');
        break;
      case 'undo':
        refs.rootDocument.current.execCommand('undo');
        break;
      case 'redo':
        refs.rootDocument.current.execCommand('redo');
        break;
      default:
        break;
    }
  };
  const includes = (...args_0) => !is('array', exclude) || args_0.some(item_22 => !exclude.includes(item_22));

  // italic, underline, bold
  // updates toolbar
  const updateOptions = ['font-family', 'font-version', 'font-size', 'font-color', 'font-background', 'italic', 'underline', 'bold', 'strike-line', 'align-left', 'align-center', 'align-right', 'align-justify', 'superscript', 'subscript', 'indent', 'outdent', 'list-ordered', 'list-unordered', 'horizontal-rule', 'link-add', 'link-remove', 'quote', 'image', 'video', 'video-youtube', 'table', 'drawing', 'code'];
  const updates_ = updates && (!is('array', exclude) || includes(...updateOptions));

  // copy, paste, cut
  // action toolbar
  const actions_ = actions && (!is('array', exclude) || includes('copy', 'paste', 'cut', 'clear', 'undo', 'redo', 'delete', 'select-all', 'save', 'print'));
  const AppendProps = _objectSpread({
    padding: [14, 14]
  }, AppendProps_);
  const DividerProps = _objectSpread({
    color: 'inherit'
  }, DividerProps_);
  const TooltipProps = _objectSpread({
    position: 'bottom',
    interactive: false
  }, TooltipProps_);
  const ToggleButtonsProps = _objectSpread({
    tonal,
    color,
    version: 'text',
    border: false
  }, ToggleButtonsProps_);
  const ToggleButtonProps = _objectSpread({
    size: 'small'
  }, ToggleButtonProps_);
  const MiniMenuProps = _objectSpread({
    tonal,
    color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed'
  }, MiniMenuProps_);
  const SelectProps = _objectSpread({
    tonal,
    color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
    version: 'outlined',
    size: 'small',
    ListProps: {
      tonal,
      color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed'
    },
    MenuProps: {
      portal: true
    }
  }, SelectProps_);
  const ListItemProps = _objectSpread({
    size: 'small',
    PrimaryProps: {
      style: {
        fontFamily: 'inherit'
      }
    }
  }, ListItemProps_);
  const IconProps = _objectSpread({
    size: 'small'
  }, IconProps_);
  const WrapperToggleButton = props_ => {
    const {
        open: open_,
        name,
        children: children__0
      } = props_,
      other__0 = _objectWithoutProperties(props_, _excluded2);
    return /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
      open: open_ !== undefined ? open_ : undefined,
      name: name
    }, TooltipProps), {}, {
      children: /*#__PURE__*/React.cloneElement(children__0, _objectSpread(_objectSpread({}, other__0), children__0.props))
    }));
  };
  const WrapperAppend = props__0 => {
    const {
        open: open__0,
        element: element_0,
        anchorElement,
        onClose,
        children: children__1
      } = props__0,
      other__1 = _objectWithoutProperties(props__0, _excluded3);
    return /*#__PURE__*/_jsx(Append, _objectSpread(_objectSpread({
      open: open__0,
      element: /*#__PURE__*/_jsx("div", {
        children: /*#__PURE__*/_jsx(Fade, {
          in: open__0,
          add: true,
          children: /*#__PURE__*/React.cloneElement(element_0)
        })
      }),
      anchorElement: anchorElement,
      portal: true,
      alignment: "center",
      position: "bottom"
    }, AppendProps), {}, {
      children: /*#__PURE__*/React.cloneElement(children__1, _objectSpread(_objectSpread({}, other__1), children__1.props))
    }));
  };
  const onMouseDown = () => {
    const selection__0 = refs.rootWindow.current.getSelection();
    if (selection__0.anchorNode && !selection__0.anchorNode?.className?.includes('TextField')) refs.range.current = selection__0.getRangeAt(0);
  };
  const onMouseUp = () => {
    if (refs.range.current) {
      const selection__1 = refs.rootWindow.current.getSelection();
      selection__1.removeAllRanges();
      selection__1.addRange(refs.range.current);
    }
  };
  const PaletteItem = props__1 => {
    const {
        color: color_
      } = props__1,
      other__2 = _objectWithoutProperties(props__1, _excluded4);
    return /*#__PURE__*/_jsx("span", _objectSpread({
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-palette-item'], classes.paletteItem]),
      style: {
        background: color_
      }
    }, other__2));
  };
  const Palette = props__2 => {
    const {
        ref: ref_,
        version: version_,
        onUpdate: onUpdate_,
        onClose: onClose_0
      } = props__2,
      other__3 = _objectWithoutProperties(props__2, _excluded5);
    return /*#__PURE__*/_jsxs(Line, _objectSpread(_objectSpread({
      ref: ref_,
      gap: 1,
      direction: "column",
      tonal: tonal,
      color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
      Component: Surface,
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-palette'], classes.palette])
    }, other__3), {}, {
      children: [/*#__PURE__*/_jsxs(Line, {
        gap: 0.5,
        onMouseUp: onMouseUp,
        onMouseDown: onMouseDown,
        children: [/*#__PURE__*/_jsxs(Line, {
          gap: 0.5,
          direction: "row",
          style: {
            width: '100%'
          },
          children: [/*#__PURE__*/_jsx(PaletteItem, {
            color: "#000000",
            onClick: () => {
              onUpdate_('#000000');
              onClose_0();
            }
          }), /*#__PURE__*/_jsx(PaletteItem, {
            color: "#ffffff",
            onClick: () => {
              onUpdate_('#ffffff');
              onClose_0();
            }
          })]
        }), Object.keys(colors).filter(item_23 => !['black', 'white'].includes(item_23)).map((item_24, index_0) => /*#__PURE__*/_jsx(Line, {
          gap: 0.5,
          direction: "row",
          style: {
            width: '100%'
          },
          children: Object.keys(colors[item_24]).map((item_, index_) => /*#__PURE__*/_jsx(PaletteItem, {
            color: colors[item_24][item_],
            onClick: () => {
              if (refs.range.current) {
                const selection__2 = refs.rootWindow.current.getSelection();
                selection__2.removeAllRanges();
                selection__2.addRange(refs.range.current);
              }
              onUpdate_(colors[item_24][item_]);
              onClose_0();
            }
          }, index_))
        }, index_0))]
      }), /*#__PURE__*/_jsx(Divider, {}), /*#__PURE__*/_jsxs(Line, {
        gap: 0.5,
        direction: "row",
        align: "center",
        style: {
          width: '100%'
        },
        children: [/*#__PURE__*/_jsx(ColorTextField, _objectSpread(_objectSpread({
          tonal: tonal,
          color: color,
          name: l('Custom color'),
          version: "outlined",
          size: "small",
          value: refs.inputValues.current[version_],
          onChange: valueNew => updateInputValues(version_, valueNew)
        }, ColorTextFieldProps), {}, {
          className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-text-field-color'], ColorTextFieldProps?.className, classes.textFieldColor])
        })), /*#__PURE__*/_jsx(Button, {
          tonal: tonal,
          color: "inherit",
          version: "text",
          size: "small",
          onClick: () => {
            if (refs.range.current) {
              const selection__3 = refs.rootWindow.current.getSelection();
              selection__3.removeAllRanges();
              selection__3.addRange(refs.range.current);
            }
            onUpdate_(refs.inputValues.current[version_]);
            onClose_0();
          },
          children: "Apply"
        })]
      })]
    }));
  };
  const Input = props__3 => {
    const {
        ref: ref__0,
        label,
        labelButton,
        value: value__,
        onChange: onChange__,
        onClick,
        InputComponent = TextField,
        InputProps
      } = props__3,
      other__4 = _objectWithoutProperties(props__3, _excluded6);
    return /*#__PURE__*/_jsx(Line, _objectSpread(_objectSpread({
      ref: ref__0,
      gap: 1,
      direction: "column",
      tonal: tonal,
      color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
      Component: Surface,
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-palette'], classes.palette])
    }, other__4), {}, {
      children: /*#__PURE__*/_jsxs(Line, {
        gap: 0.5,
        direction: "row",
        align: "center",
        style: {
          width: '100%'
        },
        children: [/*#__PURE__*/_jsx(InputComponent, _objectSpread({
          tonal: tonal,
          color: color,
          name: label,
          version: "outlined",
          size: "small",
          value: value__,
          onChange: onChange__,
          className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-text-field-color'], classes.textFieldColor])
        }, InputProps)), /*#__PURE__*/_jsx(Button, {
          tonal: tonal,
          color: "inherit",
          version: "text",
          size: "small",
          onClick: onClick,
          children: labelButton
        })]
      })
    }));
  };
  const font_families = [...fontFamilies, ...addFontFamilies];
  const font_sizes = [{
    label: '11',
    value: 1
  }, {
    label: '14',
    value: 2
  }, {
    label: '16',
    value: 3
  }, {
    label: '18',
    value: 4
  }, {
    label: '24',
    value: 5
  }, {
    label: '32',
    value: 6
  }, {
    label: '48',
    value: 7
  }];
  const font_versions = [{
    label: /*#__PURE__*/_jsx(Type, {
      version: "b2",
      children: l('Normal text')
    }),
    value: 'p'
  }, {
    label: /*#__PURE__*/_jsx(Type, {
      version: "h1",
      children: l('Heading 1')
    }),
    value: 'h1'
  }, {
    label: /*#__PURE__*/_jsx(Type, {
      version: "h2",
      children: l('Heading 2')
    }),
    value: 'h2'
  }, {
    label: /*#__PURE__*/_jsx(Type, {
      version: "h3",
      children: l('Heading 3')
    }),
    value: 'h3'
  }, {
    label: /*#__PURE__*/_jsx(Type, {
      version: "t1",
      children: l('Heading 4')
    }),
    value: 'h4'
  }, {
    label: /*#__PURE__*/_jsx(Type, {
      version: "t2",
      children: l('Heading 5')
    }),
    value: 'h5'
  }];
  const queryValueUpdate = () => {
    const selected_ = [];
    const inputValues_ = _objectSpread({}, inputValues);
    const updateOptionValues = [{
      name: 'italic',
      command: 'italic'
    }, {
      name: 'underline',
      command: 'underline'
    }, {
      name: 'bold',
      command: 'bold'
    }, {
      name: 'strike-line',
      command: 'strikeThrough'
    }, {
      name: 'align-left',
      command: 'justifyLeft'
    }, {
      name: 'align-center',
      command: 'justifyCenter'
    }, {
      name: 'align-right',
      command: 'justifyRight'
    }, {
      name: 'align-justify',
      command: 'justifyFull'
    }, {
      name: 'superscript',
      command: 'superscript'
    }, {
      name: 'subscript',
      command: 'subscript'
    }, {
      name: 'list-ordered',
      command: 'insertOrderedList'
    }, {
      name: 'list-unordered',
      command: 'insertUnorderedList'
    }];
    updateOptionValues.forEach(item_25 => {
      if (query(item_25.command)) selected_.push(item_25.name);
    });

    // Font version
    const fontVersion = query('formatBlock');
    const fontVersionValue = font_versions.find(item__0 => item__0.value === fontVersion) || font_versions[0];
    inputValues_['font-version'] = fontVersionValue?.value;

    // Font family
    const fontFamily = query('fontName');
    const fontFamilyValue = font_families.find(item__2 => fontFamily?.includes(item__2.label)) || font_families.find(item__1 => item__1.label === 'DM Sans');
    inputValues_['font-family'] = fontFamilyValue?.value;

    // Font version
    const fontSize = query('fontSize');
    const fontSizeValue = font_sizes.find(item__4 => item__4.value === fontSize) || font_sizes.find(item__3 => item__3.label === '14');
    inputValues_['font-size'] = fontSizeValue?.value;
    setInputValues(inputValues_);
    setSelected(selected_);
  };
  const onMouseUpValue = () => {
    queryValueUpdate();
    setTimeout(() => {
      const selection__4 = refs.rootWindow.current.getSelection();
      if (!selection__4.anchorNode || !refs.value.current.contains(selection__4.anchorNode)) return setSelection('');
      const rect = selection__4.getRangeAt(0).getBoundingClientRect();
      setSelection(Math.round(rect.width) ? rect : '');
    });
  };
  const onMouseDownValue = () => {
    queryValueUpdate();
  };
  const updateElements = {
    'font-version': /*#__PURE__*/_jsx(Select, _objectSpread(_objectSpread({
      name: l('Font Version'),
      valueDefault: font_versions.find(item_26 => item_26.value.includes('p')).value,
      value: inputValues['font-version'],
      onChange: valueNew_0 => {
        updateInputValues('font-version', valueNew_0);
        method('font-version')(valueNew_0);
      },
      onMouseUp: onMouseUp,
      onMouseDown: onMouseDown
    }, SelectProps), {}, {
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-select'], SelectProps?.className, classes.select]),
      style: {
        minWidth: '150px'
      },
      children: font_versions.map(item_27 => /*#__PURE__*/_jsx(ListItem, _objectSpread({
        primary: item_27.label,
        value: item_27.value,
        button: true
      }, ListItemProps), item_27.value))
    })),
    'font-family': /*#__PURE__*/_jsx(Select, _objectSpread(_objectSpread({
      name: l('Font Family'),
      valueDefault: font_families.find(item_28 => item_28.label.includes('DM Sans')).value,
      value: inputValues['font-family'],
      onChange: valueNew_1 => {
        updateInputValues('font-family', valueNew_1);
        method('font-family')(valueNew_1);
      },
      onMouseUp: onMouseUp,
      onMouseDown: onMouseDown
    }, SelectProps), {}, {
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-select'], SelectProps?.className, classes.select]),
      style: {
        minWidth: '140px'
      },
      children: font_families.map(item_29 => /*#__PURE__*/_jsx(ListItem, _objectSpread({
        primary: item_29.label,
        value: item_29.value,
        button: true,
        style: {
          fontFamily: item_29.value
        }
      }, ListItemProps), item_29.value))
    })),
    'font-size': /*#__PURE__*/_jsx(Select, _objectSpread(_objectSpread({
      name: l('Font Size'),
      valueDefault: +font_sizes.find(item_30 => item_30.label.includes('14')).value,
      value: inputValues['font-size'],
      onChange: valueNew_2 => {
        updateInputValues('font-size', +valueNew_2);
        method('font-size')(+valueNew_2);
      },
      onMouseUp: onMouseUp,
      onMouseDown: onMouseDown
    }, SelectProps), {}, {
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-select'], SelectProps?.className, classes.select]),
      children: font_sizes.map(item_31 => /*#__PURE__*/_jsx(ListItem, _objectSpread({
        primary: item_31.label,
        value: item_31.value,
        button: true
      }, ListItemProps), item_31.value))
    })),
    'italic': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Italic'),
      children: is('function', render) ? render('italic', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('italic'),
        onClick: method('italic'),
        children: /*#__PURE__*/_jsx(IconItalic, _objectSpread({}, IconProps))
      }))
    }),
    'underline': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Underline'),
      children: is('function', render) ? render('underline', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('underline'),
        onClick: method('underline'),
        children: /*#__PURE__*/_jsx(IconUnderline, _objectSpread({}, IconProps))
      }))
    }),
    'bold': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Bold'),
      onClick: method('bold'),
      children: is('function', render) ? render('bold', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('bold'),
        children: /*#__PURE__*/_jsx(IconBold, _objectSpread({}, IconProps))
      }))
    }),
    'strike-line': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Strike Line'),
      onClick: method('strike-line'),
      children: is('function', render) ? render('strike-line', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('strike-line'),
        children: /*#__PURE__*/_jsx(IconStrikeLine, _objectSpread({}, IconProps))
      }))
    }),
    'font-color': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.color,
      anchorElement: refs.elements.color.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('color', false),
        include: [refs.elements.color.current],
        children: /*#__PURE__*/_jsx(Palette, {
          version: "font-color",
          onClose: () => updateOpen('color', false),
          onUpdate: method('font-color')
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Text Color'),
        open: refs.open.current.color ? false : undefined,
        children: is('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.color
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.color,
          onClick: () => updateOpen('color', !refs.open.current.color),
          children: /*#__PURE__*/_jsx(IconColor, _objectSpread({}, IconProps))
        }))
      })
    }),
    'font-color-mini-menu': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.colorMiniMenu,
      anchorElement: refs.miniMenuElements.color,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('colorMiniMenu', false),
        include: [refs.miniMenuElements.color],
        children: /*#__PURE__*/_jsx(Palette, {
          ref: refs.miniMenuElements.colorPalette,
          version: "font-color",
          onClose: () => updateOpen('colorMiniMenu', false),
          onUpdate: method('font-color')
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Text Color'),
        open: refs.open.current.colorMiniMenu ? false : undefined,
        children: is('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.miniMenuElements.color
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.colorMiniMenu,
          onClick: () => updateOpen('colorMiniMenu', !refs.open.current.colorMiniMenu),
          children: /*#__PURE__*/_jsx(IconColor, _objectSpread({}, IconProps))
        }))
      })
    }),
    'font-background': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.background,
      anchorElement: refs.elements.background.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('background', false),
        include: [refs.elements.background.current],
        children: /*#__PURE__*/_jsx(Palette, {
          version: "font-background",
          onClose: () => updateOpen('background', false),
          onUpdate: method('font-background')
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Background Color'),
        open: refs.open.current.background ? false : undefined,
        children: is('function', render) ? render('font-background', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.background
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.background,
          onClick: () => updateOpen('background', !refs.open.current.background),
          children: /*#__PURE__*/_jsx(IconBackground, _objectSpread({}, IconProps))
        }))
      })
    }),
    'font-background-mini-menu': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.backgroundMiniMenu,
      anchorElement: refs.miniMenuElements.background,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('backgroundMiniMenu', false),
        include: [refs.miniMenuElements.background],
        children: /*#__PURE__*/_jsx(Palette, {
          ref: refs.miniMenuElements.backgroundPalette,
          version: "font-background",
          onClose: () => updateOpen('backgroundMiniMenu', false),
          onUpdate: method('font-background')
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Text Color'),
        open: refs.open.current.backgroundMiniMenu ? false : undefined,
        children: is('function', render) ? render('font-background', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.miniMenuElements.background
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.backgroundMiniMenu,
          onClick: () => updateOpen('backgroundMiniMenu', !refs.open.current.backgroundMiniMenu),
          children: /*#__PURE__*/_jsx(IconBackground, _objectSpread({}, IconProps))
        }))
      })
    }),
    'align-left': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Align Left'),
      children: is('function', render) ? render('align-left', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('align-left'),
        onClick: method('align-left'),
        children: /*#__PURE__*/_jsx(IconAlignLeft, _objectSpread({}, IconProps))
      }))
    }),
    'align-center': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Align Center'),
      children: is('function', render) ? render('align-center', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('align-center'),
        onClick: method('align-center'),
        children: /*#__PURE__*/_jsx(IconAlignCenter, _objectSpread({}, IconProps))
      }))
    }),
    'align-right': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Align Right'),
      children: is('function', render) ? render('align-right', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('align-right'),
        onClick: method('align-right'),
        children: /*#__PURE__*/_jsx(IconAlignRight, _objectSpread({}, IconProps))
      }))
    }),
    'align-justify': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Align Justify'),
      children: is('function', render) ? render('align-justify', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('align-justify'),
        onClick: method('align-justify'),
        children: /*#__PURE__*/_jsx(IconAlignJustify, _objectSpread({}, IconProps))
      }))
    }),
    'indent': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Indent'),
      children: is('function', render) ? render('indent', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        onClick: method('indent'),
        children: /*#__PURE__*/_jsx(IconIndent, _objectSpread({}, IconProps))
      }))
    }),
    'outdent': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Outdent'),
      children: is('function', render) ? render('outdent', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        onClick: method('outdent'),
        children: /*#__PURE__*/_jsx(IconOutdent, _objectSpread({}, IconProps))
      }))
    }),
    'superscript': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Superscript'),
      children: is('function', render) ? render('superscript', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('superscript'),
        onClick: method('superscript'),
        children: /*#__PURE__*/_jsx(IconSuperscript, _objectSpread({}, IconProps))
      }))
    }),
    'subscript': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Subscript'),
      children: is('function', render) ? render('subscript', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('subscript'),
        onClick: method('subscript'),
        children: /*#__PURE__*/_jsx(IconSubscript, _objectSpread({}, IconProps))
      }))
    }),
    'list-ordered': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('List Ordered'),
      children: is('function', render) ? render('list-ordered', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('list-ordered'),
        onClick: method('list-ordered'),
        children: /*#__PURE__*/_jsx(IconListOrdered, _objectSpread({}, IconProps))
      }))
    }),
    'list-unordered': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('List Unordered'),
      children: is('function', render) ? render('list-unordered', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        selected: refs.selected.current.includes('list-unordered'),
        onClick: method('list-unordered'),
        children: /*#__PURE__*/_jsx(IconListUnordered, _objectSpread({}, IconProps))
      }))
    }),
    'horizontal-rule': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Insert Horizontal Rule'),
      onClick: method('horizontal-rule'),
      children: is('function', render) ? render('horizontal-rule', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        children: /*#__PURE__*/_jsx(IconHorizontalRule, _objectSpread({}, IconProps))
      }))
    }),
    'link-add': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.link,
      anchorElement: refs.elements.linkAdd.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('link', false),
        include: [refs.elements.linkAdd.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Link'),
          labelButton: l('Add'),
          value: refs.inputValues.current.link,
          onChange: valueNew_3 => updateInputValues('link', valueNew_3),
          onClick: () => {
            if (refs.range.current) {
              const selection__5 = refs.rootWindow.current.getSelection();
              selection__5.removeAllRanges();
              selection__5.addRange(refs.range.current);
            }
            method('link-add')(refs.inputValues.current.link);
            updateOpen('link', false);
            updateInputValues('link', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Link'),
        open: refs.open.current.link ? false : undefined,
        children: is('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.linkAdd
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.link,
          onClick: () => updateOpen('link', !refs.open.current.link),
          children: /*#__PURE__*/_jsx(IconLinkAdd, _objectSpread({}, IconProps))
        }))
      })
    }),
    'link-add-mini-menu': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.linkMiniMenu,
      anchorElement: refs.miniMenuElements.linkAdd,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('linkMiniMenu', false),
        include: [refs.miniMenuElements.linkAdd],
        children: /*#__PURE__*/_jsx(Input, {
          ref: refs.miniMenuElements.linkAddInput,
          name: l('Link'),
          labelButton: l('Add'),
          value: refs.inputValues.current.link,
          onChange: valueNew_4 => updateInputValues('link', valueNew_4),
          onClick: () => {
            if (refs.range.current) {
              const selection__6 = refs.rootWindow.current.getSelection();
              selection__6.removeAllRanges();
              selection__6.addRange(refs.range.current);
            }
            method('link-add')(refs.inputValues.current.link);
            updateOpen('linkMiniMenu', false);
            updateInputValues('link', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Link'),
        open: refs.open.current.linkMiniMenu ? false : undefined,
        children: is('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.miniMenuElements.linkAdd
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.linkMiniMenu,
          onClick: () => updateOpen('linkMiniMenu', !refs.open.current.linkMiniMenu),
          children: /*#__PURE__*/_jsx(IconLinkAdd, _objectSpread({}, IconProps))
        }))
      })
    }),
    'link-remove': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Remove Link'),
      children: is('function', render) ? render('link-remove', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        onClick: method('link-remove'),
        children: /*#__PURE__*/_jsx(IconLinkRemove, _objectSpread({}, IconProps))
      }))
    }),
    'quote': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.quote,
      anchorElement: refs.elements.quote.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('quote', false),
        include: [refs.elements.quote.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Quote'),
          labelButton: l('Add'),
          value: refs.inputValues.current.quote,
          onChange: valueNew_5 => updateInputValues('quote', valueNew_5),
          InputProps: {
            multiline: true
          },
          onClick: () => {
            if (refs.range.current) {
              const selection__7 = refs.rootWindow.current.getSelection();
              selection__7.removeAllRanges();
              selection__7.addRange(refs.range.current);
            }
            method('html')(`<blockquote>${refs.inputValues.current.quote}</blockquote>`);
            updateOpen('quote', false);
            updateInputValues('quote', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Quote'),
        open: refs.open.current.quote ? false : undefined,
        children: is('function', render) ? render('quote', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.quote
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.quote,
          onClick: () => updateOpen('quote', !refs.open.current.quote),
          children: /*#__PURE__*/_jsx(IconQuote, _objectSpread({}, IconProps))
        }))
      })
    }),
    'table': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.table,
      anchorElement: refs.elements.table.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('table', false),
        include: [refs.elements.table.current],
        children: /*#__PURE__*/_jsxs(Line, {
          gap: 1,
          tonal: tonal,
          color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
          Component: Surface,
          className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-palette'], classes.palette]),
          children: [/*#__PURE__*/_jsxs(Line, {
            gap: 1,
            direction: "row",
            align: "center",
            justify: "center",
            children: [/*#__PURE__*/_jsx(NumericTextField, {
              name: l('Rows'),
              tonal: tonal,
              color: color,
              size: "small",
              version: "outlined",
              increment: false,
              decrement: false,
              value: refs.inputValues.current.tableRows,
              onChange: valueNew_6 => updateInputValues('tableRows', valueNew_6)
            }), "\xD7", /*#__PURE__*/_jsx(NumericTextField, {
              name: l('Columns'),
              tonal: tonal,
              color: color,
              size: "small",
              version: "outlined",
              increment: false,
              decrement: false,
              value: refs.inputValues.current.tableColumns,
              onChange: valueNew_7 => updateInputValues('tableColumns', valueNew_7)
            })]
          }), /*#__PURE__*/_jsxs(Line, {
            gap: 1,
            direction: "row",
            align: "center",
            justify: "space-between",
            style: {
              width: '100%'
            },
            children: [/*#__PURE__*/_jsxs(Label, {
              size: "small",
              children: [/*#__PURE__*/_jsx(Switch, {
                tonal: tonal,
                color: props.color !== undefined ? props.color : 'default',
                checked: refs.inputValues.current.tableHeader,
                onChange: valueNew_8 => updateInputValues('tableHeader', valueNew_8)
              }), l('Header')]
            }), /*#__PURE__*/_jsx(Button, {
              tonal: tonal,
              color: "inherit",
              version: "text",
              size: "small",
              onClick: () => {
                if (refs.range.current) {
                  const selection__8 = refs.rootWindow.current.getSelection();
                  selection__8.removeAllRanges();
                  selection__8.addRange(refs.range.current);
                }
                let table = `<table>`;
                if (refs.inputValues.current.tableHeader && refs.inputValues.current.tableColumns > 0) {
                  table += `<thead><tr>${'<th></th>'.repeat(refs.inputValues.current.tableColumns)}</tr></thead>`;
                }
                if (refs.inputValues.current.tableRows > 0 && refs.inputValues.current.tableColumns > 0) {
                  table += `<tbody>`;
                  for (let i = 0; i < refs.inputValues.current.tableRows; i++) {
                    table += `<tr>${'<td></td>'.repeat(refs.inputValues.current.tableColumns)}</tr>`;
                  }
                  table += `</tbody>`;
                }
                table += `</table>`;
                method('html')(table);
                updateOpen('table', false);
                updateInputValues('tableRows', '');
                updateInputValues('tableColumns', '');
                updateInputValues('tableHeader', '');
              },
              children: l('Add')
            })]
          })]
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Table'),
        open: refs.open.current.table ? false : undefined,
        children: is('function', render) ? render('table', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.table
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.table,
          onClick: () => updateOpen('table', !refs.open.current.table),
          children: /*#__PURE__*/_jsx(IconTable, _objectSpread({}, IconProps))
        }))
      })
    }),
    'image': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.image,
      anchorElement: refs.elements.image.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('image', false),
        include: [refs.elements.image.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Image'),
          labelButton: l('Add'),
          value: refs.inputValues.current.image,
          onChange: valueNew_9 => updateInputValues('image', valueNew_9),
          onClick: () => {
            if (refs.range.current) {
              const selection__9 = refs.rootWindow.current.getSelection();
              selection__9.removeAllRanges();
              selection__9.addRange(refs.range.current);
            }
            method('image')(refs.inputValues.current.image);
            updateOpen('image', false);
            updateInputValues('image', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Image'),
        open: refs.open.current.image ? false : undefined,
        children: is('function', render) ? render('image', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.image
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.image,
          onClick: () => updateOpen('image', !refs.open.current.image),
          children: /*#__PURE__*/_jsx(IconImage, _objectSpread({}, IconProps))
        }))
      })
    }),
    'video': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.video,
      anchorElement: refs.elements.video.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('video', false),
        include: [refs.elements.video.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Video'),
          labelButton: l('Add'),
          value: refs.inputValues.current.video,
          onChange: valueNew_10 => updateInputValues('video', valueNew_10),
          onClick: () => {
            if (refs.range.current) {
              const selection__10 = refs.rootWindow.current.getSelection();
              selection__10.removeAllRanges();
              selection__10.addRange(refs.range.current);
            }
            method('html')(`<video controls><source src='${refs.inputValues.current.video}' /></video>`);
            updateOpen('video', false);
            updateInputValues('video', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Video'),
        open: refs.open.current.video ? false : undefined,
        children: is('function', render) ? render('video', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.video
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.video,
          onClick: () => updateOpen('video', !refs.open.current.video),
          children: /*#__PURE__*/_jsx(IconVideo, _objectSpread({}, IconProps))
        }))
      })
    }),
    'video-youtube': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.videoYoutube,
      anchorElement: refs.elements.videoYoutube.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('videoYoutube', false),
        include: [refs.elements.videoYoutube.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Youtube Video ID'),
          labelButton: l('Add'),
          value: refs.inputValues.current.videoYoutube,
          onChange: valueNew_11 => updateInputValues('videoYoutube', valueNew_11),
          onClick: () => {
            if (refs.range.current) {
              const selection__11 = refs.rootWindow.current.getSelection();
              selection__11.removeAllRanges();
              selection__11.addRange(refs.range.current);
            }
            method('html')(`<iframe width="560" height="315" src="https://www.youtube.com/embed/${refs.inputValues.current.videoYoutube}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>`);
            updateOpen('videoYoutube', false);
            updateInputValues('videoYoutube', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Youtube Video'),
        open: refs.open.current.videoYoutube ? false : undefined,
        children: is('function', render) ? render('videoYoutube', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.videoYoutube
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.videoYoutube,
          onClick: () => updateOpen('videoYoutube', !refs.open.current.videoYoutube),
          children: /*#__PURE__*/_jsx(IconVideoYoutube, _objectSpread({}, IconProps))
        }))
      })
    }),
    'drawing': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.drawing,
      anchorElement: refs.elements.drawing.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('drawing', false),
        include: [refs.elements.drawing, refs.elements.drawingSelect, refs.elements.drawingSelect.current, refs.elements.drawingPalette, refs.elements.drawingPalette.current, refs.elements.drawingSize, refs.elements.drawingSize.current],
        includeParentQueries: ['.onesy-Drawing-palette', '.onesy-Drawing-modal'],
        includeQueries: ['a[download]', 'svg', 'path'],
        children: /*#__PURE__*/_jsxs(Line, {
          gap: 2,
          tonal: tonal,
          color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
          Component: Surface,
          className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-palette'], classes.palette]),
          children: [/*#__PURE__*/_jsx(Drawing, _objectSpread({
            tonal: tonal,
            color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed',
            version: version,
            svgRef: refs.elements.drawingSvg,
            SizeProps: {
              ref: refs.elements.drawingSize
            },
            SelectProps: {
              MenuProps: _objectSpread({
                ListProps: {
                  ref: refs.elements.drawingSelect
                }
              }, SelectProps?.MenuProps)
            },
            PaletteProps: {
              ref: refs.elements.drawingPalette
            }
          }, DrawingProps)), /*#__PURE__*/_jsx(Line, {
            gap: 1,
            direction: "row",
            align: "center",
            justify: "flex-end",
            style: {
              width: '100%'
            },
            children: /*#__PURE__*/_jsx(Button, {
              tonal: tonal,
              color: "inherit",
              version: "text",
              size: "small",
              onClick: () => {
                if (refs.range.current) {
                  const selection__12 = refs.rootWindow.current.getSelection();
                  selection__12.removeAllRanges();
                  selection__12.addRange(refs.range.current);
                }

                // Get svg html element
                // clone it, remove circle
                // and add it as outer html
                // to the rich text editor
                const svg = refs.elements.drawingSvg.current;
                const svgClone = svg.cloneNode(true);

                // Clean up
                svgClone.style.width = refs.inputValues.current.drawingWidth;
                svgClone.style.height = refs.inputValues.current.drawingHeight;
                svgClone.style.boxShadow = 'none';
                const pointers = Array.from(svgClone.querySelectorAll('.onesy-Drawing-pointer'));
                pointers.forEach(pointer => pointer.remove());
                const valueNew_12 = svgClone.outerHTML;
                method('html')(valueNew_12);
                updateOpen('drawing', false);
              },
              children: l('Add')
            })
          })]
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Drawing'),
        open: refs.open.current.drawing ? false : undefined,
        children: is('function', render) ? render('drawing', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.drawing
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.drawing,
          onClick: () => updateOpen('drawing', !refs.open.current.drawing),
          children: /*#__PURE__*/_jsx(IconDrawing, _objectSpread({}, IconProps))
        }))
      })
    }),
    'code': /*#__PURE__*/_jsx(WrapperAppend, {
      open: refs.open.current.code,
      anchorElement: refs.elements.code.current,
      element: /*#__PURE__*/_jsx(ClickListener, {
        onClickOutside: () => updateOpen('code', false),
        include: [refs.elements.code.current],
        children: /*#__PURE__*/_jsx(Input, {
          name: l('Code'),
          labelButton: l('Add'),
          value: refs.inputValues.current.code,
          onChange: valueNew_13 => updateInputValues('code', valueNew_13),
          InputProps: {
            multiline: true
          },
          onClick: () => {
            if (refs.range.current) {
              const selection__13 = refs.rootWindow.current.getSelection();
              selection__13.removeAllRanges();
              selection__13.addRange(refs.range.current);
            }
            method('html')(`<pre><code>${refs.inputValues.current.code}</code></pre>`);
            updateOpen('code', false);
            updateInputValues('code', '');
          }
        })
      }),
      children: /*#__PURE__*/_jsx(WrapperToggleButton, {
        name: l('Insert Code'),
        open: refs.open.current.code ? false : undefined,
        children: is('function', render) ? render('code', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({
          ref: refs.elements.code
        }, ToggleButtonProps), {}, {
          selected: refs.open.current.code,
          onClick: () => updateOpen('code', !refs.open.current.code),
          children: /*#__PURE__*/_jsx(IconCode, _objectSpread({}, IconProps))
        }))
      })
    })
  };
  const actionElements = {
    'clear': /*#__PURE__*/_jsx(WrapperToggleButton, {
      name: l('Clear'),
      children: is('function', render) ? render('clear', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
        onClick: method('clear'),
        children: /*#__PURE__*/_jsx(IconClear, _objectSpread({}, IconProps))
      }))
    })
  };
  return /*#__PURE__*/_jsxs(Line, _objectSpread(_objectSpread({
    ref: item_32 => {
      if (ref) {
        if (is('function', ref)) ref(item_32);else ref.current = item_32;
      }
      refs.root.current = item_32;
    },
    gap: 0,
    Component: Component,
    className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-root'], className, classes.root])
  }, other), {}, {
    children: [(updates || actions_) && /*#__PURE__*/_jsxs(Line, _objectSpread(_objectSpread({
      tonal: tonal,
      color: color,
      version: version,
      gap: 0,
      direction: "column",
      align: "unset",
      justify: "unset",
      Component: Surface
    }, ToolbarProps), {}, {
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-toolbars'], ToolbarProps?.className, classes.toolbars]),
      children: [updates_ && /*#__PURE__*/_jsxs(Line, _objectSpread(_objectSpread({
        gap: 2,
        direction: "row",
        align: "center",
        justify: "flex-start",
        role: "toolbar",
        "aria-label": l('Updates')
      }, ToolbarUpdatesProps), {}, {
        className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-toolbar'], ToolbarUpdatesProps?.className, classes.toolbar, classes.toolbar_updates]),
        children: [includes('font-family', 'font-size', 'font-version') && /*#__PURE__*/_jsxs(Line, {
          gap: 1,
          direction: "row",
          align: "center",
          justify: "flex-start",
          children: [includes('font-version') && updateElements['font-version'], includes('font-family') && updateElements['font-family'], includes('font-size') && updateElements['font-size']]
        }), includes('italic', 'underlined', 'bold', 'strike-line') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('italic') && updateElements['italic'], includes('underline') && updateElements['underline'], includes('bold') && updateElements['bold'], includes('strike-line') && updateElements['strike-line']]
        })), includes('font-color', 'font-background') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('font-color') && updateElements['font-color'], includes('font-background') && updateElements['font-background']]
        })), includes('align-left', 'align-center', 'align-right', 'align-justify') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('align-left') && updateElements['align-left'], includes('align-center') && updateElements['align-center'], includes('align-right') && updateElements['align-right'], includes('align-justify') && updateElements['align-justify']]
        })), includes('indent', 'outdent') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('indent') && updateElements['indent'], includes('outdent') && updateElements['outdent']]
        })), includes('superscript', 'subscript') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('superscript') && updateElements['superscript'], includes('subscript') && updateElements['subscript']]
        })), includes('list-ordered', 'list-unordered') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('list-ordered') && updateElements['list-ordered'], includes('list-unordered') && updateElements['list-unordered']]
        })), includes('horizontal-rule') && /*#__PURE__*/_jsx(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: includes('horizontal-rule') && updateElements['horizontal-rule']
        })), includes('link-add', 'link-remove') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('link-add') && updateElements['link-add'], includes('link-remove') && updateElements['link-remove']]
        })), includes('quote', 'image', 'video', 'video-youtube', 'table', 'drawing', 'code') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
          children: [includes('quote') && updateElements['quote'], includes('table') && updateElements['table'], includes('image') && updateElements['image'], includes('video') && updateElements['video'], includes('video-youtube') && updateElements['video-youtube'], includes('drawing') && updateElements['drawing'], includes('code') && updateElements['code']]
        }))]
      })), updates_ && actions_ && /*#__PURE__*/_jsx(Divider, _objectSpread(_objectSpread({}, DividerProps), {}, {
        className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-divider'], DividerProps?.className, classes.divider, classes.divider_middle])
      })), actions_ && /*#__PURE__*/_jsx(Line, _objectSpread(_objectSpread({
        gap: 2,
        direction: "row",
        align: "center",
        justify: "flex-start",
        role: "toolbar",
        "aria-label": l('Actions')
      }, ToolbarActionsProps), {}, {
        className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-toolbar'], ToolbarActionsProps?.className, classes.toolbar, classes.toolbar_actions]),
        children: /*#__PURE__*/_jsxs(Line, {
          direction: "row",
          align: "center",
          justify: "space-between",
          style: {
            width: '100%'
          },
          children: [/*#__PURE__*/_jsx(Line, {
            gap: 2,
            direction: "row",
            align: "center",
            justify: "flex-start",
            children: includes('copy', 'cut', 'paste', 'delete') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
              children: [includes('copy') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Copy'),
                children: is('function', render) ? render('copy', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('copy'),
                  children: /*#__PURE__*/_jsx(IconCopy, _objectSpread({}, IconProps))
                }))
              }), includes('cut') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Cut'),
                children: is('function', render) ? render('cut', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('cut'),
                  children: /*#__PURE__*/_jsx(IconCut, _objectSpread({}, IconProps))
                }))
              }), includes('paste') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Paste'),
                children: is('function', render) ? render('paste', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('paste'),
                  children: /*#__PURE__*/_jsx(IconPaste, _objectSpread({}, IconProps))
                }))
              }), includes('delete') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Delete'),
                children: is('function', render) ? render('delete', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('delete'),
                  children: /*#__PURE__*/_jsx(IconDelete, _objectSpread({}, IconProps))
                }))
              })]
            }))
          }), /*#__PURE__*/_jsxs(Line, {
            gap: 2,
            direction: "row",
            align: "center",
            justify: "flex-start",
            children: [includes('clear', 'select-all') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
              children: [includes('clear') && actionElements['clear'], includes('select-all') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Select All'),
                children: is('function', render) ? render('select-all', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('select-all'),
                  children: /*#__PURE__*/_jsx(IconSelectAll, _objectSpread({}, IconProps))
                }))
              })]
            })), includes('undo', 'redo') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
              children: [includes('undo') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Undo'),
                children: is('function', render) ? render('undo', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('undo'),
                  children: /*#__PURE__*/_jsx(IconUndo, _objectSpread({}, IconProps))
                }))
              }), includes('redo') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Redo'),
                children: is('function', render) ? render('redo', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: method('redo'),
                  children: /*#__PURE__*/_jsx(IconRedo, _objectSpread({}, IconProps))
                }))
              })]
            })), includes('save', 'print') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
              children: [includes('save') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Save'),
                children: is('function', render) ? render('save', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: () => save(refs.value.current),
                  children: /*#__PURE__*/_jsx(IconSave, _objectSpread({}, IconProps))
                }))
              }), includes('print') && /*#__PURE__*/_jsx(WrapperToggleButton, {
                name: l('Print'),
                children: is('function', render) ? render('print', ToggleButtonProps, refs.value.current, method) : /*#__PURE__*/_jsx(ToggleButton, _objectSpread(_objectSpread({}, ToggleButtonProps), {}, {
                  onClick: () => print(refs.value.current),
                  children: /*#__PURE__*/_jsx(IconPrint, _objectSpread({}, IconProps))
                }))
              })]
            }))]
          })]
        })
      })), /*#__PURE__*/_jsx(Divider, _objectSpread(_objectSpread({}, DividerProps), {}, {
        className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-divider'], DividerProps?.className, classes.divider, classes.divider_end])
      }))]
    })), miniMenu && !!refs.miniMenuInclude.current.length && /*#__PURE__*/_jsx(Append, _objectSpread({
      open: selection,
      element: ({
        ref: ref__1,
        values: values_26,
        style
      }) => /*#__PURE__*/_jsx("div", {
        ref: item_33 => {
          if (ref__1) {
            if (is('function', ref__1)) ref__1(item_33);else ref__1.current = item_33;
            refs.miniMenu.current = item_33;
          }
        },
        style: _objectSpread(_objectSpread({}, values_26?.x === 0 && values_26?.y === 0 ? {
          visibility: 'hidden'
        } : undefined), style),
        children: /*#__PURE__*/_jsx(Fade, {
          in: !!selection,
          add: true,
          children: /*#__PURE__*/_jsx(ClickListener, {
            onClickOutside: () => {
              setSelection('');
            },
            include: [refs.miniMenu, refs.miniMenu.current, refs.miniMenuElements.colorPalette, refs.miniMenuElements.colorPalette.current, refs.miniMenuElements.backgroundPalette, refs.miniMenuElements.backgroundPalette.current, refs.miniMenuElements.linkAddInput, refs.miniMenuElements.linkAddInput.current],
            children: /*#__PURE__*/_jsxs(Line, _objectSpread(_objectSpread({
              gap: 2,
              direction: "row",
              align: "center",
              justify: "flex-start",
              role: "toolbar",
              "aria-label": l('Mini menu'),
              Component: Surface
            }, MiniMenuProps), {}, {
              className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-mini-menu'], MiniMenuProps?.className, classes.miniMenu]),
              children: [includesMinMenu('italic', 'underlined', 'bold', 'strike-line') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
                children: [includesMinMenu('italic') && updateElements['italic'], includesMinMenu('underline') && updateElements['underline'], includesMinMenu('bold') && updateElements['bold'], includesMinMenu('strike-line') && updateElements['strike-line']]
              })), includesMinMenu('font-color', 'font-background') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
                children: [includesMinMenu('font-color') && updateElements['font-color-mini-menu'], includesMinMenu('font-background') && updateElements['font-background-mini-menu']]
              })), includesMinMenu('align-left', 'align-center', 'align-right', 'align-justify') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
                children: [includesMinMenu('align-left') && updateElements['align-left'], includesMinMenu('align-center') && updateElements['align-center'], includesMinMenu('align-right') && updateElements['align-right'], includesMinMenu('align-justify') && updateElements['align-justify']]
              })), includesMinMenu('link-add', 'link-remove') && /*#__PURE__*/_jsxs(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
                children: [includesMinMenu('link-add') && updateElements['link-add-mini-menu'], includesMinMenu('link-remove') && updateElements['link-remove']]
              })), includesMinMenu('clear') && /*#__PURE__*/_jsx(ToggleButtons, _objectSpread(_objectSpread({}, ToggleButtonsProps), {}, {
                children: includesMinMenu('clear') && actionElements['clear']
              }))]
            }))
          })
        })
      }),
      anchor: selection,
      portal: true,
      alignment: "center",
      position: "bottom",
      clearOnClose: true
    }, AppendProps)), /*#__PURE__*/_jsx(Surface, {
      ref: refs.value,
      color: "default",
      onMouseUp: onMouseUpValue,
      onMouseDown: onMouseDownValue,
      onInput: onUpdate,
      contentEditable: true,
      className: classNames([staticClassName('RichTextEditor', theme) && ['onesy-RichTextEditor-value'], classes.value])
    })]
  }));
};
RichTextEditor.displayName = 'onesy-RichTextEditor';
export default RichTextEditor;