import React from 'react'; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(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; } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; function autoconfigureTextDirection(el) { if (el) { var text = el.textContent; var rtlPattern = /[\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC]/; el.style.direction = text && rtlPattern.test(text[0]) ? 'rtl' : 'ltr'; } } function cls() { var classNames = []; for (var _i = 0; _i < arguments.length; _i++) { classNames[_i] = arguments[_i]; } return classNames.filter(Boolean).join(' '); } function getSelectedNode() { if (document.selection) { return document.selection.createRange().parentElement(); } var selection = window.getSelection(); if (selection && selection.rangeCount > 0) { return selection.getRangeAt(0).startContainer.parentNode || undefined; } return undefined; } function normalizeHtml(str) { return typeof str === 'string' ? str.replace(/ |\u202F|\u00A0/g, ' ').replace(/
/g, '
') : String(str); } function replaceCaret(el) { // Place the caret at the end of the element var target = document.createTextNode(''); el.appendChild(target); // do not move caret if element was not focused var isTargetFocused = document.activeElement === el; if (target !== null && target.nodeValue !== null && isTargetFocused) { var sel = window.getSelection(); if (sel !== null) { var range = document.createRange(); range.setStart(target, target.nodeValue.length); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } if (el instanceof HTMLElement) el.focus(); } } function setForwardRef(el, ref) { if (typeof ref === 'function') { ref(el); } else if (typeof ref === 'object' && ref) { // eslint-disable-next-line no-param-reassign ref.current = el; } } /** * Based on https://github.com/lovasoa/react-contenteditable * A simple component for a html element with editable contents. */ var ContentEditable = React.memo(React.forwardRef(function ContentEditable(_a, ref) { var // Some properties are used here only as useMemo dependencies className = _a.className, disabled = _a.disabled, tagName = _a.tagName, _b = _a.value, value = _b === void 0 ? '' : _b, placeholder = _a.placeholder, rest = __rest(_a, ["className", "disabled", "tagName", "value", "placeholder"]); var elRef = React.useRef(null); var htmlRef = React.useRef(value); var restRef = React.useRef(rest); React.useEffect(function () { restRef.current = rest; var el = elRef.current; if (el && normalizeHtml(htmlRef.current) !== normalizeHtml(value)) { htmlRef.current = value; el.innerHTML = value; replaceCaret(el); } }); return React.useMemo(function () { function onSetRef($el) { elRef.current = $el; autoconfigureTextDirection($el); setForwardRef($el, ref); } function onChange(event) { var _a, _b; var el = elRef.current; if (!el) { return; } var elementHtml = el.innerHTML; if (elementHtml !== htmlRef.current) { (_b = (_a = restRef.current).onChange) === null || _b === void 0 ? void 0 : _b.call(_a, __assign(__assign({}, event), { target: { value: elementHtml, name: rest.name, } })); } autoconfigureTextDirection(el); htmlRef.current = elementHtml; } var cssClass = cls('rsw-ce', className); return React.createElement(tagName || 'div', __assign(__assign({}, rest), { className: cssClass, contentEditable: !disabled, dangerouslySetInnerHTML: { __html: value }, onBlur: function (e) { return (restRef.current.onBlur || onChange)(e); }, onInput: onChange, onKeyDown: function (e) { return (restRef.current.onKeyDown || onChange)(e); }, onKeyUp: function (e) { return (restRef.current.onKeyUp || onChange)(e); }, placeholder: placeholder, ref: onSetRef })); // eslint-disable-next-line react-hooks/exhaustive-deps }, [className, disabled, placeholder, tagName]); })); var EditorContext = React.createContext(undefined); function EditorProvider(_a) { var children = _a.children; var _b = React.useState({ htmlMode: false, update: update, }), state = _b[0], setState = _b[1]; function update(attrs) { setState(function (prevState) { return __assign(__assign({}, prevState), attrs); }); } return (React.createElement(EditorContext.Provider, { value: state }, children)); } function useEditorState() { var context = React.useContext(EditorContext); if (!context) { throw new Error('You should wrap your component by EditorProvider'); } return context; } var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=true===r.prepend?"prepend":"append",d=true===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n")); } function Separator(props) { var editorState = useEditorState(); if (editorState.htmlMode) { return null; } return React.createElement("div", __assign({ className: "rsw-separator" }, props)); } function Toolbar(props) { return React.createElement("div", __assign({ className: "rsw-toolbar" }, props)); } var DefaultEditor = React.forwardRef(function DefaultEditor(props, ref) { return (React.createElement(EditorProvider, null, React.createElement(Editor, __assign({}, props, { ref: ref }), props.children || (React.createElement(Toolbar, null, React.createElement(BtnUndo, null), React.createElement(BtnRedo, null), React.createElement(Separator, null), React.createElement(BtnBold, null), React.createElement(BtnItalic, null), React.createElement(BtnUnderline, null), React.createElement(BtnStrikeThrough, null), React.createElement(Separator, null), React.createElement(BtnNumberedList, null), React.createElement(BtnBulletList, null), React.createElement(Separator, null), React.createElement(BtnLink, null), React.createElement(BtnClearFormatting, null), React.createElement(HtmlButton, null), React.createElement(Separator, null), React.createElement(BtnStyles, null)))))); }); export { BtnBold, BtnBulletList, BtnClearFormatting, BtnItalic, BtnLink, BtnNumberedList, BtnRedo, BtnStrikeThrough, BtnStyles, BtnUnderline, BtnUndo, ContentEditable, DefaultEditor, Dropdown, Editor, EditorContext, EditorProvider, HtmlButton, Separator, Toolbar, createButton, createDropdown, DefaultEditor as default, useEditorState }; //# sourceMappingURL=index.es.mjs.map