slate-react 0.57.2 → 0.57.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/editable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;AACtE,OAAO,EAEL,OAAO,EACP,SAAS,EAET,KAAK,EACL,IAAI,EAEL,MAAM,OAAO,CAAA;AAiCd;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE;QACV,iBAAiB,EAAE,SAAS,CAAA;QAC5B,mBAAmB,CAAC,EAAE,IAAI,CAAA;QAC1B,iBAAiB,CAAC,EAAE,IAAI,CAAA;QACxB,GAAG,CAAC,EAAE,KAAK,CAAA;QACX,GAAG,EAAE,GAAG,CAAA;KACT,CAAA;CACF;AAED;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE;QACV,iBAAiB,EAAE,IAAI,CAAA;KACxB,CAAA;CACF;AAED;;GAEG;AAEH,oBAAY,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,CAAA;IACxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,GAAG,CAAC,OAAO,CAAA;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,GAAG,CAAC,OAAO,CAAA;IACpD,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;CACvB,GAAG,KAAK,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AAEhD;;GAEG;AAEH,eAAO,MAAM,QAAQ,uCA00BpB,CAAA"}
1
+ {"version":3,"file":"editable.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/editable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAA;AACtE,OAAO,EAEL,OAAO,EACP,SAAS,EAET,KAAK,EACL,IAAI,EAEL,MAAM,OAAO,CAAA;AAiCd;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE;QACV,iBAAiB,EAAE,SAAS,CAAA;QAC5B,mBAAmB,CAAC,EAAE,IAAI,CAAA;QAC1B,iBAAiB,CAAC,EAAE,IAAI,CAAA;QACxB,GAAG,CAAC,EAAE,KAAK,CAAA;QACX,GAAG,EAAE,GAAG,CAAA;KACT,CAAA;CACF;AAED;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE;QACV,iBAAiB,EAAE,IAAI,CAAA;KACxB,CAAA;CACF;AAED;;GAEG;AAEH,oBAAY,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,CAAA;IACxC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,GAAG,CAAC,OAAO,CAAA;IAC1D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,GAAG,CAAC,OAAO,CAAA;IACpD,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;CACvB,GAAG,KAAK,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AAEhD;;GAEG;AAEH,eAAO,MAAM,QAAQ,uCAs0BpB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"slate.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/slate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyC,MAAM,OAAO,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAMpD;;;GAGG;AAEH,eAAO,MAAM,KAAK;;;;;;iBA+BjB,CAAA"}
1
+ {"version":3,"file":"slate.d.ts","sourceRoot":"","sources":["../packages/slate-react/src/components/slate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAMpD;;;GAGG;AAEH,eAAO,MAAM,KAAK;;;;;;iBAqCjB,CAAA"}
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import React, { createContext, useContext, useState, useMemo, useCallback, useLayoutEffect, useEffect, useRef } from 'react';
1
+ import React, { createContext, useContext, useState, useMemo, useCallback, useEffect, useLayoutEffect, useRef } from 'react';
2
2
  import { Editor, Transforms, Range, Path, Node as Node$1, Text as Text$1, Element as Element$1 } from 'slate';
3
3
  import throttle from 'lodash/throttle';
4
4
  import scrollIntoView from 'scroll-into-view-if-needed';
@@ -209,6 +209,34 @@ var getEditableChild = (parent, index, direction) => {
209
209
 
210
210
  return child;
211
211
  };
212
+ /**
213
+ * Get a plaintext representation of the content of a node, accounting for block
214
+ * elements which get a newline appended.
215
+ *
216
+ * The domNode must be attached to the DOM.
217
+ */
218
+
219
+ var getPlainText = domNode => {
220
+ var text = '';
221
+
222
+ if (isDOMText(domNode) && domNode.nodeValue) {
223
+ return domNode.nodeValue;
224
+ }
225
+
226
+ if (isDOMElement(domNode)) {
227
+ for (var childNode of Array.from(domNode.childNodes)) {
228
+ text += getPlainText(childNode);
229
+ }
230
+
231
+ var display = getComputedStyle(domNode).getPropertyValue('display');
232
+
233
+ if (display === 'block' || display === 'list' || domNode.tagName === 'BR') {
234
+ text += '\n';
235
+ }
236
+ }
237
+
238
+ return text;
239
+ };
212
240
 
213
241
  var ReactEditor = {
214
242
  /**
@@ -350,6 +378,13 @@ var ReactEditor = {
350
378
  editor.insertData(data);
351
379
  },
352
380
 
381
+ /**
382
+ * Sets data from the currently selected fragment on a `DataTransfer`.
383
+ */
384
+ setFragmentData(editor, data) {
385
+ editor.setFragmentData(data);
386
+ },
387
+
353
388
  /**
354
389
  * Find the native DOM element from a Slate node.
355
390
  */
@@ -426,13 +461,21 @@ var ReactEditor = {
426
461
  anchor,
427
462
  focus
428
463
  } = range;
464
+ var isBackward = Range.isBackward(range);
429
465
  var domAnchor = ReactEditor.toDOMPoint(editor, anchor);
430
466
  var domFocus = Range.isCollapsed(range) ? domAnchor : ReactEditor.toDOMPoint(editor, focus);
431
467
  var domRange = window.document.createRange();
432
- var start = Range.isBackward(range) ? domFocus : domAnchor;
433
- var end = Range.isBackward(range) ? domAnchor : domFocus;
434
- domRange.setStart(start[0], start[1]);
435
- domRange.setEnd(end[0], end[1]);
468
+ var [startNode, startOffset] = isBackward ? domFocus : domAnchor;
469
+ var [endNode, endOffset] = isBackward ? domAnchor : domFocus; // A slate Point at zero-width Leaf always has an offset of 0 but a native DOM selection at
470
+ // zero-width node has an offset of 1 so we have to check if we are in a zero-width node and
471
+ // adjust the offset accordingly.
472
+
473
+ var startEl = isDOMElement(startNode) ? startNode : startNode.parentElement;
474
+ var isStartAtZeroWidth = !!startEl.getAttribute('data-slate-zero-width');
475
+ var endEl = isDOMElement(endNode) ? endNode : endNode.parentElement;
476
+ var isEndAtZeroWidth = !!endEl.getAttribute('data-slate-zero-width');
477
+ domRange.setStart(startNode, isStartAtZeroWidth ? 1 : startOffset);
478
+ domRange.setEnd(endNode, isEndAtZeroWidth ? 1 : endOffset);
436
479
  return domRange;
437
480
  },
438
481
 
@@ -705,6 +748,11 @@ var Slate = props => {
705
748
  setKey(key + 1);
706
749
  }, [key, onChange]);
707
750
  EDITOR_TO_ON_CHANGE.set(editor, onContextChange);
751
+ useEffect(() => {
752
+ return () => {
753
+ EDITOR_TO_ON_CHANGE.set(editor, () => {});
754
+ };
755
+ }, []);
708
756
  return React.createElement(SlateContext.Provider, {
709
757
  value: context
710
758
  }, React.createElement(EditorContext.Provider, {
@@ -794,6 +842,91 @@ var withReact = editor => {
794
842
  }
795
843
  };
796
844
 
845
+ e.setFragmentData = data => {
846
+ var {
847
+ selection
848
+ } = e;
849
+
850
+ if (!selection) {
851
+ return;
852
+ }
853
+
854
+ var [start, end] = Range.edges(selection);
855
+ var startVoid = Editor.void(e, {
856
+ at: start.path
857
+ });
858
+ var endVoid = Editor.void(e, {
859
+ at: end.path
860
+ });
861
+
862
+ if (Range.isCollapsed(selection) && !startVoid) {
863
+ return;
864
+ } // Create a fake selection so that we can add a Base64-encoded copy of the
865
+ // fragment to the HTML, to decode on future pastes.
866
+
867
+
868
+ var domRange = ReactEditor.toDOMRange(e, selection);
869
+ var contents = domRange.cloneContents();
870
+ var attach = contents.childNodes[0]; // Make sure attach is non-empty, since empty nodes will not get copied.
871
+
872
+ contents.childNodes.forEach(node => {
873
+ if (node.textContent && node.textContent.trim() !== '') {
874
+ attach = node;
875
+ }
876
+ }); // COMPAT: If the end node is a void node, we need to move the end of the
877
+ // range from the void node's spacer span, to the end of the void node's
878
+ // content, since the spacer is before void's content in the DOM.
879
+
880
+ if (endVoid) {
881
+ var [voidNode] = endVoid;
882
+ var r = domRange.cloneRange();
883
+ var domNode = ReactEditor.toDOMNode(e, voidNode);
884
+ r.setEndAfter(domNode);
885
+ contents = r.cloneContents();
886
+ } // COMPAT: If the start node is a void node, we need to attach the encoded
887
+ // fragment to the void node's content node instead of the spacer, because
888
+ // attaching it to empty `<div>/<span>` nodes will end up having it erased by
889
+ // most browsers. (2018/04/27)
890
+
891
+
892
+ if (startVoid) {
893
+ attach = contents.querySelector('[data-slate-spacer]');
894
+ } // Remove any zero-width space spans from the cloned DOM so that they don't
895
+ // show up elsewhere when pasted.
896
+
897
+
898
+ Array.from(contents.querySelectorAll('[data-slate-zero-width]')).forEach(zw => {
899
+ var isNewline = zw.getAttribute('data-slate-zero-width') === 'n';
900
+ zw.textContent = isNewline ? '\n' : '';
901
+ }); // Set a `data-slate-fragment` attribute on a non-empty node, so it shows up
902
+ // in the HTML, and can be used for intra-Slate pasting. If it's a text
903
+ // node, wrap it in a `<span>` so we have something to set an attribute on.
904
+
905
+ if (isDOMText(attach)) {
906
+ var span = document.createElement('span'); // COMPAT: In Chrome and Safari, if we don't add the `white-space` style
907
+ // then leading and trailing spaces will be ignored. (2017/09/21)
908
+
909
+ span.style.whiteSpace = 'pre';
910
+ span.appendChild(attach);
911
+ contents.appendChild(span);
912
+ attach = span;
913
+ }
914
+
915
+ var fragment = e.getFragment();
916
+ var string = JSON.stringify(fragment);
917
+ var encoded = window.btoa(encodeURIComponent(string));
918
+ attach.setAttribute('data-slate-fragment', encoded);
919
+ data.setData('application/x-slate-fragment', encoded); // Add the content to a <div> so that we can get its inner HTML.
920
+
921
+ var div = document.createElement('div');
922
+ div.appendChild(contents);
923
+ div.setAttribute('hidden', 'true');
924
+ document.body.appendChild(div);
925
+ data.setData('text/html', div.innerHTML);
926
+ data.setData('text/plain', getPlainText(div));
927
+ document.body.removeChild(div);
928
+ };
929
+
797
930
  e.insertData = data => {
798
931
  var fragment = data.getData('application/x-slate-fragment');
799
932
 
@@ -1401,11 +1534,10 @@ var Editable = props => {
1401
1534
 
1402
1535
  if (!selection && !hasDomSelection) {
1403
1536
  return;
1404
- }
1537
+ } // If the DOM selection is already correct, we're done.
1405
1538
 
1406
- var newDomRange = selection && ReactEditor.toDOMRange(editor, selection); // If the DOM selection is already correct, we're done.
1407
1539
 
1408
- if (hasDomSelection && newDomRange && isRangeEqual(domSelection.getRangeAt(0), newDomRange)) {
1540
+ if (hasDomSelection && selection && Range.equals(ReactEditor.toSlateRange(editor, domSelection), selection)) {
1409
1541
  return;
1410
1542
  } // Otherwise the DOM selection is out of sync, so update it.
1411
1543
 
@@ -1413,6 +1545,7 @@ var Editable = props => {
1413
1545
  var el = ReactEditor.toDOMNode(editor, editor);
1414
1546
  state.isUpdatingSelection = true;
1415
1547
  domSelection.removeAllRanges();
1548
+ var newDomRange = selection && ReactEditor.toDOMRange(editor, selection);
1416
1549
 
1417
1550
  if (newDomRange) {
1418
1551
  domSelection.addRange(newDomRange);
@@ -1616,7 +1749,6 @@ var Editable = props => {
1616
1749
  } = window.document;
1617
1750
  var el = ReactEditor.toDOMNode(editor, editor);
1618
1751
  var domSelection = window.getSelection();
1619
- var domRange = domSelection && domSelection.rangeCount > 0 && domSelection.getRangeAt(0);
1620
1752
 
1621
1753
  if (activeElement === el) {
1622
1754
  state.latestElement = activeElement;
@@ -1625,8 +1757,8 @@ var Editable = props => {
1625
1757
  IS_FOCUSED.delete(editor);
1626
1758
  }
1627
1759
 
1628
- if (domRange && hasEditableTarget(editor, domRange.startContainer) && hasEditableTarget(editor, domRange.endContainer)) {
1629
- var range = ReactEditor.toSlateRange(editor, domRange);
1760
+ if (domSelection && hasEditableTarget(editor, domSelection.anchorNode) && hasEditableTarget(editor, domSelection.focusNode)) {
1761
+ var range = ReactEditor.toSlateRange(editor, domSelection);
1630
1762
  Transforms.select(editor, range);
1631
1763
  } else {
1632
1764
  Transforms.deselect(editor);
@@ -1771,13 +1903,13 @@ var Editable = props => {
1771
1903
  onCopy: useCallback(event => {
1772
1904
  if (hasEditableTarget(editor, event.target) && !isEventHandled(event, attributes.onCopy)) {
1773
1905
  event.preventDefault();
1774
- setFragmentData(event.clipboardData, editor);
1906
+ ReactEditor.setFragmentData(editor, event.clipboardData);
1775
1907
  }
1776
1908
  }, [attributes.onCopy]),
1777
1909
  onCut: useCallback(event => {
1778
1910
  if (!readOnly && hasEditableTarget(editor, event.target) && !isEventHandled(event, attributes.onCut)) {
1779
1911
  event.preventDefault();
1780
- setFragmentData(event.clipboardData, editor);
1912
+ ReactEditor.setFragmentData(editor, event.clipboardData);
1781
1913
  var {
1782
1914
  selection
1783
1915
  } = editor;
@@ -1813,7 +1945,7 @@ var Editable = props => {
1813
1945
  Transforms.select(editor, range);
1814
1946
  }
1815
1947
 
1816
- setFragmentData(event.dataTransfer, editor);
1948
+ ReactEditor.setFragmentData(editor, event.dataTransfer);
1817
1949
  }
1818
1950
  }, [attributes.onDragStart]),
1819
1951
  onDrop: useCallback(event => {
@@ -2094,14 +2226,6 @@ var Editable = props => {
2094
2226
  */
2095
2227
 
2096
2228
  var defaultDecorate = () => [];
2097
- /**
2098
- * Check if two DOM range objects are equal.
2099
- */
2100
-
2101
-
2102
- var isRangeEqual = (a, b) => {
2103
- return a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset === b.endOffset || a.startContainer === b.endContainer && a.startOffset === b.endOffset && a.endContainer === b.startContainer && a.endOffset === b.startOffset;
2104
- };
2105
2229
  /**
2106
2230
  * Check if the target is in the editor.
2107
2231
  */
@@ -2146,124 +2270,6 @@ var isDOMEventHandled = (event, handler) => {
2146
2270
  handler(event);
2147
2271
  return event.defaultPrevented;
2148
2272
  };
2149
- /**
2150
- * Set the currently selected fragment to the clipboard.
2151
- */
2152
-
2153
-
2154
- var setFragmentData = (dataTransfer, editor) => {
2155
- var {
2156
- selection
2157
- } = editor;
2158
-
2159
- if (!selection) {
2160
- return;
2161
- }
2162
-
2163
- var [start, end] = Range.edges(selection);
2164
- var startVoid = Editor.void(editor, {
2165
- at: start.path
2166
- });
2167
- var endVoid = Editor.void(editor, {
2168
- at: end.path
2169
- });
2170
-
2171
- if (Range.isCollapsed(selection) && !startVoid) {
2172
- return;
2173
- } // Create a fake selection so that we can add a Base64-encoded copy of the
2174
- // fragment to the HTML, to decode on future pastes.
2175
-
2176
-
2177
- var domRange = ReactEditor.toDOMRange(editor, selection);
2178
- var contents = domRange.cloneContents();
2179
- var attach = contents.childNodes[0]; // Make sure attach is non-empty, since empty nodes will not get copied.
2180
-
2181
- contents.childNodes.forEach(node => {
2182
- if (node.textContent && node.textContent.trim() !== '') {
2183
- attach = node;
2184
- }
2185
- }); // COMPAT: If the end node is a void node, we need to move the end of the
2186
- // range from the void node's spacer span, to the end of the void node's
2187
- // content, since the spacer is before void's content in the DOM.
2188
-
2189
- if (endVoid) {
2190
- var [voidNode] = endVoid;
2191
- var r = domRange.cloneRange();
2192
- var domNode = ReactEditor.toDOMNode(editor, voidNode);
2193
- r.setEndAfter(domNode);
2194
- contents = r.cloneContents();
2195
- } // COMPAT: If the start node is a void node, we need to attach the encoded
2196
- // fragment to the void node's content node instead of the spacer, because
2197
- // attaching it to empty `<div>/<span>` nodes will end up having it erased by
2198
- // most browsers. (2018/04/27)
2199
-
2200
-
2201
- if (startVoid) {
2202
- attach = contents.querySelector('[data-slate-spacer]');
2203
- } // Remove any zero-width space spans from the cloned DOM so that they don't
2204
- // show up elsewhere when pasted.
2205
-
2206
-
2207
- Array.from(contents.querySelectorAll('[data-slate-zero-width]')).forEach(zw => {
2208
- var isNewline = zw.getAttribute('data-slate-zero-width') === 'n';
2209
- zw.textContent = isNewline ? '\n' : '';
2210
- }); // Set a `data-slate-fragment` attribute on a non-empty node, so it shows up
2211
- // in the HTML, and can be used for intra-Slate pasting. If it's a text
2212
- // node, wrap it in a `<span>` so we have something to set an attribute on.
2213
-
2214
- if (isDOMText(attach)) {
2215
- var span = document.createElement('span'); // COMPAT: In Chrome and Safari, if we don't add the `white-space` style
2216
- // then leading and trailing spaces will be ignored. (2017/09/21)
2217
-
2218
- span.style.whiteSpace = 'pre';
2219
- span.appendChild(attach);
2220
- contents.appendChild(span);
2221
- attach = span;
2222
- }
2223
-
2224
- var fragment = Node$1.fragment(editor, selection);
2225
- var string = JSON.stringify(fragment);
2226
- var encoded = window.btoa(encodeURIComponent(string));
2227
- attach.setAttribute('data-slate-fragment', encoded);
2228
- dataTransfer.setData('application/x-slate-fragment', encoded); // Add the content to a <div> so that we can get its inner HTML.
2229
-
2230
- var div = document.createElement('div');
2231
- div.appendChild(contents);
2232
- div.setAttribute('hidden', 'true');
2233
- document.body.appendChild(div);
2234
- dataTransfer.setData('text/html', div.innerHTML);
2235
- dataTransfer.setData('text/plain', getPlainText(div));
2236
- document.body.removeChild(div);
2237
- };
2238
- /**
2239
- * Get a plaintext representation of the content of a node, accounting for block
2240
- * elements which get a newline appended.
2241
- *
2242
- * The domNode must be attached to the DOM.
2243
- */
2244
-
2245
-
2246
- var getPlainText = domNode => {
2247
- var text = '';
2248
-
2249
- if (isDOMText(domNode) && domNode.nodeValue) {
2250
- return domNode.nodeValue;
2251
- }
2252
-
2253
- if (isDOMElement(domNode)) {
2254
- for (var childNode of Array.from(domNode.childNodes)) {
2255
- text += getPlainText(childNode);
2256
- }
2257
-
2258
- var display = getComputedStyle(domNode).getPropertyValue('display');
2259
-
2260
- if (display === 'block' || display === 'list' || domNode.tagName === 'BR') {
2261
- text += '\n';
2262
- }
2263
- }
2264
-
2265
- return text;
2266
- };
2267
2273
 
2268
2274
  export { DefaultElement, DefaultLeaf, Editable, ReactEditor, Slate, useEditor, useFocused, useReadOnly, useSelected, useSlate, withReact };
2269
2275
  //# sourceMappingURL=index.es.js.map