@pie-lib/editable-html 7.22.6 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,24 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [8.0.0](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html@7.22.6...@pie-lib/editable-html@8.0.0) (2022-06-27)
7
+
8
+
9
+ ### Features
10
+
11
+ * **editable-html:** Added characters limit support PD-1681 ([9e7f6ad](https://github.com/pie-framework/pie-lib/commit/9e7f6add3f846d32265990aca98dfb5b4847bb95))
12
+ * **editable-html:** image resize functionality PD-1801 ([6f46903](https://github.com/pie-framework/pie-lib/commit/6f46903acdf791716263be33abe49235572421ad))
13
+ * **plugins:** added special characters adding capabilities [PD-1462] ([b9f41e1](https://github.com/pie-framework/pie-lib/commit/b9f41e11f44df140a66145d0b04558ca2b0ea48e))
14
+
15
+
16
+ ### BREAKING CHANGES
17
+
18
+ * **editable-html:** Removed the percent buttons from editable-html image button. Added resize functionality.
19
+
20
+
21
+
22
+
23
+
6
24
  ## [7.22.6](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html@7.22.5...@pie-lib/editable-html@7.22.6) (2022-06-13)
7
25
 
8
26
  **Note:** Version bump only for package @pie-lib/editable-html
package/lib/editor.js CHANGED
@@ -134,7 +134,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
134
134
  props.imageSupport.add(handler);
135
135
  },
136
136
  onFocus: _this.onPluginFocus,
137
- onBlur: _this.onPluginBlur
137
+ onBlur: _this.onPluginBlur,
138
+ maxImageWidth: _this.props.maxImageWidth,
139
+ maxImageHeight: _this.props.maxImageHeight
138
140
  },
139
141
  toolbar: {
140
142
  /**
@@ -723,7 +725,9 @@ _defineProperty(Editor, "propTypes", {
723
725
  });
724
726
  return !allValid && new Error("Invalid values: ".concat(values, ", values must be one of [").concat(_plugins.ALL_PLUGINS.join(','), "]"));
725
727
  }),
726
- className: _propTypes["default"].string
728
+ className: _propTypes["default"].string,
729
+ maxImageWidth: _propTypes["default"].number,
730
+ maxImageHeight: _propTypes["default"].number
727
731
  });
728
732
 
729
733
  _defineProperty(Editor, "defaultProps", {
package/lib/editor.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor.jsx"],"names":["log","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","defaultLanguageCharactersProps","createToolbarOpts","toolbarOpts","Editor","props","normalizedResponseAreaProps","responseAreaProps","plugins","activePlugins","math","onClick","onMathClick","onFocus","onPluginFocus","onBlur","onPluginBlur","image","onDelete","imageSupport","src","done","e","state","value","insertImageRequested","getHandler","handler","add","toolbar","disableUnderline","autoWidth","autoWidthToolbar","onDone","nonEmpty","setState","toolbarInFocus","focusedNode","editor","blur","startText","text","length","resetValue","then","onEditingDone","table","responseArea","type","maxResponseAreas","error","languageCharacters","languageCharactersProps","media","focus","createChange","change","onChange","relatedTarget","target","node","stashedValue","stashValue","c","collapseToStartOf","selectedNode","resolve","event","Promise","handleBlur","bind","editorDOM","document","querySelector","key","setTimeout","wrapperRef","editorElement","activeElement","closest","className","toolbarElement","toolbarRef","isInCurrentComponent","contains","removeEventListener","handleDomBlur","__TEMPORARY_CHANGE_DATA","data","domEl","setNodeByKey","addEventListener","force","stopReset","reduce","s","p","isFocused","toObject","newValue","Value","fromJSON","toJSON","charactersLimit","v","endsWith","undefined","parseInt","isNaN","object","last","nodes","parent","getParent","Block","pos","onResize","handlePlugins","onRef","window","autoFocus","nextProps","newToolbarOpts","zeroWidthEls","querySelectorAll","Array","from","forEach","el","style","minWidth","display","equals","width","minHeight","height","maxHeight","valueToSize","disabled","spellCheck","highlightShape","classes","placeholder","pluginProps","onKeyDown","sizeStyle","buildSizeStyle","names","withBg","toolbarOnTop","ref","r","slateEditor","editorRef","normalize","changeData","React","Component","PropTypes","bool","func","isRequired","SlateTypes","number","oneOfType","string","any","shape","oneOf","arrayOf","language","characterIcon","characters","values","allValid","every","ALL_PLUGINS","includes","Error","join","styles","backgroundColor","fontFamily","tableLayout","borderCollapse","color","background","borderTop","padding","textAlign","border","marginTop"],"mappings":"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","sourcesContent":["import { Editor as SlateEditor, findNode } from 'slate-react';\nimport SlateTypes from 'slate-prop-types';\n\nimport isEqual from 'lodash/isEqual';\nimport * as serialization from './serialization';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { Value, Block } from 'slate';\nimport { buildPlugins, ALL_PLUGINS, DEFAULT_PLUGINS } from './plugins';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { color } from '@pie-lib/render-ui';\n\nexport { ALL_PLUGINS, DEFAULT_PLUGINS, serialization };\n\nconst log = debug('editable-html:editor');\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur'\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {}\n};\n\nconst defaultLanguageCharactersProps = [];\n\nconst createToolbarOpts = toolbarOpts => {\n return {\n ...defaultToolbarOpts,\n ...toolbarOpts\n };\n};\n\nexport class Editor extends React.Component {\n static propTypes = {\n autoFocus: PropTypes.bool,\n editorRef: PropTypes.func.isRequired,\n onRef: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n onKeyDown: PropTypes.func,\n focus: PropTypes.func.isRequired,\n value: SlateTypes.value.isRequired,\n imageSupport: PropTypes.object,\n charactersLimit: PropTypes.number,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n classes: PropTypes.object.isRequired,\n highlightShape: PropTypes.bool,\n disabled: PropTypes.bool,\n spellCheck: PropTypes.bool,\n nonEmpty: PropTypes.bool,\n disableUnderline: PropTypes.bool,\n autoWidthToolbar: PropTypes.bool,\n pluginProps: PropTypes.any,\n placeholder: PropTypes.string,\n responseAreaProps: PropTypes.shape({\n type: PropTypes.oneOf([\n 'explicit-constructed-response',\n 'inline-dropdown',\n 'drag-in-the-blank'\n ]),\n options: PropTypes.object,\n respAreaToolbar: PropTypes.func,\n onHandleAreaChange: PropTypes.func\n }),\n languageCharactersProps: PropTypes.arrayOf(\n PropTypes.shape({\n language: PropTypes.string,\n characterIcon: PropTypes.string,\n characters: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string))\n })\n ),\n toolbarOpts: PropTypes.shape({\n position: PropTypes.oneOf(['bottom', 'top']),\n alignment: PropTypes.oneOf(['left', 'right']),\n alwaysVisible: PropTypes.bool,\n showDone: PropTypes.bool,\n doneOn: PropTypes.string\n }),\n activePlugins: PropTypes.arrayOf(values => {\n const allValid = values.every(v => ALL_PLUGINS.includes(v));\n\n return (\n !allValid &&\n new Error(`Invalid values: ${values}, values must be one of [${ALL_PLUGINS.join(',')}]`)\n );\n }),\n className: PropTypes.string\n };\n\n static defaultProps = {\n disableUnderline: true,\n onFocus: () => {},\n onBlur: () => {},\n onKeyDown: () => {},\n toolbarOpts: defaultToolbarOpts,\n responseAreaProps: defaultResponseAreaProps,\n languageCharactersProps: defaultLanguageCharactersProps\n };\n\n constructor(props) {\n super(props);\n this.state = {\n value: props.value,\n toolbarOpts: createToolbarOpts(props.toolbarOpts)\n };\n\n this.onResize = () => {\n props.onChange(this.state.value, true);\n };\n\n this.handlePlugins(this.props);\n }\n\n handlePlugins = props => {\n const normalizedResponseAreaProps = {\n ...defaultResponseAreaProps,\n ...props.responseAreaProps\n };\n\n this.plugins = buildPlugins(props.activePlugins, {\n math: {\n onClick: this.onMathClick,\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur\n },\n image: {\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((src, done) => {\n props.imageSupport.delete(src, e => {\n done(e, this.state.value);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n (getHandler => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(() => this.state.value);\n props.imageSupport.add(handler);\n }),\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur\n },\n toolbar: {\n /**\n * To minimize converting html -> state -> html\n * We only emit markup once 'done' is clicked.\n */\n disableUnderline: props.disableUnderline,\n autoWidth: props.autoWidthToolbar,\n onDone: () => {\n const { nonEmpty } = props;\n\n log('[onDone]');\n this.setState({ toolbarInFocus: false, focusedNode: null });\n this.editor.blur();\n\n if (nonEmpty && this.state.value.startText.text.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n });\n } else {\n this.onEditingDone();\n }\n }\n },\n table: {\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n }\n },\n responseArea: {\n type: normalizedResponseAreaProps.type,\n options: normalizedResponseAreaProps.options,\n maxResponseAreas: normalizedResponseAreaProps.maxResponseAreas,\n respAreaToolbar: normalizedResponseAreaProps.respAreaToolbar,\n onHandleAreaChange: normalizedResponseAreaProps.onHandleAreaChange,\n error: normalizedResponseAreaProps.error,\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n }\n },\n languageCharacters: props.languageCharactersProps,\n media: {\n focus: this.focus,\n createChange: () => this.state.value.change(),\n onChange: this.onChange\n }\n });\n };\n\n componentDidMount() {\n // onRef is needed to get the ref of the component because we export it using withStyles\n this.props.onRef(this);\n\n window.addEventListener('resize', this.onResize);\n\n if (this.editor && this.props.autoFocus) {\n Promise.resolve().then(() => {\n if (this.editor) {\n const editorDOM = document.querySelector(\n `[data-key=\"${this.editor.value.document.key}\"]`\n );\n\n this.editor.focus();\n\n if (editorDOM) {\n editorDOM.focus();\n }\n }\n });\n }\n }\n\n componentWillReceiveProps(nextProps) {\n const { toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts);\n\n if (!isEqual(newToolbarOpts, toolbarOpts)) {\n this.setState({\n toolbarOpts: newToolbarOpts\n });\n }\n\n if (!isEqual(nextProps.languageCharactersProps, this.props.languageCharactersProps)) {\n this.handlePlugins(nextProps);\n }\n }\n\n componentDidUpdate() {\n // The cursor is on a zero width element and when that is placed near void elements, it is not visible\n // so we increase the width to at least 2px in order for the user to see it\n const zeroWidthEls = document.querySelectorAll('[data-slate-zero-width=\"z\"]');\n\n Array.from(zeroWidthEls).forEach(el => {\n el.style.minWidth = '2px';\n el.style.display = 'inline-block';\n });\n }\n\n onPluginBlur = e => {\n log('[onPluginBlur]', e && e.relatedTarget);\n const target = e && e.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n log('[onPluginBlur] node: ', node);\n this.setState({ focusedNode: node }, () => {\n this.resetValue();\n });\n };\n\n onPluginFocus = e => {\n log('[onPluginFocus]', e && e.target);\n const target = e && e.target;\n if (target) {\n const node = findNode(target, this.state.value);\n log('[onPluginFocus] node: ', node);\n\n const stashedValue = this.state.stashedValue || this.state.value;\n this.setState({ focusedNode: node, stashedValue });\n } else {\n this.setState({ focusedNode: null });\n }\n this.stashValue();\n };\n\n onMathClick = node => {\n this.editor.change(c => c.collapseToStartOf(node));\n this.setState({ selectedNode: node });\n };\n\n onEditingDone = () => {\n log('[onEditingDone]');\n this.setState({ stashedValue: null, focusedNode: null });\n log('[onEditingDone] value: ', this.state.value);\n this.props.onChange(this.state.value, true);\n };\n\n /**\n * Remove onResize event listener\n */\n componentWillUnmount() {\n window.removeEventListener('resize', this.onResize);\n }\n\n // Allowing time for onChange to take effect if it is called\n handleBlur = resolve => {\n const { nonEmpty } = this.props;\n const {\n toolbarOpts: { doneOn }\n } = this.state;\n\n this.setState({ toolbarInFocus: false, focusedNode: null });\n\n if (this.editor) {\n this.editor.blur();\n }\n\n if (doneOn === 'blur') {\n if (nonEmpty && this.state.value.startText.text.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n resolve();\n });\n } else {\n this.onEditingDone();\n resolve();\n }\n }\n };\n\n onBlur = event => {\n log('[onBlur]');\n const target = event.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n\n log('[onBlur] node: ', node);\n\n return new Promise(resolve => {\n this.setState({ focusedNode: node }, this.handleBlur.bind(this, resolve));\n this.props.onBlur(event);\n });\n };\n\n handleDomBlur = e => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n setTimeout(() => {\n if (!this.wrapperRef) {\n return;\n }\n\n const editorElement =\n !editorDOM || document.activeElement.closest(`[class*=\"${editorDOM.className}\"]`);\n const toolbarElement =\n !this.toolbarRef ||\n document.activeElement.closest(`[class*=\"${this.toolbarRef.className}\"]`);\n const isInCurrentComponent =\n this.wrapperRef.contains(editorElement) || this.wrapperRef.contains(toolbarElement);\n\n if (!isInCurrentComponent) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n this.onBlur(e);\n }\n }, 50);\n };\n\n /*\n * Needs to be wrapped otherwise it causes issues because of race conditions\n * Known issue for slatejs. See: https://github.com/ianstormtaylor/slate/issues/2097\n * Using timeout I wasn't able to test this\n *\n * Note: The use of promises has been causing issues with MathQuill\n * */\n onFocus = () =>\n new Promise(resolve => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n log('[onFocus]', document.activeElement);\n\n /**\n * This is a temporary hack - @see changeData below for some more information.\n */\n if (this.__TEMPORARY_CHANGE_DATA) {\n const { key, data } = this.__TEMPORARY_CHANGE_DATA;\n const domEl = document.querySelector(`[data-key=\"${key}\"]`);\n\n if (domEl) {\n let change = this.state.value.change().setNodeByKey(key, { data });\n\n this.setState({ value: change.value }, () => {\n this.__TEMPORARY_CHANGE_DATA = null;\n });\n }\n }\n\n /**\n * This is needed just in case the browser decides to make the editor\n * lose focus without triggering the onBlur event (can happen in a few cases).\n * This will also trigger onBlur if the user clicks outside of the page when the editor\n * is focused.\n */\n if (editorDOM === document.activeElement) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n editorDOM.addEventListener('blur', this.handleDomBlur);\n }\n\n this.stashValue();\n this.props.onFocus();\n\n resolve();\n });\n\n stashValue = () => {\n log('[stashValue]');\n if (!this.state.stashedValue) {\n this.setState({ stashedValue: this.state.value });\n }\n };\n\n /**\n * Reset the value if the user didn't click done.\n */\n resetValue = force => {\n const { value, focusedNode } = this.state;\n\n const stopReset = this.plugins.reduce((s, p) => {\n return s || (p.stopReset && p.stopReset(this.state.value));\n }, false);\n\n log('[resetValue]', value.isFocused, focusedNode, 'stopReset: ', stopReset);\n if ((this.state.stashedValue && !value.isFocused && !focusedNode && !stopReset) || force) {\n log('[resetValue] resetting...');\n log('stashed', this.state.stashedValue.document.toObject());\n log('current', this.state.value.document.toObject());\n\n const newValue = Value.fromJSON(this.state.stashedValue.toJSON());\n\n log('newValue: ', newValue.document);\n return new Promise(resolve => {\n setTimeout(() => {\n this.setState({ value: newValue, stashedValue: null }, () => {\n log('value now: ', this.state.value.document.toJSON());\n resolve();\n });\n }, 50);\n });\n } else {\n return Promise.resolve({});\n }\n };\n\n onChange = (change, done) => {\n log('[onChange]');\n\n const { value } = change;\n const { charactersLimit } = this.props;\n\n if (\n value &&\n value.document &&\n value.document.text &&\n value.document.text.length > charactersLimit\n ) {\n return;\n }\n\n this.setState({ value }, () => {\n log('[onChange], call done()');\n\n if (done) {\n done();\n }\n });\n };\n\n UNSAFE_componentWillReceiveProps(props) {\n if (!props.value.document.equals(this.props.value.document)) {\n this.setState({\n focus: false,\n value: props.value\n });\n }\n }\n\n valueToSize = v => {\n if (!v) {\n return;\n }\n\n if (typeof v === 'string') {\n if (v.endsWith('%')) {\n return undefined;\n } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw')) {\n return v;\n } else {\n const value = parseInt(v, 10);\n return isNaN(value) ? value : `${value}px`;\n }\n }\n if (typeof v === 'number') {\n return `${v}px`;\n }\n\n return;\n };\n\n buildSizeStyle() {\n const { width, minHeight, height, maxHeight } = this.props;\n\n return {\n width: this.valueToSize(width),\n height: this.valueToSize(height),\n minHeight: this.valueToSize(minHeight),\n maxHeight: this.valueToSize(maxHeight)\n };\n }\n\n validateNode = node => {\n if (node.object !== 'block') return;\n\n const last = node.nodes.last();\n if (!last) return;\n\n if (last.type !== 'image') return;\n\n log('[validateNode] last is image..');\n\n const parent = last.getParent(last.key);\n const p = Block.getParent(last.key);\n log('[validateNode] parent:', parent, p);\n\n return undefined;\n };\n\n changeData = (key, data) => {\n log('[changeData]. .. ', key, data);\n\n /**\n * HACK ALERT: We should be calling setState here and storing the change data:\n *\n * <code>this.setState({changeData: { key, data}})</code>\n * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no\n * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these\n * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle\n * on this hack rather than spend more time on this.\n */\n\n // Uncomment this line to see the bug described above.\n // this.setState({changeData: {key, data}})\n\n this.__TEMPORARY_CHANGE_DATA = { key, data };\n };\n\n focus = (pos, node) => {\n const position = pos || 'end';\n\n this.props.focus(position, node);\n };\n\n render() {\n const {\n disabled,\n spellCheck,\n highlightShape,\n classes,\n className,\n placeholder,\n pluginProps,\n onKeyDown\n } = this.props;\n\n const { value, focusedNode, toolbarOpts } = this.state;\n\n log('[render] value: ', value);\n const sizeStyle = this.buildSizeStyle();\n const names = classNames(\n {\n [classes.withBg]: highlightShape,\n [classes.toolbarOnTop]: toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'\n },\n className\n );\n\n return (\n <div\n ref={ref => (this.wrapperRef = ref)}\n style={{ width: sizeStyle.width }}\n className={names}\n >\n <SlateEditor\n plugins={this.plugins}\n innerRef={r => {\n if (r) {\n this.slateEditor = r;\n }\n }}\n ref={r => (this.editor = r && this.props.editorRef(r))}\n toolbarRef={r => {\n if (r) {\n this.toolbarRef = r;\n }\n }}\n value={value}\n focus={this.focus}\n onKeyDown={onKeyDown}\n onChange={this.onChange}\n onBlur={this.onBlur}\n onFocus={this.onFocus}\n onEditingDone={this.onEditingDone}\n focusedNode={focusedNode}\n normalize={this.normalize}\n readOnly={disabled}\n spellCheck={spellCheck}\n className={classes.slateEditor}\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight\n }}\n pluginProps={pluginProps}\n toolbarOpts={toolbarOpts}\n placeholder={placeholder}\n onDataChange={this.changeData}\n />\n </div>\n );\n }\n}\n\n// TODO color - hardcoded gray background and keypad colors will need to change too\nconst styles = {\n withBg: {\n backgroundColor: 'rgba(0,0,0,0.06)'\n },\n slateEditor: {\n fontFamily: 'Roboto, sans-serif',\n\n '& table': {\n tableLayout: 'fixed',\n width: '100%',\n borderCollapse: 'collapse',\n color: color.text(),\n backgroundColor: color.background()\n },\n '& table:not([border=\"1\"]) tr': {\n borderTop: '1px solid #dfe2e5'\n // TODO perhaps secondary color for background, for now disable\n // '&:nth-child(2n)': {\n // backgroundColor: '#f6f8fa'\n // }\n },\n '& td, th': {\n padding: '.6em 1em',\n textAlign: 'center'\n },\n '& table:not([border=\"1\"]) td, th': {\n border: '1px solid #dfe2e5'\n }\n },\n toolbarOnTop: {\n marginTop: '45px'\n }\n};\n\nexport default withStyles(styles)(Editor);\n"],"file":"editor.js"}
1
+ {"version":3,"sources":["../src/editor.jsx"],"names":["log","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","defaultLanguageCharactersProps","createToolbarOpts","toolbarOpts","Editor","props","normalizedResponseAreaProps","responseAreaProps","plugins","activePlugins","math","onClick","onMathClick","onFocus","onPluginFocus","onBlur","onPluginBlur","image","onDelete","imageSupport","src","done","e","state","value","insertImageRequested","getHandler","handler","add","maxImageWidth","maxImageHeight","toolbar","disableUnderline","autoWidth","autoWidthToolbar","onDone","nonEmpty","setState","toolbarInFocus","focusedNode","editor","blur","startText","text","length","resetValue","then","onEditingDone","table","responseArea","type","maxResponseAreas","error","languageCharacters","languageCharactersProps","media","focus","createChange","change","onChange","relatedTarget","target","node","stashedValue","stashValue","c","collapseToStartOf","selectedNode","resolve","event","Promise","handleBlur","bind","editorDOM","document","querySelector","key","setTimeout","wrapperRef","editorElement","activeElement","closest","className","toolbarElement","toolbarRef","isInCurrentComponent","contains","removeEventListener","handleDomBlur","__TEMPORARY_CHANGE_DATA","data","domEl","setNodeByKey","addEventListener","force","stopReset","reduce","s","p","isFocused","toObject","newValue","Value","fromJSON","toJSON","charactersLimit","v","endsWith","undefined","parseInt","isNaN","object","last","nodes","parent","getParent","Block","pos","onResize","handlePlugins","onRef","window","autoFocus","nextProps","newToolbarOpts","zeroWidthEls","querySelectorAll","Array","from","forEach","el","style","minWidth","display","equals","width","minHeight","height","maxHeight","valueToSize","disabled","spellCheck","highlightShape","classes","placeholder","pluginProps","onKeyDown","sizeStyle","buildSizeStyle","names","withBg","toolbarOnTop","ref","r","slateEditor","editorRef","normalize","changeData","React","Component","PropTypes","bool","func","isRequired","SlateTypes","number","oneOfType","string","any","shape","oneOf","arrayOf","language","characterIcon","characters","values","allValid","every","ALL_PLUGINS","includes","Error","join","styles","backgroundColor","fontFamily","tableLayout","borderCollapse","color","background","borderTop","padding","textAlign","border","marginTop"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AACA;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAMA,GAAG,GAAG,uBAAM,sBAAN,CAAZ;AAEA,IAAMC,kBAAkB,GAAG;AACzBC,EAAAA,QAAQ,EAAE,QADe;AAEzBC,EAAAA,SAAS,EAAE,MAFc;AAGzBC,EAAAA,aAAa,EAAE,KAHU;AAIzBC,EAAAA,QAAQ,EAAE,IAJe;AAKzBC,EAAAA,MAAM,EAAE;AALiB,CAA3B;AAQA,IAAMC,wBAAwB,GAAG;AAC/BC,EAAAA,OAAO,EAAE,EADsB;AAE/BC,EAAAA,eAAe,EAAE,2BAAM,CAAE,CAFM;AAG/BC,EAAAA,kBAAkB,EAAE,8BAAM,CAAE;AAHG,CAAjC;AAMA,IAAMC,8BAA8B,GAAG,EAAvC;;AAEA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAAC,WAAW,EAAI;AACvC,yCACKZ,kBADL,GAEKY,WAFL;AAID,CALD;;IAOaC,M;;;;;AAyEX,kBAAYC,MAAZ,EAAmB;AAAA;;AAAA;;AACjB,8BAAMA,MAAN;;AADiB,oEAcH,UAAAA,KAAK,EAAI;AACvB,UAAMC,2BAA2B,mCAC5BT,wBAD4B,GAE5BQ,KAAK,CAACE,iBAFsB,CAAjC;;AAKA,YAAKC,OAAL,GAAe,2BAAaH,KAAK,CAACI,aAAnB,EAAkC;AAC/CC,QAAAA,IAAI,EAAE;AACJC,UAAAA,OAAO,EAAE,MAAKC,WADV;AAEJC,UAAAA,OAAO,EAAE,MAAKC,aAFV;AAGJC,UAAAA,MAAM,EAAE,MAAKC;AAHT,SADyC;AAM/CC,QAAAA,KAAK,EAAE;AACLC,UAAAA,QAAQ,EACNb,KAAK,CAACc,YAAN,IACAd,KAAK,CAACc,YAAN,UADA,IAEC,UAACC,GAAD,EAAMC,IAAN,EAAe;AACdhB,YAAAA,KAAK,CAACc,YAAN,WAA0BC,GAA1B,EAA+B,UAAAE,CAAC,EAAI;AAClCD,cAAAA,IAAI,CAACC,CAAD,EAAI,MAAKC,KAAL,CAAWC,KAAf,CAAJ;AACD,aAFD;AAGD,WARE;AASLC,UAAAA,oBAAoB,EAClBpB,KAAK,CAACc,YAAN,IACC,UAAAO,UAAU,EAAI;AACb;AACZ;AACA;AACA;AACY,gBAAMC,OAAO,GAAGD,UAAU,CAAC;AAAA,qBAAM,MAAKH,KAAL,CAAWC,KAAjB;AAAA,aAAD,CAA1B;AACAnB,YAAAA,KAAK,CAACc,YAAN,CAAmBS,GAAnB,CAAuBD,OAAvB;AACD,WAlBE;AAmBLd,UAAAA,OAAO,EAAE,MAAKC,aAnBT;AAoBLC,UAAAA,MAAM,EAAE,MAAKC,YApBR;AAqBLa,UAAAA,aAAa,EAAE,MAAKxB,KAAL,CAAWwB,aArBrB;AAsBLC,UAAAA,cAAc,EAAE,MAAKzB,KAAL,CAAWyB;AAtBtB,SANwC;AA8B/CC,QAAAA,OAAO,EAAE;AACP;AACR;AACA;AACA;AACQC,UAAAA,gBAAgB,EAAE3B,KAAK,CAAC2B,gBALjB;AAMPC,UAAAA,SAAS,EAAE5B,KAAK,CAAC6B,gBANV;AAOPC,UAAAA,MAAM,EAAE,kBAAM;AACZ,gBAAQC,QAAR,GAAqB/B,KAArB,CAAQ+B,QAAR;AAEA9C,YAAAA,GAAG,CAAC,UAAD,CAAH;;AACA,kBAAK+C,QAAL,CAAc;AAAEC,cAAAA,cAAc,EAAE,KAAlB;AAAyBC,cAAAA,WAAW,EAAE;AAAtC,aAAd;;AACA,kBAAKC,MAAL,CAAYC,IAAZ;;AAEA,gBAAIL,QAAQ,IAAI,MAAKb,KAAL,CAAWC,KAAX,CAAiBkB,SAAjB,CAA2BC,IAA3B,CAAgCC,MAAhC,KAA2C,CAA3D,EAA8D;AAC5D,oBAAKC,UAAL,CAAgB,IAAhB,EAAsBC,IAAtB,CAA2B,YAAM;AAC/B,sBAAKC,aAAL;AACD,eAFD;AAGD,aAJD,MAIO;AACL,oBAAKA,aAAL;AACD;AACF;AArBM,SA9BsC;AAqD/CC,QAAAA,KAAK,EAAE;AACLnC,UAAAA,OAAO,EAAE,mBAAM;AACbvB,YAAAA,GAAG,CAAC,oBAAD,CAAH;;AACA,kBAAKwB,aAAL;AACD,WAJI;AAKLC,UAAAA,MAAM,EAAE,kBAAM;AACZzB,YAAAA,GAAG,CAAC,mBAAD,CAAH;;AACA,kBAAK0B,YAAL;AACD;AARI,SArDwC;AA+D/CiC,QAAAA,YAAY,EAAE;AACZC,UAAAA,IAAI,EAAE5C,2BAA2B,CAAC4C,IADtB;AAEZpD,UAAAA,OAAO,EAAEQ,2BAA2B,CAACR,OAFzB;AAGZqD,UAAAA,gBAAgB,EAAE7C,2BAA2B,CAAC6C,gBAHlC;AAIZpD,UAAAA,eAAe,EAAEO,2BAA2B,CAACP,eAJjC;AAKZC,UAAAA,kBAAkB,EAAEM,2BAA2B,CAACN,kBALpC;AAMZoD,UAAAA,KAAK,EAAE9C,2BAA2B,CAAC8C,KANvB;AAOZvC,UAAAA,OAAO,EAAE,mBAAM;AACbvB,YAAAA,GAAG,CAAC,oBAAD,CAAH;;AACA,kBAAKwB,aAAL;AACD,WAVW;AAWZC,UAAAA,MAAM,EAAE,kBAAM;AACZzB,YAAAA,GAAG,CAAC,mBAAD,CAAH;;AACA,kBAAK0B,YAAL;AACD;AAdW,SA/DiC;AA+E/CqC,QAAAA,kBAAkB,EAAEhD,KAAK,CAACiD,uBA/EqB;AAgF/CC,QAAAA,KAAK,EAAE;AACLC,UAAAA,KAAK,EAAE,MAAKA,KADP;AAELC,UAAAA,YAAY,EAAE;AAAA,mBAAM,MAAKlC,KAAL,CAAWC,KAAX,CAAiBkC,MAAjB,EAAN;AAAA,WAFT;AAGLC,UAAAA,QAAQ,EAAE,MAAKA;AAHV;AAhFwC,OAAlC,CAAf;AAsFD,KA1GkB;;AAAA,mEA6JJ,UAAArC,CAAC,EAAI;AAClBhC,MAAAA,GAAG,CAAC,gBAAD,EAAmBgC,CAAC,IAAIA,CAAC,CAACsC,aAA1B,CAAH;AACA,UAAMC,MAAM,GAAGvC,CAAC,IAAIA,CAAC,CAACsC,aAAtB;AAEA,UAAME,IAAI,GAAGD,MAAM,GAAG,0BAASA,MAAT,EAAiB,MAAKtC,KAAL,CAAWC,KAA5B,CAAH,GAAwC,IAA3D;AACAlC,MAAAA,GAAG,CAAC,uBAAD,EAA0BwE,IAA1B,CAAH;;AACA,YAAKzB,QAAL,CAAc;AAAEE,QAAAA,WAAW,EAAEuB;AAAf,OAAd,EAAqC,YAAM;AACzC,cAAKjB,UAAL;AACD,OAFD;AAGD,KAtKkB;;AAAA,oEAwKH,UAAAvB,CAAC,EAAI;AACnBhC,MAAAA,GAAG,CAAC,iBAAD,EAAoBgC,CAAC,IAAIA,CAAC,CAACuC,MAA3B,CAAH;AACA,UAAMA,MAAM,GAAGvC,CAAC,IAAIA,CAAC,CAACuC,MAAtB;;AACA,UAAIA,MAAJ,EAAY;AACV,YAAMC,IAAI,GAAG,0BAASD,MAAT,EAAiB,MAAKtC,KAAL,CAAWC,KAA5B,CAAb;AACAlC,QAAAA,GAAG,CAAC,wBAAD,EAA2BwE,IAA3B,CAAH;AAEA,YAAMC,YAAY,GAAG,MAAKxC,KAAL,CAAWwC,YAAX,IAA2B,MAAKxC,KAAL,CAAWC,KAA3D;;AACA,cAAKa,QAAL,CAAc;AAAEE,UAAAA,WAAW,EAAEuB,IAAf;AAAqBC,UAAAA,YAAY,EAAZA;AAArB,SAAd;AACD,OAND,MAMO;AACL,cAAK1B,QAAL,CAAc;AAAEE,UAAAA,WAAW,EAAE;AAAf,SAAd;AACD;;AACD,YAAKyB,UAAL;AACD,KArLkB;;AAAA,kEAuLL,UAAAF,IAAI,EAAI;AACpB,YAAKtB,MAAL,CAAYkB,MAAZ,CAAmB,UAAAO,CAAC;AAAA,eAAIA,CAAC,CAACC,iBAAF,CAAoBJ,IAApB,CAAJ;AAAA,OAApB;;AACA,YAAKzB,QAAL,CAAc;AAAE8B,QAAAA,YAAY,EAAEL;AAAhB,OAAd;AACD,KA1LkB;;AAAA,oEA4LH,YAAM;AACpBxE,MAAAA,GAAG,CAAC,iBAAD,CAAH;;AACA,YAAK+C,QAAL,CAAc;AAAE0B,QAAAA,YAAY,EAAE,IAAhB;AAAsBxB,QAAAA,WAAW,EAAE;AAAnC,OAAd;;AACAjD,MAAAA,GAAG,CAAC,yBAAD,EAA4B,MAAKiC,KAAL,CAAWC,KAAvC,CAAH;;AACA,YAAKnB,KAAL,CAAWsD,QAAX,CAAoB,MAAKpC,KAAL,CAAWC,KAA/B,EAAsC,IAAtC;AACD,KAjMkB;;AAAA,iEA2MN,UAAA4C,OAAO,EAAI;AACtB,UAAQhC,QAAR,GAAqB,MAAK/B,KAA1B,CAAQ+B,QAAR;AACA,UACiBxC,MADjB,GAEI,MAAK2B,KAFT,CACEpB,WADF,CACiBP,MADjB;;AAIA,YAAKyC,QAAL,CAAc;AAAEC,QAAAA,cAAc,EAAE,KAAlB;AAAyBC,QAAAA,WAAW,EAAE;AAAtC,OAAd;;AAEA,UAAI,MAAKC,MAAT,EAAiB;AACf,cAAKA,MAAL,CAAYC,IAAZ;AACD;;AAED,UAAI7C,MAAM,KAAK,MAAf,EAAuB;AACrB,YAAIwC,QAAQ,IAAI,MAAKb,KAAL,CAAWC,KAAX,CAAiBkB,SAAjB,CAA2BC,IAA3B,CAAgCC,MAAhC,KAA2C,CAA3D,EAA8D;AAC5D,gBAAKC,UAAL,CAAgB,IAAhB,EAAsBC,IAAtB,CAA2B,YAAM;AAC/B,kBAAKC,aAAL;;AACAqB,YAAAA,OAAO;AACR,WAHD;AAID,SALD,MAKO;AACL,gBAAKrB,aAAL;;AACAqB,UAAAA,OAAO;AACR;AACF;AACF,KAlOkB;;AAAA,6DAoOV,UAAAC,KAAK,EAAI;AAChB/E,MAAAA,GAAG,CAAC,UAAD,CAAH;AACA,UAAMuE,MAAM,GAAGQ,KAAK,CAACT,aAArB;AAEA,UAAME,IAAI,GAAGD,MAAM,GAAG,0BAASA,MAAT,EAAiB,MAAKtC,KAAL,CAAWC,KAA5B,CAAH,GAAwC,IAA3D;AAEAlC,MAAAA,GAAG,CAAC,iBAAD,EAAoBwE,IAApB,CAAH;AAEA,aAAO,IAAIQ,OAAJ,CAAY,UAAAF,OAAO,EAAI;AAC5B,cAAK/B,QAAL,CAAc;AAAEE,UAAAA,WAAW,EAAEuB;AAAf,SAAd,EAAqC,MAAKS,UAAL,CAAgBC,IAAhB,gCAA2BJ,OAA3B,CAArC;;AACA,cAAK/D,KAAL,CAAWU,MAAX,CAAkBsD,KAAlB;AACD,OAHM,CAAP;AAID,KAhPkB;;AAAA,oEAkPH,UAAA/C,CAAC,EAAI;AACnB,UAAMmD,SAAS,GAAGC,QAAQ,CAACC,aAAT,uBAAqC,MAAKpD,KAAL,CAAWC,KAAX,CAAiBkD,QAAjB,CAA0BE,GAA/D,SAAlB;AAEAC,MAAAA,UAAU,CAAC,YAAM;AACf,YAAI,CAAC,MAAKC,UAAV,EAAsB;AACpB;AACD;;AAED,YAAMC,aAAa,GACjB,CAACN,SAAD,IAAcC,QAAQ,CAACM,aAAT,CAAuBC,OAAvB,qBAA2CR,SAAS,CAACS,SAArD,SADhB;AAEA,YAAMC,cAAc,GAClB,CAAC,MAAKC,UAAN,IACAV,QAAQ,CAACM,aAAT,CAAuBC,OAAvB,qBAA2C,MAAKG,UAAL,CAAgBF,SAA3D,SAFF;;AAGA,YAAMG,oBAAoB,GACxB,MAAKP,UAAL,CAAgBQ,QAAhB,CAAyBP,aAAzB,KAA2C,MAAKD,UAAL,CAAgBQ,QAAhB,CAAyBH,cAAzB,CAD7C;;AAGA,YAAI,CAACE,oBAAL,EAA2B;AACzBZ,UAAAA,SAAS,CAACc,mBAAV,CAA8B,MAA9B,EAAsC,MAAKC,aAA3C;;AACA,gBAAKzE,MAAL,CAAYO,CAAZ;AACD;AACF,OAjBS,EAiBP,EAjBO,CAAV;AAkBD,KAvQkB;;AAAA,8DAgRT;AAAA,aACR,IAAIgD,OAAJ,CAAY,UAAAF,OAAO,EAAI;AACrB,YAAMK,SAAS,GAAGC,QAAQ,CAACC,aAAT,uBAAqC,MAAKpD,KAAL,CAAWC,KAAX,CAAiBkD,QAAjB,CAA0BE,GAA/D,SAAlB;AAEAtF,QAAAA,GAAG,CAAC,WAAD,EAAcoF,QAAQ,CAACM,aAAvB,CAAH;AAEA;AACN;AACA;;AACM,YAAI,MAAKS,uBAAT,EAAkC;AAChC,sCAAsB,MAAKA,uBAA3B;AAAA,cAAQb,GAAR,yBAAQA,GAAR;AAAA,cAAac,IAAb,yBAAaA,IAAb;AACA,cAAMC,KAAK,GAAGjB,QAAQ,CAACC,aAAT,uBAAqCC,GAArC,SAAd;;AAEA,cAAIe,KAAJ,EAAW;AACT,gBAAIjC,MAAM,GAAG,MAAKnC,KAAL,CAAWC,KAAX,CAAiBkC,MAAjB,GAA0BkC,YAA1B,CAAuChB,GAAvC,EAA4C;AAAEc,cAAAA,IAAI,EAAJA;AAAF,aAA5C,CAAb;;AAEA,kBAAKrD,QAAL,CAAc;AAAEb,cAAAA,KAAK,EAAEkC,MAAM,CAAClC;AAAhB,aAAd,EAAuC,YAAM;AAC3C,oBAAKiE,uBAAL,GAA+B,IAA/B;AACD,aAFD;AAGD;AACF;AAED;AACN;AACA;AACA;AACA;AACA;;;AACM,YAAIhB,SAAS,KAAKC,QAAQ,CAACM,aAA3B,EAA0C;AACxCP,UAAAA,SAAS,CAACc,mBAAV,CAA8B,MAA9B,EAAsC,MAAKC,aAA3C;AACAf,UAAAA,SAAS,CAACoB,gBAAV,CAA2B,MAA3B,EAAmC,MAAKL,aAAxC;AACD;;AAED,cAAKxB,UAAL;;AACA,cAAK3D,KAAL,CAAWQ,OAAX;;AAEAuD,QAAAA,OAAO;AACR,OApCD,CADQ;AAAA,KAhRS;;AAAA,iEAuTN,YAAM;AACjB9E,MAAAA,GAAG,CAAC,cAAD,CAAH;;AACA,UAAI,CAAC,MAAKiC,KAAL,CAAWwC,YAAhB,EAA8B;AAC5B,cAAK1B,QAAL,CAAc;AAAE0B,UAAAA,YAAY,EAAE,MAAKxC,KAAL,CAAWC;AAA3B,SAAd;AACD;AACF,KA5TkB;;AAAA,iEAiUN,UAAAsE,KAAK,EAAI;AACpB,wBAA+B,MAAKvE,KAApC;AAAA,UAAQC,KAAR,eAAQA,KAAR;AAAA,UAAee,WAAf,eAAeA,WAAf;;AAEA,UAAMwD,SAAS,GAAG,MAAKvF,OAAL,CAAawF,MAAb,CAAoB,UAACC,CAAD,EAAIC,CAAJ,EAAU;AAC9C,eAAOD,CAAC,IAAKC,CAAC,CAACH,SAAF,IAAeG,CAAC,CAACH,SAAF,CAAY,MAAKxE,KAAL,CAAWC,KAAvB,CAA5B;AACD,OAFiB,EAEf,KAFe,CAAlB;;AAIAlC,MAAAA,GAAG,CAAC,cAAD,EAAiBkC,KAAK,CAAC2E,SAAvB,EAAkC5D,WAAlC,EAA+C,aAA/C,EAA8DwD,SAA9D,CAAH;;AACA,UAAK,MAAKxE,KAAL,CAAWwC,YAAX,IAA2B,CAACvC,KAAK,CAAC2E,SAAlC,IAA+C,CAAC5D,WAAhD,IAA+D,CAACwD,SAAjE,IAA+ED,KAAnF,EAA0F;AACxFxG,QAAAA,GAAG,CAAC,2BAAD,CAAH;AACAA,QAAAA,GAAG,CAAC,SAAD,EAAY,MAAKiC,KAAL,CAAWwC,YAAX,CAAwBW,QAAxB,CAAiC0B,QAAjC,EAAZ,CAAH;AACA9G,QAAAA,GAAG,CAAC,SAAD,EAAY,MAAKiC,KAAL,CAAWC,KAAX,CAAiBkD,QAAjB,CAA0B0B,QAA1B,EAAZ,CAAH;;AAEA,YAAMC,QAAQ,GAAGC,aAAMC,QAAN,CAAe,MAAKhF,KAAL,CAAWwC,YAAX,CAAwByC,MAAxB,EAAf,CAAjB;;AAEAlH,QAAAA,GAAG,CAAC,YAAD,EAAe+G,QAAQ,CAAC3B,QAAxB,CAAH;AACA,eAAO,IAAIJ,OAAJ,CAAY,UAAAF,OAAO,EAAI;AAC5BS,UAAAA,UAAU,CAAC,YAAM;AACf,kBAAKxC,QAAL,CAAc;AAAEb,cAAAA,KAAK,EAAE6E,QAAT;AAAmBtC,cAAAA,YAAY,EAAE;AAAjC,aAAd,EAAuD,YAAM;AAC3DzE,cAAAA,GAAG,CAAC,aAAD,EAAgB,MAAKiC,KAAL,CAAWC,KAAX,CAAiBkD,QAAjB,CAA0B8B,MAA1B,EAAhB,CAAH;AACApC,cAAAA,OAAO;AACR,aAHD;AAID,WALS,EAKP,EALO,CAAV;AAMD,SAPM,CAAP;AAQD,OAhBD,MAgBO;AACL,eAAOE,OAAO,CAACF,OAAR,CAAgB,EAAhB,CAAP;AACD;AACF,KA5VkB;;AAAA,+DA8VR,UAACV,MAAD,EAASrC,IAAT,EAAkB;AAC3B/B,MAAAA,GAAG,CAAC,YAAD,CAAH;AAEA,UAAQkC,KAAR,GAAkBkC,MAAlB,CAAQlC,KAAR;AACA,UAAQiF,eAAR,GAA4B,MAAKpG,KAAjC,CAAQoG,eAAR;;AAEA,UACEjF,KAAK,IACLA,KAAK,CAACkD,QADN,IAEAlD,KAAK,CAACkD,QAAN,CAAe/B,IAFf,IAGAnB,KAAK,CAACkD,QAAN,CAAe/B,IAAf,CAAoBC,MAApB,GAA6B6D,eAJ/B,EAKE;AACA;AACD;;AAED,YAAKpE,QAAL,CAAc;AAAEb,QAAAA,KAAK,EAALA;AAAF,OAAd,EAAyB,YAAM;AAC7BlC,QAAAA,GAAG,CAAC,yBAAD,CAAH;;AAEA,YAAI+B,IAAJ,EAAU;AACRA,UAAAA,IAAI;AACL;AACF,OAND;AAOD,KApXkB;;AAAA,kEA+XL,UAAAqF,CAAC,EAAI;AACjB,UAAI,CAACA,CAAL,EAAQ;AACN;AACD;;AAED,UAAI,OAAOA,CAAP,KAAa,QAAjB,EAA2B;AACzB,YAAIA,CAAC,CAACC,QAAF,CAAW,GAAX,CAAJ,EAAqB;AACnB,iBAAOC,SAAP;AACD,SAFD,MAEO,IAAIF,CAAC,CAACC,QAAF,CAAW,IAAX,KAAoBD,CAAC,CAACC,QAAF,CAAW,IAAX,CAApB,IAAwCD,CAAC,CAACC,QAAF,CAAW,IAAX,CAA5C,EAA8D;AACnE,iBAAOD,CAAP;AACD,SAFM,MAEA;AACL,cAAMlF,KAAK,GAAGqF,QAAQ,CAACH,CAAD,EAAI,EAAJ,CAAtB;AACA,iBAAOI,KAAK,CAACtF,KAAD,CAAL,GAAeA,KAAf,aAA0BA,KAA1B,OAAP;AACD;AACF;;AACD,UAAI,OAAOkF,CAAP,KAAa,QAAjB,EAA2B;AACzB,yBAAUA,CAAV;AACD;;AAED;AACD,KAnZkB;;AAAA,mEAgaJ,UAAA5C,IAAI,EAAI;AACrB,UAAIA,IAAI,CAACiD,MAAL,KAAgB,OAApB,EAA6B;AAE7B,UAAMC,IAAI,GAAGlD,IAAI,CAACmD,KAAL,CAAWD,IAAX,EAAb;AACA,UAAI,CAACA,IAAL,EAAW;AAEX,UAAIA,IAAI,CAAC9D,IAAL,KAAc,OAAlB,EAA2B;AAE3B5D,MAAAA,GAAG,CAAC,gCAAD,CAAH;AAEA,UAAM4H,MAAM,GAAGF,IAAI,CAACG,SAAL,CAAeH,IAAI,CAACpC,GAApB,CAAf;;AACA,UAAMsB,CAAC,GAAGkB,aAAMD,SAAN,CAAgBH,IAAI,CAACpC,GAArB,CAAV;;AACAtF,MAAAA,GAAG,CAAC,wBAAD,EAA2B4H,MAA3B,EAAmChB,CAAnC,CAAH;AAEA,aAAOU,SAAP;AACD,KA/akB;;AAAA,iEAibN,UAAChC,GAAD,EAAMc,IAAN,EAAe;AAC1BpG,MAAAA,GAAG,CAAC,mBAAD,EAAsBsF,GAAtB,EAA2Bc,IAA3B,CAAH;AAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEI;AACA;;AAEA,YAAKD,uBAAL,GAA+B;AAAEb,QAAAA,GAAG,EAAHA,GAAF;AAAOc,QAAAA,IAAI,EAAJA;AAAP,OAA/B;AACD,KAlckB;;AAAA,4DAocX,UAAC2B,GAAD,EAAMvD,IAAN,EAAe;AACrB,UAAMtE,QAAQ,GAAG6H,GAAG,IAAI,KAAxB;;AAEA,YAAKhH,KAAL,CAAWmD,KAAX,CAAiBhE,QAAjB,EAA2BsE,IAA3B;AACD,KAxckB;;AAEjB,UAAKvC,KAAL,GAAa;AACXC,MAAAA,KAAK,EAAEnB,MAAK,CAACmB,KADF;AAEXrB,MAAAA,WAAW,EAAED,iBAAiB,CAACG,MAAK,CAACF,WAAP;AAFnB,KAAb;;AAKA,UAAKmH,QAAL,GAAgB,YAAM;AACpBjH,MAAAA,MAAK,CAACsD,QAAN,CAAe,MAAKpC,KAAL,CAAWC,KAA1B,EAAiC,IAAjC;AACD,KAFD;;AAIA,UAAK+F,aAAL,CAAmB,MAAKlH,KAAxB;;AAXiB;AAYlB;;;;WAgGD,6BAAoB;AAAA;;AAClB;AACA,WAAKA,KAAL,CAAWmH,KAAX,CAAiB,IAAjB;AAEAC,MAAAA,MAAM,CAAC5B,gBAAP,CAAwB,QAAxB,EAAkC,KAAKyB,QAAvC;;AAEA,UAAI,KAAK9E,MAAL,IAAe,KAAKnC,KAAL,CAAWqH,SAA9B,EAAyC;AACvCpD,QAAAA,OAAO,CAACF,OAAR,GAAkBtB,IAAlB,CAAuB,YAAM;AAC3B,cAAI,MAAI,CAACN,MAAT,EAAiB;AACf,gBAAMiC,SAAS,GAAGC,QAAQ,CAACC,aAAT,uBACF,MAAI,CAACnC,MAAL,CAAYhB,KAAZ,CAAkBkD,QAAlB,CAA2BE,GADzB,SAAlB;;AAIA,YAAA,MAAI,CAACpC,MAAL,CAAYgB,KAAZ;;AAEA,gBAAIiB,SAAJ,EAAe;AACbA,cAAAA,SAAS,CAACjB,KAAV;AACD;AACF;AACF,SAZD;AAaD;AACF;;;WAED,mCAA0BmE,SAA1B,EAAqC;AACnC,UAAQxH,WAAR,GAAwB,KAAKoB,KAA7B,CAAQpB,WAAR;AACA,UAAMyH,cAAc,GAAG1H,iBAAiB,CAACyH,SAAS,CAACxH,WAAX,CAAxC;;AAEA,UAAI,CAAC,yBAAQyH,cAAR,EAAwBzH,WAAxB,CAAL,EAA2C;AACzC,aAAKkC,QAAL,CAAc;AACZlC,UAAAA,WAAW,EAAEyH;AADD,SAAd;AAGD;;AAED,UAAI,CAAC,yBAAQD,SAAS,CAACrE,uBAAlB,EAA2C,KAAKjD,KAAL,CAAWiD,uBAAtD,CAAL,EAAqF;AACnF,aAAKiE,aAAL,CAAmBI,SAAnB;AACD;AACF;;;WAED,8BAAqB;AACnB;AACA;AACA,UAAME,YAAY,GAAGnD,QAAQ,CAACoD,gBAAT,CAA0B,6BAA1B,CAArB;AAEAC,MAAAA,KAAK,CAACC,IAAN,CAAWH,YAAX,EAAyBI,OAAzB,CAAiC,UAAAC,EAAE,EAAI;AACrCA,QAAAA,EAAE,CAACC,KAAH,CAASC,QAAT,GAAoB,KAApB;AACAF,QAAAA,EAAE,CAACC,KAAH,CAASE,OAAT,GAAmB,cAAnB;AACD,OAHD;AAID;;;;AAwCD;AACF;AACA;AACE,oCAAuB;AACrBZ,MAAAA,MAAM,CAAClC,mBAAP,CAA2B,QAA3B,EAAqC,KAAK+B,QAA1C;AACD,K,CAED;;;;WA4KA,0CAAiCjH,KAAjC,EAAwC;AACtC,UAAI,CAACA,KAAK,CAACmB,KAAN,CAAYkD,QAAZ,CAAqB4D,MAArB,CAA4B,KAAKjI,KAAL,CAAWmB,KAAX,CAAiBkD,QAA7C,CAAL,EAA6D;AAC3D,aAAKrC,QAAL,CAAc;AACZmB,UAAAA,KAAK,EAAE,KADK;AAEZhC,UAAAA,KAAK,EAAEnB,KAAK,CAACmB;AAFD,SAAd;AAID;AACF;;;WAwBD,0BAAiB;AACf,wBAAgD,KAAKnB,KAArD;AAAA,UAAQkI,KAAR,eAAQA,KAAR;AAAA,UAAeC,SAAf,eAAeA,SAAf;AAAA,UAA0BC,MAA1B,eAA0BA,MAA1B;AAAA,UAAkCC,SAAlC,eAAkCA,SAAlC;AAEA,aAAO;AACLH,QAAAA,KAAK,EAAE,KAAKI,WAAL,CAAiBJ,KAAjB,CADF;AAELE,QAAAA,MAAM,EAAE,KAAKE,WAAL,CAAiBF,MAAjB,CAFH;AAGLD,QAAAA,SAAS,EAAE,KAAKG,WAAL,CAAiBH,SAAjB,CAHN;AAILE,QAAAA,SAAS,EAAE,KAAKC,WAAL,CAAiBD,SAAjB;AAJN,OAAP;AAMD;;;WA4CD,kBAAS;AAAA;AAAA;;AACP,yBASI,KAAKrI,KATT;AAAA,UACEuI,QADF,gBACEA,QADF;AAAA,UAEEC,UAFF,gBAEEA,UAFF;AAAA,UAGEC,cAHF,gBAGEA,cAHF;AAAA,UAIEC,OAJF,gBAIEA,OAJF;AAAA,UAKE7D,SALF,gBAKEA,SALF;AAAA,UAME8D,WANF,gBAMEA,WANF;AAAA,UAOEC,WAPF,gBAOEA,WAPF;AAAA,UAQEC,SARF,gBAQEA,SARF;AAWA,yBAA4C,KAAK3H,KAAjD;AAAA,UAAQC,KAAR,gBAAQA,KAAR;AAAA,UAAee,WAAf,gBAAeA,WAAf;AAAA,UAA4BpC,WAA5B,gBAA4BA,WAA5B;AAEAb,MAAAA,GAAG,CAAC,kBAAD,EAAqBkC,KAArB,CAAH;AACA,UAAM2H,SAAS,GAAG,KAAKC,cAAL,EAAlB;AACA,UAAMC,KAAK,GAAG,4EAETN,OAAO,CAACO,MAFC,EAEQR,cAFR,gCAGTC,OAAO,CAACQ,YAHC,EAGcpJ,WAAW,CAACT,aAAZ,IAA6BS,WAAW,CAACX,QAAZ,KAAyB,KAHpE,iBAKZ0F,SALY,CAAd;AAQA,0BACE;AACE,QAAA,GAAG,EAAE,aAAAsE,IAAG;AAAA,iBAAK,MAAI,CAAC1E,UAAL,GAAkB0E,IAAvB;AAAA,SADV;AAEE,QAAA,KAAK,EAAE;AAAEjB,UAAAA,KAAK,EAAEY,SAAS,CAACZ;AAAnB,SAFT;AAGE,QAAA,SAAS,EAAEc;AAHb,sBAKE,gCAAC,kBAAD;AACE,QAAA,OAAO,EAAE,KAAK7I,OADhB;AAEE,QAAA,QAAQ,EAAE,kBAAAiJ,CAAC,EAAI;AACb,cAAIA,CAAJ,EAAO;AACL,YAAA,MAAI,CAACC,WAAL,GAAmBD,CAAnB;AACD;AACF,SANH;AAOE,QAAA,GAAG,EAAE,aAAAA,CAAC;AAAA,iBAAK,MAAI,CAACjH,MAAL,GAAciH,CAAC,IAAI,MAAI,CAACpJ,KAAL,CAAWsJ,SAAX,CAAqBF,CAArB,CAAxB;AAAA,SAPR;AAQE,QAAA,UAAU,EAAE,oBAAAA,CAAC,EAAI;AACf,cAAIA,CAAJ,EAAO;AACL,YAAA,MAAI,CAACrE,UAAL,GAAkBqE,CAAlB;AACD;AACF,SAZH;AAaE,QAAA,KAAK,EAAEjI,KAbT;AAcE,QAAA,KAAK,EAAE,KAAKgC,KAdd;AAeE,QAAA,SAAS,EAAE0F,SAfb;AAgBE,QAAA,QAAQ,EAAE,KAAKvF,QAhBjB;AAiBE,QAAA,MAAM,EAAE,KAAK5C,MAjBf;AAkBE,QAAA,OAAO,EAAE,KAAKF,OAlBhB;AAmBE,QAAA,aAAa,EAAE,KAAKkC,aAnBtB;AAoBE,QAAA,WAAW,EAAER,WApBf;AAqBE,QAAA,SAAS,EAAE,KAAKqH,SArBlB;AAsBE,QAAA,QAAQ,EAAEhB,QAtBZ;AAuBE,QAAA,UAAU,EAAEC,UAvBd;AAwBE,QAAA,SAAS,EAAEE,OAAO,CAACW,WAxBrB;AAyBE,QAAA,KAAK,EAAE;AACLlB,UAAAA,SAAS,EAAEW,SAAS,CAACX,SADhB;AAELC,UAAAA,MAAM,EAAEU,SAAS,CAACV,MAFb;AAGLC,UAAAA,SAAS,EAAES,SAAS,CAACT;AAHhB,SAzBT;AA8BE,QAAA,WAAW,EAAEO,WA9Bf;AA+BE,QAAA,WAAW,EAAE9I,WA/Bf;AAgCE,QAAA,WAAW,EAAE6I,WAhCf;AAiCE,QAAA,YAAY,EAAE,KAAKa;AAjCrB,QALF,CADF;AA2CD;;;;EAtlByBC,kBAAMC,S,GAylBlC;;;;;gBAzlBa3J,M,eACQ;AACjBsH,EAAAA,SAAS,EAAEsC,sBAAUC,IADJ;AAEjBN,EAAAA,SAAS,EAAEK,sBAAUE,IAAV,CAAeC,UAFT;AAGjB3C,EAAAA,KAAK,EAAEwC,sBAAUE,IAAV,CAAeC,UAHL;AAIjBxG,EAAAA,QAAQ,EAAEqG,sBAAUE,IAAV,CAAeC,UAJR;AAKjBtJ,EAAAA,OAAO,EAAEmJ,sBAAUE,IALF;AAMjBnJ,EAAAA,MAAM,EAAEiJ,sBAAUE,IAND;AAOjBhB,EAAAA,SAAS,EAAEc,sBAAUE,IAPJ;AAQjB1G,EAAAA,KAAK,EAAEwG,sBAAUE,IAAV,CAAeC,UARL;AASjB3I,EAAAA,KAAK,EAAE4I,2BAAW5I,KAAX,CAAiB2I,UATP;AAUjBhJ,EAAAA,YAAY,EAAE6I,sBAAUjD,MAVP;AAWjBN,EAAAA,eAAe,EAAEuD,sBAAUK,MAXV;AAYjB9B,EAAAA,KAAK,EAAEyB,sBAAUM,SAAV,CAAoB,CAACN,sBAAUO,MAAX,EAAmBP,sBAAUK,MAA7B,CAApB,CAZU;AAajB5B,EAAAA,MAAM,EAAEuB,sBAAUM,SAAV,CAAoB,CAACN,sBAAUO,MAAX,EAAmBP,sBAAUK,MAA7B,CAApB,CAbS;AAcjB7B,EAAAA,SAAS,EAAEwB,sBAAUM,SAAV,CAAoB,CAACN,sBAAUO,MAAX,EAAmBP,sBAAUK,MAA7B,CAApB,CAdM;AAejB3B,EAAAA,SAAS,EAAEsB,sBAAUM,SAAV,CAAoB,CAACN,sBAAUO,MAAX,EAAmBP,sBAAUK,MAA7B,CAApB,CAfM;AAgBjBtB,EAAAA,OAAO,EAAEiB,sBAAUjD,MAAV,CAAiBoD,UAhBT;AAiBjBrB,EAAAA,cAAc,EAAEkB,sBAAUC,IAjBT;AAkBjBrB,EAAAA,QAAQ,EAAEoB,sBAAUC,IAlBH;AAmBjBpB,EAAAA,UAAU,EAAEmB,sBAAUC,IAnBL;AAoBjB7H,EAAAA,QAAQ,EAAE4H,sBAAUC,IApBH;AAqBjBjI,EAAAA,gBAAgB,EAAEgI,sBAAUC,IArBX;AAsBjB/H,EAAAA,gBAAgB,EAAE8H,sBAAUC,IAtBX;AAuBjBhB,EAAAA,WAAW,EAAEe,sBAAUQ,GAvBN;AAwBjBxB,EAAAA,WAAW,EAAEgB,sBAAUO,MAxBN;AAyBjBhK,EAAAA,iBAAiB,EAAEyJ,sBAAUS,KAAV,CAAgB;AACjCvH,IAAAA,IAAI,EAAE8G,sBAAUU,KAAV,CAAgB,CACpB,+BADoB,EAEpB,iBAFoB,EAGpB,mBAHoB,CAAhB,CAD2B;AAMjC5K,IAAAA,OAAO,EAAEkK,sBAAUjD,MANc;AAOjChH,IAAAA,eAAe,EAAEiK,sBAAUE,IAPM;AAQjClK,IAAAA,kBAAkB,EAAEgK,sBAAUE;AARG,GAAhB,CAzBF;AAmCjB5G,EAAAA,uBAAuB,EAAE0G,sBAAUW,OAAV,CACvBX,sBAAUS,KAAV,CAAgB;AACdG,IAAAA,QAAQ,EAAEZ,sBAAUO,MADN;AAEdM,IAAAA,aAAa,EAAEb,sBAAUO,MAFX;AAGdO,IAAAA,UAAU,EAAEd,sBAAUW,OAAV,CAAkBX,sBAAUW,OAAV,CAAkBX,sBAAUO,MAA5B,CAAlB;AAHE,GAAhB,CADuB,CAnCR;AA0CjBpK,EAAAA,WAAW,EAAE6J,sBAAUS,KAAV,CAAgB;AAC3BjL,IAAAA,QAAQ,EAAEwK,sBAAUU,KAAV,CAAgB,CAAC,QAAD,EAAW,KAAX,CAAhB,CADiB;AAE3BjL,IAAAA,SAAS,EAAEuK,sBAAUU,KAAV,CAAgB,CAAC,MAAD,EAAS,OAAT,CAAhB,CAFgB;AAG3BhL,IAAAA,aAAa,EAAEsK,sBAAUC,IAHE;AAI3BtK,IAAAA,QAAQ,EAAEqK,sBAAUC,IAJO;AAK3BrK,IAAAA,MAAM,EAAEoK,sBAAUO;AALS,GAAhB,CA1CI;AAiDjB9J,EAAAA,aAAa,EAAEuJ,sBAAUW,OAAV,CAAkB,UAAAI,MAAM,EAAI;AACzC,QAAMC,QAAQ,GAAGD,MAAM,CAACE,KAAP,CAAa,UAAAvE,CAAC;AAAA,aAAIwE,qBAAYC,QAAZ,CAAqBzE,CAArB,CAAJ;AAAA,KAAd,CAAjB;AAEA,WACE,CAACsE,QAAD,IACA,IAAII,KAAJ,2BAA6BL,MAA7B,sCAA+DG,qBAAYG,IAAZ,CAAiB,GAAjB,CAA/D,OAFF;AAID,GAPc,CAjDE;AAyDjBnG,EAAAA,SAAS,EAAE8E,sBAAUO,MAzDJ;AA0DjB1I,EAAAA,aAAa,EAAEmI,sBAAUK,MA1DR;AA2DjBvI,EAAAA,cAAc,EAAEkI,sBAAUK;AA3DT,C;;gBADRjK,M,kBA+DW;AACpB4B,EAAAA,gBAAgB,EAAE,IADE;AAEpBnB,EAAAA,OAAO,EAAE,mBAAM,CAAE,CAFG;AAGpBE,EAAAA,MAAM,EAAE,kBAAM,CAAE,CAHI;AAIpBmI,EAAAA,SAAS,EAAE,qBAAM,CAAE,CAJC;AAKpB/I,EAAAA,WAAW,EAAEZ,kBALO;AAMpBgB,EAAAA,iBAAiB,EAAEV,wBANC;AAOpByD,EAAAA,uBAAuB,EAAErD;AAPL,C;;AA2hBxB,IAAMqL,MAAM,GAAG;AACbhC,EAAAA,MAAM,EAAE;AACNiC,IAAAA,eAAe,EAAE;AADX,GADK;AAIb7B,EAAAA,WAAW,EAAE;AACX8B,IAAAA,UAAU,EAAE,oBADD;AAGX,eAAW;AACTC,MAAAA,WAAW,EAAE,OADJ;AAETlD,MAAAA,KAAK,EAAE,MAFE;AAGTmD,MAAAA,cAAc,EAAE,UAHP;AAITC,MAAAA,KAAK,EAAEA,gBAAMhJ,IAAN,EAJE;AAKT4I,MAAAA,eAAe,EAAEI,gBAAMC,UAAN;AALR,KAHA;AAUX,oCAAgC;AAC9BC,MAAAA,SAAS,EAAE,mBADmB,CAE9B;AACA;AACA;AACA;;AAL8B,KAVrB;AAiBX,gBAAY;AACVC,MAAAA,OAAO,EAAE,UADC;AAEVC,MAAAA,SAAS,EAAE;AAFD,KAjBD;AAqBX,wCAAoC;AAClCC,MAAAA,MAAM,EAAE;AAD0B;AArBzB,GAJA;AA6BbzC,EAAAA,YAAY,EAAE;AACZ0C,IAAAA,SAAS,EAAE;AADC;AA7BD,CAAf;;eAkCe,wBAAWX,MAAX,EAAmBlL,MAAnB,C","sourcesContent":["import { Editor as SlateEditor, findNode } from 'slate-react';\nimport SlateTypes from 'slate-prop-types';\n\nimport isEqual from 'lodash/isEqual';\nimport * as serialization from './serialization';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport { Value, Block } from 'slate';\nimport { buildPlugins, ALL_PLUGINS, DEFAULT_PLUGINS } from './plugins';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\nimport { color } from '@pie-lib/render-ui';\n\nexport { ALL_PLUGINS, DEFAULT_PLUGINS, serialization };\n\nconst log = debug('editable-html:editor');\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur'\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {}\n};\n\nconst defaultLanguageCharactersProps = [];\n\nconst createToolbarOpts = toolbarOpts => {\n return {\n ...defaultToolbarOpts,\n ...toolbarOpts\n };\n};\n\nexport class Editor extends React.Component {\n static propTypes = {\n autoFocus: PropTypes.bool,\n editorRef: PropTypes.func.isRequired,\n onRef: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n onKeyDown: PropTypes.func,\n focus: PropTypes.func.isRequired,\n value: SlateTypes.value.isRequired,\n imageSupport: PropTypes.object,\n charactersLimit: PropTypes.number,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n minHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n classes: PropTypes.object.isRequired,\n highlightShape: PropTypes.bool,\n disabled: PropTypes.bool,\n spellCheck: PropTypes.bool,\n nonEmpty: PropTypes.bool,\n disableUnderline: PropTypes.bool,\n autoWidthToolbar: PropTypes.bool,\n pluginProps: PropTypes.any,\n placeholder: PropTypes.string,\n responseAreaProps: PropTypes.shape({\n type: PropTypes.oneOf([\n 'explicit-constructed-response',\n 'inline-dropdown',\n 'drag-in-the-blank'\n ]),\n options: PropTypes.object,\n respAreaToolbar: PropTypes.func,\n onHandleAreaChange: PropTypes.func\n }),\n languageCharactersProps: PropTypes.arrayOf(\n PropTypes.shape({\n language: PropTypes.string,\n characterIcon: PropTypes.string,\n characters: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string))\n })\n ),\n toolbarOpts: PropTypes.shape({\n position: PropTypes.oneOf(['bottom', 'top']),\n alignment: PropTypes.oneOf(['left', 'right']),\n alwaysVisible: PropTypes.bool,\n showDone: PropTypes.bool,\n doneOn: PropTypes.string\n }),\n activePlugins: PropTypes.arrayOf(values => {\n const allValid = values.every(v => ALL_PLUGINS.includes(v));\n\n return (\n !allValid &&\n new Error(`Invalid values: ${values}, values must be one of [${ALL_PLUGINS.join(',')}]`)\n );\n }),\n className: PropTypes.string,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n };\n\n static defaultProps = {\n disableUnderline: true,\n onFocus: () => {},\n onBlur: () => {},\n onKeyDown: () => {},\n toolbarOpts: defaultToolbarOpts,\n responseAreaProps: defaultResponseAreaProps,\n languageCharactersProps: defaultLanguageCharactersProps\n };\n\n constructor(props) {\n super(props);\n this.state = {\n value: props.value,\n toolbarOpts: createToolbarOpts(props.toolbarOpts)\n };\n\n this.onResize = () => {\n props.onChange(this.state.value, true);\n };\n\n this.handlePlugins(this.props);\n }\n\n handlePlugins = props => {\n const normalizedResponseAreaProps = {\n ...defaultResponseAreaProps,\n ...props.responseAreaProps\n };\n\n this.plugins = buildPlugins(props.activePlugins, {\n math: {\n onClick: this.onMathClick,\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur\n },\n image: {\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((src, done) => {\n props.imageSupport.delete(src, e => {\n done(e, this.state.value);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n (getHandler => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(() => this.state.value);\n props.imageSupport.add(handler);\n }),\n onFocus: this.onPluginFocus,\n onBlur: this.onPluginBlur,\n maxImageWidth: this.props.maxImageWidth,\n maxImageHeight: this.props.maxImageHeight,\n },\n toolbar: {\n /**\n * To minimize converting html -> state -> html\n * We only emit markup once 'done' is clicked.\n */\n disableUnderline: props.disableUnderline,\n autoWidth: props.autoWidthToolbar,\n onDone: () => {\n const { nonEmpty } = props;\n\n log('[onDone]');\n this.setState({ toolbarInFocus: false, focusedNode: null });\n this.editor.blur();\n\n if (nonEmpty && this.state.value.startText.text.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n });\n } else {\n this.onEditingDone();\n }\n }\n },\n table: {\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n }\n },\n responseArea: {\n type: normalizedResponseAreaProps.type,\n options: normalizedResponseAreaProps.options,\n maxResponseAreas: normalizedResponseAreaProps.maxResponseAreas,\n respAreaToolbar: normalizedResponseAreaProps.respAreaToolbar,\n onHandleAreaChange: normalizedResponseAreaProps.onHandleAreaChange,\n error: normalizedResponseAreaProps.error,\n onFocus: () => {\n log('[table:onFocus]...');\n this.onPluginFocus();\n },\n onBlur: () => {\n log('[table:onBlur]...');\n this.onPluginBlur();\n }\n },\n languageCharacters: props.languageCharactersProps,\n media: {\n focus: this.focus,\n createChange: () => this.state.value.change(),\n onChange: this.onChange\n }\n });\n };\n\n componentDidMount() {\n // onRef is needed to get the ref of the component because we export it using withStyles\n this.props.onRef(this);\n\n window.addEventListener('resize', this.onResize);\n\n if (this.editor && this.props.autoFocus) {\n Promise.resolve().then(() => {\n if (this.editor) {\n const editorDOM = document.querySelector(\n `[data-key=\"${this.editor.value.document.key}\"]`\n );\n\n this.editor.focus();\n\n if (editorDOM) {\n editorDOM.focus();\n }\n }\n });\n }\n }\n\n componentWillReceiveProps(nextProps) {\n const { toolbarOpts } = this.state;\n const newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts);\n\n if (!isEqual(newToolbarOpts, toolbarOpts)) {\n this.setState({\n toolbarOpts: newToolbarOpts\n });\n }\n\n if (!isEqual(nextProps.languageCharactersProps, this.props.languageCharactersProps)) {\n this.handlePlugins(nextProps);\n }\n }\n\n componentDidUpdate() {\n // The cursor is on a zero width element and when that is placed near void elements, it is not visible\n // so we increase the width to at least 2px in order for the user to see it\n const zeroWidthEls = document.querySelectorAll('[data-slate-zero-width=\"z\"]');\n\n Array.from(zeroWidthEls).forEach(el => {\n el.style.minWidth = '2px';\n el.style.display = 'inline-block';\n });\n }\n\n onPluginBlur = e => {\n log('[onPluginBlur]', e && e.relatedTarget);\n const target = e && e.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n log('[onPluginBlur] node: ', node);\n this.setState({ focusedNode: node }, () => {\n this.resetValue();\n });\n };\n\n onPluginFocus = e => {\n log('[onPluginFocus]', e && e.target);\n const target = e && e.target;\n if (target) {\n const node = findNode(target, this.state.value);\n log('[onPluginFocus] node: ', node);\n\n const stashedValue = this.state.stashedValue || this.state.value;\n this.setState({ focusedNode: node, stashedValue });\n } else {\n this.setState({ focusedNode: null });\n }\n this.stashValue();\n };\n\n onMathClick = node => {\n this.editor.change(c => c.collapseToStartOf(node));\n this.setState({ selectedNode: node });\n };\n\n onEditingDone = () => {\n log('[onEditingDone]');\n this.setState({ stashedValue: null, focusedNode: null });\n log('[onEditingDone] value: ', this.state.value);\n this.props.onChange(this.state.value, true);\n };\n\n /**\n * Remove onResize event listener\n */\n componentWillUnmount() {\n window.removeEventListener('resize', this.onResize);\n }\n\n // Allowing time for onChange to take effect if it is called\n handleBlur = resolve => {\n const { nonEmpty } = this.props;\n const {\n toolbarOpts: { doneOn }\n } = this.state;\n\n this.setState({ toolbarInFocus: false, focusedNode: null });\n\n if (this.editor) {\n this.editor.blur();\n }\n\n if (doneOn === 'blur') {\n if (nonEmpty && this.state.value.startText.text.length === 0) {\n this.resetValue(true).then(() => {\n this.onEditingDone();\n resolve();\n });\n } else {\n this.onEditingDone();\n resolve();\n }\n }\n };\n\n onBlur = event => {\n log('[onBlur]');\n const target = event.relatedTarget;\n\n const node = target ? findNode(target, this.state.value) : null;\n\n log('[onBlur] node: ', node);\n\n return new Promise(resolve => {\n this.setState({ focusedNode: node }, this.handleBlur.bind(this, resolve));\n this.props.onBlur(event);\n });\n };\n\n handleDomBlur = e => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n setTimeout(() => {\n if (!this.wrapperRef) {\n return;\n }\n\n const editorElement =\n !editorDOM || document.activeElement.closest(`[class*=\"${editorDOM.className}\"]`);\n const toolbarElement =\n !this.toolbarRef ||\n document.activeElement.closest(`[class*=\"${this.toolbarRef.className}\"]`);\n const isInCurrentComponent =\n this.wrapperRef.contains(editorElement) || this.wrapperRef.contains(toolbarElement);\n\n if (!isInCurrentComponent) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n this.onBlur(e);\n }\n }, 50);\n };\n\n /*\n * Needs to be wrapped otherwise it causes issues because of race conditions\n * Known issue for slatejs. See: https://github.com/ianstormtaylor/slate/issues/2097\n * Using timeout I wasn't able to test this\n *\n * Note: The use of promises has been causing issues with MathQuill\n * */\n onFocus = () =>\n new Promise(resolve => {\n const editorDOM = document.querySelector(`[data-key=\"${this.state.value.document.key}\"]`);\n\n log('[onFocus]', document.activeElement);\n\n /**\n * This is a temporary hack - @see changeData below for some more information.\n */\n if (this.__TEMPORARY_CHANGE_DATA) {\n const { key, data } = this.__TEMPORARY_CHANGE_DATA;\n const domEl = document.querySelector(`[data-key=\"${key}\"]`);\n\n if (domEl) {\n let change = this.state.value.change().setNodeByKey(key, { data });\n\n this.setState({ value: change.value }, () => {\n this.__TEMPORARY_CHANGE_DATA = null;\n });\n }\n }\n\n /**\n * This is needed just in case the browser decides to make the editor\n * lose focus without triggering the onBlur event (can happen in a few cases).\n * This will also trigger onBlur if the user clicks outside of the page when the editor\n * is focused.\n */\n if (editorDOM === document.activeElement) {\n editorDOM.removeEventListener('blur', this.handleDomBlur);\n editorDOM.addEventListener('blur', this.handleDomBlur);\n }\n\n this.stashValue();\n this.props.onFocus();\n\n resolve();\n });\n\n stashValue = () => {\n log('[stashValue]');\n if (!this.state.stashedValue) {\n this.setState({ stashedValue: this.state.value });\n }\n };\n\n /**\n * Reset the value if the user didn't click done.\n */\n resetValue = force => {\n const { value, focusedNode } = this.state;\n\n const stopReset = this.plugins.reduce((s, p) => {\n return s || (p.stopReset && p.stopReset(this.state.value));\n }, false);\n\n log('[resetValue]', value.isFocused, focusedNode, 'stopReset: ', stopReset);\n if ((this.state.stashedValue && !value.isFocused && !focusedNode && !stopReset) || force) {\n log('[resetValue] resetting...');\n log('stashed', this.state.stashedValue.document.toObject());\n log('current', this.state.value.document.toObject());\n\n const newValue = Value.fromJSON(this.state.stashedValue.toJSON());\n\n log('newValue: ', newValue.document);\n return new Promise(resolve => {\n setTimeout(() => {\n this.setState({ value: newValue, stashedValue: null }, () => {\n log('value now: ', this.state.value.document.toJSON());\n resolve();\n });\n }, 50);\n });\n } else {\n return Promise.resolve({});\n }\n };\n\n onChange = (change, done) => {\n log('[onChange]');\n\n const { value } = change;\n const { charactersLimit } = this.props;\n\n if (\n value &&\n value.document &&\n value.document.text &&\n value.document.text.length > charactersLimit\n ) {\n return;\n }\n\n this.setState({ value }, () => {\n log('[onChange], call done()');\n\n if (done) {\n done();\n }\n });\n };\n\n UNSAFE_componentWillReceiveProps(props) {\n if (!props.value.document.equals(this.props.value.document)) {\n this.setState({\n focus: false,\n value: props.value\n });\n }\n }\n\n valueToSize = v => {\n if (!v) {\n return;\n }\n\n if (typeof v === 'string') {\n if (v.endsWith('%')) {\n return undefined;\n } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw')) {\n return v;\n } else {\n const value = parseInt(v, 10);\n return isNaN(value) ? value : `${value}px`;\n }\n }\n if (typeof v === 'number') {\n return `${v}px`;\n }\n\n return;\n };\n\n buildSizeStyle() {\n const { width, minHeight, height, maxHeight } = this.props;\n\n return {\n width: this.valueToSize(width),\n height: this.valueToSize(height),\n minHeight: this.valueToSize(minHeight),\n maxHeight: this.valueToSize(maxHeight)\n };\n }\n\n validateNode = node => {\n if (node.object !== 'block') return;\n\n const last = node.nodes.last();\n if (!last) return;\n\n if (last.type !== 'image') return;\n\n log('[validateNode] last is image..');\n\n const parent = last.getParent(last.key);\n const p = Block.getParent(last.key);\n log('[validateNode] parent:', parent, p);\n\n return undefined;\n };\n\n changeData = (key, data) => {\n log('[changeData]. .. ', key, data);\n\n /**\n * HACK ALERT: We should be calling setState here and storing the change data:\n *\n * <code>this.setState({changeData: { key, data}})</code>\n * However this is causing issues with the Mathquill instance. The 'input' event stops firing on the element and no\n * more changes get through. The issues seem to be related to the promises in onBlur/onFocus. But removing these\n * brings it's own problems. A major clean up is planned for this component so I've decided to temporarily settle\n * on this hack rather than spend more time on this.\n */\n\n // Uncomment this line to see the bug described above.\n // this.setState({changeData: {key, data}})\n\n this.__TEMPORARY_CHANGE_DATA = { key, data };\n };\n\n focus = (pos, node) => {\n const position = pos || 'end';\n\n this.props.focus(position, node);\n };\n\n render() {\n const {\n disabled,\n spellCheck,\n highlightShape,\n classes,\n className,\n placeholder,\n pluginProps,\n onKeyDown\n } = this.props;\n\n const { value, focusedNode, toolbarOpts } = this.state;\n\n log('[render] value: ', value);\n const sizeStyle = this.buildSizeStyle();\n const names = classNames(\n {\n [classes.withBg]: highlightShape,\n [classes.toolbarOnTop]: toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'\n },\n className\n );\n\n return (\n <div\n ref={ref => (this.wrapperRef = ref)}\n style={{ width: sizeStyle.width }}\n className={names}\n >\n <SlateEditor\n plugins={this.plugins}\n innerRef={r => {\n if (r) {\n this.slateEditor = r;\n }\n }}\n ref={r => (this.editor = r && this.props.editorRef(r))}\n toolbarRef={r => {\n if (r) {\n this.toolbarRef = r;\n }\n }}\n value={value}\n focus={this.focus}\n onKeyDown={onKeyDown}\n onChange={this.onChange}\n onBlur={this.onBlur}\n onFocus={this.onFocus}\n onEditingDone={this.onEditingDone}\n focusedNode={focusedNode}\n normalize={this.normalize}\n readOnly={disabled}\n spellCheck={spellCheck}\n className={classes.slateEditor}\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight\n }}\n pluginProps={pluginProps}\n toolbarOpts={toolbarOpts}\n placeholder={placeholder}\n onDataChange={this.changeData}\n />\n </div>\n );\n }\n}\n\n// TODO color - hardcoded gray background and keypad colors will need to change too\nconst styles = {\n withBg: {\n backgroundColor: 'rgba(0,0,0,0.06)'\n },\n slateEditor: {\n fontFamily: 'Roboto, sans-serif',\n\n '& table': {\n tableLayout: 'fixed',\n width: '100%',\n borderCollapse: 'collapse',\n color: color.text(),\n backgroundColor: color.background()\n },\n '& table:not([border=\"1\"]) tr': {\n borderTop: '1px solid #dfe2e5'\n // TODO perhaps secondary color for background, for now disable\n // '&:nth-child(2n)': {\n // backgroundColor: '#f6f8fa'\n // }\n },\n '& td, th': {\n padding: '.6em 1em',\n textAlign: 'center'\n },\n '& table:not([border=\"1\"]) td, th': {\n border: '1px solid #dfe2e5'\n }\n },\n toolbarOnTop: {\n marginTop: '45px'\n }\n};\n\nexport default withStyles(styles)(Editor);\n"],"file":"editor.js"}
@@ -88,22 +88,14 @@ var Component = /*#__PURE__*/function (_React$Component) {
88
88
  var _this$props = _this.props,
89
89
  node = _this$props.node,
90
90
  editor = _this$props.editor;
91
- var resizePercent = node.data.get('resizePercent');
92
- log('[applySizeData]: resizePercent: ', resizePercent);
93
91
  var update = node.data;
92
+ var w = update.get('width');
94
93
 
95
- if (resizePercent) {
96
- update = update.set('width', _this.getWidth(resizePercent));
97
- update = update.set('height', _this.getHeight(resizePercent));
98
- } else {
99
- var w = update.get('width');
100
-
101
- if (w) {
102
- update = update.set('resizePercent', _this.getPercentFromWidth(w));
103
- }
94
+ if (w) {
95
+ update = update.set('resizePercent', _this.getPercentFromWidth(w));
104
96
  }
105
97
 
106
- log('[applySizeData] update: ', update);
98
+ log("[applySizeData] update: ", update);
107
99
 
108
100
  if (!update.equals(node.data)) {
109
101
  editor.change(function (c) {
@@ -114,6 +106,138 @@ var Component = /*#__PURE__*/function (_React$Component) {
114
106
  }
115
107
  });
116
108
 
109
+ _defineProperty(_assertThisInitialized(_this), "initialiseResize", function () {
110
+ window.addEventListener('mousemove', _this.startResizing, false);
111
+ window.addEventListener('mouseup', _this.stopResizing, false);
112
+ });
113
+
114
+ _defineProperty(_assertThisInitialized(_this), "loadImage", function () {
115
+ var _ref = _this.props || {},
116
+ maxImageWidth = _ref.maxImageWidth,
117
+ maxImageHeight = _ref.maxImageHeight;
118
+
119
+ maxImageWidth = maxImageWidth || 700;
120
+ maxImageHeight = maxImageHeight || 900;
121
+ var box = _this.img; //on first load
122
+
123
+ if (!box.style.width || box.style.width === 'auto') {
124
+ var dimensions = {
125
+ width: box && box.naturalWidth || 100,
126
+ height: box && box.naturalHeight || 100
127
+ };
128
+
129
+ var _this$updateImageDime = _this.updateImageDimensions(dimensions, {
130
+ width: dimensions.width < maxImageWidth ? dimensions.width : maxImageWidth,
131
+ height: dimensions.height < maxImageHeight ? dimensions.height : maxImageHeight
132
+ }, true),
133
+ width = _this$updateImageDime.width,
134
+ height = _this$updateImageDime.height;
135
+
136
+ box.style.width = "".concat(width, "px");
137
+ box.style.height = "".concat(height, "px");
138
+
139
+ _this.setState({
140
+ dimensions: {
141
+ height: height,
142
+ width: width
143
+ }
144
+ });
145
+
146
+ var _this$props2 = _this.props,
147
+ node = _this$props2.node,
148
+ editor = _this$props2.editor;
149
+ var update = node.data;
150
+ update = update.set('width', width);
151
+ update = update.set('height', height);
152
+
153
+ if (!update.equals(node.data)) {
154
+ editor.change(function (c) {
155
+ return c.setNodeByKey(node.key, {
156
+ data: update
157
+ });
158
+ });
159
+ }
160
+ }
161
+ });
162
+
163
+ _defineProperty(_assertThisInitialized(_this), "startResizing", function (e) {
164
+ var bounds = e.target.getBoundingClientRect();
165
+ var box = _this.img;
166
+ var dimensions = {
167
+ width: box && box.naturalWidth || 100,
168
+ height: box && box.naturalHeight || 100
169
+ };
170
+
171
+ var _this$updateImageDime2 = _this.updateImageDimensions(dimensions, {
172
+ width: e.clientX - bounds.left,
173
+ height: e.clientY - bounds.top
174
+ }, true),
175
+ width = _this$updateImageDime2.width,
176
+ height = _this$updateImageDime2.height;
177
+
178
+ var hasMinimumWidth = width > 50 && height > 50;
179
+ var hasDimensionsConstraints = width <= 700 && height <= 900;
180
+
181
+ if (hasMinimumWidth && hasDimensionsConstraints && box) {
182
+ box.style.width = "".concat(width, "px");
183
+ box.style.height = "".concat(height, "px");
184
+
185
+ _this.setState({
186
+ dimensions: {
187
+ height: height,
188
+ width: width
189
+ }
190
+ });
191
+
192
+ var _this$props3 = _this.props,
193
+ node = _this$props3.node,
194
+ editor = _this$props3.editor;
195
+ var update = node.data;
196
+ update = update.set('width', width);
197
+ update = update.set('height', height);
198
+
199
+ if (!update.equals(node.data)) {
200
+ editor.change(function (c) {
201
+ return c.setNodeByKey(node.key, {
202
+ data: update
203
+ });
204
+ });
205
+ }
206
+ }
207
+ });
208
+
209
+ _defineProperty(_assertThisInitialized(_this), "stopResizing", function () {
210
+ window.removeEventListener('mousemove', _this.startResizing, false);
211
+ window.removeEventListener('mouseup', _this.stopResizing, false);
212
+ });
213
+
214
+ _defineProperty(_assertThisInitialized(_this), "updateImageDimensions", function (initialDim, nextDim, keepAspectRatio, resizeType) {
215
+ // if we want to keep image aspect ratio
216
+ if (keepAspectRatio) {
217
+ var imageAspectRatio = initialDim.width / initialDim.height;
218
+
219
+ if (resizeType === 'height') {
220
+ // if we want to change image height => we update the width accordingly
221
+ return {
222
+ width: nextDim.height * imageAspectRatio,
223
+ height: nextDim.height
224
+ };
225
+ } // if we want to change image width => we update the height accordingly
226
+
227
+
228
+ return {
229
+ width: nextDim.width,
230
+ height: nextDim.width / imageAspectRatio
231
+ };
232
+ } // if we don't want to keep aspect ratio, we just update both values
233
+
234
+
235
+ return {
236
+ width: nextDim.width,
237
+ height: nextDim.height
238
+ };
239
+ });
240
+
117
241
  return _this;
118
242
  }
119
243
 
@@ -121,6 +245,11 @@ var Component = /*#__PURE__*/function (_React$Component) {
121
245
  key: "componentDidMount",
122
246
  value: function componentDidMount() {
123
247
  this.applySizeData();
248
+ var resizeHandle = this.resize;
249
+
250
+ if (resizeHandle) {
251
+ resizeHandle.addEventListener('mousedown', this.initialiseResize, false);
252
+ }
124
253
  }
125
254
  }, {
126
255
  key: "componentDidUpdate",
@@ -141,12 +270,12 @@ var Component = /*#__PURE__*/function (_React$Component) {
141
270
  value: function render() {
142
271
  var _this2 = this;
143
272
 
144
- var _this$props2 = this.props,
145
- node = _this$props2.node,
146
- editor = _this$props2.editor,
147
- classes = _this$props2.classes,
148
- attributes = _this$props2.attributes,
149
- onFocus = _this$props2.onFocus;
273
+ var _this$props4 = this.props,
274
+ node = _this$props4.node,
275
+ editor = _this$props4.editor,
276
+ classes = _this$props4.classes,
277
+ attributes = _this$props4.attributes,
278
+ onFocus = _this$props4.onFocus;
150
279
  var active = editor.value.isFocused && editor.value.selection.hasEdgeIn(node);
151
280
  var src = node.data.get('src');
152
281
  var percent = node.data.get('percent');
@@ -155,7 +284,7 @@ var Component = /*#__PURE__*/function (_React$Component) {
155
284
  log('[render] node.data:', node.data);
156
285
  var size = this.getSize(node.data);
157
286
  log('[render] style:', size);
158
- var className = (0, _classnames["default"])(classes.root, active && classes.active, !loaded && classes.loading, deleteStatus === 'pending' && classes.pendingDelete);
287
+ var className = (0, _classnames["default"])(classes.root, !loaded && classes.loading, deleteStatus === 'pending' && classes.pendingDelete);
159
288
  var progressClasses = (0, _classnames["default"])(classes.progress, loaded && classes.hideProgress);
160
289
  return [/*#__PURE__*/_react["default"].createElement("span", {
161
290
  key: 'sp1'
@@ -167,13 +296,21 @@ var Component = /*#__PURE__*/function (_React$Component) {
167
296
  mode: "determinate",
168
297
  value: percent > 0 ? percent : 0,
169
298
  className: progressClasses
170
- }), /*#__PURE__*/_react["default"].createElement("img", _extends({
171
- src: src
172
- }, attributes, {
173
- ref: function ref(r) {
174
- return _this2.img = r;
299
+ }), /*#__PURE__*/_react["default"].createElement("div", {
300
+ className: classes.imageContainer
301
+ }, /*#__PURE__*/_react["default"].createElement("img", _extends({}, attributes, {
302
+ className: (0, _classnames["default"])(classes.image, active && classes.active),
303
+ ref: function ref(_ref2) {
304
+ _this2.img = _ref2;
305
+ },
306
+ src: src,
307
+ style: size,
308
+ onLoad: this.loadImage
309
+ })), /*#__PURE__*/_react["default"].createElement("div", {
310
+ ref: function ref(_ref3) {
311
+ _this2.resize = _ref3;
175
312
  },
176
- style: size
313
+ className: (0, _classnames["default"])(classes.resize, 'resize')
177
314
  }))), /*#__PURE__*/_react["default"].createElement("span", {
178
315
  key: 'sp2'
179
316
  }, "\xA0")];
@@ -194,7 +331,9 @@ _defineProperty(Component, "propTypes", {
194
331
  classes: _propTypes["default"].object.isRequired,
195
332
  attributes: _propTypes["default"].object,
196
333
  onFocus: _propTypes["default"].func,
197
- onBlur: _propTypes["default"].func
334
+ onBlur: _propTypes["default"].func,
335
+ maxImageWidth: _propTypes["default"].number,
336
+ maxImageHeight: _propTypes["default"].number
198
337
  });
199
338
 
200
339
  var styles = function styles(theme) {
@@ -234,12 +373,34 @@ var styles = function styles(theme) {
234
373
  display: 'inline-block',
235
374
  transition: 'opacity 200ms linear'
236
375
  },
237
- active: {
238
- border: "solid 1px ".concat(theme.palette.primary.main)
239
- },
240
376
  "delete": {
241
377
  position: 'absolute',
242
378
  right: 0
379
+ },
380
+ imageContainer: {
381
+ position: 'relative',
382
+ width: 'fit-content',
383
+ display: 'flex',
384
+ alignItems: 'center',
385
+ '&&:hover > .resize': {
386
+ display: 'block'
387
+ }
388
+ },
389
+ active: {
390
+ border: "solid 1px ".concat(theme.palette.primary.main)
391
+ },
392
+ resize: {
393
+ backgroundColor: theme.palette.primary.main,
394
+ cursor: 'col-resize',
395
+ height: '35px',
396
+ width: '5px',
397
+ borderRadius: 8,
398
+ marginLeft: '5px',
399
+ marginRight: '10px',
400
+ display: 'none'
401
+ },
402
+ drawableHeight: {
403
+ minHeight: 350
243
404
  }
244
405
  };
245
406
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/image/component.jsx"],"names":["log","size","s","Component","percent","multiplier","img","naturalWidth","naturalHeight","width","floored","parseInt","toFixed","props","node","editor","resizePercent","data","get","update","set","getWidth","getHeight","w","getPercentFromWidth","equals","change","c","setNodeByKey","key","applySizeData","height","objectFit","classes","attributes","onFocus","active","value","isFocused","selection","hasEdgeIn","src","loaded","deleteStatus","getSize","className","root","loading","pendingDelete","progressClasses","progress","hideProgress","r","React","SlatePropTypes","isRequired","PropTypes","shape","func","object","onBlur","styles","theme","portal","position","opacity","transition","floatingButtonRow","backgroundColor","borderRadius","display","padding","border","boxShadow","left","top","palette","primary","main","right"],"mappings":"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","sourcesContent":["import LinearProgress from '@material-ui/core/LinearProgress';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport SlatePropTypes from 'slate-prop-types';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst size = s => (s ? `${s}px` : 'auto');\n\nexport class Component extends React.Component {\n static propTypes = {\n node: SlatePropTypes.node.isRequired,\n editor: PropTypes.shape({\n change: PropTypes.func.isRequired,\n value: PropTypes.object\n }).isRequired,\n classes: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func\n };\n\n getWidth = percent => {\n const multiplier = percent / 100;\n return this.img.naturalWidth * multiplier;\n };\n\n getHeight = percent => {\n const multiplier = percent / 100;\n return this.img.naturalHeight * multiplier;\n };\n\n getPercentFromWidth = width => {\n var floored = (width / this.img.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n };\n\n applySizeData = () => {\n const { node, editor } = this.props;\n\n const resizePercent = node.data.get('resizePercent');\n log('[applySizeData]: resizePercent: ', resizePercent);\n\n let update = node.data;\n\n if (resizePercent) {\n update = update.set('width', this.getWidth(resizePercent));\n update = update.set('height', this.getHeight(resizePercent));\n } else {\n const w = update.get('width');\n if (w) {\n update = update.set('resizePercent', this.getPercentFromWidth(w));\n }\n }\n\n log('[applySizeData] update: ', update);\n\n if (!update.equals(node.data)) {\n editor.change(c => c.setNodeByKey(node.key, { data: update }));\n }\n };\n\n componentDidMount() {\n this.applySizeData();\n }\n\n componentDidUpdate() {\n this.applySizeData();\n }\n\n getSize(data) {\n return {\n width: size(data.get('width')),\n height: size(data.get('height')),\n objectFit: 'contain'\n };\n }\n\n render() {\n const { node, editor, classes, attributes, onFocus } = this.props;\n const active = editor.value.isFocused && editor.value.selection.hasEdgeIn(node);\n const src = node.data.get('src');\n const percent = node.data.get('percent');\n const loaded = node.data.get('loaded') !== false;\n const deleteStatus = node.data.get('deleteStatus');\n\n log('[render] node.data:', node.data);\n\n const size = this.getSize(node.data);\n\n log('[render] style:', size);\n\n const className = classNames(\n classes.root,\n active && classes.active,\n !loaded && classes.loading,\n deleteStatus === 'pending' && classes.pendingDelete\n );\n\n const progressClasses = classNames(classes.progress, loaded && classes.hideProgress);\n\n return [\n <span key={'sp1'}>&nbsp;</span>,\n <div key={'comp'} onFocus={onFocus} className={className}>\n <LinearProgress\n mode=\"determinate\"\n value={percent > 0 ? percent : 0}\n className={progressClasses}\n />\n <img src={src} {...attributes} ref={r => (this.img = r)} style={size} />\n </div>,\n <span key={'sp2'}>&nbsp;</span>\n ];\n }\n}\n\nconst styles = theme => ({\n portal: {\n position: 'absolute',\n opacity: 0,\n transition: 'opacity 200ms linear'\n },\n floatingButtonRow: {\n backgroundColor: 'white',\n borderRadius: '1px',\n display: 'flex',\n padding: '10px',\n border: 'solid 1px #eeeeee',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)'\n },\n progress: {\n position: 'absolute',\n left: '0',\n width: '100%',\n top: '0%',\n transition: 'opacity 200ms linear'\n },\n hideProgress: {\n opacity: 0\n },\n loading: {\n opacity: 0.3\n },\n pendingDelete: {\n opacity: 0.3\n },\n root: {\n position: 'relative',\n border: 'solid 1px white',\n display: 'inline-block',\n transition: 'opacity 200ms linear'\n },\n active: {\n border: `solid 1px ${theme.palette.primary.main}`\n },\n delete: {\n position: 'absolute',\n right: 0\n }\n});\n\nexport default withStyles(styles)(Component);\n"],"file":"component.js"}
1
+ {"version":3,"sources":["../../../src/plugins/image/component.jsx"],"names":["log","size","s","Component","percent","multiplier","img","naturalWidth","naturalHeight","width","floored","parseInt","toFixed","props","node","editor","update","data","w","get","set","getPercentFromWidth","equals","change","c","setNodeByKey","key","window","addEventListener","startResizing","stopResizing","maxImageWidth","maxImageHeight","box","style","dimensions","height","updateImageDimensions","setState","e","bounds","target","getBoundingClientRect","clientX","left","clientY","top","hasMinimumWidth","hasDimensionsConstraints","removeEventListener","initialDim","nextDim","keepAspectRatio","resizeType","imageAspectRatio","applySizeData","resizeHandle","resize","initialiseResize","objectFit","classes","attributes","onFocus","active","value","isFocused","selection","hasEdgeIn","src","loaded","deleteStatus","getSize","className","root","loading","pendingDelete","progressClasses","progress","hideProgress","imageContainer","image","ref","loadImage","React","SlatePropTypes","isRequired","PropTypes","shape","func","object","onBlur","number","styles","theme","portal","position","opacity","transition","floatingButtonRow","backgroundColor","borderRadius","display","padding","border","boxShadow","right","alignItems","palette","primary","main","cursor","marginLeft","marginRight","drawableHeight","minHeight"],"mappings":"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","sourcesContent":["import LinearProgress from '@material-ui/core/LinearProgress';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\nimport SlatePropTypes from 'slate-prop-types';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst size = s => (s ? `${s}px` : 'auto');\n\nexport class Component extends React.Component {\n static propTypes = {\n node: SlatePropTypes.node.isRequired,\n editor: PropTypes.shape({\n change: PropTypes.func.isRequired,\n value: PropTypes.object\n }).isRequired,\n classes: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n onBlur: PropTypes.func,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n };\n\n getWidth = percent => {\n const multiplier = percent / 100;\n return this.img.naturalWidth * multiplier;\n };\n\n getHeight = percent => {\n const multiplier = percent / 100;\n return this.img.naturalHeight * multiplier;\n };\n\n getPercentFromWidth = width => {\n var floored = (width / this.img.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n };\n\n applySizeData = () => {\n const { node, editor } = this.props;\n\n let update = node.data;\n\n const w = update.get('width');\n if (w) {\n update = update.set('resizePercent', this.getPercentFromWidth(w));\n }\n\n log(\"[applySizeData] update: \", update);\n\n if (!update.equals(node.data)) {\n editor.change(c => c.setNodeByKey(node.key, { data: update }));\n }\n };\n\n initialiseResize = () => {\n window.addEventListener('mousemove', this.startResizing, false);\n window.addEventListener('mouseup', this.stopResizing, false);\n };\n\n componentDidMount() {\n this.applySizeData();\n\n const resizeHandle = this.resize;\n\n if (resizeHandle) {\n resizeHandle.addEventListener('mousedown', this.initialiseResize, false);\n }\n }\n\n componentDidUpdate() {\n this.applySizeData();\n }\n\n getSize(data) {\n return {\n width: size(data.get('width')),\n height: size(data.get('height')),\n objectFit: 'contain'\n };\n }\n\n loadImage = () => {\n let { maxImageWidth, maxImageHeight } = this.props || {};\n maxImageWidth = maxImageWidth || 700;\n maxImageHeight = maxImageHeight || 900;\n\n const box = this.img;\n\n //on first load\n if (!box.style.width || box.style.width === 'auto') {\n const dimensions = { width: box && box.naturalWidth || 100, height: box && box.naturalHeight || 100 };\n\n const { width, height } = this.updateImageDimensions(\n dimensions,\n {\n width: dimensions.width < maxImageWidth ? dimensions.width : maxImageWidth,\n height: dimensions.height < maxImageHeight ? dimensions.height : maxImageHeight\n },\n true\n );\n\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n\n this.setState({\n dimensions: { height: height, width: width },\n });\n\n const { node, editor } = this.props;\n\n let update = node.data;\n\n update = update.set('width', width);\n update = update.set('height', height);\n\n if (!update.equals(node.data)) {\n editor.change(c => c.setNodeByKey(node.key, { data: update }));\n }\n }\n };\n\n startResizing = (e) => {\n const bounds = e.target.getBoundingClientRect();\n const box = this.img;\n const dimensions = { width: box && box.naturalWidth || 100, height: box && box.naturalHeight || 100};\n\n const { width, height } = this.updateImageDimensions(\n dimensions,\n {\n width: e.clientX - bounds.left,\n height: e.clientY - bounds.top\n },\n true\n );\n\n const hasMinimumWidth = width > 50 && height > 50;\n const hasDimensionsConstraints = width <= 700 && height <= 900;\n\n if (hasMinimumWidth && hasDimensionsConstraints && box) {\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n\n this.setState({\n dimensions: { height: height, width: width }\n });\n\n const { node, editor } = this.props;\n\n let update = node.data;\n\n update = update.set('width', width);\n update = update.set('height', height);\n\n if (!update.equals(node.data)) {\n editor.change(c => c.setNodeByKey(node.key, { data: update }));\n }\n }\n };\n\n stopResizing = () => {\n window.removeEventListener('mousemove', this.startResizing, false);\n window.removeEventListener('mouseup', this.stopResizing, false);\n };\n\n updateImageDimensions = (initialDim, nextDim, keepAspectRatio, resizeType) => {\n // if we want to keep image aspect ratio\n if (keepAspectRatio) {\n const imageAspectRatio = initialDim.width / initialDim.height;\n\n if (resizeType === 'height') {\n // if we want to change image height => we update the width accordingly\n return {\n width: nextDim.height * imageAspectRatio,\n height: nextDim.height\n }\n }\n\n // if we want to change image width => we update the height accordingly\n return {\n width: nextDim.width,\n height: nextDim.width / imageAspectRatio\n }\n }\n\n // if we don't want to keep aspect ratio, we just update both values\n return {\n width: nextDim.width,\n height: nextDim.height\n }\n };\n\n\n render() {\n const { node, editor, classes, attributes, onFocus } = this.props;\n const active = editor.value.isFocused && editor.value.selection.hasEdgeIn(node);\n const src = node.data.get('src');\n const percent = node.data.get('percent');\n const loaded = node.data.get('loaded') !== false;\n const deleteStatus = node.data.get('deleteStatus');\n\n log('[render] node.data:', node.data);\n\n const size = this.getSize(node.data);\n\n log('[render] style:', size);\n\n const className = classNames(\n classes.root,\n !loaded && classes.loading,\n deleteStatus === 'pending' && classes.pendingDelete\n );\n\n const progressClasses = classNames(classes.progress, loaded && classes.hideProgress);\n\n return [\n <span key={'sp1'}>&nbsp;</span>,\n <div key={'comp'} onFocus={onFocus} className={className}>\n <LinearProgress\n mode=\"determinate\"\n value={percent > 0 ? percent : 0}\n className={progressClasses}\n />\n <div className={classes.imageContainer}>\n <img\n {...attributes}\n className={classNames(classes.image, active && classes.active)}\n ref={ref => {\n this.img = ref;\n }}\n src={src}\n style={size}\n onLoad={this.loadImage}\n />\n <div ref={ref => {\n this.resize = ref;\n }} className={classNames(classes.resize, 'resize')}/>\n </div>\n </div>,\n <span key={'sp2'}>&nbsp;</span>\n ];\n }\n}\n\nconst styles = theme => ({\n portal: {\n position: 'absolute',\n opacity: 0,\n transition: 'opacity 200ms linear'\n },\n floatingButtonRow: {\n backgroundColor: 'white',\n borderRadius: '1px',\n display: 'flex',\n padding: '10px',\n border: 'solid 1px #eeeeee',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)'\n },\n progress: {\n position: 'absolute',\n left: '0',\n width: '100%',\n top: '0%',\n transition: 'opacity 200ms linear'\n },\n hideProgress: {\n opacity: 0\n },\n loading: {\n opacity: 0.3\n },\n pendingDelete: {\n opacity: 0.3\n },\n root: {\n position: 'relative',\n border: 'solid 1px white',\n display: 'inline-block',\n transition: 'opacity 200ms linear'\n },\n delete: {\n position: 'absolute',\n right: 0\n },\n imageContainer: {\n position: 'relative',\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n\n '&&:hover > .resize': {\n display: 'block'\n }\n },\n active: {\n border: `solid 1px ${theme.palette.primary.main}`\n },\n resize: {\n backgroundColor: theme.palette.primary.main,\n cursor: 'col-resize',\n height: '35px',\n width: '5px',\n borderRadius: 8,\n marginLeft: '5px',\n marginRight: '10px',\n display: 'none'\n },\n drawableHeight: {\n minHeight: 350,\n },\n});\n\nexport default withStyles(styles)(Component);\n"],"file":"component.js"}
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports["default"] = exports.ImageToolbar = void 0;
9
9
 
10
- var _toolbarButtons = require("../toolbar/toolbar-buttons");
11
-
12
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
11
 
14
12
  var _react = _interopRequireDefault(require("react"));
@@ -43,76 +41,25 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
43
41
 
44
42
  var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:image:image-toolbar');
45
43
 
46
- var PercentButton = function PercentButton(_ref) {
47
- var percent = _ref.percent,
48
- active = _ref.active,
49
- onClick = _ref.onClick;
50
- var label = "".concat(percent, "%");
51
- return /*#__PURE__*/_react["default"].createElement(_toolbarButtons.MarkButton, {
52
- active: active,
53
- onToggle: function onToggle() {
54
- return onClick(percent);
55
- },
56
- label: label
57
- }, label);
58
- };
59
-
60
- PercentButton.propTypes = {
61
- percent: _propTypes["default"].number.isRequired,
62
- active: _propTypes["default"].bool.isRequired,
63
- onClick: _propTypes["default"].func.isRequired
64
- };
65
-
66
44
  var ImageToolbar = /*#__PURE__*/function (_React$Component) {
67
45
  _inherits(ImageToolbar, _React$Component);
68
46
 
69
47
  var _super = _createSuper(ImageToolbar);
70
48
 
71
49
  function ImageToolbar() {
72
- var _this;
73
-
74
50
  _classCallCheck(this, ImageToolbar);
75
51
 
76
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
77
- args[_key] = arguments[_key];
78
- }
79
-
80
- _this = _super.call.apply(_super, [this].concat(args));
81
-
82
- _defineProperty(_assertThisInitialized(_this), "onPercentClick", function (percent) {
83
- log('[onPercentClick]: percent:', percent);
84
-
85
- _this.props.onChange(percent);
86
- });
87
-
88
- return _this;
52
+ return _super.apply(this, arguments);
89
53
  }
90
54
 
91
55
  _createClass(ImageToolbar, [{
92
56
  key: "render",
93
57
  value: function render() {
94
- var _this$props = this.props,
95
- classes = _this$props.classes,
96
- percent = _this$props.percent;
58
+ // Don't remove toolbar since we will have other new buttons
59
+ var classes = this.props.classes;
97
60
  return /*#__PURE__*/_react["default"].createElement("div", {
98
61
  className: classes.holder
99
- }, /*#__PURE__*/_react["default"].createElement(PercentButton, {
100
- percent: 25,
101
- active: percent === 25,
102
- onClick: this.onPercentClick
103
- }), /*#__PURE__*/_react["default"].createElement(PercentButton, {
104
- percent: 50,
105
- active: percent === 50,
106
- onClick: this.onPercentClick
107
- }), /*#__PURE__*/_react["default"].createElement(PercentButton, {
108
- active: percent === 75,
109
- percent: 75,
110
- onClick: this.onPercentClick
111
- }), /*#__PURE__*/_react["default"].createElement(PercentButton, {
112
- percent: 100,
113
- active: percent === 100 || !percent,
114
- onClick: this.onPercentClick
115
- }));
62
+ });
116
63
  }
117
64
  }]);
118
65
 
@@ -122,7 +69,6 @@ var ImageToolbar = /*#__PURE__*/function (_React$Component) {
122
69
  exports.ImageToolbar = ImageToolbar;
123
70
 
124
71
  _defineProperty(ImageToolbar, "propTypes", {
125
- percent: _propTypes["default"].number.isRequired,
126
72
  onChange: _propTypes["default"].func.isRequired,
127
73
  classes: _propTypes["default"].object.isRequired
128
74
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/image/image-toolbar.jsx"],"names":["log","PercentButton","percent","active","onClick","label","propTypes","PropTypes","number","isRequired","bool","func","ImageToolbar","props","onChange","classes","holder","onPercentClick","React","Component","object","styles","theme","paddingLeft","spacing","unit","display","alignItems"],"mappings":";;;;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,oDAAN,CAAZ;;AAEA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,OAAkC;AAAA,MAA/BC,OAA+B,QAA/BA,OAA+B;AAAA,MAAtBC,MAAsB,QAAtBA,MAAsB;AAAA,MAAdC,OAAc,QAAdA,OAAc;AACtD,MAAMC,KAAK,aAAMH,OAAN,MAAX;AACA,sBACE,gCAAC,0BAAD;AAAY,IAAA,MAAM,EAAEC,MAApB;AAA4B,IAAA,QAAQ,EAAE;AAAA,aAAMC,OAAO,CAACF,OAAD,CAAb;AAAA,KAAtC;AAA8D,IAAA,KAAK,EAAEG;AAArE,KACGA,KADH,CADF;AAKD,CAPD;;AASAJ,aAAa,CAACK,SAAd,GAA0B;AACxBJ,EAAAA,OAAO,EAAEK,sBAAUC,MAAV,CAAiBC,UADF;AAExBN,EAAAA,MAAM,EAAEI,sBAAUG,IAAV,CAAeD,UAFC;AAGxBL,EAAAA,OAAO,EAAEG,sBAAUI,IAAV,CAAeF;AAHA,CAA1B;;IAMaG,Y;;;;;;;;;;;;;;;;qEAOM,UAAAV,OAAO,EAAI;AAC1BF,MAAAA,GAAG,CAAC,4BAAD,EAA+BE,OAA/B,CAAH;;AACA,YAAKW,KAAL,CAAWC,QAAX,CAAoBZ,OAApB;AACD,K;;;;;;;WAED,kBAAS;AACP,wBAA6B,KAAKW,KAAlC;AAAA,UAAQE,OAAR,eAAQA,OAAR;AAAA,UAAiBb,OAAjB,eAAiBA,OAAjB;AACA,0BACE;AAAK,QAAA,SAAS,EAAEa,OAAO,CAACC;AAAxB,sBACE,gCAAC,aAAD;AAAe,QAAA,OAAO,EAAE,EAAxB;AAA4B,QAAA,MAAM,EAAEd,OAAO,KAAK,EAAhD;AAAoD,QAAA,OAAO,EAAE,KAAKe;AAAlE,QADF,eAEE,gCAAC,aAAD;AAAe,QAAA,OAAO,EAAE,EAAxB;AAA4B,QAAA,MAAM,EAAEf,OAAO,KAAK,EAAhD;AAAoD,QAAA,OAAO,EAAE,KAAKe;AAAlE,QAFF,eAGE,gCAAC,aAAD;AAAe,QAAA,MAAM,EAAEf,OAAO,KAAK,EAAnC;AAAuC,QAAA,OAAO,EAAE,EAAhD;AAAoD,QAAA,OAAO,EAAE,KAAKe;AAAlE,QAHF,eAIE,gCAAC,aAAD;AACE,QAAA,OAAO,EAAE,GADX;AAEE,QAAA,MAAM,EAAEf,OAAO,KAAK,GAAZ,IAAmB,CAACA,OAF9B;AAGE,QAAA,OAAO,EAAE,KAAKe;AAHhB,QAJF,CADF;AAYD;;;;EA1B+BC,kBAAMC,S;;;;gBAA3BP,Y,eACQ;AACjBV,EAAAA,OAAO,EAAEK,sBAAUC,MAAV,CAAiBC,UADT;AAEjBK,EAAAA,QAAQ,EAAEP,sBAAUI,IAAV,CAAeF,UAFR;AAGjBM,EAAAA,OAAO,EAAER,sBAAUa,MAAV,CAAiBX;AAHT,C;;AA4BrB,IAAMY,MAAM,GAAG,SAATA,MAAS,CAAAC,KAAK;AAAA,SAAK;AACvBN,IAAAA,MAAM,EAAE;AACNO,MAAAA,WAAW,EAAED,KAAK,CAACE,OAAN,CAAcC,IADrB;AAENC,MAAAA,OAAO,EAAE,MAFH;AAGNC,MAAAA,UAAU,EAAE;AAHN;AADe,GAAL;AAAA,CAApB;;eAQe,wBAAWN,MAAX,EAAmBT,YAAnB,C","sourcesContent":["import { MarkButton } from '../toolbar/toolbar-buttons';\n\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:image-toolbar');\n\nconst PercentButton = ({ percent, active, onClick }) => {\n const label = `${percent}%`;\n return (\n <MarkButton active={active} onToggle={() => onClick(percent)} label={label}>\n {label}\n </MarkButton>\n );\n};\n\nPercentButton.propTypes = {\n percent: PropTypes.number.isRequired,\n active: PropTypes.bool.isRequired,\n onClick: PropTypes.func.isRequired\n};\n\nexport class ImageToolbar extends React.Component {\n static propTypes = {\n percent: PropTypes.number.isRequired,\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired\n };\n\n onPercentClick = percent => {\n log('[onPercentClick]: percent:', percent);\n this.props.onChange(percent);\n };\n\n render() {\n const { classes, percent } = this.props;\n return (\n <div className={classes.holder}>\n <PercentButton percent={25} active={percent === 25} onClick={this.onPercentClick} />\n <PercentButton percent={50} active={percent === 50} onClick={this.onPercentClick} />\n <PercentButton active={percent === 75} percent={75} onClick={this.onPercentClick} />\n <PercentButton\n percent={100}\n active={percent === 100 || !percent}\n onClick={this.onPercentClick}\n />\n </div>\n );\n }\n}\n\nconst styles = theme => ({\n holder: {\n paddingLeft: theme.spacing.unit,\n display: 'flex',\n alignItems: 'center'\n }\n});\n\nexport default withStyles(styles)(ImageToolbar);\n"],"file":"image-toolbar.js"}
1
+ {"version":3,"sources":["../../../src/plugins/image/image-toolbar.jsx"],"names":["log","ImageToolbar","classes","props","holder","React","Component","onChange","PropTypes","func","isRequired","object","styles","theme","paddingLeft","spacing","unit","display","alignItems"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,oDAAN,CAAZ;;IAEaC,Y;;;;;;;;;;;;;WAMX,kBAAS;AACP;AACA,UAAQC,OAAR,GAAoB,KAAKC,KAAzB,CAAQD,OAAR;AACA,0BACE;AAAK,QAAA,SAAS,EAAEA,OAAO,CAACE;AAAxB,QADF;AAID;;;;EAb+BC,kBAAMC,S;;;;gBAA3BL,Y,eACQ;AACjBM,EAAAA,QAAQ,EAAEC,sBAAUC,IAAV,CAAeC,UADR;AAEjBR,EAAAA,OAAO,EAAEM,sBAAUG,MAAV,CAAiBD;AAFT,C;;AAerB,IAAME,MAAM,GAAG,SAATA,MAAS,CAAAC,KAAK;AAAA,SAAK;AACvBT,IAAAA,MAAM,EAAE;AACNU,MAAAA,WAAW,EAAED,KAAK,CAACE,OAAN,CAAcC,IADrB;AAENC,MAAAA,OAAO,EAAE,MAFH;AAGNC,MAAAA,UAAU,EAAE;AAHN;AADe,GAAL;AAAA,CAApB;;eAQe,wBAAWN,MAAX,EAAmBX,YAAnB,C","sourcesContent":["import PropTypes from 'prop-types';\nimport React from 'react';\nimport debug from 'debug';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:image-toolbar');\n\nexport class ImageToolbar extends React.Component {\n static propTypes = {\n onChange: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired\n };\n\n render() {\n // Don't remove toolbar since we will have other new buttons\n const { classes } = this.props;\n return (\n <div className={classes.holder}>\n </div>\n );\n }\n}\n\nconst styles = theme => ({\n holder: {\n paddingLeft: theme.spacing.unit,\n display: 'flex',\n alignItems: 'center'\n }\n});\n\nexport default withStyles(styles)(ImageToolbar);\n"],"file":"image-toolbar.js"}
@@ -128,7 +128,9 @@ function ImagePlugin(opts) {
128
128
  var all = Object.assign({
129
129
  onDelete: opts.onDelete,
130
130
  onFocus: opts.onFocus,
131
- onBlur: opts.onBlur
131
+ onBlur: opts.onBlur,
132
+ maxImageWidth: opts.maxImageWidth,
133
+ maxImageHeight: opts.maxImageHeight
132
134
  }, props);
133
135
  return /*#__PURE__*/_react["default"].createElement(_component["default"], all);
134
136
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/plugins/image/index.jsx"],"names":["log","ImagePlugin","opts","toolbar","insertImageRequested","icon","onClick","value","onChange","inline","Inline","create","type","isVoid","data","loaded","src","undefined","change","insertInline","getValue","InsertImageHandler","supports","node","object","customToolbar","onToolbarDone","percent","get","resizePercent","update","toObject","setNodeByKey","key","Tb","showDone","name","deleteNode","e","preventDefault","onDelete","merge","Data","deleteStatus","err","v","removeNodeByKey","stopReset","imgPendingInsertion","document","findDescendant","n","renderNode","props","all","Object","assign","onFocus","onBlur","normalizeNode","textNodeMap","updateNodesArray","index","d","text","push","length","withoutNormalization","forEach","insertTextByKey","serialization","deserialize","el","tagName","toLowerCase","style","width","height","parseInt","replace","out","getAttribute","serialize","objectFit"],"mappings":"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","sourcesContent":["import { Data, Inline } from 'slate';\n\nimport Image from '@material-ui/icons/Image';\nimport ImageComponent from './component';\nimport ImageToolbar from './image-toolbar';\nimport InsertImageHandler from './insert-image-handler';\nimport React from 'react';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:plugins:image');\n\nexport default function ImagePlugin(opts) {\n const toolbar = opts.insertImageRequested && {\n icon: <Image />,\n onClick: (value, onChange) => {\n log('[toolbar] onClick');\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loaded: false,\n src: undefined\n }\n });\n\n const change = value.change().insertInline(inline);\n onChange(change);\n opts.insertImageRequested(getValue => new InsertImageHandler(inline, getValue, onChange));\n },\n supports: node => node.object === 'inline' && node.type === 'image',\n customToolbar: (node, value, onToolbarDone) => {\n const percent = node.data.get('resizePercent');\n\n const onChange = resizePercent => {\n const update = {\n ...node.data.toObject(),\n resizePercent\n };\n\n const change = value.change().setNodeByKey(node.key, { data: update });\n onToolbarDone(change, false);\n };\n\n const Tb = () => <ImageToolbar percent={percent || 100} onChange={onChange} />;\n return Tb;\n },\n showDone: true\n };\n\n return {\n name: 'image',\n toolbar,\n deleteNode: (e, node, value, onChange) => {\n e.preventDefault();\n if (opts.onDelete) {\n const update = node.data.merge(Data.create({ deleteStatus: 'pending' }));\n\n let change = value.change().setNodeByKey(node.key, { data: update });\n\n onChange(change);\n opts.onDelete(node.data.get('src'), (err, v) => {\n if (!err) {\n change = v.change().removeNodeByKey(node.key);\n } else {\n log('[error]: ', err);\n change = v\n .change()\n .setNodeByKey(node.key, node.data.merge(Data.create({ deleteStatus: 'failed' })));\n }\n onChange(change);\n });\n } else {\n let change = value.change().removeNodeByKey(node.key);\n onChange(change);\n }\n },\n stopReset: value => {\n const imgPendingInsertion = value.document.findDescendant(n => {\n if (n.type !== 'image') {\n return;\n }\n return n.data.get('loaded') === false;\n });\n /** don't reset if there is an image pending insertion */\n return imgPendingInsertion !== undefined && imgPendingInsertion !== null;\n },\n renderNode(props) {\n if (props.node.type === 'image') {\n const all = Object.assign(\n {\n onDelete: opts.onDelete,\n onFocus: opts.onFocus,\n onBlur: opts.onBlur\n },\n props\n );\n return <ImageComponent {...all} />;\n }\n },\n normalizeNode: node => {\n const textNodeMap = {};\n const updateNodesArray = [];\n let index = 0;\n\n if (node.object !== 'document') return;\n\n node.findDescendant(d => {\n if (d.object === 'text') {\n textNodeMap[index] = d;\n }\n\n if (d.type === 'image') {\n if (index > 0 && textNodeMap[index - 1] && textNodeMap[index - 1].text === '') {\n updateNodesArray.push(textNodeMap[index - 1]);\n }\n }\n\n index++;\n });\n\n if (!updateNodesArray.length) return;\n\n return change => {\n change.withoutNormalization(() => {\n updateNodesArray.forEach(n => change.insertTextByKey(n.key, 0, ' '));\n });\n };\n }\n };\n}\n\nexport const serialization = {\n deserialize(el /*, next*/) {\n const name = el.tagName.toLowerCase();\n if (name !== 'img') return;\n\n log('deserialize: ', name);\n const style = el.style || { width: '', height: '' };\n const width = parseInt(style.width.replace('px', ''), 10) || null;\n const height = parseInt(style.height.replace('px', ''), 10) || null;\n\n const out = {\n object: 'inline',\n type: 'image',\n isVoid: true,\n data: {\n src: el.getAttribute('src'),\n width,\n height\n }\n };\n log('return object: ', out);\n return out;\n },\n serialize(object /*, children*/) {\n if (object.type !== 'image') return;\n\n const { data } = object;\n const src = data.get('src');\n const width = data.get('width');\n const height = data.get('height');\n const style = {};\n if (width) {\n style.width = `${width}px`;\n }\n\n if (height) {\n style.height = `${height}px`;\n }\n\n style.objectFit = 'contain';\n\n const props = {\n src,\n style\n };\n\n return <img {...props} />;\n }\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../src/plugins/image/index.jsx"],"names":["log","ImagePlugin","opts","toolbar","insertImageRequested","icon","onClick","value","onChange","inline","Inline","create","type","isVoid","data","loaded","src","undefined","change","insertInline","getValue","InsertImageHandler","supports","node","object","customToolbar","onToolbarDone","percent","get","resizePercent","update","toObject","setNodeByKey","key","Tb","showDone","name","deleteNode","e","preventDefault","onDelete","merge","Data","deleteStatus","err","v","removeNodeByKey","stopReset","imgPendingInsertion","document","findDescendant","n","renderNode","props","all","Object","assign","onFocus","onBlur","maxImageWidth","maxImageHeight","normalizeNode","textNodeMap","updateNodesArray","index","d","text","push","length","withoutNormalization","forEach","insertTextByKey","serialization","deserialize","el","tagName","toLowerCase","style","width","height","parseInt","replace","out","getAttribute","serialize","objectFit"],"mappings":"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","sourcesContent":["import { Data, Inline } from 'slate';\n\nimport Image from '@material-ui/icons/Image';\nimport ImageComponent from './component';\nimport ImageToolbar from './image-toolbar';\nimport InsertImageHandler from './insert-image-handler';\nimport React from 'react';\nimport debug from 'debug';\n\nconst log = debug('@pie-lib:editable-html:plugins:image');\n\nexport default function ImagePlugin(opts) {\n const toolbar = opts.insertImageRequested && {\n icon: <Image />,\n onClick: (value, onChange) => {\n log('[toolbar] onClick');\n const inline = Inline.create({\n type: 'image',\n isVoid: true,\n data: {\n loaded: false,\n src: undefined\n }\n });\n\n const change = value.change().insertInline(inline);\n onChange(change);\n opts.insertImageRequested(getValue => new InsertImageHandler(inline, getValue, onChange));\n },\n supports: node => node.object === 'inline' && node.type === 'image',\n customToolbar: (node, value, onToolbarDone) => {\n const percent = node.data.get('resizePercent');\n\n const onChange = resizePercent => {\n const update = {\n ...node.data.toObject(),\n resizePercent\n };\n\n const change = value.change().setNodeByKey(node.key, { data: update });\n onToolbarDone(change, false);\n };\n\n const Tb = () => <ImageToolbar percent={percent || 100} onChange={onChange} />;\n return Tb;\n },\n showDone: true\n };\n\n return {\n name: 'image',\n toolbar,\n deleteNode: (e, node, value, onChange) => {\n e.preventDefault();\n if (opts.onDelete) {\n const update = node.data.merge(Data.create({ deleteStatus: 'pending' }));\n\n let change = value.change().setNodeByKey(node.key, { data: update });\n\n onChange(change);\n opts.onDelete(node.data.get('src'), (err, v) => {\n if (!err) {\n change = v.change().removeNodeByKey(node.key);\n } else {\n log('[error]: ', err);\n change = v\n .change()\n .setNodeByKey(node.key, node.data.merge(Data.create({ deleteStatus: 'failed' })));\n }\n onChange(change);\n });\n } else {\n let change = value.change().removeNodeByKey(node.key);\n onChange(change);\n }\n },\n stopReset: value => {\n const imgPendingInsertion = value.document.findDescendant(n => {\n if (n.type !== 'image') {\n return;\n }\n return n.data.get('loaded') === false;\n });\n /** don't reset if there is an image pending insertion */\n return imgPendingInsertion !== undefined && imgPendingInsertion !== null;\n },\n renderNode(props) {\n if (props.node.type === 'image') {\n const all = Object.assign(\n {\n onDelete: opts.onDelete,\n onFocus: opts.onFocus,\n onBlur: opts.onBlur,\n maxImageWidth: opts.maxImageWidth,\n maxImageHeight: opts.maxImageHeight,\n },\n props\n );\n return <ImageComponent {...all} />;\n }\n },\n normalizeNode: node => {\n const textNodeMap = {};\n const updateNodesArray = [];\n let index = 0;\n\n if (node.object !== 'document') return;\n\n node.findDescendant(d => {\n if (d.object === 'text') {\n textNodeMap[index] = d;\n }\n\n if (d.type === 'image') {\n if (index > 0 && textNodeMap[index - 1] && textNodeMap[index - 1].text === '') {\n updateNodesArray.push(textNodeMap[index - 1]);\n }\n }\n\n index++;\n });\n\n if (!updateNodesArray.length) return;\n\n return change => {\n change.withoutNormalization(() => {\n updateNodesArray.forEach(n => change.insertTextByKey(n.key, 0, ' '));\n });\n };\n }\n };\n}\n\nexport const serialization = {\n deserialize(el /*, next*/) {\n const name = el.tagName.toLowerCase();\n if (name !== 'img') return;\n\n log('deserialize: ', name);\n const style = el.style || { width: '', height: '' };\n const width = parseInt(style.width.replace('px', ''), 10) || null;\n const height = parseInt(style.height.replace('px', ''), 10) || null;\n\n const out = {\n object: 'inline',\n type: 'image',\n isVoid: true,\n data: {\n src: el.getAttribute('src'),\n width,\n height\n }\n };\n log('return object: ', out);\n return out;\n },\n serialize(object /*, children*/) {\n if (object.type !== 'image') return;\n\n const { data } = object;\n const src = data.get('src');\n const width = data.get('width');\n const height = data.get('height');\n const style = {};\n if (width) {\n style.width = `${width}px`;\n }\n\n if (height) {\n style.height = `${height}px`;\n }\n\n style.objectFit = 'contain';\n\n const props = {\n src,\n style\n };\n\n return <img {...props} />;\n }\n};\n"],"file":"index.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-lib/editable-html",
3
- "version": "7.22.6",
3
+ "version": "8.0.0",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "main": "lib/index.js",
@@ -46,6 +46,6 @@
46
46
  "publishConfig": {
47
47
  "access": "public"
48
48
  },
49
- "gitHead": "531a7f4895323a9d524cfb96f7e26a5f1ab9f7c1",
49
+ "gitHead": "2f841d92dcda7472f18cbce517eb664dec2f6442",
50
50
  "scripts": {}
51
51
  }
package/src/editor.jsx CHANGED
@@ -97,7 +97,9 @@ export class Editor extends React.Component {
97
97
  new Error(`Invalid values: ${values}, values must be one of [${ALL_PLUGINS.join(',')}]`)
98
98
  );
99
99
  }),
100
- className: PropTypes.string
100
+ className: PropTypes.string,
101
+ maxImageWidth: PropTypes.number,
102
+ maxImageHeight: PropTypes.number,
101
103
  };
102
104
 
103
105
  static defaultProps = {
@@ -156,7 +158,9 @@ export class Editor extends React.Component {
156
158
  props.imageSupport.add(handler);
157
159
  }),
158
160
  onFocus: this.onPluginFocus,
159
- onBlur: this.onPluginBlur
161
+ onBlur: this.onPluginBlur,
162
+ maxImageWidth: this.props.maxImageWidth,
163
+ maxImageHeight: this.props.maxImageHeight,
160
164
  },
161
165
  toolbar: {
162
166
  /**
@@ -20,7 +20,9 @@ export class Component extends React.Component {
20
20
  classes: PropTypes.object.isRequired,
21
21
  attributes: PropTypes.object,
22
22
  onFocus: PropTypes.func,
23
- onBlur: PropTypes.func
23
+ onBlur: PropTypes.func,
24
+ maxImageWidth: PropTypes.number,
25
+ maxImageHeight: PropTypes.number,
24
26
  };
25
27
 
26
28
  getWidth = percent => {
@@ -41,30 +43,33 @@ export class Component extends React.Component {
41
43
  applySizeData = () => {
42
44
  const { node, editor } = this.props;
43
45
 
44
- const resizePercent = node.data.get('resizePercent');
45
- log('[applySizeData]: resizePercent: ', resizePercent);
46
-
47
46
  let update = node.data;
48
47
 
49
- if (resizePercent) {
50
- update = update.set('width', this.getWidth(resizePercent));
51
- update = update.set('height', this.getHeight(resizePercent));
52
- } else {
53
- const w = update.get('width');
54
- if (w) {
55
- update = update.set('resizePercent', this.getPercentFromWidth(w));
56
- }
48
+ const w = update.get('width');
49
+ if (w) {
50
+ update = update.set('resizePercent', this.getPercentFromWidth(w));
57
51
  }
58
52
 
59
- log('[applySizeData] update: ', update);
53
+ log("[applySizeData] update: ", update);
60
54
 
61
55
  if (!update.equals(node.data)) {
62
56
  editor.change(c => c.setNodeByKey(node.key, { data: update }));
63
57
  }
64
58
  };
65
59
 
60
+ initialiseResize = () => {
61
+ window.addEventListener('mousemove', this.startResizing, false);
62
+ window.addEventListener('mouseup', this.stopResizing, false);
63
+ };
64
+
66
65
  componentDidMount() {
67
66
  this.applySizeData();
67
+
68
+ const resizeHandle = this.resize;
69
+
70
+ if (resizeHandle) {
71
+ resizeHandle.addEventListener('mousedown', this.initialiseResize, false);
72
+ }
68
73
  }
69
74
 
70
75
  componentDidUpdate() {
@@ -79,6 +84,117 @@ export class Component extends React.Component {
79
84
  };
80
85
  }
81
86
 
87
+ loadImage = () => {
88
+ let { maxImageWidth, maxImageHeight } = this.props || {};
89
+ maxImageWidth = maxImageWidth || 700;
90
+ maxImageHeight = maxImageHeight || 900;
91
+
92
+ const box = this.img;
93
+
94
+ //on first load
95
+ if (!box.style.width || box.style.width === 'auto') {
96
+ const dimensions = { width: box && box.naturalWidth || 100, height: box && box.naturalHeight || 100 };
97
+
98
+ const { width, height } = this.updateImageDimensions(
99
+ dimensions,
100
+ {
101
+ width: dimensions.width < maxImageWidth ? dimensions.width : maxImageWidth,
102
+ height: dimensions.height < maxImageHeight ? dimensions.height : maxImageHeight
103
+ },
104
+ true
105
+ );
106
+
107
+ box.style.width = `${width}px`;
108
+ box.style.height = `${height}px`;
109
+
110
+ this.setState({
111
+ dimensions: { height: height, width: width },
112
+ });
113
+
114
+ const { node, editor } = this.props;
115
+
116
+ let update = node.data;
117
+
118
+ update = update.set('width', width);
119
+ update = update.set('height', height);
120
+
121
+ if (!update.equals(node.data)) {
122
+ editor.change(c => c.setNodeByKey(node.key, { data: update }));
123
+ }
124
+ }
125
+ };
126
+
127
+ startResizing = (e) => {
128
+ const bounds = e.target.getBoundingClientRect();
129
+ const box = this.img;
130
+ const dimensions = { width: box && box.naturalWidth || 100, height: box && box.naturalHeight || 100};
131
+
132
+ const { width, height } = this.updateImageDimensions(
133
+ dimensions,
134
+ {
135
+ width: e.clientX - bounds.left,
136
+ height: e.clientY - bounds.top
137
+ },
138
+ true
139
+ );
140
+
141
+ const hasMinimumWidth = width > 50 && height > 50;
142
+ const hasDimensionsConstraints = width <= 700 && height <= 900;
143
+
144
+ if (hasMinimumWidth && hasDimensionsConstraints && box) {
145
+ box.style.width = `${width}px`;
146
+ box.style.height = `${height}px`;
147
+
148
+ this.setState({
149
+ dimensions: { height: height, width: width }
150
+ });
151
+
152
+ const { node, editor } = this.props;
153
+
154
+ let update = node.data;
155
+
156
+ update = update.set('width', width);
157
+ update = update.set('height', height);
158
+
159
+ if (!update.equals(node.data)) {
160
+ editor.change(c => c.setNodeByKey(node.key, { data: update }));
161
+ }
162
+ }
163
+ };
164
+
165
+ stopResizing = () => {
166
+ window.removeEventListener('mousemove', this.startResizing, false);
167
+ window.removeEventListener('mouseup', this.stopResizing, false);
168
+ };
169
+
170
+ updateImageDimensions = (initialDim, nextDim, keepAspectRatio, resizeType) => {
171
+ // if we want to keep image aspect ratio
172
+ if (keepAspectRatio) {
173
+ const imageAspectRatio = initialDim.width / initialDim.height;
174
+
175
+ if (resizeType === 'height') {
176
+ // if we want to change image height => we update the width accordingly
177
+ return {
178
+ width: nextDim.height * imageAspectRatio,
179
+ height: nextDim.height
180
+ }
181
+ }
182
+
183
+ // if we want to change image width => we update the height accordingly
184
+ return {
185
+ width: nextDim.width,
186
+ height: nextDim.width / imageAspectRatio
187
+ }
188
+ }
189
+
190
+ // if we don't want to keep aspect ratio, we just update both values
191
+ return {
192
+ width: nextDim.width,
193
+ height: nextDim.height
194
+ }
195
+ };
196
+
197
+
82
198
  render() {
83
199
  const { node, editor, classes, attributes, onFocus } = this.props;
84
200
  const active = editor.value.isFocused && editor.value.selection.hasEdgeIn(node);
@@ -95,7 +211,6 @@ export class Component extends React.Component {
95
211
 
96
212
  const className = classNames(
97
213
  classes.root,
98
- active && classes.active,
99
214
  !loaded && classes.loading,
100
215
  deleteStatus === 'pending' && classes.pendingDelete
101
216
  );
@@ -110,7 +225,21 @@ export class Component extends React.Component {
110
225
  value={percent > 0 ? percent : 0}
111
226
  className={progressClasses}
112
227
  />
113
- <img src={src} {...attributes} ref={r => (this.img = r)} style={size} />
228
+ <div className={classes.imageContainer}>
229
+ <img
230
+ {...attributes}
231
+ className={classNames(classes.image, active && classes.active)}
232
+ ref={ref => {
233
+ this.img = ref;
234
+ }}
235
+ src={src}
236
+ style={size}
237
+ onLoad={this.loadImage}
238
+ />
239
+ <div ref={ref => {
240
+ this.resize = ref;
241
+ }} className={classNames(classes.resize, 'resize')}/>
242
+ </div>
114
243
  </div>,
115
244
  <span key={'sp2'}>&nbsp;</span>
116
245
  ];
@@ -154,13 +283,36 @@ const styles = theme => ({
154
283
  display: 'inline-block',
155
284
  transition: 'opacity 200ms linear'
156
285
  },
157
- active: {
158
- border: `solid 1px ${theme.palette.primary.main}`
159
- },
160
286
  delete: {
161
287
  position: 'absolute',
162
288
  right: 0
163
- }
289
+ },
290
+ imageContainer: {
291
+ position: 'relative',
292
+ width: 'fit-content',
293
+ display: 'flex',
294
+ alignItems: 'center',
295
+
296
+ '&&:hover > .resize': {
297
+ display: 'block'
298
+ }
299
+ },
300
+ active: {
301
+ border: `solid 1px ${theme.palette.primary.main}`
302
+ },
303
+ resize: {
304
+ backgroundColor: theme.palette.primary.main,
305
+ cursor: 'col-resize',
306
+ height: '35px',
307
+ width: '5px',
308
+ borderRadius: 8,
309
+ marginLeft: '5px',
310
+ marginRight: '10px',
311
+ display: 'none'
312
+ },
313
+ drawableHeight: {
314
+ minHeight: 350,
315
+ },
164
316
  });
165
317
 
166
318
  export default withStyles(styles)(Component);
@@ -1,5 +1,3 @@
1
- import { MarkButton } from '../toolbar/toolbar-buttons';
2
-
3
1
  import PropTypes from 'prop-types';
4
2
  import React from 'react';
5
3
  import debug from 'debug';
@@ -7,45 +5,17 @@ import { withStyles } from '@material-ui/core/styles';
7
5
 
8
6
  const log = debug('@pie-lib:editable-html:plugins:image:image-toolbar');
9
7
 
10
- const PercentButton = ({ percent, active, onClick }) => {
11
- const label = `${percent}%`;
12
- return (
13
- <MarkButton active={active} onToggle={() => onClick(percent)} label={label}>
14
- {label}
15
- </MarkButton>
16
- );
17
- };
18
-
19
- PercentButton.propTypes = {
20
- percent: PropTypes.number.isRequired,
21
- active: PropTypes.bool.isRequired,
22
- onClick: PropTypes.func.isRequired
23
- };
24
-
25
8
  export class ImageToolbar extends React.Component {
26
9
  static propTypes = {
27
- percent: PropTypes.number.isRequired,
28
10
  onChange: PropTypes.func.isRequired,
29
11
  classes: PropTypes.object.isRequired
30
12
  };
31
13
 
32
- onPercentClick = percent => {
33
- log('[onPercentClick]: percent:', percent);
34
- this.props.onChange(percent);
35
- };
36
-
37
14
  render() {
38
- const { classes, percent } = this.props;
15
+ // Don't remove toolbar since we will have other new buttons
16
+ const { classes } = this.props;
39
17
  return (
40
18
  <div className={classes.holder}>
41
- <PercentButton percent={25} active={percent === 25} onClick={this.onPercentClick} />
42
- <PercentButton percent={50} active={percent === 50} onClick={this.onPercentClick} />
43
- <PercentButton active={percent === 75} percent={75} onClick={this.onPercentClick} />
44
- <PercentButton
45
- percent={100}
46
- active={percent === 100 || !percent}
47
- onClick={this.onPercentClick}
48
- />
49
19
  </div>
50
20
  );
51
21
  }
@@ -90,7 +90,9 @@ export default function ImagePlugin(opts) {
90
90
  {
91
91
  onDelete: opts.onDelete,
92
92
  onFocus: opts.onFocus,
93
- onBlur: opts.onBlur
93
+ onBlur: opts.onBlur,
94
+ maxImageWidth: opts.maxImageWidth,
95
+ maxImageHeight: opts.maxImageHeight,
94
96
  },
95
97
  props
96
98
  );