UNPKG

@onesy/ui-react

Version:
999 lines 101 kB
"use strict";
var __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jsx_runtime_1 = require("react/jsx-runtime");
const react_1 = __importDefault(require("react"));
const utils_1 = require("@onesy/utils");
const style_react_1 = require("@onesy/style-react");
const IconMaterialFormatItalicW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatItalicW100"));
const IconMaterialFormatUnderlinedW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatUnderlinedW100"));
const IconMaterialFormatBoldW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatBoldW100"));
const IconMaterialContentCopyW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialContentCopyW100"));
const IconMaterialContentCutW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialContentCutW100"));
const IconMaterialContentPasteW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialContentPasteW100"));
const IconMaterialFormatAlignLeftW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatAlignLeftW100"));
const IconMaterialFormatAlignCenterW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatAlignCenterW100"));
const IconMaterialFormatAlignRightW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatAlignRightW100"));
const IconMaterialFormatAlignJustifyW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatAlignJustifyW100"));
const IconMaterialStrikethroughSW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialStrikethroughSW100"));
const IconMaterialUndoW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialUndoW100"));
const IconMaterialRedoW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialRedoW100"));
const IconMaterialFormatClearW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatClearW100"));
const IconMaterialSuperscriptW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialSuperscriptW100"));
const IconMaterialSubscriptW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialSubscriptW100"));
const IconMaterialFormatIndentIncreaseW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatIndentIncreaseW100"));
const IconMaterialFormatIndentDecreaseW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatIndentDecreaseW100"));
const IconMaterialFormatListNumberedW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatListNumberedW100"));
const IconMaterialFormatListBulletedW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatListBulletedW100"));
const IconMaterialHorizontalRuleW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialHorizontalRuleW100"));
const IconMaterialFormatColorTextW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatColorTextW100"));
const IconMaterialFormatColorFillW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatColorFillW100"));
const IconMaterialAddLinkW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialAddLinkW100"));
const IconMaterialLinkOffW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialLinkOffW100"));
const IconMaterialImageW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialImageW100"));
const IconMaterialFormatQuoteW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialFormatQuoteW100"));
const IconMaterialVideocamW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialVideocamW100"));
const IconMaterialPlayArrowW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialPlayArrowW100"));
const IconMaterialCodeW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialCodeW100"));
const IconMaterialDeleteSweepW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialDeleteSweepW100"));
const IconMaterialSelectAllW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialSelectAllW100"));
const IconMaterialPrintW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialPrintW100"));
const IconMaterialDownloadW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialDownloadW100"));
const IconMaterialTableW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialTableW100"));
const IconMaterialDrawW100_1 = __importDefault(require("@onesy/icons-material-rounded-react/IconMaterialDrawW100"));
const Type_1 = __importDefault(require("../Type"));
const Tooltip_1 = __importDefault(require("../Tooltip"));
const Fade_1 = __importDefault(require("../Fade"));
const Append_1 = __importDefault(require("../Append"));
const Select_1 = __importDefault(require("../Select"));
const Switch_1 = __importDefault(require("../Switch"));
const Label_1 = __importDefault(require("../Label"));
const NumericTextField_1 = __importDefault(require("../NumericTextField"));
const ColorTextField_1 = __importDefault(require("../ColorTextField"));
const ToggleButtons_1 = __importDefault(require("../ToggleButtons"));
const ToggleButton_1 = __importDefault(require("../ToggleButton"));
const Drawing_1 = __importDefault(require("../Drawing"));
const Divider_1 = __importDefault(require("../Divider"));
const ClickListener_1 = __importDefault(require("../ClickListener"));
const TextField_1 = __importDefault(require("../TextField"));
const Button_1 = __importDefault(require("../Button"));
const Surface_1 = __importDefault(require("../Surface"));
const ListItem_1 = __importDefault(require("../ListItem"));
const Line_1 = __importDefault(require("../Line"));
const utils_2 = require("../utils");
const useStyle = (0, style_react_1.style)(theme => ({
    root: {
        width: '100%'
    },
    value: {
        padding: theme.methods.space.value(2, 'px'),
        whiteSpace: 'break-spaces',
        '& p': Object.assign({}, theme.typography.values.b2),
        '& h1': Object.assign({}, theme.typography.values.h1),
        '& h2': Object.assign({}, theme.typography.values.h2),
        '& h3': Object.assign({}, theme.typography.values.h3),
        '& h4': Object.assign({}, theme.typography.values.t1),
        '& h5': Object.assign({}, 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': Object.assign(Object.assign({}, 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': {
            '& > *': Object.assign(Object.assign({}, 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 = react_1.default.forwardRef((props__, ref) => {
    var _a;
    const theme = (0, style_react_1.useOnesyTheme)();
    const l = theme.l;
    const props = react_1.default.useMemo(() => { var _a, _b, _c, _d, _e, _f, _g, _h; return (Object.assign(Object.assign(Object.assign({}, (_d = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.all) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.default), (_h = (_g = (_f = (_e = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _e === void 0 ? void 0 : _e.elements) === null || _f === void 0 ? void 0 : _f.onesyRichTextEditor) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.default), props__)); }, [props__]);
    const Line = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Line) || Line_1.default; }, [theme]);
    const Type = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Type) || Type_1.default; }, [theme]);
    const Tooltip = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Tooltip) || Tooltip_1.default; }, [theme]);
    const Fade = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Fade) || Fade_1.default; }, [theme]);
    const Append = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Append) || Append_1.default; }, [theme]);
    const Select = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Select) || Select_1.default; }, [theme]);
    const Switch = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Switch) || Switch_1.default; }, [theme]);
    const Label = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Label) || Label_1.default; }, [theme]);
    const NumericTextField = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.NumericTextField) || NumericTextField_1.default; }, [theme]);
    const ColorTextField = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ColorTextField) || ColorTextField_1.default; }, [theme]);
    const ToggleButton = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ToggleButton) || ToggleButton_1.default; }, [theme]);
    const ToggleButtons = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ToggleButtons) || ToggleButtons_1.default; }, [theme]);
    const Drawing = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Drawing) || Drawing_1.default; }, [theme]);
    const Divider = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Divider) || Divider_1.default; }, [theme]);
    const ClickListener = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ClickListener) || ClickListener_1.default; }, [theme]);
    const TextField = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.TextField) || TextField_1.default; }, [theme]);
    const Surface = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Surface) || Surface_1.default; }, [theme]);
    const Button = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Button) || Button_1.default; }, [theme]);
    const ListItem = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ListItem) || ListItem_1.default; }, [theme]);
    const { 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 = IconMaterialFormatItalicW100_1.default, IconUnderline = IconMaterialFormatUnderlinedW100_1.default, IconBold = IconMaterialFormatBoldW100_1.default, IconStrikeLine = IconMaterialStrikethroughSW100_1.default, IconColor = IconMaterialFormatColorTextW100_1.default, IconBackground = IconMaterialFormatColorFillW100_1.default, IconAlignLeft = IconMaterialFormatAlignLeftW100_1.default, IconAlignCenter = IconMaterialFormatAlignCenterW100_1.default, IconAlignRight = IconMaterialFormatAlignRightW100_1.default, IconAlignJustify = IconMaterialFormatAlignJustifyW100_1.default, IconIndent = IconMaterialFormatIndentIncreaseW100_1.default, IconOutdent = IconMaterialFormatIndentDecreaseW100_1.default, IconSuperscript = IconMaterialSuperscriptW100_1.default, IconSubscript = IconMaterialSubscriptW100_1.default, IconListOrdered = IconMaterialFormatListNumberedW100_1.default, IconListUnordered = IconMaterialFormatListBulletedW100_1.default, IconHorizontalRule = IconMaterialHorizontalRuleW100_1.default, IconLinkAdd = IconMaterialAddLinkW100_1.default, IconLinkRemove = IconMaterialLinkOffW100_1.default, IconQuote = IconMaterialFormatQuoteW100_1.default, IconImage = IconMaterialImageW100_1.default, IconVideo = IconMaterialVideocamW100_1.default, IconVideoYoutube = IconMaterialPlayArrowW100_1.default, IconTable = IconMaterialTableW100_1.default, IconCode = IconMaterialCodeW100_1.default, IconDrawing = IconMaterialDrawW100_1.default, 
    // Action
    IconCopy = IconMaterialContentCopyW100_1.default, IconCut = IconMaterialContentCutW100_1.default, IconPaste = IconMaterialContentPasteW100_1.default, IconDelete = IconMaterialDeleteSweepW100_1.default, IconClear = IconMaterialFormatClearW100_1.default, IconSelectAll = IconMaterialSelectAllW100_1.default, IconSave = IconMaterialDownloadW100_1.default, IconPrint = IconMaterialPrintW100_1.default, IconUndo = IconMaterialUndoW100_1.default, IconRedo = IconMaterialRedoW100_1.default, 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 = __rest(props, ["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"]);
    const { classes } = useStyle();
    const [inputValues, setInputValues] = react_1.default.useState({});
    const [open, setOpen] = react_1.default.useState({});
    const [selected, setSelected] = react_1.default.useState([]);
    const [selection, setSelection] = react_1.default.useState();
    const refs = {
        root: react_1.default.useRef(null),
        value: react_1.default.useRef(null),
        range: react_1.default.useRef(null),
        inputValues: react_1.default.useRef(null),
        open: react_1.default.useRef(null),
        props: react_1.default.useRef(null),
        selected: react_1.default.useRef(null),
        miniMenu: react_1.default.useRef(null),
        miniMenuInclude: react_1.default.useRef(null),
        miniMenuElements: {
            color: react_1.default.useRef(null),
            colorPalette: react_1.default.useRef(null),
            background: react_1.default.useRef(null),
            backgroundPalette: react_1.default.useRef(null),
            linkAdd: react_1.default.useRef(null),
            linkAddInput: react_1.default.useRef(null),
            linkRemove: react_1.default.useRef(null)
        },
        elements: {
            color: react_1.default.useRef(null),
            background: react_1.default.useRef(null),
            linkAdd: react_1.default.useRef(null),
            linkRemove: react_1.default.useRef(null),
            quote: react_1.default.useRef(null),
            image: react_1.default.useRef(null),
            video: react_1.default.useRef(null),
            videoYoutube: react_1.default.useRef(null),
            table: react_1.default.useRef(null),
            drawing: react_1.default.useRef(null),
            drawingSvg: react_1.default.useRef(null),
            drawingSize: react_1.default.useRef(null),
            drawingSelect: react_1.default.useRef(null),
            drawingPalette: react_1.default.useRef(null),
            code: react_1.default.useRef(null)
        },
        rootDocument: react_1.default.useRef(null),
        rootWindow: react_1.default.useRef(null)
    };
    refs.inputValues.current = inputValues;
    refs.open.current = open;
    refs.props.current = props;
    refs.selected.current = selected;
    refs.miniMenuInclude.current = miniMenuInclude;
    const rootDocument = (0, utils_1.isEnvironment)('browser') && (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document);
    const rootWindow = rootDocument && (rootDocument.defaultView || window);
    refs.rootDocument.current = rootDocument;
    refs.rootWindow.current = rootWindow;
    react_1.default.useEffect(() => {
        // Add value as innerHTML
        refs.value.current.innerHTML = value;
    }, [value]);
    react_1.default.useEffect(() => {
        var _a, _b;
        const selection_ = refs.rootWindow.current.getSelection();
        if (selection_ &&
            selection_.anchorNode &&
            !((_b = (_a = selection_.anchorNode) === null || _a === void 0 ? void 0 : _a.className) === null || _b === void 0 ? void 0 : _b.includes('TextField')))
            refs.range.current = selection_.getRangeAt(0);
    }, [open]);
    react_1.default.useEffect(() => {
        if (!selection) {
            updateOpen('colorMiniMenu', false);
            updateOpen('backgroundMiniMenu', false);
            updateOpen('linkMiniMenu', false);
        }
    }, [selection]);
    const query = (command) => {
        return (0, utils_1.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, index) => {
            ((item.tagName === 'SPAN' && !item.innerHTML) ||
                (item.tagName === 'BR' && index > 0 && (children_[index - 1].tagName === 'SPAN' && !children_[index - 1].innerHTML))) ? toRemove.push(item) : other_.push(item);
        });
        toRemove.forEach((item) => item.remove());
        other_.forEach(item => clear(item));
    };
    const onUpdate = (event) => {
        // Clear from empty element values
        clear();
        if ((0, utils_1.is)('function', onChange))
            onChange(event);
    };
    const updateInputValues = (property, itemValue) => {
        setInputValues(values => (Object.assign(Object.assign({}, values), { [property]: itemValue })));
    };
    const updateOpen = (property, itemValue) => {
        setOpen(values => (Object.assign(Object.assign({}, values), { [property]: itemValue })));
    };
    const paste = async () => {
        const value_ = await navigator.clipboard.read();
        if (value_) {
            let values = '';
            for (const item of Array.from(value_)) {
                const valueItem = await item.getType('text/html');
                values += await valueItem.text();
            }
            refs.rootDocument.current.execCommand('insertHTML', undefined, values);
        }
    };
    const method = react_1.default.useCallback((command) => (argument) => {
        switch (command) {
            // updates
            case 'italic':
                refs.rootDocument.current.execCommand('italic');
                if (query('italic'))
                    setSelected(values => [...values, 'italic']);
                else
                    setSelected(values => values.filter(item => item !== 'italic'));
                break;
            case 'underline':
                refs.rootDocument.current.execCommand('underline');
                if (query('underline'))
                    setSelected(values => [...values, 'underline']);
                else
                    setSelected(values => values.filter(item => item !== 'underline'));
                break;
            case 'bold':
                refs.rootDocument.current.execCommand('bold');
                if (query('bold'))
                    setSelected(values => [...values, 'bold']);
                else
                    setSelected(values => values.filter(item => item !== 'bold'));
                break;
            case 'strike-line':
                refs.rootDocument.current.execCommand('strikeThrough');
                if (query('strikeThrough'))
                    setSelected(values => [...values, 'strike-line']);
                else
                    setSelected(values => values.filter(item => item !== 'strike-line'));
                break;
            case 'align-left':
                refs.rootDocument.current.execCommand('justifyLeft');
                if (query('justifyLeft'))
                    setSelected(values => [...values.filter(item => !item.includes('align')), 'align-left']);
                else
                    setSelected(values => values.filter(item => item !== 'align-left'));
                break;
            case 'align-center':
                refs.rootDocument.current.execCommand('justifyCenter');
                if (query('justifyCenter'))
                    setSelected(values => [...values.filter(item => !item.includes('align')), 'align-center']);
                else
                    setSelected(values => values.filter(item => item !== 'align-center'));
                break;
            case 'align-right':
                refs.rootDocument.current.execCommand('justifyRight');
                if (query('justifyRight'))
                    setSelected(values => [...values.filter(item => !item.includes('align')), 'align-right']);
                else
                    setSelected(values => values.filter(item => item !== 'align-right'));
                break;
            case 'align-justify':
                refs.rootDocument.current.execCommand('justifyFull');
                if (query('justifyFull'))
                    setSelected(values => [...values.filter(item => !item.includes('align')), 'align-justify']);
                else
                    setSelected(values => values.filter(item => item !== 'align-justify'));
                break;
            case 'superscript':
                refs.rootDocument.current.execCommand('superscript');
                if (query('superscript'))
                    setSelected(values => [...values, 'superscript']);
                else
                    setSelected(values => values.filter(item => item !== 'superscript'));
                break;
            case 'subscript':
                refs.rootDocument.current.execCommand('subscript');
                if (query('subscript'))
                    setSelected(values => [...values, 'subscript']);
                else
                    setSelected(values => values.filter(item => item !== '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 => [...values.filter(item => !item.includes('list')), 'list-ordered']);
                else
                    setSelected(values => values.filter(item => item !== 'list-ordered'));
                break;
            case 'list-unordered':
                refs.rootDocument.current.execCommand('insertUnorderedList');
                if (query('insertUnorderedList'))
                    setSelected(values => [...values.filter(item => !item.includes('list')), 'list-unordered']);
                else
                    setSelected(values => values.filter(item => item !== '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, utils_1.is)('array', exclude) || args.some(item => !exclude.includes(item));
    // 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 && (!(0, utils_1.is)('array', exclude) || includes(...updateOptions));
    // copy, paste, cut
    // action toolbar
    const actions_ = actions && (!(0, utils_1.is)('array', exclude) || includes('copy', 'paste', 'cut', 'clear', 'undo', 'redo', 'delete', 'select-all', 'save', 'print'));
    const AppendProps = Object.assign({ padding: [14, 14] }, AppendProps_);
    const DividerProps = Object.assign({ color: 'inherit' }, DividerProps_);
    const TooltipProps = Object.assign({ position: 'bottom', interactive: false }, TooltipProps_);
    const ToggleButtonsProps = Object.assign({ tonal,
        color, version: 'text', border: false }, ToggleButtonsProps_);
    const ToggleButtonProps = Object.assign({ size: 'small' }, ToggleButtonProps_);
    const MiniMenuProps = Object.assign({ tonal, color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed' }, MiniMenuProps_);
    const SelectProps = Object.assign({ 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 = Object.assign({ size: 'small', PrimaryProps: {
            style: {
                fontFamily: 'inherit'
            }
        } }, ListItemProps_);
    const IconProps = Object.assign({ size: 'small' }, IconProps_);
    const WrapperToggleButton = react_1.default.useCallback(react_1.default.forwardRef((props_, ref_) => {
        const { open: open_, name, children: children_ } = props_, other_ = __rest(props_, ["open", "name", "children"]);
        return ((0, jsx_runtime_1.jsx)(Tooltip, Object.assign({ open: open_ !== undefined ? open_ : undefined, name: name }, TooltipProps, { children: react_1.default.cloneElement(children_, Object.assign(Object.assign({}, other_), children_.props)) })));
    }), []);
    const WrapperAppend = react_1.default.useCallback((props_) => {
        const { open: open_, element, anchorElement, onClose, children: children_ } = props_, other_ = __rest(props_, ["open", "element", "anchorElement", "onClose", "children"]);
        return ((0, jsx_runtime_1.jsx)(Append, Object.assign({ open: open_, element: ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Fade, Object.assign({ in: open_, add: true }, { children: react_1.default.cloneElement(element) })) })), anchorElement: anchorElement, portal: true, alignment: 'center', position: 'bottom' }, AppendProps, { children: react_1.default.cloneElement(children_, Object.assign(Object.assign({}, other_), children_.props)) })));
    }, []);
    const onMouseDown = react_1.default.useCallback(() => {
        var _a, _b;
        const selection_ = refs.rootWindow.current.getSelection();
        if (selection_.anchorNode &&
            !((_b = (_a = selection_.anchorNode) === null || _a === void 0 ? void 0 : _a.className) === null || _b === void 0 ? void 0 : _b.includes('TextField')))
            refs.range.current = selection_.getRangeAt(0);
    }, []);
    const onMouseUp = react_1.default.useCallback(() => {
        if (refs.range.current) {
            const selection_ = refs.rootWindow.current.getSelection();
            selection_.removeAllRanges();
            selection_.addRange(refs.range.current);
        }
    }, []);
    const PaletteItem = react_1.default.useCallback((props_) => {
        const { color: color_ } = props_, other_ = __rest(props_, ["color"]);
        return ((0, jsx_runtime_1.jsx)("span", Object.assign({ className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-palette-item'
                ],
                classes.paletteItem
            ]), style: {
                background: color_
            } }, other_)));
    }, []);
    const Palette = react_1.default.useCallback(react_1.default.forwardRef((props_, ref_) => {
        const { version: version_, onUpdate: onUpdate_, onClose } = props_, other_ = __rest(props_, ["version", "onUpdate", "onClose"]);
        return ((0, jsx_runtime_1.jsxs)(Line, Object.assign({ ref: ref_, gap: 1, direction: 'column', tonal: tonal, color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed', Component: Surface, className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-palette'
                ],
                classes.palette
            ]) }, other_, { children: [(0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, onMouseUp: onMouseUp, onMouseDown: onMouseDown }, { children: [(0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, direction: 'row', style: {
                                width: '100%'
                            } }, { children: [(0, jsx_runtime_1.jsx)(PaletteItem, { color: '#000000', onClick: () => {
                                        onUpdate_('#000000');
                                        onClose();
                                    } }), (0, jsx_runtime_1.jsx)(PaletteItem, { color: '#ffffff', onClick: () => {
                                        onUpdate_('#ffffff');
                                        onClose();
                                    } })] })), Object.keys(style_react_1.colors).filter(item => !['black', 'white'].includes(item)).map((item, index) => ((0, jsx_runtime_1.jsx)(Line, Object.assign({ gap: 0.5, direction: 'row', style: {
                                width: '100%'
                            } }, { children: Object.keys(style_react_1.colors[item]).map((item_, index_) => ((0, jsx_runtime_1.jsx)(PaletteItem, { color: style_react_1.colors[item][item_], onClick: () => {
                                    if (refs.range.current) {
                                        const selection_ = refs.rootWindow.current.getSelection();
                                        selection_.removeAllRanges();
                                        selection_.addRange(refs.range.current);
                                    }
                                    onUpdate_(style_react_1.colors[item][item_]);
                                    onClose();
                                } }, index_))) }), index)))] })), (0, jsx_runtime_1.jsx)(Divider, {}), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, direction: 'row', align: 'center', style: {
                        width: '100%'
                    } }, { children: [(0, jsx_runtime_1.jsx)(ColorTextField, Object.assign({ tonal: tonal, color: color, name: l('Custom color'), version: 'outlined', size: 'small', value: refs.inputValues.current[version_], onChange: valueNew => updateInputValues(version_, valueNew) }, ColorTextFieldProps, { className: (0, style_react_1.classNames)([
                                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                    'onesy-RichTextEditor-text-field-color'
                                ],
                                ColorTextFieldProps === null || ColorTextFieldProps === void 0 ? void 0 : ColorTextFieldProps.className,
                                classes.textFieldColor
                            ]) })), (0, jsx_runtime_1.jsx)(Button, Object.assign({ tonal: tonal, color: 'inherit', version: 'text', size: 'small', onClick: () => {
                                if (refs.range.current) {
                                    const selection_ = refs.rootWindow.current.getSelection();
                                    selection_.removeAllRanges();
                                    selection_.addRange(refs.range.current);
                                }
                                onUpdate_(refs.inputValues.current[version_]);
                                onClose();
                            } }, { children: "Apply" }))] }))] })));
    }), []);
    const Input = react_1.default.useCallback(react_1.default.forwardRef((props_, ref_) => {
        const { label, labelButton, value: value__, onChange: onChange__, onClick, InputComponent = TextField, InputProps } = props_, other_ = __rest(props_, ["label", "labelButton", "value", "onChange", "onClick", "InputComponent", "InputProps"]);
        return ((0, jsx_runtime_1.jsx)(Line, Object.assign({ ref: ref_, gap: 1, direction: 'column', tonal: tonal, color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed', Component: Surface, className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-palette'
                ],
                classes.palette
            ]) }, other_, { children: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 0.5, direction: 'row', align: 'center', style: {
                    width: '100%'
                } }, { children: [(0, jsx_runtime_1.jsx)(InputComponent, Object.assign({ tonal: tonal, color: color, name: label, version: 'outlined', size: 'small', value: value__, onChange: onChange__, className: (0, style_react_1.classNames)([
                            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                'onesy-RichTextEditor-text-field-color'
                            ],
                            classes.textFieldColor
                        ]) }, InputProps)), (0, jsx_runtime_1.jsx)(Button, Object.assign({ 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: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'b2' }, { children: l('Normal text') })), value: 'p' },
        { label: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'h1' }, { children: l('Heading 1') })), value: 'h1' },
        { label: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'h2' }, { children: l('Heading 2') })), value: 'h2' },
        { label: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 'h3' }, { children: l('Heading 3') })), value: 'h3' },
        { label: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 't1' }, { children: l('Heading 4') })), value: 'h4' },
        { label: (0, jsx_runtime_1.jsx)(Type, Object.assign({ version: 't2' }, { children: l('Heading 5') })), value: 'h5' }
    ];
    const queryValueUpdate = () => {
        const selected_ = [];
        const inputValues_ = Object.assign({}, 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 => {
            if (query(item.command))
                selected_.push(item.name);
        });
        // Font version
        const fontVersion = query('formatBlock');
        const fontVersionValue = font_versions.find(item_ => item_.value === fontVersion) || font_versions[0];
        inputValues_['font-version'] = fontVersionValue === null || fontVersionValue === void 0 ? void 0 : fontVersionValue.value;
        // Font family
        const fontFamily = query('fontName');
        const fontFamilyValue = font_families.find(item_ => fontFamily === null || fontFamily === void 0 ? void 0 : fontFamily.includes(item_.label)) || font_families.find(item_ => item_.label === 'DM Sans');
        inputValues_['font-family'] = fontFamilyValue === null || fontFamilyValue === void 0 ? void 0 : fontFamilyValue.value;
        // Font version
        const fontSize = query('fontSize');
        const fontSizeValue = font_sizes.find(item_ => item_.value === fontSize) || font_sizes.find(item_ => item_.label === '14');
        inputValues_['font-size'] = fontSizeValue === null || fontSizeValue === void 0 ? void 0 : fontSizeValue.value;
        setInputValues(inputValues_);
        setSelected(selected_);
    };
    const onMouseUpValue = react_1.default.useCallback(() => {
        queryValueUpdate();
        setTimeout(() => {
            const selection_ = refs.rootWindow.current.getSelection();
            if (!selection_.anchorNode || !refs.value.current.contains(selection_.anchorNode))
                return setSelection('');
            const rect = selection_.getRangeAt(0).getBoundingClientRect();
            setSelection(Math.round(rect.width) ? rect : '');
        });
    }, []);
    const onMouseDownValue = react_1.default.useCallback(() => {
        queryValueUpdate();
    }, []);
    const updateElements = {
        'font-version': ((0, jsx_runtime_1.jsx)(Select, Object.assign({ name: l('Font Version'), valueDefault: font_versions.find(item => item.value.includes('p')).value, value: inputValues['font-version'], onChange: (valueNew) => {
                updateInputValues('font-version', valueNew);
                method('font-version')(valueNew);
            }, onMouseUp: onMouseUp, onMouseDown: onMouseDown }, SelectProps, { className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-select'
                ],
                SelectProps === null || SelectProps === void 0 ? void 0 : SelectProps.className,
                classes.select
            ]), style: {
                minWidth: '150px'
            } }, { children: font_versions.map(item => ((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: item.label, value: item.value, button: true }, ListItemProps), item.value))) }))),
        'font-family': ((0, jsx_runtime_1.jsx)(Select, Object.assign({ name: l('Font Family'), valueDefault: font_families.find(item => item.label.includes('DM Sans')).value, value: inputValues['font-family'], onChange: (valueNew) => {
                updateInputValues('font-family', valueNew);
                method('font-family')(valueNew);
            }, onMouseUp: onMouseUp, onMouseDown: onMouseDown }, SelectProps, { className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-select'
                ],
                SelectProps === null || SelectProps === void 0 ? void 0 : SelectProps.className,
                classes.select
            ]), style: {
                minWidth: '140px'
            } }, { children: font_families.map(item => ((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: item.label, value: item.value, button: true, style: {
                    fontFamily: item.value
                } }, ListItemProps), item.value))) }))),
        'font-size': ((0, jsx_runtime_1.jsx)(Select, Object.assign({ name: l('Font Size'), valueDefault: +font_sizes.find(item => item.label.includes('14')).value, value: inputValues['font-size'], onChange: (valueNew) => {
                updateInputValues('font-size', +valueNew);
                method('font-size')(+valueNew);
            }, onMouseUp: onMouseUp, onMouseDown: onMouseDown }, SelectProps, { className: (0, style_react_1.classNames)([
                (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                    'onesy-RichTextEditor-select'
                ],
                SelectProps === null || SelectProps === void 0 ? void 0 : SelectProps.className,
                classes.select
            ]) }, { children: font_sizes.map(item => ((0, jsx_runtime_1.jsx)(ListItem, Object.assign({ primary: item.label, value: item.value, button: true }, ListItemProps), item.value))) }))),
        'italic': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Italic') }, { children: (0, utils_1.is)('function', render) ? render('italic', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('italic'), onClick: method('italic') }, { children: (0, jsx_runtime_1.jsx)(IconItalic, Object.assign({}, IconProps)) }))) }))),
        'underline': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Underline') }, { children: (0, utils_1.is)('function', render) ? render('underline', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('underline'), onClick: method('underline') }, { children: (0, jsx_runtime_1.jsx)(IconUnderline, Object.assign({}, IconProps)) }))) }))),
        'bold': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Bold'), onClick: method('bold') }, { children: (0, utils_1.is)('function', render) ? render('bold', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('bold') }, { children: (0, jsx_runtime_1.jsx)(IconBold, Object.assign({}, IconProps)) }))) }))),
        'strike-line': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Strike Line'), onClick: method('strike-line') }, { children: (0, utils_1.is)('function', render) ? render('strike-line', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('strike-line') }, { children: (0, jsx_runtime_1.jsx)(IconStrikeLine, Object.assign({}, IconProps)) }))) }))),
        'font-color': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.color, anchorElement: refs.elements.color.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('color', false), include: [refs.elements.color.current] }, { children: (0, jsx_runtime_1.jsx)(Palette, { version: 'font-color', onClose: () => updateOpen('color', false), onUpdate: method('font-color') }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Text Color'), open: refs.open.current.color ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.color }, ToggleButtonProps, { selected: refs.open.current.color, onClick: () => updateOpen('color', !refs.open.current.color) }, { children: (0, jsx_runtime_1.jsx)(IconColor, Object.assign({}, IconProps)) }))) })) }))),
        'font-color-mini-menu': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.colorMiniMenu, anchorElement: refs.miniMenuElements.color, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('colorMiniMenu', false), include: [refs.miniMenuElements.color] }, { children: (0, jsx_runtime_1.jsx)(Palette, { ref: refs.miniMenuElements.colorPalette, version: 'font-color', onClose: () => updateOpen('colorMiniMenu', false), onUpdate: method('font-color') }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Text Color'), open: refs.open.current.colorMiniMenu ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.miniMenuElements.color }, ToggleButtonProps, { selected: refs.open.current.colorMiniMenu, onClick: () => updateOpen('colorMiniMenu', !refs.open.current.colorMiniMenu) }, { children: (0, jsx_runtime_1.jsx)(IconColor, Object.assign({}, IconProps)) }))) })) }))),
        'font-background': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.background, anchorElement: refs.elements.background.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('background', false), include: [refs.elements.background.current] }, { children: (0, jsx_runtime_1.jsx)(Palette, { version: 'font-background', onClose: () => updateOpen('background', false), onUpdate: method('font-background') }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Background Color'), open: refs.open.current.background ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-background', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.background }, ToggleButtonProps, { selected: refs.open.current.background, onClick: () => updateOpen('background', !refs.open.current.background) }, { children: (0, jsx_runtime_1.jsx)(IconBackground, Object.assign({}, IconProps)) }))) })) }))),
        'font-background-mini-menu': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.backgroundMiniMenu, anchorElement: refs.miniMenuElements.background, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('backgroundMiniMenu', false), include: [refs.miniMenuElements.background] }, { children: (0, jsx_runtime_1.jsx)(Palette, { ref: refs.miniMenuElements.backgroundPalette, version: 'font-background', onClose: () => updateOpen('backgroundMiniMenu', false), onUpdate: method('font-background') }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Text Color'), open: refs.open.current.backgroundMiniMenu ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-background', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.miniMenuElements.background }, ToggleButtonProps, { selected: refs.open.current.backgroundMiniMenu, onClick: () => updateOpen('backgroundMiniMenu', !refs.open.current.backgroundMiniMenu) }, { children: (0, jsx_runtime_1.jsx)(IconBackground, Object.assign({}, IconProps)) }))) })) }))),
        'align-left': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Align Left') }, { children: (0, utils_1.is)('function', render) ? render('align-left', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('align-left'), onClick: method('align-left') }, { children: (0, jsx_runtime_1.jsx)(IconAlignLeft, Object.assign({}, IconProps)) }))) }))),
        'align-center': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Align Center') }, { children: (0, utils_1.is)('function', render) ? render('align-center', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('align-center'), onClick: method('align-center') }, { children: (0, jsx_runtime_1.jsx)(IconAlignCenter, Object.assign({}, IconProps)) }))) }))),
        'align-right': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Align Right') }, { children: (0, utils_1.is)('function', render) ? render('align-right', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('align-right'), onClick: method('align-right') }, { children: (0, jsx_runtime_1.jsx)(IconAlignRight, Object.assign({}, IconProps)) }))) }))),
        'align-justify': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Align Justify') }, { children: (0, utils_1.is)('function', render) ? render('align-justify', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('align-justify'), onClick: method('align-justify') }, { children: (0, jsx_runtime_1.jsx)(IconAlignJustify, Object.assign({}, IconProps)) }))) }))),
        'indent': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Indent') }, { children: (0, utils_1.is)('function', render) ? render('indent', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('indent') }, { children: (0, jsx_runtime_1.jsx)(IconIndent, Object.assign({}, IconProps)) }))) }))),
        'outdent': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Outdent') }, { children: (0, utils_1.is)('function', render) ? render('outdent', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('outdent') }, { children: (0, jsx_runtime_1.jsx)(IconOutdent, Object.assign({}, IconProps)) }))) }))),
        'superscript': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Superscript') }, { children: (0, utils_1.is)('function', render) ? render('superscript', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('superscript'), onClick: method('superscript') }, { children: (0, jsx_runtime_1.jsx)(IconSuperscript, Object.assign({}, IconProps)) }))) }))),
        'subscript': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Subscript') }, { children: (0, utils_1.is)('function', render) ? render('subscript', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('subscript'), onClick: method('subscript') }, { children: (0, jsx_runtime_1.jsx)(IconSubscript, Object.assign({}, IconProps)) }))) }))),
        'list-ordered': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('List Ordered') }, { children: (0, utils_1.is)('function', render) ? render('list-ordered', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('list-ordered'), onClick: method('list-ordered') }, { children: (0, jsx_runtime_1.jsx)(IconListOrdered, Object.assign({}, IconProps)) }))) }))),
        'list-unordered': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('List Unordered') }, { children: (0, utils_1.is)('function', render) ? render('list-unordered', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { selected: refs.selected.current.includes('list-unordered'), onClick: method('list-unordered') }, { children: (0, jsx_runtime_1.jsx)(IconListUnordered, Object.assign({}, IconProps)) }))) }))),
        'horizontal-rule': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Horizontal Rule'), onClick: method('horizontal-rule') }, { children: (0, utils_1.is)('function', render) ? render('horizontal-rule', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { children: (0, jsx_runtime_1.jsx)(IconHorizontalRule, Object.assign({}, IconProps)) }))) }))),
        'link-add': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.link, anchorElement: refs.elements.linkAdd.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('link', false), include: [refs.elements.linkAdd.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Link'), labelButton: l('Add'), value: refs.inputValues.current.link, onChange: valueNew => updateInputValues('link', valueNew), onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('link-add')(refs.inputValues.current.link);
                        updateOpen('link', false);
                        updateInputValues('link', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Link'), open: refs.open.current.link ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.linkAdd }, ToggleButtonProps, { selected: refs.open.current.link, onClick: () => updateOpen('link', !refs.open.current.link) }, { children: (0, jsx_runtime_1.jsx)(IconLinkAdd, Object.assign({}, IconProps)) }))) })) }))),
        'link-add-mini-menu': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.linkMiniMenu, anchorElement: refs.miniMenuElements.linkAdd, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('linkMiniMenu', false), include: [refs.miniMenuElements.linkAdd] }, { children: (0, jsx_runtime_1.jsx)(Input, { ref: refs.miniMenuElements.linkAddInput, name: l('Link'), labelButton: l('Add'), value: refs.inputValues.current.link, onChange: valueNew => updateInputValues('link', valueNew), onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('link-add')(refs.inputValues.current.link);
                        updateOpen('linkMiniMenu', false);
                        updateInputValues('link', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Link'), open: refs.open.current.linkMiniMenu ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('font-color', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.miniMenuElements.linkAdd }, ToggleButtonProps, { selected: refs.open.current.linkMiniMenu, onClick: () => updateOpen('linkMiniMenu', !refs.open.current.linkMiniMenu) }, { children: (0, jsx_runtime_1.jsx)(IconLinkAdd, Object.assign({}, IconProps)) }))) })) }))),
        'link-remove': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Remove Link') }, { children: (0, utils_1.is)('function', render) ? render('link-remove', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('link-remove') }, { children: (0, jsx_runtime_1.jsx)(IconLinkRemove, Object.assign({}, IconProps)) }))) }))),
        'quote': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.quote, anchorElement: refs.elements.quote.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('quote', false), include: [refs.elements.quote.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Quote'), labelButton: l('Add'), value: refs.inputValues.current.quote, onChange: valueNew => updateInputValues('quote', valueNew), InputProps: {
                        multiline: true
                    }, onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('html')(`<blockquote>${refs.inputValues.current.quote}</blockquote>`);
                        updateOpen('quote', false);
                        updateInputValues('quote', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Quote'), open: refs.open.current.quote ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('quote', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.quote }, ToggleButtonProps, { selected: refs.open.current.quote, onClick: () => updateOpen('quote', !refs.open.current.quote) }, { children: (0, jsx_runtime_1.jsx)(IconQuote, Object.assign({}, IconProps)) }))) })) }))),
        'table': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.table, anchorElement: refs.elements.table.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('table', false), include: [refs.elements.table.current] }, { children: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 1, tonal: tonal, color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed', Component: Surface, className: (0, style_react_1.classNames)([
                        (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                            'onesy-RichTextEditor-palette'
                        ],
                        classes.palette
                    ]) }, { children: [(0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 1, direction: 'row', align: 'center', justify: 'center' }, { children: [(0, jsx_runtime_1.jsx)(NumericTextField, { name: l('Rows'), tonal: tonal, color: color, size: 'small', version: 'outlined', increment: false, decrement: false, value: refs.inputValues.current.tableRows, onChange: valueNew => updateInputValues('tableRows', valueNew) }), "\u00D7", (0, jsx_runtime_1.jsx)(NumericTextField, { name: l('Columns'), tonal: tonal, color: color, size: 'small', version: 'outlined', increment: false, decrement: false, value: refs.inputValues.current.tableColumns, onChange: valueNew => updateInputValues('tableColumns', valueNew) })] })), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 1, direction: 'row', align: 'center', justify: 'space-between', style: {
                                width: '100%'
                            } }, { children: [(0, jsx_runtime_1.jsxs)(Label, Object.assign({ size: 'small' }, { children: [(0, jsx_runtime_1.jsx)(Switch, { tonal: tonal, color: props.color !== undefined ? props.color : 'default', checked: refs.inputValues.current.tableHeader, onChange: valueNew => updateInputValues('tableHeader', valueNew) }), l('Header')] })), (0, jsx_runtime_1.jsx)(Button, Object.assign({ tonal: tonal, color: 'inherit', version: 'text', size: 'small', onClick: () => {
                                        if (refs.range.current) {
                                            const selection_ = refs.rootWindow.current.getSelection();
                                            selection_.removeAllRanges();
                                            selection_.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: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Table'), open: refs.open.current.table ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('table', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.table }, ToggleButtonProps, { selected: refs.open.current.table, onClick: () => updateOpen('table', !refs.open.current.table) }, { children: (0, jsx_runtime_1.jsx)(IconTable, Object.assign({}, IconProps)) }))) })) }))),
        'image': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.image, anchorElement: refs.elements.image.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('image', false), include: [refs.elements.image.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Image'), labelButton: l('Add'), value: refs.inputValues.current.image, onChange: valueNew => updateInputValues('image', valueNew), onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('image')(refs.inputValues.current.image);
                        updateOpen('image', false);
                        updateInputValues('image', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Image'), open: refs.open.current.image ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('image', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.image }, ToggleButtonProps, { selected: refs.open.current.image, onClick: () => updateOpen('image', !refs.open.current.image) }, { children: (0, jsx_runtime_1.jsx)(IconImage, Object.assign({}, IconProps)) }))) })) }))),
        'video': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.video, anchorElement: refs.elements.video.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('video', false), include: [refs.elements.video.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Video'), labelButton: l('Add'), value: refs.inputValues.current.video, onChange: valueNew => updateInputValues('video', valueNew), onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('html')(`<video controls><source src='${refs.inputValues.current.video}' /></video>`);
                        updateOpen('video', false);
                        updateInputValues('video', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Video'), open: refs.open.current.video ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('video', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.video }, ToggleButtonProps, { selected: refs.open.current.video, onClick: () => updateOpen('video', !refs.open.current.video) }, { children: (0, jsx_runtime_1.jsx)(IconVideo, Object.assign({}, IconProps)) }))) })) }))),
        'video-youtube': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.videoYoutube, anchorElement: refs.elements.videoYoutube.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('videoYoutube', false), include: [refs.elements.videoYoutube.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Youtube Video ID'), labelButton: l('Add'), value: refs.inputValues.current.videoYoutube, onChange: valueNew => updateInputValues('videoYoutube', valueNew), onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.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: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Youtube Video'), open: refs.open.current.videoYoutube ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('videoYoutube', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.videoYoutube }, ToggleButtonProps, { selected: refs.open.current.videoYoutube, onClick: () => updateOpen('videoYoutube', !refs.open.current.videoYoutube) }, { children: (0, jsx_runtime_1.jsx)(IconVideoYoutube, Object.assign({}, IconProps)) }))) })) }))),
        'drawing': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.drawing, anchorElement: refs.elements.drawing.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ 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: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 2, tonal: tonal, color: refs.props.current.color !== undefined ? refs.props.current.color : 'themed', Component: Surface, className: (0, style_react_1.classNames)([
                        (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                            'onesy-RichTextEditor-palette'
                        ],
                        classes.palette
                    ]) }, { children: [(0, jsx_runtime_1.jsx)(Drawing, Object.assign({ 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: Object.assign({ ListProps: {
                                        ref: refs.elements.drawingSelect
                                    } }, SelectProps === null || SelectProps === void 0 ? void 0 : SelectProps.MenuProps)
                            }, PaletteProps: {
                                ref: refs.elements.drawingPalette
                            } }, DrawingProps)), (0, jsx_runtime_1.jsx)(Line, Object.assign({ gap: 1, direction: 'row', align: 'center', justify: 'flex-end', style: {
                                width: '100%'
                            } }, { children: (0, jsx_runtime_1.jsx)(Button, Object.assign({ tonal: tonal, color: 'inherit', version: 'text', size: 'small', onClick: () => {
                                    if (refs.range.current) {
                                        const selection_ = refs.rootWindow.current.getSelection();
                                        selection_.removeAllRanges();
                                        selection_.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 = svgClone.outerHTML;
                                    method('html')(valueNew);
                                    updateOpen('drawing', false);
                                } }, { children: l('Add') })) }))] })) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Drawing'), open: refs.open.current.drawing ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('drawing', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.drawing }, ToggleButtonProps, { selected: refs.open.current.drawing, onClick: () => updateOpen('drawing', !refs.open.current.drawing) }, { children: (0, jsx_runtime_1.jsx)(IconDrawing, Object.assign({}, IconProps)) }))) })) }))),
        'code': ((0, jsx_runtime_1.jsx)(WrapperAppend, Object.assign({ open: refs.open.current.code, anchorElement: refs.elements.code.current, element: ((0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ onClickOutside: () => updateOpen('code', false), include: [refs.elements.code.current] }, { children: (0, jsx_runtime_1.jsx)(Input, { name: l('Code'), labelButton: l('Add'), value: refs.inputValues.current.code, onChange: valueNew => updateInputValues('code', valueNew), InputProps: {
                        multiline: true
                    }, onClick: () => {
                        if (refs.range.current) {
                            const selection_ = refs.rootWindow.current.getSelection();
                            selection_.removeAllRanges();
                            selection_.addRange(refs.range.current);
                        }
                        method('html')(`<pre><code>${refs.inputValues.current.code}</code></pre>`);
                        updateOpen('code', false);
                        updateInputValues('code', '');
                    } }) }))) }, { children: (0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Insert Code'), open: refs.open.current.code ? false : undefined }, { children: (0, utils_1.is)('function', render) ? render('code', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({ ref: refs.elements.code }, ToggleButtonProps, { selected: refs.open.current.code, onClick: () => updateOpen('code', !refs.open.current.code) }, { children: (0, jsx_runtime_1.jsx)(IconCode, Object.assign({}, IconProps)) }))) })) })))
    };
    const actionElements = {
        'clear': ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Clear') }, { children: (0, utils_1.is)('function', render) ? render('clear', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('clear') }, { children: (0, jsx_runtime_1.jsx)(IconClear, Object.assign({}, IconProps)) }))) })))
    };
    return ((0, jsx_runtime_1.jsxs)(Line, Object.assign({ ref: item => {
            if (ref) {
                if ((0, utils_1.is)('function', ref))
                    ref(item);
                else
                    ref.current = item;
            }
            refs.root.current = item;
        }, gap: 0, Component: Component, className: (0, style_react_1.classNames)([
            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                'onesy-RichTextEditor-root'
            ],
            className,
            classes.root
        ]) }, other, { children: [(updates || actions_) && ((0, jsx_runtime_1.jsxs)(Line, Object.assign({ tonal: tonal, color: color, version: version, gap: 0, direction: 'column', align: 'unset', justify: 'unset', Component: Surface }, ToolbarProps, { className: (0, style_react_1.classNames)([
                    (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                        'onesy-RichTextEditor-toolbars'
                    ],
                    ToolbarProps === null || ToolbarProps === void 0 ? void 0 : ToolbarProps.className,
                    classes.toolbars
                ]) }, { children: [updates_ && ((0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 2, direction: 'row', align: 'center', justify: 'flex-start', role: 'toolbar', "aria-label": l('Updates') }, ToolbarUpdatesProps, { className: (0, style_react_1.classNames)([
                            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                'onesy-RichTextEditor-toolbar'
                            ],
                            ToolbarUpdatesProps === null || ToolbarUpdatesProps === void 0 ? void 0 : ToolbarUpdatesProps.className,
                            classes.toolbar,
                            classes.toolbar_updates
                        ]) }, { children: [includes('font-family', 'font-size', 'font-version') && ((0, jsx_runtime_1.jsxs)(Line, Object.assign({ 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('font-color') && updateElements['font-color'], includes('font-background') && updateElements['font-background']] }))), includes('align-left', 'align-center', 'align-right', 'align-justify') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('indent') && updateElements['indent'], includes('outdent') && updateElements['outdent']] }))), includes('superscript', 'subscript') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('superscript') && updateElements['superscript'], includes('subscript') && updateElements['subscript']] }))), includes('list-ordered', 'list-unordered') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('list-ordered') && updateElements['list-ordered'], includes('list-unordered') && updateElements['list-unordered']] }))), includes('horizontal-rule') && ((0, jsx_runtime_1.jsx)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: includes('horizontal-rule') && updateElements['horizontal-rule'] }))), includes('link-add', 'link-remove') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('link-add') && updateElements['link-add'], includes('link-remove') && updateElements['link-remove']] }))), includes('quote', 'image', 'video', 'video-youtube', 'table', 'drawing', 'code') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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_) && ((0, jsx_runtime_1.jsx)(Divider, Object.assign({}, DividerProps, { className: (0, style_react_1.classNames)([
                            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                'onesy-RichTextEditor-divider'
                            ],
                            DividerProps === null || DividerProps === void 0 ? void 0 : DividerProps.className,
                            classes.divider,
                            classes.divider_middle
                        ]) }))), actions_ && ((0, jsx_runtime_1.jsx)(Line, Object.assign({ gap: 2, direction: 'row', align: 'center', justify: 'flex-start', role: 'toolbar', "aria-label": l('Actions') }, ToolbarActionsProps, { className: (0, style_react_1.classNames)([
                            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                'onesy-RichTextEditor-toolbar'
                            ],
                            ToolbarActionsProps === null || ToolbarActionsProps === void 0 ? void 0 : ToolbarActionsProps.className,
                            classes.toolbar,
                            classes.toolbar_actions
                        ]) }, { children: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ direction: 'row', align: 'center', justify: 'space-between', style: {
                                width: '100%'
                            } }, { children: [(0, jsx_runtime_1.jsx)(Line, Object.assign({ gap: 2, direction: 'row', align: 'center', justify: 'flex-start' }, { children: includes('copy', 'cut', 'paste', 'delete') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('copy') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Copy') }, { children: (0, utils_1.is)('function', render) ? render('copy', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('copy') }, { children: (0, jsx_runtime_1.jsx)(IconCopy, Object.assign({}, IconProps)) }))) }))), includes('cut') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Cut') }, { children: (0, utils_1.is)('function', render) ? render('cut', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('cut') }, { children: (0, jsx_runtime_1.jsx)(IconCut, Object.assign({}, IconProps)) }))) }))), includes('paste') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Paste') }, { children: (0, utils_1.is)('function', render) ? render('paste', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('paste') }, { children: (0, jsx_runtime_1.jsx)(IconPaste, Object.assign({}, IconProps)) }))) }))), includes('delete') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Delete') }, { children: (0, utils_1.is)('function', render) ? render('delete', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('delete') }, { children: (0, jsx_runtime_1.jsx)(IconDelete, Object.assign({}, IconProps)) }))) })))] }))) })), (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 2, direction: 'row', align: 'center', justify: 'flex-start' }, { children: [includes('clear', 'select-all') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('clear') && actionElements['clear'], includes('select-all') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Select All') }, { children: (0, utils_1.is)('function', render) ? render('select-all', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('select-all') }, { children: (0, jsx_runtime_1.jsx)(IconSelectAll, Object.assign({}, IconProps)) }))) })))] }))), includes('undo', 'redo') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('undo') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Undo') }, { children: (0, utils_1.is)('function', render) ? render('undo', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('undo') }, { children: (0, jsx_runtime_1.jsx)(IconUndo, Object.assign({}, IconProps)) }))) }))), includes('redo') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Redo') }, { children: (0, utils_1.is)('function', render) ? render('redo', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: method('redo') }, { children: (0, jsx_runtime_1.jsx)(IconRedo, Object.assign({}, IconProps)) }))) })))] }))), includes('save', 'print') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includes('save') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Save') }, { children: (0, utils_1.is)('function', render) ? render('save', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: () => (0, utils_2.save)(refs.value.current) }, { children: (0, jsx_runtime_1.jsx)(IconSave, Object.assign({}, IconProps)) }))) }))), includes('print') && ((0, jsx_runtime_1.jsx)(WrapperToggleButton, Object.assign({ name: l('Print') }, { children: (0, utils_1.is)('function', render) ? render('print', ToggleButtonProps, refs.value.current, method) : ((0, jsx_runtime_1.jsx)(ToggleButton, Object.assign({}, ToggleButtonProps, { onClick: () => (0, utils_2.print)(refs.value.current) }, { children: (0, jsx_runtime_1.jsx)(IconPrint, Object.assign({}, IconProps)) }))) })))] })))] }))] })) }))), (0, jsx_runtime_1.jsx)(Divider, Object.assign({}, DividerProps, { className: (0, style_react_1.classNames)([
                            (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                'onesy-RichTextEditor-divider'
                            ],
                            DividerProps === null || DividerProps === void 0 ? void 0 : DividerProps.className,
                            classes.divider,
                            classes.divider_end
                        ]) }))] }))), miniMenu && !!refs.miniMenuInclude.current.length && ((0, jsx_runtime_1.jsx)(Append, Object.assign({ open: selection, element: ({ ref: ref_, values, style }) => ((0, jsx_runtime_1.jsx)("div", Object.assign({ ref: item => {
                        if (ref_) {
                            if ((0, utils_1.is)('function', ref_))
                                ref_(item);
                            else
                                ref_.current = item;
                            refs.miniMenu.current = item;
                        }
                    }, style: Object.assign(Object.assign({}, (((values === null || values === void 0 ? void 0 : values.x) === 0 && (values === null || values === void 0 ? void 0 : values.y) === 0) ? {
                        visibility: 'hidden'
                    } : undefined)), style) }, { children: (0, jsx_runtime_1.jsx)(Fade, Object.assign({ in: !!selection, add: true }, { children: (0, jsx_runtime_1.jsx)(ClickListener, Object.assign({ 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: (0, jsx_runtime_1.jsxs)(Line, Object.assign({ gap: 2, direction: 'row', align: 'center', justify: 'flex-start', role: 'toolbar', "aria-label": l('Mini menu'), Component: Surface }, MiniMenuProps, { className: (0, style_react_1.classNames)([
                                    (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                                        'onesy-RichTextEditor-mini-menu'
                                    ],
                                    MiniMenuProps === null || MiniMenuProps === void 0 ? void 0 : MiniMenuProps.className,
                                    classes.miniMenu
                                ]) }, { children: [includesMinMenu('italic', 'underlined', 'bold', 'strike-line') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, 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') && ((0, jsx_runtime_1.jsxs)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: [includesMinMenu('link-add') && updateElements['link-add-mini-menu'], includesMinMenu('link-remove') && updateElements['link-remove']] }))), includesMinMenu('clear') && ((0, jsx_runtime_1.jsx)(ToggleButtons, Object.assign({}, ToggleButtonsProps, { children: includesMinMenu('clear') && actionElements['clear'] })))] })) })) })) }))), anchor: selection, portal: true, alignment: 'center', position: 'bottom', clearOnClose: true }, AppendProps))), (0, jsx_runtime_1.jsx)(Surface, { ref: refs.value, color: 'default', onMouseUp: onMouseUpValue, onMouseDown: onMouseDownValue, onInput: onUpdate, contentEditable: true, className: (0, style_react_1.classNames)([
                    (0, utils_2.staticClassName)('RichTextEditor', theme) && [
                        'onesy-RichTextEditor-value'
                    ],
                    classes.value
                ]) })] })));
});
RichTextEditor.displayName = 'onesy-RichTextEditor';
exports.default = RichTextEditor;