@pie-lib/editable-html-tip-tap 2.1.12-next.42 → 2.1.12-next.49

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.
@@ -77,6 +77,16 @@ var cssVariables = {
77
77
  '--red-light': '#ffebe5',
78
78
  '--shadow': "0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)"
79
79
  };
80
+
81
+ // ProseMirror puts these on the contenteditable element. Without them the browser
82
+ // spellchecks the editor regardless of the spellCheck prop.
83
+ var spellCheckAttributes = function spellCheckAttributes(enabled) {
84
+ return {
85
+ spellcheck: enabled ? 'true' : 'false',
86
+ autocorrect: enabled ? 'on' : 'off',
87
+ autocapitalize: enabled ? 'on' : 'off'
88
+ };
89
+ };
80
90
  var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
81
91
  var _props$pluginProps;
82
92
  var _ref = props.pluginProps || {},
@@ -234,10 +244,16 @@ var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
234
244
  }), _css.CSSMark.configure({
235
245
  extraCSSRules: props.extraCSSRules
236
246
  })];
247
+
248
+ // Callers that don't pass spellCheck keep the browser default (on), as they did with the
249
+ // slate-based editor. Players that have to default to off - extended-text-entry, see
250
+ // PIE-978 - resolve that in their controller and pass an explicit false.
251
+ var spellCheckEnabled = props.spellCheck !== false;
237
252
  var editor = (0, _react2.useEditor)({
238
253
  extensions: extensions,
239
254
  immediatelyRender: false,
240
255
  editorProps: {
256
+ attributes: spellCheckAttributes(spellCheckEnabled),
241
257
  handleKeyDown: function handleKeyDown(view, event) {
242
258
  if (props.onKeyDown) {
243
259
  return props.onKeyDown(event);
@@ -274,6 +290,27 @@ var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
274
290
  (0, _react.useEffect)(function () {
275
291
  editor === null || editor === void 0 || editor.setEditable(!props.disabled);
276
292
  }, [props.disabled, editor]);
293
+
294
+ // useEditor only re-applies options on its own when it is called with an empty dependency
295
+ // array, and this call site depends on charactersLimit, so a spellCheck change on a mounted
296
+ // editor has to be pushed in. Only the attributes are replaced - the rest of editorProps
297
+ // stays as the editor already has it.
298
+ (0, _react.useEffect)(function () {
299
+ var _editor$options, _currentEditorProps$a;
300
+ if (!editor) {
301
+ return;
302
+ }
303
+ var currentEditorProps = (_editor$options = editor.options) === null || _editor$options === void 0 ? void 0 : _editor$options.editorProps;
304
+ var attributes = spellCheckAttributes(spellCheckEnabled);
305
+ if ((currentEditorProps === null || currentEditorProps === void 0 || (_currentEditorProps$a = currentEditorProps.attributes) === null || _currentEditorProps$a === void 0 ? void 0 : _currentEditorProps$a.spellcheck) === attributes.spellcheck) {
306
+ return;
307
+ }
308
+ editor.setOptions({
309
+ editorProps: _objectSpread(_objectSpread({}, currentEditorProps), {}, {
310
+ attributes: attributes
311
+ })
312
+ });
313
+ }, [spellCheckEnabled, editor]);
277
314
  (0, _react.useEffect)(function () {
278
315
  if (!editor) {
279
316
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"EditableHtml.js","names":["_react","_interopRequireWildcard","require","_debounce","_interopRequireDefault","_react2","_styles","_starterKit","_extensionTextStyle","_extensionCharacterCount","_extensionSuperscript","_extensionSubscript","_extensionTextAlign","_extensionImage","_extensionPlaceholder","_helper","_extendedTable","_extendedTableCell","_divNode","_ensureEmptyRootDiv","_ensureListItemContentIsDiv","_extensionTableRow","_responseArea","_math","_image","_media","_css","_extendedListItem","_headingParagraph","_TiptapContainer","_size","_extensions","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","DEFAULT_ACTIVE_PLUGINS","cssVariables","EditableHtml","exports","props","_props$pluginProps","_ref","pluginProps","showParagraphs","separateParagraphs","_useState","useState","_useState2","_slicedToArray2","pendingImages","setPendingImages","_useState3","_useState4","scheduled","setScheduled","toolbarOpts","removePendingImage","useCallback","imagePos","prev","next","img","pos","toolbarOptsToUse","commitEditorContent","editor","html","getHTML","markup","_props$onChange","onChange","_props$onDone","onDone","responseAreaPropsToUse","useMemo","responseAreaProps","onInlineDropdownToolbarClose","activePluginsToUse","_ref3","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","ExtendedListItem","DivNode","HeadingParagraph","EnsureEmptyRootIsDiv","EnsureListItemContentIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","_props$onDone2","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","useEditor","immediatelyRender","editorProps","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","onUpdate","_ref4","transaction","isDone","_props$onChange2","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","schema","useEffect","editorRef","setEditable","nextMarkup","commands","setContent","emitUpdate","entries","_ref6","_ref7","key","value","document","documentElement","style","setProperty","editorState","useEditorState","selector","ctx","_ctx$editor","isFocused","sizeStyle","minWidth","width","maxWidth","minHeight","height","maxHeight","valueToSize","createElement","_extends2","StyledEditorContent","showParagraph","separateParagraph","styled","EditorContent","shouldForwardProp","prop","includes","_ref8","display","outline","flex","padding","margin","left","top","color","pointerEvents","whiteSpace","fontSize","marginBottom","_default"],"sources":["../../src/components/EditableHtml.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash-es/debounce';\nimport { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { styled } from '@mui/material/styles';\nimport StarterKit from '@tiptap/starter-kit';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport SuperScript from '@tiptap/extension-superscript';\nimport SubScript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Image from '@tiptap/extension-image';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { normalizeInitialMarkup } from '../utils/helper';\n\nimport ExtendedTable from '../extensions/extended-table';\nimport { ExtendedTableCell, ExtendedTableHeader } from '../extensions/extended-table-cell';\nimport { DivNode } from '../extensions/div-node';\nimport { EnsureEmptyRootIsDiv } from '../extensions/ensure-empty-root-div';\nimport { EnsureListItemContentIsDiv } from '../extensions/ensure-list-item-content-is-div';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport {\n DragInTheBlankNode,\n ExplicitConstructedResponseNode,\n InlineDropdownNode,\n MathTemplatedNode,\n ResponseAreaExtension,\n} from '../extensions/responseArea';\nimport { MathNode } from '../extensions/math';\nimport { ImageUploadNode } from '../extensions/image';\nimport { Media } from '../extensions/media';\nimport { CSSMark } from '../extensions/css';\nimport { ExtendedListItem } from '../extensions/extended-list-item';\nimport { HeadingParagraph } from '../extensions/heading-paragraph';\n\nimport EditorContainer from './TiptapContainer';\nimport { valueToSize } from '../utils/size';\nimport { buildExtensions, PLUGINS_MAP } from '../extensions';\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 DEFAULT_ACTIVE_PLUGINS = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n 'bulleted-list',\n 'numbered-list',\n 'image',\n 'math',\n 'languageCharacters',\n 'text-align',\n 'table',\n 'video',\n 'audio',\n 'responseArea',\n 'superscript',\n 'subscript',\n 'css',\n 'h3',\n 'undo',\n 'redo',\n];\n\nconst cssVariables = {\n '--white': '#fff',\n '--black': '#2e2b29',\n '--black-contrast': '#110f0e',\n '--gray-1': 'rgba(61, 37, 20, .05)',\n '--gray-2': 'rgba(61, 37, 20, .08)',\n '--gray-3': 'rgba(61, 37, 20, .12)',\n '--gray-4': 'rgba(53, 38, 28, .3)',\n '--gray-5': 'rgba(28, 25, 23, .6)',\n '--green': '#22c55e',\n '--purple': '#6a00f5',\n '--purple-contrast': '#5800cc',\n '--purple-light': 'rgba(88, 5, 255, .05)',\n '--yellow-contrast': '#facc15',\n '--yellow': 'rgba(250, 204, 21, .4)',\n '--yellow-light': '#fffae5',\n '--red': '#ff5c33',\n '--red-light': '#ffebe5',\n '--shadow': `0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,\n};\n\nexport const EditableHtml = (props) => {\n const { showParagraphs, separateParagraphs } = props.pluginProps || {};\n const [pendingImages, setPendingImages] = useState([]);\n const [scheduled, setScheduled] = useState(false);\n const { toolbarOpts } = props;\n\n const removePendingImage = useCallback(\n (imagePos) => {\n setPendingImages((prev) => {\n const next = prev.filter((img) => img.pos !== imagePos);\n if (next.length === 0) {\n setScheduled(false);\n }\n return next;\n });\n },\n [setPendingImages],\n );\n\n const toolbarOptsToUse = {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n };\n\n const commitEditorContent = useCallback(\n (editor) => {\n const html = editor.getHTML();\n\n if (props.markup !== html) {\n props.onChange?.(html);\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(html);\n }\n },\n [props.markup, props.onChange, props.onDone, toolbarOptsToUse.doneOn],\n );\n\n const responseAreaPropsToUse = useMemo(\n () => ({\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n onInlineDropdownToolbarClose: commitEditorContent,\n }),\n [props.responseAreaProps, commitEditorContent],\n );\n\n const activePluginsToUse = useMemo(() => {\n let { customPlugins, ...otherPluginProps } = props.pluginProps || {};\n\n customPlugins = customPlugins || [];\n\n const filteredActivePlugins = (props.activePlugins || DEFAULT_ACTIVE_PLUGINS)?.filter((pluginName) => {\n const nameToUse = PLUGINS_MAP[pluginName] || pluginName;\n const pluginInfo = otherPluginProps[nameToUse] || {};\n\n return !pluginInfo || !pluginInfo.disabled;\n });\n\n return buildExtensions(filteredActivePlugins, customPlugins, {\n math: {},\n textAlign: props.textAlign,\n html: {},\n extraCSSRules: props.extraCSSRules || {},\n image: {\n ...props.imageSupport,\n },\n toolbar: {},\n table: {},\n responseArea: {\n type: responseAreaPropsToUse.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props, responseAreaPropsToUse.type]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', 'headingParagraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'td', 'th'],\n alignments: ['left', 'right', 'center', 'justify'],\n }),\n TextStyleKit,\n CharacterCount.configure({\n limit: props.charactersLimit || 1000000,\n }),\n StarterKit.configure({\n trailingNode: {\n node: 'paragraph',\n notAfter: ['paragraph', 'div'],\n },\n }),\n ExtendedListItem,\n DivNode,\n HeadingParagraph,\n EnsureEmptyRootIsDiv,\n EnsureListItemContentIsDiv,\n Placeholder.configure({\n placeholder: props.placeholder,\n // show placeholder even when editor is focused\n showOnlyWhenEditable: true,\n showOnlyCurrent: false, // show on all empty nodes, not only the current one\n includeChildren: true,\n }),\n ExtendedTable,\n TableRow,\n ExtendedTableHeader,\n ExtendedTableCell,\n ResponseAreaExtension.configure(responseAreaPropsToUse),\n ExplicitConstructedResponseNode.configure(responseAreaPropsToUse),\n DragInTheBlankNode.configure(responseAreaPropsToUse),\n InlineDropdownNode.configure(responseAreaPropsToUse),\n MathTemplatedNode.configure(responseAreaPropsToUse),\n MathNode.configure({\n toolbarOpts: toolbarOptsToUse,\n math: props.pluginProps?.math || {},\n }),\n SubScript,\n SuperScript,\n Image,\n ImageUploadNode.configure({\n toolbarOpts: toolbarOptsToUse,\n imageHandling: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDone: (editor) => props.onDone?.(editor.getHTML()),\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((node) => {\n const { src } = node.attrs;\n\n props.imageSupport.delete(src, (e) => {\n removePendingImage(node.pos);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((editor, imageInfo, getHandler) => {\n const [addedImage, pos] = imageInfo;\n\n const onFinish = (result) => {\n let cb;\n\n if (scheduled && result) {\n // finish editing only on success\n cb = props.onChange;\n }\n\n removePendingImage(pos);\n cb?.(editor.getHTML());\n };\n\n const callback = () => {\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(onFinish);\n\n // If the user closes the file picker without choosing a file, the window regains\n // focus while _insertingImage is still true — drop the stale pending entry.\n const focusHandler = debounce(() => {\n const detach = () => window.removeEventListener('focus', focusHandler);\n\n if (!editor._insertingImage) {\n detach();\n return;\n }\n\n removePendingImage(pos);\n editor._insertingImage = false;\n detach();\n }, 500);\n\n window.addEventListener('focus', focusHandler);\n\n props.imageSupport.add(handler);\n };\n\n editor._insertingImage = true;\n setPendingImages((prev) => [...prev, addedImage]);\n callback();\n }),\n maxImageWidth: props.maxImageWidth,\n maxImageHeight: props.maxImageHeight,\n },\n limit: 3,\n }),\n Media.configure({\n uploadSoundSupport: props.uploadSoundSupport,\n }),\n CSSMark.configure({\n extraCSSRules: props.extraCSSRules,\n }),\n ];\n\n const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\n handleKeyDown(view, event) {\n if (props.onKeyDown) {\n return props.onKeyDown(event);\n }\n\n // Return false to let default behavior continue\n return false;\n },\n },\n editable: !props.disabled,\n content: normalizeInitialMarkup(props.markup),\n onUpdate: ({ editor, transaction }) => {\n if (transaction.isDone) {\n props.onChange?.(editor.getHTML());\n }\n },\n onBlur: ({ editor }) => {\n const otherToolbarOpened =\n editor._insertingImage ||\n editor._toolbarOpened ||\n editor.isActive('inline_dropdown') ||\n editor.isActive('explicit_constructed_response');\n\n if (otherToolbarOpened || !editor.schema) {\n return;\n }\n\n commitEditorContent(editor);\n },\n },\n [props.charactersLimit],\n );\n\n useEffect(() => {\n if (props.editorRef) {\n props.editorRef(editor);\n }\n }, [props.editorRef, editor]);\n\n useEffect(() => {\n editor?.setEditable(!props.disabled);\n }, [props.disabled, editor]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, { emitUpdate: false });\n }\n }, [props.markup, editor]);\n\n useEffect(() => {\n Object.entries(cssVariables).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n }, []);\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => ({\n isFocused: ctx.editor?.isFocused,\n }),\n });\n\n const sizeStyle = useMemo(() => {\n const { minWidth, width, maxWidth, minHeight, height, maxHeight } = props;\n\n return {\n width: valueToSize(width),\n minWidth: valueToSize(minWidth),\n maxWidth: valueToSize(maxWidth),\n height: valueToSize(height),\n minHeight: valueToSize(minHeight),\n maxHeight: valueToSize(maxHeight),\n };\n }, [props]);\n\n return (\n <EditorContainer\n {...{\n ...props,\n activePlugins: activePluginsToUse,\n toolbarOpts: toolbarOptsToUse,\n }}\n editorState={editorState}\n editor={editor}\n >\n {editor && (\n <StyledEditorContent\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n showParagraph={showParagraphs && !showParagraphs.disabled}\n separateParagraph={separateParagraphs && !separateParagraphs.disabled}\n editor={editor}\n />\n )}\n </EditorContainer>\n );\n};\n\nconst StyledEditorContent = styled(EditorContent, {\n shouldForwardProp: (prop) => !['showParagraph', 'separateParagraph'].includes(prop),\n})(({ showParagraph, separateParagraph }) => ({\n display: 'flex',\n outline: 'none !important',\n '& .ProseMirror': {\n flex: 1,\n padding: '5px',\n maxHeight: '500px',\n outline: 'none !important',\n position: 'initial',\n\n // reset default margins for all block paragraphs/divs in the editor\n '& > p, & > div': {\n margin: '0',\n },\n\n // Out of flow so the caret stays at the start of the block; in-flow ::before pushes the caret after the hint text.\n // :only-child ensures the placeholder is hidden whenever the editor has other content (images, upload nodes, etc.)\n // and covers the type+backspace edge case where Tiptap only adds is-empty (not is-editor-empty).\n '& p[data-placeholder].is-empty:only-child, & div[data-placeholder].is-empty:only-child': {\n position: 'relative',\n },\n '& p[data-placeholder].is-empty:only-child::before, & div[data-placeholder].is-empty:only-child::before': {\n content: 'attr(data-placeholder)',\n position: 'absolute',\n left: 0,\n top: 0,\n color: '#9CA3AF',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n },\n\n ...(showParagraph && {\n '& > p:has(+ p)::after, & > div:has(+ div)::after': {\n display: 'block',\n content: '\"¶\"',\n fontSize: '1em',\n color: '#146EB3',\n },\n }),\n ...(separateParagraph && {\n '& > p:has(+ p)': {\n marginBottom: '1em',\n },\n }),\n },\n}));\n\nexport default EditableHtml;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"EditableHtml.js","names":["_react","_interopRequireWildcard","require","_debounce","_interopRequireDefault","_react2","_styles","_starterKit","_extensionTextStyle","_extensionCharacterCount","_extensionSuperscript","_extensionSubscript","_extensionTextAlign","_extensionImage","_extensionPlaceholder","_helper","_extendedTable","_extendedTableCell","_divNode","_ensureEmptyRootDiv","_ensureListItemContentIsDiv","_extensionTableRow","_responseArea","_math","_image","_media","_css","_extendedListItem","_headingParagraph","_TiptapContainer","_size","_extensions","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","DEFAULT_ACTIVE_PLUGINS","cssVariables","spellCheckAttributes","enabled","spellcheck","autocorrect","autocapitalize","EditableHtml","exports","props","_props$pluginProps","_ref","pluginProps","showParagraphs","separateParagraphs","_useState","useState","_useState2","_slicedToArray2","pendingImages","setPendingImages","_useState3","_useState4","scheduled","setScheduled","toolbarOpts","removePendingImage","useCallback","imagePos","prev","next","img","pos","toolbarOptsToUse","commitEditorContent","editor","html","getHTML","markup","_props$onChange","onChange","_props$onDone","onDone","responseAreaPropsToUse","useMemo","responseAreaProps","onInlineDropdownToolbarClose","activePluginsToUse","_ref3","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","ExtendedListItem","DivNode","HeadingParagraph","EnsureEmptyRootIsDiv","EnsureListItemContentIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","_props$onDone2","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","spellCheckEnabled","spellCheck","useEditor","immediatelyRender","editorProps","attributes","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","onUpdate","_ref4","transaction","isDone","_props$onChange2","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","schema","useEffect","editorRef","setEditable","_editor$options","_currentEditorProps$a","currentEditorProps","setOptions","nextMarkup","commands","setContent","emitUpdate","entries","_ref6","_ref7","key","value","document","documentElement","style","setProperty","editorState","useEditorState","selector","ctx","_ctx$editor","isFocused","sizeStyle","minWidth","width","maxWidth","minHeight","height","maxHeight","valueToSize","createElement","_extends2","StyledEditorContent","showParagraph","separateParagraph","styled","EditorContent","shouldForwardProp","prop","includes","_ref8","display","outline","flex","padding","margin","left","top","color","pointerEvents","whiteSpace","fontSize","marginBottom","_default"],"sources":["../../src/components/EditableHtml.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash-es/debounce';\nimport { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { styled } from '@mui/material/styles';\nimport StarterKit from '@tiptap/starter-kit';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport SuperScript from '@tiptap/extension-superscript';\nimport SubScript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Image from '@tiptap/extension-image';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { normalizeInitialMarkup } from '../utils/helper';\n\nimport ExtendedTable from '../extensions/extended-table';\nimport { ExtendedTableCell, ExtendedTableHeader } from '../extensions/extended-table-cell';\nimport { DivNode } from '../extensions/div-node';\nimport { EnsureEmptyRootIsDiv } from '../extensions/ensure-empty-root-div';\nimport { EnsureListItemContentIsDiv } from '../extensions/ensure-list-item-content-is-div';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport {\n DragInTheBlankNode,\n ExplicitConstructedResponseNode,\n InlineDropdownNode,\n MathTemplatedNode,\n ResponseAreaExtension,\n} from '../extensions/responseArea';\nimport { MathNode } from '../extensions/math';\nimport { ImageUploadNode } from '../extensions/image';\nimport { Media } from '../extensions/media';\nimport { CSSMark } from '../extensions/css';\nimport { ExtendedListItem } from '../extensions/extended-list-item';\nimport { HeadingParagraph } from '../extensions/heading-paragraph';\n\nimport EditorContainer from './TiptapContainer';\nimport { valueToSize } from '../utils/size';\nimport { buildExtensions, PLUGINS_MAP } from '../extensions';\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 DEFAULT_ACTIVE_PLUGINS = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n 'bulleted-list',\n 'numbered-list',\n 'image',\n 'math',\n 'languageCharacters',\n 'text-align',\n 'table',\n 'video',\n 'audio',\n 'responseArea',\n 'superscript',\n 'subscript',\n 'css',\n 'h3',\n 'undo',\n 'redo',\n];\n\nconst cssVariables = {\n '--white': '#fff',\n '--black': '#2e2b29',\n '--black-contrast': '#110f0e',\n '--gray-1': 'rgba(61, 37, 20, .05)',\n '--gray-2': 'rgba(61, 37, 20, .08)',\n '--gray-3': 'rgba(61, 37, 20, .12)',\n '--gray-4': 'rgba(53, 38, 28, .3)',\n '--gray-5': 'rgba(28, 25, 23, .6)',\n '--green': '#22c55e',\n '--purple': '#6a00f5',\n '--purple-contrast': '#5800cc',\n '--purple-light': 'rgba(88, 5, 255, .05)',\n '--yellow-contrast': '#facc15',\n '--yellow': 'rgba(250, 204, 21, .4)',\n '--yellow-light': '#fffae5',\n '--red': '#ff5c33',\n '--red-light': '#ffebe5',\n '--shadow': `0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,\n};\n\n// ProseMirror puts these on the contenteditable element. Without them the browser\n// spellchecks the editor regardless of the spellCheck prop.\nconst spellCheckAttributes = (enabled) => ({\n spellcheck: enabled ? 'true' : 'false',\n autocorrect: enabled ? 'on' : 'off',\n autocapitalize: enabled ? 'on' : 'off',\n});\n\nexport const EditableHtml = (props) => {\n const { showParagraphs, separateParagraphs } = props.pluginProps || {};\n const [pendingImages, setPendingImages] = useState([]);\n const [scheduled, setScheduled] = useState(false);\n const { toolbarOpts } = props;\n\n const removePendingImage = useCallback(\n (imagePos) => {\n setPendingImages((prev) => {\n const next = prev.filter((img) => img.pos !== imagePos);\n if (next.length === 0) {\n setScheduled(false);\n }\n return next;\n });\n },\n [setPendingImages],\n );\n\n const toolbarOptsToUse = {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n };\n\n const commitEditorContent = useCallback(\n (editor) => {\n const html = editor.getHTML();\n\n if (props.markup !== html) {\n props.onChange?.(html);\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(html);\n }\n },\n [props.markup, props.onChange, props.onDone, toolbarOptsToUse.doneOn],\n );\n\n const responseAreaPropsToUse = useMemo(\n () => ({\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n onInlineDropdownToolbarClose: commitEditorContent,\n }),\n [props.responseAreaProps, commitEditorContent],\n );\n\n const activePluginsToUse = useMemo(() => {\n let { customPlugins, ...otherPluginProps } = props.pluginProps || {};\n\n customPlugins = customPlugins || [];\n\n const filteredActivePlugins = (props.activePlugins || DEFAULT_ACTIVE_PLUGINS)?.filter((pluginName) => {\n const nameToUse = PLUGINS_MAP[pluginName] || pluginName;\n const pluginInfo = otherPluginProps[nameToUse] || {};\n\n return !pluginInfo || !pluginInfo.disabled;\n });\n\n return buildExtensions(filteredActivePlugins, customPlugins, {\n math: {},\n textAlign: props.textAlign,\n html: {},\n extraCSSRules: props.extraCSSRules || {},\n image: {\n ...props.imageSupport,\n },\n toolbar: {},\n table: {},\n responseArea: {\n type: responseAreaPropsToUse.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props, responseAreaPropsToUse.type]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', 'headingParagraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'td', 'th'],\n alignments: ['left', 'right', 'center', 'justify'],\n }),\n TextStyleKit,\n CharacterCount.configure({\n limit: props.charactersLimit || 1000000,\n }),\n StarterKit.configure({\n trailingNode: {\n node: 'paragraph',\n notAfter: ['paragraph', 'div'],\n },\n }),\n ExtendedListItem,\n DivNode,\n HeadingParagraph,\n EnsureEmptyRootIsDiv,\n EnsureListItemContentIsDiv,\n Placeholder.configure({\n placeholder: props.placeholder,\n // show placeholder even when editor is focused\n showOnlyWhenEditable: true,\n showOnlyCurrent: false, // show on all empty nodes, not only the current one\n includeChildren: true,\n }),\n ExtendedTable,\n TableRow,\n ExtendedTableHeader,\n ExtendedTableCell,\n ResponseAreaExtension.configure(responseAreaPropsToUse),\n ExplicitConstructedResponseNode.configure(responseAreaPropsToUse),\n DragInTheBlankNode.configure(responseAreaPropsToUse),\n InlineDropdownNode.configure(responseAreaPropsToUse),\n MathTemplatedNode.configure(responseAreaPropsToUse),\n MathNode.configure({\n toolbarOpts: toolbarOptsToUse,\n math: props.pluginProps?.math || {},\n }),\n SubScript,\n SuperScript,\n Image,\n ImageUploadNode.configure({\n toolbarOpts: toolbarOptsToUse,\n imageHandling: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDone: (editor) => props.onDone?.(editor.getHTML()),\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((node) => {\n const { src } = node.attrs;\n\n props.imageSupport.delete(src, (e) => {\n removePendingImage(node.pos);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((editor, imageInfo, getHandler) => {\n const [addedImage, pos] = imageInfo;\n\n const onFinish = (result) => {\n let cb;\n\n if (scheduled && result) {\n // finish editing only on success\n cb = props.onChange;\n }\n\n removePendingImage(pos);\n cb?.(editor.getHTML());\n };\n\n const callback = () => {\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(onFinish);\n\n // If the user closes the file picker without choosing a file, the window regains\n // focus while _insertingImage is still true — drop the stale pending entry.\n const focusHandler = debounce(() => {\n const detach = () => window.removeEventListener('focus', focusHandler);\n\n if (!editor._insertingImage) {\n detach();\n return;\n }\n\n removePendingImage(pos);\n editor._insertingImage = false;\n detach();\n }, 500);\n\n window.addEventListener('focus', focusHandler);\n\n props.imageSupport.add(handler);\n };\n\n editor._insertingImage = true;\n setPendingImages((prev) => [...prev, addedImage]);\n callback();\n }),\n maxImageWidth: props.maxImageWidth,\n maxImageHeight: props.maxImageHeight,\n },\n limit: 3,\n }),\n Media.configure({\n uploadSoundSupport: props.uploadSoundSupport,\n }),\n CSSMark.configure({\n extraCSSRules: props.extraCSSRules,\n }),\n ];\n\n // Callers that don't pass spellCheck keep the browser default (on), as they did with the\n // slate-based editor. Players that have to default to off - extended-text-entry, see\n // PIE-978 - resolve that in their controller and pass an explicit false.\n const spellCheckEnabled = props.spellCheck !== false;\n\n const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\n attributes: spellCheckAttributes(spellCheckEnabled),\n handleKeyDown(view, event) {\n if (props.onKeyDown) {\n return props.onKeyDown(event);\n }\n\n // Return false to let default behavior continue\n return false;\n },\n },\n editable: !props.disabled,\n content: normalizeInitialMarkup(props.markup),\n onUpdate: ({ editor, transaction }) => {\n if (transaction.isDone) {\n props.onChange?.(editor.getHTML());\n }\n },\n onBlur: ({ editor }) => {\n const otherToolbarOpened =\n editor._insertingImage ||\n editor._toolbarOpened ||\n editor.isActive('inline_dropdown') ||\n editor.isActive('explicit_constructed_response');\n\n if (otherToolbarOpened || !editor.schema) {\n return;\n }\n\n commitEditorContent(editor);\n },\n },\n [props.charactersLimit],\n );\n\n useEffect(() => {\n if (props.editorRef) {\n props.editorRef(editor);\n }\n }, [props.editorRef, editor]);\n\n useEffect(() => {\n editor?.setEditable(!props.disabled);\n }, [props.disabled, editor]);\n\n // useEditor only re-applies options on its own when it is called with an empty dependency\n // array, and this call site depends on charactersLimit, so a spellCheck change on a mounted\n // editor has to be pushed in. Only the attributes are replaced - the rest of editorProps\n // stays as the editor already has it.\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const currentEditorProps = editor.options?.editorProps;\n const attributes = spellCheckAttributes(spellCheckEnabled);\n\n if (currentEditorProps?.attributes?.spellcheck === attributes.spellcheck) {\n return;\n }\n\n editor.setOptions({ editorProps: { ...currentEditorProps, attributes } });\n }, [spellCheckEnabled, editor]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, { emitUpdate: false });\n }\n }, [props.markup, editor]);\n\n useEffect(() => {\n Object.entries(cssVariables).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n }, []);\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => ({\n isFocused: ctx.editor?.isFocused,\n }),\n });\n\n const sizeStyle = useMemo(() => {\n const { minWidth, width, maxWidth, minHeight, height, maxHeight } = props;\n\n return {\n width: valueToSize(width),\n minWidth: valueToSize(minWidth),\n maxWidth: valueToSize(maxWidth),\n height: valueToSize(height),\n minHeight: valueToSize(minHeight),\n maxHeight: valueToSize(maxHeight),\n };\n }, [props]);\n\n return (\n <EditorContainer\n {...{\n ...props,\n activePlugins: activePluginsToUse,\n toolbarOpts: toolbarOptsToUse,\n }}\n editorState={editorState}\n editor={editor}\n >\n {editor && (\n <StyledEditorContent\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n showParagraph={showParagraphs && !showParagraphs.disabled}\n separateParagraph={separateParagraphs && !separateParagraphs.disabled}\n editor={editor}\n />\n )}\n </EditorContainer>\n );\n};\n\nconst StyledEditorContent = styled(EditorContent, {\n shouldForwardProp: (prop) => !['showParagraph', 'separateParagraph'].includes(prop),\n})(({ showParagraph, separateParagraph }) => ({\n display: 'flex',\n outline: 'none !important',\n '& .ProseMirror': {\n flex: 1,\n padding: '5px',\n maxHeight: '500px',\n outline: 'none !important',\n position: 'initial',\n\n // reset default margins for all block paragraphs/divs in the editor\n '& > p, & > div': {\n margin: '0',\n },\n\n // Out of flow so the caret stays at the start of the block; in-flow ::before pushes the caret after the hint text.\n // :only-child ensures the placeholder is hidden whenever the editor has other content (images, upload nodes, etc.)\n // and covers the type+backspace edge case where Tiptap only adds is-empty (not is-editor-empty).\n '& p[data-placeholder].is-empty:only-child, & div[data-placeholder].is-empty:only-child': {\n position: 'relative',\n },\n '& p[data-placeholder].is-empty:only-child::before, & div[data-placeholder].is-empty:only-child::before': {\n content: 'attr(data-placeholder)',\n position: 'absolute',\n left: 0,\n top: 0,\n color: '#9CA3AF',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n },\n\n ...(showParagraph && {\n '& > p:has(+ p)::after, & > div:has(+ div)::after': {\n display: 'block',\n content: '\"¶\"',\n fontSize: '1em',\n color: '#146EB3',\n },\n }),\n ...(separateParagraph && {\n '& > p:has(+ p)': {\n marginBottom: '1em',\n },\n }),\n },\n}));\n\nexport default EditableHtml;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "2.1.12-next.42+cfa076a8a",
6
+ "version": "2.1.12-next.49+2d8497341",
7
7
  "description": "",
8
8
  "license": "ISC",
9
9
  "main": "lib/index.js",
@@ -16,11 +16,11 @@
16
16
  "@dnd-kit/utilities": "3.2.2",
17
17
  "@mui/icons-material": "^7.3.4",
18
18
  "@mui/material": "^7.3.4",
19
- "@pie-lib/drag": "^4.0.7-next.65+cfa076a8a",
19
+ "@pie-lib/drag": "^4.0.6",
20
20
  "@pie-lib/math-input": "^8.1.1",
21
21
  "@pie-lib/math-rendering": "^5.1.0",
22
- "@pie-lib/math-toolbar": "^3.0.7-next.65+cfa076a8a",
23
- "@pie-lib/render-ui": "^6.1.4-next.65+cfa076a8a",
22
+ "@pie-lib/math-toolbar": "^3.0.6",
23
+ "@pie-lib/render-ui": "^6.1.3",
24
24
  "@tiptap/core": "3.20.0",
25
25
  "@tiptap/extension-character-count": "3.20.0",
26
26
  "@tiptap/extension-color": "3.20.0",
@@ -59,6 +59,6 @@
59
59
  "peerDependencies": {
60
60
  "react": "^18.2.0"
61
61
  },
62
- "gitHead": "cfa076a8a8c5b9528ad666b8e41e631e86e0df29",
62
+ "gitHead": "2d8497341eeb736bbc23bcdc38cfaa1b66f7e801",
63
63
  "scripts": {}
64
64
  }
@@ -11,6 +11,7 @@ jest.mock('@tiptap/react', () => ({
11
11
  const mockEditor = {
12
12
  getHTML: jest.fn(() => '<p>test content</p>'),
13
13
  setEditable: jest.fn(),
14
+ setOptions: jest.fn(),
14
15
  commands: {
15
16
  setContent: jest.fn(),
16
17
  },
@@ -585,4 +586,73 @@ describe('EditableHtml', () => {
585
586
  }).not.toThrow();
586
587
  });
587
588
  });
589
+
590
+ describe('spellCheck', () => {
591
+ const lastEditorAttributes = () => {
592
+ const editorConfig = useEditor.mock.calls[useEditor.mock.calls.length - 1][0];
593
+
594
+ return editorConfig.editorProps.attributes;
595
+ };
596
+
597
+ it('disables browser spellcheck on the contenteditable when spellCheck is false', async () => {
598
+ render(<EditableHtml {...defaultProps} spellCheck={false} />);
599
+
600
+ await waitFor(() => {
601
+ expect(useEditor).toHaveBeenCalled();
602
+ });
603
+
604
+ expect(lastEditorAttributes()).toEqual({
605
+ spellcheck: 'false',
606
+ autocorrect: 'off',
607
+ autocapitalize: 'off',
608
+ });
609
+ });
610
+
611
+ it('enables browser spellcheck when spellCheck is true', async () => {
612
+ render(<EditableHtml {...defaultProps} spellCheck={true} />);
613
+
614
+ await waitFor(() => {
615
+ expect(useEditor).toHaveBeenCalled();
616
+ });
617
+
618
+ expect(lastEditorAttributes()).toEqual({
619
+ spellcheck: 'true',
620
+ autocorrect: 'on',
621
+ autocapitalize: 'on',
622
+ });
623
+ });
624
+
625
+ it('keeps the browser default when spellCheck is not provided', async () => {
626
+ render(<EditableHtml {...defaultProps} />);
627
+
628
+ await waitFor(() => {
629
+ expect(useEditor).toHaveBeenCalled();
630
+ });
631
+
632
+ expect(lastEditorAttributes().spellcheck).toEqual('true');
633
+ });
634
+
635
+ it('pushes spellCheck changes onto an existing editor', async () => {
636
+ const editorRef = jest.fn();
637
+ const { rerender } = render(<EditableHtml {...defaultProps} spellCheck={true} editorRef={editorRef} />);
638
+
639
+ await waitFor(() => {
640
+ expect(editorRef).toHaveBeenCalled();
641
+ });
642
+
643
+ rerender(<EditableHtml {...defaultProps} spellCheck={false} editorRef={editorRef} />);
644
+
645
+ await waitFor(() => {
646
+ expect(lastEditorAttributes().spellcheck).toEqual('false');
647
+ });
648
+
649
+ const editor = editorRef.mock.calls[editorRef.mock.calls.length - 1][0];
650
+
651
+ expect(editor.setOptions).toHaveBeenCalledWith({
652
+ editorProps: expect.objectContaining({
653
+ attributes: { spellcheck: 'false', autocorrect: 'off', autocapitalize: 'off' },
654
+ }),
655
+ });
656
+ });
657
+ });
588
658
  });
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import { render, waitFor } from '@testing-library/react';
3
+ import { EditableHtml } from '../components/EditableHtml';
4
+
5
+ const renderEditor = (props) =>
6
+ render(<EditableHtml markup="<p>teh</p>" onChange={() => {}} pluginProps={{}} {...props} />);
7
+
8
+ const prosemirror = (container) => container.querySelector('.ProseMirror');
9
+
10
+ const waitForEditor = async (container) => {
11
+ await waitFor(() => {
12
+ expect(prosemirror(container)).toBeInTheDocument();
13
+ });
14
+ };
15
+
16
+ describe('spellCheck', () => {
17
+ it('turns off browser spellcheck on the contenteditable when spellCheck is false', async () => {
18
+ const { container } = renderEditor({ spellCheck: false });
19
+
20
+ await waitForEditor(container);
21
+
22
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('false');
23
+ expect(prosemirror(container).getAttribute('autocorrect')).toBe('off');
24
+ expect(prosemirror(container).getAttribute('autocapitalize')).toBe('off');
25
+ });
26
+
27
+ it('leaves browser spellcheck on when spellCheck is true', async () => {
28
+ const { container } = renderEditor({ spellCheck: true });
29
+
30
+ await waitForEditor(container);
31
+
32
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('true');
33
+ });
34
+
35
+ it('keeps the browser default when spellCheck is not provided', async () => {
36
+ const { container } = renderEditor();
37
+
38
+ await waitForEditor(container);
39
+
40
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('true');
41
+ });
42
+
43
+ it('updates the contenteditable when spellCheck changes on an existing editor', async () => {
44
+ const { container, rerender } = renderEditor({ spellCheck: true });
45
+
46
+ await waitForEditor(container);
47
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('true');
48
+
49
+ rerender(<EditableHtml markup="<p>teh</p>" onChange={() => {}} pluginProps={{}} spellCheck={false} />);
50
+
51
+ await waitFor(() => {
52
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('false');
53
+ });
54
+ });
55
+
56
+ it('keeps spellcheck off for a disabled (read-only) editor', async () => {
57
+ const { container } = renderEditor({ spellCheck: false, disabled: true });
58
+
59
+ await waitForEditor(container);
60
+
61
+ expect(prosemirror(container).getAttribute('spellcheck')).toBe('false');
62
+ });
63
+ });
@@ -96,6 +96,14 @@ const cssVariables = {
96
96
  0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,
97
97
  };
98
98
 
99
+ // ProseMirror puts these on the contenteditable element. Without them the browser
100
+ // spellchecks the editor regardless of the spellCheck prop.
101
+ const spellCheckAttributes = (enabled) => ({
102
+ spellcheck: enabled ? 'true' : 'false',
103
+ autocorrect: enabled ? 'on' : 'off',
104
+ autocapitalize: enabled ? 'on' : 'off',
105
+ });
106
+
99
107
  export const EditableHtml = (props) => {
100
108
  const { showParagraphs, separateParagraphs } = props.pluginProps || {};
101
109
  const [pendingImages, setPendingImages] = useState([]);
@@ -295,11 +303,17 @@ export const EditableHtml = (props) => {
295
303
  }),
296
304
  ];
297
305
 
306
+ // Callers that don't pass spellCheck keep the browser default (on), as they did with the
307
+ // slate-based editor. Players that have to default to off - extended-text-entry, see
308
+ // PIE-978 - resolve that in their controller and pass an explicit false.
309
+ const spellCheckEnabled = props.spellCheck !== false;
310
+
298
311
  const editor = useEditor(
299
312
  {
300
313
  extensions,
301
314
  immediatelyRender: false,
302
315
  editorProps: {
316
+ attributes: spellCheckAttributes(spellCheckEnabled),
303
317
  handleKeyDown(view, event) {
304
318
  if (props.onKeyDown) {
305
319
  return props.onKeyDown(event);
@@ -343,6 +357,25 @@ export const EditableHtml = (props) => {
343
357
  editor?.setEditable(!props.disabled);
344
358
  }, [props.disabled, editor]);
345
359
 
360
+ // useEditor only re-applies options on its own when it is called with an empty dependency
361
+ // array, and this call site depends on charactersLimit, so a spellCheck change on a mounted
362
+ // editor has to be pushed in. Only the attributes are replaced - the rest of editorProps
363
+ // stays as the editor already has it.
364
+ useEffect(() => {
365
+ if (!editor) {
366
+ return;
367
+ }
368
+
369
+ const currentEditorProps = editor.options?.editorProps;
370
+ const attributes = spellCheckAttributes(spellCheckEnabled);
371
+
372
+ if (currentEditorProps?.attributes?.spellcheck === attributes.spellcheck) {
373
+ return;
374
+ }
375
+
376
+ editor.setOptions({ editorProps: { ...currentEditorProps, attributes } });
377
+ }, [spellCheckEnabled, editor]);
378
+
346
379
  useEffect(() => {
347
380
  if (!editor) {
348
381
  return;