@ni/spright-components 4.0.1 → 4.0.2

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.
@@ -15,7 +15,7 @@
15
15
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16
16
  PERFORMANCE OF THIS SOFTWARE.
17
17
  ***************************************************************************** */
18
- /* global Reflect, Promise, SuppressedError, Symbol */
18
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
19
19
 
20
20
 
21
21
  function __decorate$1(decorators, target, key, desc) {
@@ -54,7 +54,7 @@
54
54
  function __asyncGenerator(thisArg, _arguments, generator) {
55
55
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
56
56
  var g = generator.apply(thisArg, _arguments || []), i, q = [];
57
- return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
57
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
58
58
  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
59
59
  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
60
60
  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
@@ -29373,7 +29373,7 @@ so this becomes the fallback color for the slot */ ''}
29373
29373
  */
29374
29374
  parse(dom, options = {}) {
29375
29375
  let context = new ParseContext(this, options, false);
29376
- context.addAll(dom, options.from, options.to);
29376
+ context.addAll(dom, Mark$1.none, options.from, options.to);
29377
29377
  return context.finish();
29378
29378
  }
29379
29379
  /**
@@ -29386,7 +29386,7 @@ so this becomes the fallback color for the slot */ ''}
29386
29386
  */
29387
29387
  parseSlice(dom, options = {}) {
29388
29388
  let context = new ParseContext(this, options, true);
29389
- context.addAll(dom, options.from, options.to);
29389
+ context.addAll(dom, Mark$1.none, options.from, options.to);
29390
29390
  return Slice.maxOpen(context.finish());
29391
29391
  }
29392
29392
  /**
@@ -29495,22 +29495,15 @@ so this becomes the fallback color for the slot */ ''}
29495
29495
  return type && type.whitespace == "pre" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;
29496
29496
  }
29497
29497
  class NodeContext {
29498
- constructor(type, attrs,
29499
- // Marks applied to this node itself
29500
- marks,
29501
- // Marks that can't apply here, but will be used in children if possible
29502
- pendingMarks, solid, match, options) {
29498
+ constructor(type, attrs, marks, solid, match, options) {
29503
29499
  this.type = type;
29504
29500
  this.attrs = attrs;
29505
29501
  this.marks = marks;
29506
- this.pendingMarks = pendingMarks;
29507
29502
  this.solid = solid;
29508
29503
  this.options = options;
29509
29504
  this.content = [];
29510
29505
  // Marks applied to the node's children
29511
29506
  this.activeMarks = Mark$1.none;
29512
- // Nested Marks with same type
29513
- this.stashMarks = [];
29514
29507
  this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);
29515
29508
  }
29516
29509
  findWrapping(node) {
@@ -29550,21 +29543,6 @@ so this becomes the fallback color for the slot */ ''}
29550
29543
  content = content.append(this.match.fillBefore(Fragment.empty, true));
29551
29544
  return this.type ? this.type.create(this.attrs, content, this.marks) : content;
29552
29545
  }
29553
- popFromStashMark(mark) {
29554
- for (let i = this.stashMarks.length - 1; i >= 0; i--)
29555
- if (mark.eq(this.stashMarks[i]))
29556
- return this.stashMarks.splice(i, 1)[0];
29557
- }
29558
- applyPending(nextType) {
29559
- for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) {
29560
- let mark = pending[i];
29561
- if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&
29562
- !mark.isInSet(this.activeMarks)) {
29563
- this.activeMarks = mark.addToSet(this.activeMarks);
29564
- this.pendingMarks = mark.removeFromSet(this.pendingMarks);
29565
- }
29566
- }
29567
- }
29568
29546
  inlineContext(node) {
29569
29547
  if (this.type)
29570
29548
  return this.type.inlineContent;
@@ -29586,11 +29564,11 @@ so this becomes the fallback color for the slot */ ''}
29586
29564
  let topNode = options.topNode, topContext;
29587
29565
  let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);
29588
29566
  if (topNode)
29589
- topContext = new NodeContext(topNode.type, topNode.attrs, Mark$1.none, Mark$1.none, true, options.topMatch || topNode.type.contentMatch, topOptions);
29567
+ topContext = new NodeContext(topNode.type, topNode.attrs, Mark$1.none, true, options.topMatch || topNode.type.contentMatch, topOptions);
29590
29568
  else if (isOpen)
29591
- topContext = new NodeContext(null, null, Mark$1.none, Mark$1.none, true, null, topOptions);
29569
+ topContext = new NodeContext(null, null, Mark$1.none, true, null, topOptions);
29592
29570
  else
29593
- topContext = new NodeContext(parser.schema.topNodeType, null, Mark$1.none, Mark$1.none, true, null, topOptions);
29571
+ topContext = new NodeContext(parser.schema.topNodeType, null, Mark$1.none, true, null, topOptions);
29594
29572
  this.nodes = [topContext];
29595
29573
  this.find = options.findPositions;
29596
29574
  this.needsBlock = false;
@@ -29601,31 +29579,13 @@ so this becomes the fallback color for the slot */ ''}
29601
29579
  // Add a DOM node to the content. Text is inserted as text node,
29602
29580
  // otherwise, the node is passed to `addElement` or, if it has a
29603
29581
  // `style` attribute, `addElementWithStyles`.
29604
- addDOM(dom) {
29582
+ addDOM(dom, marks) {
29605
29583
  if (dom.nodeType == 3)
29606
- this.addTextNode(dom);
29584
+ this.addTextNode(dom, marks);
29607
29585
  else if (dom.nodeType == 1)
29608
- this.addElement(dom);
29609
- }
29610
- withStyleRules(dom, f) {
29611
- let style = dom.style;
29612
- if (!style || !style.length)
29613
- return f();
29614
- let marks = this.readStyles(dom.style);
29615
- if (!marks)
29616
- return; // A style with ignore: true
29617
- let [addMarks, removeMarks] = marks, top = this.top;
29618
- for (let i = 0; i < removeMarks.length; i++)
29619
- this.removePendingMark(removeMarks[i], top);
29620
- for (let i = 0; i < addMarks.length; i++)
29621
- this.addPendingMark(addMarks[i]);
29622
- f();
29623
- for (let i = 0; i < addMarks.length; i++)
29624
- this.removePendingMark(addMarks[i], top);
29625
- for (let i = 0; i < removeMarks.length; i++)
29626
- this.addPendingMark(removeMarks[i]);
29586
+ this.addElement(dom, marks);
29627
29587
  }
29628
- addTextNode(dom) {
29588
+ addTextNode(dom, marks) {
29629
29589
  let value = dom.nodeValue;
29630
29590
  let top = this.top;
29631
29591
  if (top.options & OPT_PRESERVE_WS_FULL ||
@@ -29652,7 +29612,7 @@ so this becomes the fallback color for the slot */ ''}
29652
29612
  value = value.replace(/\r\n?/g, "\n");
29653
29613
  }
29654
29614
  if (value)
29655
- this.insertNode(this.parser.schema.text(value));
29615
+ this.insertNode(this.parser.schema.text(value), marks);
29656
29616
  this.findInText(dom);
29657
29617
  }
29658
29618
  else {
@@ -29661,7 +29621,7 @@ so this becomes the fallback color for the slot */ ''}
29661
29621
  }
29662
29622
  // Try to find a handler for the given tag and use that to parse. If
29663
29623
  // none is found, the element's content nodes are added directly.
29664
- addElement(dom, matchAfter) {
29624
+ addElement(dom, marks, matchAfter) {
29665
29625
  let name = dom.nodeName.toLowerCase(), ruleID;
29666
29626
  if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)
29667
29627
  normalizeList(dom);
@@ -29669,7 +29629,7 @@ so this becomes the fallback color for the slot */ ''}
29669
29629
  (ruleID = this.parser.matchTag(dom, this, matchAfter));
29670
29630
  if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {
29671
29631
  this.findInside(dom);
29672
- this.ignoreFallback(dom);
29632
+ this.ignoreFallback(dom, marks);
29673
29633
  }
29674
29634
  else if (!rule || rule.skip || rule.closeParent) {
29675
29635
  if (rule && rule.closeParent)
@@ -29687,45 +29647,44 @@ so this becomes the fallback color for the slot */ ''}
29687
29647
  this.needsBlock = true;
29688
29648
  }
29689
29649
  else if (!dom.firstChild) {
29690
- this.leafFallback(dom);
29650
+ this.leafFallback(dom, marks);
29691
29651
  return;
29692
29652
  }
29693
- if (rule && rule.skip)
29694
- this.addAll(dom);
29695
- else
29696
- this.withStyleRules(dom, () => this.addAll(dom));
29653
+ let innerMarks = rule && rule.skip ? marks : this.readStyles(dom, marks);
29654
+ if (innerMarks)
29655
+ this.addAll(dom, innerMarks);
29697
29656
  if (sync)
29698
29657
  this.sync(top);
29699
29658
  this.needsBlock = oldNeedsBlock;
29700
29659
  }
29701
29660
  else {
29702
- this.withStyleRules(dom, () => {
29703
- this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : undefined);
29704
- });
29661
+ let innerMarks = this.readStyles(dom, marks);
29662
+ if (innerMarks)
29663
+ this.addElementByRule(dom, rule, innerMarks, rule.consuming === false ? ruleID : undefined);
29705
29664
  }
29706
29665
  }
29707
29666
  // Called for leaf DOM nodes that would otherwise be ignored
29708
- leafFallback(dom) {
29667
+ leafFallback(dom, marks) {
29709
29668
  if (dom.nodeName == "BR" && this.top.type && this.top.type.inlineContent)
29710
- this.addTextNode(dom.ownerDocument.createTextNode("\n"));
29669
+ this.addTextNode(dom.ownerDocument.createTextNode("\n"), marks);
29711
29670
  }
29712
29671
  // Called for ignored nodes
29713
- ignoreFallback(dom) {
29672
+ ignoreFallback(dom, marks) {
29714
29673
  // Ignored BR nodes should at least create an inline context
29715
29674
  if (dom.nodeName == "BR" && (!this.top.type || !this.top.type.inlineContent))
29716
- this.findPlace(this.parser.schema.text("-"));
29675
+ this.findPlace(this.parser.schema.text("-"), marks);
29717
29676
  }
29718
29677
  // Run any style parser associated with the node's styles. Either
29719
- // return an array of marks, or null to indicate some of the styles
29720
- // had a rule with `ignore` set.
29721
- readStyles(styles) {
29722
- let add = Mark$1.none, remove = Mark$1.none;
29678
+ // return an updated array of marks, or null to indicate some of the
29679
+ // styles had a rule with `ignore` set.
29680
+ readStyles(dom, marks) {
29681
+ let styles = dom.style;
29723
29682
  // Because many properties will only show up in 'normalized' form
29724
29683
  // in `style.item` (i.e. text-decoration becomes
29725
29684
  // text-decoration-line, text-decoration-color, etc), we directly
29726
29685
  // query the styles mentioned in our rules instead of iterating
29727
29686
  // over the items.
29728
- if (styles.length)
29687
+ if (styles && styles.length)
29729
29688
  for (let i = 0; i < this.parser.matchedStyles.length; i++) {
29730
29689
  let name = this.parser.matchedStyles[i], value = styles.getPropertyValue(name);
29731
29690
  if (value)
@@ -29735,52 +29694,50 @@ so this becomes the fallback color for the slot */ ''}
29735
29694
  break;
29736
29695
  if (rule.ignore)
29737
29696
  return null;
29738
- if (rule.clearMark) {
29739
- this.top.pendingMarks.concat(this.top.activeMarks).forEach(m => {
29740
- if (rule.clearMark(m))
29741
- remove = m.addToSet(remove);
29742
- });
29743
- }
29744
- else {
29745
- add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add);
29746
- }
29697
+ if (rule.clearMark)
29698
+ marks = marks.filter(m => !rule.clearMark(m));
29699
+ else
29700
+ marks = marks.concat(this.parser.schema.marks[rule.mark].create(rule.attrs));
29747
29701
  if (rule.consuming === false)
29748
29702
  after = rule;
29749
29703
  else
29750
29704
  break;
29751
29705
  }
29752
29706
  }
29753
- return [add, remove];
29707
+ return marks;
29754
29708
  }
29755
29709
  // Look up a handler for the given node. If none are found, return
29756
29710
  // false. Otherwise, apply it, use its return value to drive the way
29757
29711
  // the node's content is wrapped, and return true.
29758
- addElementByRule(dom, rule, continueAfter) {
29759
- let sync, nodeType, mark;
29712
+ addElementByRule(dom, rule, marks, continueAfter) {
29713
+ let sync, nodeType;
29760
29714
  if (rule.node) {
29761
29715
  nodeType = this.parser.schema.nodes[rule.node];
29762
29716
  if (!nodeType.isLeaf) {
29763
- sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace);
29717
+ let inner = this.enter(nodeType, rule.attrs || null, marks, rule.preserveWhitespace);
29718
+ if (inner) {
29719
+ sync = true;
29720
+ marks = inner;
29721
+ }
29764
29722
  }
29765
- else if (!this.insertNode(nodeType.create(rule.attrs))) {
29766
- this.leafFallback(dom);
29723
+ else if (!this.insertNode(nodeType.create(rule.attrs), marks)) {
29724
+ this.leafFallback(dom, marks);
29767
29725
  }
29768
29726
  }
29769
29727
  else {
29770
29728
  let markType = this.parser.schema.marks[rule.mark];
29771
- mark = markType.create(rule.attrs);
29772
- this.addPendingMark(mark);
29729
+ marks = marks.concat(markType.create(rule.attrs));
29773
29730
  }
29774
29731
  let startIn = this.top;
29775
29732
  if (nodeType && nodeType.isLeaf) {
29776
29733
  this.findInside(dom);
29777
29734
  }
29778
29735
  else if (continueAfter) {
29779
- this.addElement(dom, continueAfter);
29736
+ this.addElement(dom, marks, continueAfter);
29780
29737
  }
29781
29738
  else if (rule.getContent) {
29782
29739
  this.findInside(dom);
29783
- rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node));
29740
+ rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node, marks));
29784
29741
  }
29785
29742
  else {
29786
29743
  let contentDOM = dom;
@@ -29791,28 +29748,26 @@ so this becomes the fallback color for the slot */ ''}
29791
29748
  else if (rule.contentElement)
29792
29749
  contentDOM = rule.contentElement;
29793
29750
  this.findAround(dom, contentDOM, true);
29794
- this.addAll(contentDOM);
29751
+ this.addAll(contentDOM, marks);
29795
29752
  }
29796
29753
  if (sync && this.sync(startIn))
29797
29754
  this.open--;
29798
- if (mark)
29799
- this.removePendingMark(mark, startIn);
29800
29755
  }
29801
29756
  // Add all child nodes between `startIndex` and `endIndex` (or the
29802
29757
  // whole node, if not given). If `sync` is passed, use it to
29803
29758
  // synchronize after every block element.
29804
- addAll(parent, startIndex, endIndex) {
29759
+ addAll(parent, marks, startIndex, endIndex) {
29805
29760
  let index = startIndex || 0;
29806
29761
  for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {
29807
29762
  this.findAtPoint(parent, index);
29808
- this.addDOM(dom);
29763
+ this.addDOM(dom, marks);
29809
29764
  }
29810
29765
  this.findAtPoint(parent, index);
29811
29766
  }
29812
29767
  // Try to find a way to fit the given node type into the current
29813
29768
  // context. May add intermediate wrappers and/or leave non-solid
29814
29769
  // nodes that we're in.
29815
- findPlace(node) {
29770
+ findPlace(node, marks) {
29816
29771
  let route, sync;
29817
29772
  for (let depth = this.open; depth >= 0; depth--) {
29818
29773
  let cx = this.nodes[depth];
@@ -29827,53 +29782,61 @@ so this becomes the fallback color for the slot */ ''}
29827
29782
  break;
29828
29783
  }
29829
29784
  if (!route)
29830
- return false;
29785
+ return null;
29831
29786
  this.sync(sync);
29832
29787
  for (let i = 0; i < route.length; i++)
29833
- this.enterInner(route[i], null, false);
29834
- return true;
29788
+ marks = this.enterInner(route[i], null, marks, false);
29789
+ return marks;
29835
29790
  }
29836
29791
  // Try to insert the given node, adjusting the context when needed.
29837
- insertNode(node) {
29792
+ insertNode(node, marks) {
29838
29793
  if (node.isInline && this.needsBlock && !this.top.type) {
29839
29794
  let block = this.textblockFromContext();
29840
29795
  if (block)
29841
- this.enterInner(block);
29796
+ marks = this.enterInner(block, null, marks);
29842
29797
  }
29843
- if (this.findPlace(node)) {
29798
+ let innerMarks = this.findPlace(node, marks);
29799
+ if (innerMarks) {
29844
29800
  this.closeExtra();
29845
29801
  let top = this.top;
29846
- top.applyPending(node.type);
29847
29802
  if (top.match)
29848
29803
  top.match = top.match.matchType(node.type);
29849
- let marks = top.activeMarks;
29850
- for (let i = 0; i < node.marks.length; i++)
29851
- if (!top.type || top.type.allowsMarkType(node.marks[i].type))
29852
- marks = node.marks[i].addToSet(marks);
29853
- top.content.push(node.mark(marks));
29804
+ let nodeMarks = Mark$1.none;
29805
+ for (let m of innerMarks.concat(node.marks))
29806
+ if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, node.type))
29807
+ nodeMarks = m.addToSet(nodeMarks);
29808
+ top.content.push(node.mark(nodeMarks));
29854
29809
  return true;
29855
29810
  }
29856
29811
  return false;
29857
29812
  }
29858
29813
  // Try to start a node of the given type, adjusting the context when
29859
29814
  // necessary.
29860
- enter(type, attrs, preserveWS) {
29861
- let ok = this.findPlace(type.create(attrs));
29862
- if (ok)
29863
- this.enterInner(type, attrs, true, preserveWS);
29864
- return ok;
29815
+ enter(type, attrs, marks, preserveWS) {
29816
+ let innerMarks = this.findPlace(type.create(attrs), marks);
29817
+ if (innerMarks)
29818
+ innerMarks = this.enterInner(type, attrs, marks, true, preserveWS);
29819
+ return innerMarks;
29865
29820
  }
29866
29821
  // Open a node of the given type
29867
- enterInner(type, attrs = null, solid = false, preserveWS) {
29822
+ enterInner(type, attrs, marks, solid = false, preserveWS) {
29868
29823
  this.closeExtra();
29869
29824
  let top = this.top;
29870
- top.applyPending(type);
29871
29825
  top.match = top.match && top.match.matchType(type);
29872
29826
  let options = wsOptionsFor(type, preserveWS, top.options);
29873
29827
  if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)
29874
29828
  options |= OPT_OPEN_LEFT;
29875
- this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));
29829
+ let applyMarks = Mark$1.none;
29830
+ marks = marks.filter(m => {
29831
+ if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, type)) {
29832
+ applyMarks = m.addToSet(applyMarks);
29833
+ return false;
29834
+ }
29835
+ return true;
29836
+ });
29837
+ this.nodes.push(new NodeContext(type, attrs, applyMarks, solid, null, options));
29876
29838
  this.open++;
29839
+ return marks;
29877
29840
  }
29878
29841
  // Make sure all nodes above this.open are finished and added to
29879
29842
  // their parents
@@ -29987,29 +29950,6 @@ so this becomes the fallback color for the slot */ ''}
29987
29950
  return type;
29988
29951
  }
29989
29952
  }
29990
- addPendingMark(mark) {
29991
- let found = findSameMarkInSet(mark, this.top.pendingMarks);
29992
- if (found)
29993
- this.top.stashMarks.push(found);
29994
- this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);
29995
- }
29996
- removePendingMark(mark, upto) {
29997
- for (let depth = this.open; depth >= 0; depth--) {
29998
- let level = this.nodes[depth];
29999
- let found = level.pendingMarks.lastIndexOf(mark);
30000
- if (found > -1) {
30001
- level.pendingMarks = mark.removeFromSet(level.pendingMarks);
30002
- }
30003
- else {
30004
- level.activeMarks = mark.removeFromSet(level.activeMarks);
30005
- let stashMark = level.popFromStashMark(mark);
30006
- if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))
30007
- level.activeMarks = stashMark.addToSet(level.activeMarks);
30008
- }
30009
- if (level == upto)
30010
- break;
30011
- }
30012
- }
30013
29953
  }
30014
29954
  // Kludge to work around directly nested list nodes produced by some
30015
29955
  // tools and allowed by browsers to mean that the nested list is
@@ -30062,12 +30002,6 @@ so this becomes the fallback color for the slot */ ''}
30062
30002
  return true;
30063
30003
  }
30064
30004
  }
30065
- function findSameMarkInSet(mark, set) {
30066
- for (let i = 0; i < set.length; i++) {
30067
- if (mark.eq(set[i]))
30068
- return set[i];
30069
- }
30070
- }
30071
30005
 
30072
30006
  /**
30073
30007
  A DOM serializer knows how to convert ProseMirror nodes and
@@ -31370,7 +31304,9 @@ so this becomes the fallback color for the slot */ ''}
31370
31304
  throw new RangeError("Type given to setBlockType should be a textblock");
31371
31305
  let mapFrom = tr.steps.length;
31372
31306
  tr.doc.nodesBetween(from, to, (node, pos) => {
31373
- if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {
31307
+ let attrsHere = typeof attrs == "function" ? attrs(node) : attrs;
31308
+ if (node.isTextblock && !node.hasMarkup(type, attrsHere) &&
31309
+ canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {
31374
31310
  let convertNewlines = null;
31375
31311
  if (type.schema.linebreakReplacement) {
31376
31312
  let pre = type.whitespace == "pre", supportLinebreak = !!type.contentMatch.matchType(type.schema.linebreakReplacement);
@@ -31385,7 +31321,7 @@ so this becomes the fallback color for the slot */ ''}
31385
31321
  clearIncompatible(tr, tr.mapping.slice(mapFrom).map(pos, 1), type, undefined, convertNewlines === null);
31386
31322
  let mapping = tr.mapping.slice(mapFrom);
31387
31323
  let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);
31388
- tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));
31324
+ tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrsHere, null, node.marks)), 0, 0), 1, true));
31389
31325
  if (convertNewlines === true)
31390
31326
  replaceNewlines(tr, node, pos, mapFrom);
31391
31327
  return false;
@@ -33535,15 +33471,18 @@ so this becomes the fallback color for the slot */ ''}
33535
33471
  if (doc.caretPositionFromPoint) {
33536
33472
  try { // Firefox throws for this call in hard-to-predict circumstances (#994)
33537
33473
  let pos = doc.caretPositionFromPoint(x, y);
33474
+ // Clip the offset, because Chrome will return a text offset
33475
+ // into <input> nodes, which can't be treated as a regular DOM
33476
+ // offset
33538
33477
  if (pos)
33539
- return { node: pos.offsetNode, offset: pos.offset };
33478
+ return { node: pos.offsetNode, offset: Math.min(nodeSize(pos.offsetNode), pos.offset) };
33540
33479
  }
33541
33480
  catch (_) { }
33542
33481
  }
33543
33482
  if (doc.caretRangeFromPoint) {
33544
33483
  let range = doc.caretRangeFromPoint(x, y);
33545
33484
  if (range)
33546
- return { node: range.startContainer, offset: range.startOffset };
33485
+ return { node: range.startContainer, offset: Math.min(nodeSize(range.startContainer), range.startOffset) };
33547
33486
  }
33548
33487
  }
33549
33488
 
@@ -34055,6 +33994,8 @@ so this becomes the fallback color for the slot */ ''}
34055
33994
  return false;
34056
33995
  let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;
34057
33996
  let sel = view.domSelection();
33997
+ if (!sel)
33998
+ return $head.pos == $head.start() || $head.pos == $head.end();
34058
33999
  // If the textblock is all LTR, or the browser doesn't support
34059
34000
  // Selection.modify (Edge), fall back to a primitive approach
34060
34001
  if (!maybeRTL.test($head.parent.textContent) || !sel.modify)
@@ -35677,12 +35618,14 @@ so this becomes the fallback color for the slot */ ''}
35677
35618
  }
35678
35619
  function selectCursorWrapper(view) {
35679
35620
  let domSel = view.domSelection(), range = document.createRange();
35621
+ if (!domSel)
35622
+ return;
35680
35623
  let node = view.cursorWrapper.dom, img = node.nodeName == "IMG";
35681
35624
  if (img)
35682
- range.setEnd(node.parentNode, domIndex(node) + 1);
35625
+ range.setStart(node.parentNode, domIndex(node) + 1);
35683
35626
  else
35684
- range.setEnd(node, 0);
35685
- range.collapse(false);
35627
+ range.setStart(node, 0);
35628
+ range.collapse(true);
35686
35629
  domSel.removeAllRanges();
35687
35630
  domSel.addRange(range);
35688
35631
  // Kludge to kill 'control selection' in IE11 when selecting an
@@ -35970,6 +35913,8 @@ so this becomes the fallback color for the slot */ ''}
35970
35913
  }
35971
35914
  }
35972
35915
  let sel = view.domSelection();
35916
+ if (!sel)
35917
+ return;
35973
35918
  if (selectionCollapsed(sel)) {
35974
35919
  let range = document.createRange();
35975
35920
  range.setEnd(node, offset);
@@ -36324,6 +36269,15 @@ so this becomes the fallback color for the slot */ ''}
36324
36269
  function detachedDoc() {
36325
36270
  return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument("title"));
36326
36271
  }
36272
+ function maybeWrapTrusted(html) {
36273
+ let trustedTypes = window.trustedTypes;
36274
+ if (!trustedTypes)
36275
+ return html;
36276
+ // With the require-trusted-types-for CSP, Chrome will block
36277
+ // innerHTML, even on a detached document. This wraps the string in
36278
+ // a way that makes the browser allow us to use its parser again.
36279
+ return trustedTypes.createPolicy("detachedDocument", { createHTML: (s) => s }).createHTML(html);
36280
+ }
36327
36281
  function readHTML(html) {
36328
36282
  let metas = /^(\s*<meta [^>]*>)*/.exec(html);
36329
36283
  if (metas)
@@ -36332,7 +36286,7 @@ so this becomes the fallback color for the slot */ ''}
36332
36286
  let firstTag = /<([a-z][^>\s]+)/i.exec(html), wrap;
36333
36287
  if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])
36334
36288
  html = wrap.map(n => "<" + n + ">").join("") + html + wrap.map(n => "</" + n + ">").reverse().join("");
36335
- elt.innerHTML = html;
36289
+ elt.innerHTML = maybeWrapTrusted(html);
36336
36290
  if (wrap)
36337
36291
  for (let i = 0; i < wrap.length; i++)
36338
36292
  elt = elt.querySelector(wrap[i]) || elt;
@@ -36473,7 +36427,9 @@ so this becomes the fallback color for the slot */ ''}
36473
36427
  // and handling them eagerly tends to corrupt the input.
36474
36428
  if (android && chrome && event.keyCode == 13)
36475
36429
  return;
36476
- if (event.keyCode != 229)
36430
+ if (view.domObserver.selectionChanged(view.domSelectionRange()))
36431
+ view.domObserver.flush();
36432
+ else if (event.keyCode != 229)
36477
36433
  view.domObserver.forceFlush();
36478
36434
  // On iOS, if we preventDefault enter key presses, the virtual
36479
36435
  // keyboard gets confused. So the hack here is to set a flag that
@@ -36536,6 +36492,8 @@ so this becomes the fallback color for the slot */ ''}
36536
36492
  function updateSelection(view, selection, origin) {
36537
36493
  if (!view.focused)
36538
36494
  view.focus();
36495
+ if (view.state.selection.eq(selection))
36496
+ return;
36539
36497
  let tr = view.state.tr.setSelection(selection);
36540
36498
  tr.setMeta("pointer", true);
36541
36499
  view.dispatch(tr);
@@ -36789,8 +36747,8 @@ so this becomes the fallback color for the slot */ ''}
36789
36747
  editHandlers.compositionstart = editHandlers.compositionupdate = view => {
36790
36748
  if (!view.composing) {
36791
36749
  view.domObserver.flush();
36792
- let { state } = view, $pos = state.selection.$from;
36793
- if (state.selection.empty &&
36750
+ let { state } = view, $pos = state.selection.$to;
36751
+ if (state.selection instanceof TextSelection &&
36794
36752
  (state.storedMarks ||
36795
36753
  (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {
36796
36754
  // Need to wrap the cursor in mark nodes different from the ones in the DOM context
@@ -36799,7 +36757,7 @@ so this becomes the fallback color for the slot */ ''}
36799
36757
  view.markCursor = null;
36800
36758
  }
36801
36759
  else {
36802
- endComposition(view);
36760
+ endComposition(view, !state.selection.empty);
36803
36761
  // In firefox, if the cursor is after but outside a marked node,
36804
36762
  // the inserted text won't inherit the marks. So this moves it
36805
36763
  // inside if necessary.
@@ -36810,7 +36768,9 @@ so this becomes the fallback color for the slot */ ''}
36810
36768
  if (!before)
36811
36769
  break;
36812
36770
  if (before.nodeType == 3) {
36813
- view.domSelection().collapse(before, before.nodeValue.length);
36771
+ let sel = view.domSelection();
36772
+ if (sel)
36773
+ sel.collapse(before, before.nodeValue.length);
36814
36774
  break;
36815
36775
  }
36816
36776
  else {
@@ -36878,15 +36838,17 @@ so this becomes the fallback color for the slot */ ''}
36878
36838
  /**
36879
36839
  @internal
36880
36840
  */
36881
- function endComposition(view, forceUpdate = false) {
36841
+ function endComposition(view, restarting = false) {
36882
36842
  if (android && view.domObserver.flushingSoon >= 0)
36883
36843
  return;
36884
36844
  view.domObserver.forceFlush();
36885
36845
  clearComposition(view);
36886
- if (forceUpdate || view.docView && view.docView.dirty) {
36846
+ if (restarting || view.docView && view.docView.dirty) {
36887
36847
  let sel = selectionFromDOM(view);
36888
36848
  if (sel && !sel.eq(view.state.selection))
36889
36849
  view.dispatch(view.state.tr.setSelection(sel));
36850
+ else if ((view.markCursor || restarting) && !view.state.selection.empty)
36851
+ view.dispatch(view.state.tr.deleteSelection());
36890
36852
  else
36891
36853
  view.updateState(view.state);
36892
36854
  return true;
@@ -37543,6 +37505,7 @@ so this becomes the fallback color for the slot */ ''}
37543
37505
  }
37544
37506
  return result;
37545
37507
  }
37508
+ forEachSet(f) { f(this); }
37546
37509
  }
37547
37510
  /**
37548
37511
  The empty set of decorations.
@@ -37618,6 +37581,10 @@ so this becomes the fallback color for the slot */ ''}
37618
37581
  members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));
37619
37582
  }
37620
37583
  }
37584
+ forEachSet(f) {
37585
+ for (let i = 0; i < this.members.length; i++)
37586
+ this.members[i].forEachSet(f);
37587
+ }
37621
37588
  }
37622
37589
  function mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {
37623
37590
  let children = oldChildren.slice();
@@ -37984,6 +37951,9 @@ so this becomes the fallback color for the slot */ ''}
37984
37951
  this.queue.push(mut);
37985
37952
  return this.queue;
37986
37953
  }
37954
+ selectionChanged(sel) {
37955
+ return !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(this.view) && !this.ignoreSelectionChange(sel);
37956
+ }
37987
37957
  flush() {
37988
37958
  let { view } = this;
37989
37959
  if (!view.docView || this.flushingSoon > -1)
@@ -37991,8 +37961,7 @@ so this becomes the fallback color for the slot */ ''}
37991
37961
  let mutations = this.pendingRecords();
37992
37962
  if (mutations.length)
37993
37963
  this.queue = [];
37994
- let sel = view.domSelectionRange();
37995
- let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);
37964
+ let sel = view.domSelectionRange(), newSel = this.selectionChanged(sel);
37996
37965
  let from = -1, to = -1, typeOver = false, added = [];
37997
37966
  if (view.editable) {
37998
37967
  for (let i = 0; i < mutations.length; i++) {
@@ -38280,6 +38249,8 @@ so this becomes the fallback color for the slot */ ''}
38280
38249
  }
38281
38250
  view.input.lastKeyCode = null;
38282
38251
  let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);
38252
+ if (change)
38253
+ view.input.domChangeCount++;
38283
38254
  if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&
38284
38255
  addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&
38285
38256
  (!change || change.endA >= change.endB) &&
@@ -38305,7 +38276,6 @@ so this becomes the fallback color for the slot */ ''}
38305
38276
  return;
38306
38277
  }
38307
38278
  }
38308
- view.input.domChangeCount++;
38309
38279
  // Handle the case where overwriting a selection by typing matches
38310
38280
  // the start or end of the selected content, creating a change
38311
38281
  // that's smaller than what was actually overwritten.
@@ -39028,6 +38998,8 @@ so this becomes the fallback color for the slot */ ''}
39028
38998
  */
39029
38999
  domSelectionRange() {
39030
39000
  let sel = this.domSelection();
39001
+ if (!sel)
39002
+ return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };
39031
39003
  return safari && this.root.nodeType === 11 &&
39032
39004
  deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;
39033
39005
  }
@@ -39065,7 +39037,7 @@ so this becomes the fallback color for the slot */ ''}
39065
39037
  dom.className = "ProseMirror-separator";
39066
39038
  dom.setAttribute("mark-placeholder", "true");
39067
39039
  dom.setAttribute("alt", "");
39068
- view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) };
39040
+ view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.from, dom, { raw: true, marks: view.markCursor }) };
39069
39041
  }
39070
39042
  else {
39071
39043
  view.cursorWrapper = null;
@@ -41000,7 +40972,7 @@ so this becomes the fallback color for the slot */ ''}
41000
40972
 
41001
40973
  function findDuplicates(items) {
41002
40974
  const filtered = items.filter((el, index) => items.indexOf(el) !== index);
41003
- return [...new Set(filtered)];
40975
+ return Array.from(new Set(filtered));
41004
40976
  }
41005
40977
 
41006
40978
  class ExtensionManager {
@@ -41802,7 +41774,11 @@ so this becomes the fallback color for the slot */ ''}
41802
41774
  if (isArrayContent) {
41803
41775
  return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)));
41804
41776
  }
41805
- return schema.nodeFromJSON(content);
41777
+ const node = schema.nodeFromJSON(content);
41778
+ if (options.errorOnInvalidContent) {
41779
+ node.check();
41780
+ }
41781
+ return node;
41806
41782
  }
41807
41783
  catch (error) {
41808
41784
  if (options.errorOnInvalidContent) {
@@ -42563,7 +42539,7 @@ so this becomes the fallback color for the slot */ ''}
42563
42539
  .resolve(from)
42564
42540
  .marks()
42565
42541
  .forEach(mark => {
42566
- const $pos = doc.resolve(from - 1);
42542
+ const $pos = doc.resolve(from);
42567
42543
  const range = getMarkRange($pos, mark.type);
42568
42544
  if (!range) {
42569
42545
  return;
@@ -42705,31 +42681,40 @@ so this becomes the fallback color for the slot */ ''}
42705
42681
  }
42706
42682
 
42707
42683
  /**
42708
- * Returns true if the given node is empty.
42709
- * When `checkChildren` is true (default), it will also check if all children are empty.
42684
+ * Returns true if the given prosemirror node is empty.
42710
42685
  */
42711
- function isNodeEmpty(node, { checkChildren } = { checkChildren: true }) {
42686
+ function isNodeEmpty(node, { checkChildren = true, ignoreWhitespace = false, } = {}) {
42687
+ var _a;
42688
+ if (ignoreWhitespace) {
42689
+ if (node.type.name === 'hardBreak') {
42690
+ // Hard breaks are considered empty
42691
+ return true;
42692
+ }
42693
+ if (node.isText) {
42694
+ return /^\s*$/m.test((_a = node.text) !== null && _a !== void 0 ? _a : '');
42695
+ }
42696
+ }
42712
42697
  if (node.isText) {
42713
42698
  return !node.text;
42714
42699
  }
42700
+ if (node.isAtom || node.isLeaf) {
42701
+ return false;
42702
+ }
42715
42703
  if (node.content.childCount === 0) {
42716
42704
  return true;
42717
42705
  }
42718
- if (node.isLeaf) {
42719
- return false;
42720
- }
42721
42706
  if (checkChildren) {
42722
- let hasSameContent = true;
42707
+ let isContentEmpty = true;
42723
42708
  node.content.forEach(childNode => {
42724
- if (hasSameContent === false) {
42709
+ if (isContentEmpty === false) {
42725
42710
  // Exit early for perf
42726
42711
  return;
42727
42712
  }
42728
- if (!isNodeEmpty(childNode)) {
42729
- hasSameContent = false;
42713
+ if (!isNodeEmpty(childNode, { ignoreWhitespace, checkChildren })) {
42714
+ isContentEmpty = false;
42730
42715
  }
42731
42716
  });
42732
- return hasSameContent;
42717
+ return isContentEmpty;
42733
42718
  }
42734
42719
  return false;
42735
42720
  }
@@ -42942,7 +42927,7 @@ so this becomes the fallback color for the slot */ ''}
42942
42927
  return can;
42943
42928
  };
42944
42929
 
42945
- const splitListItem = typeOrName => ({ tr, state, dispatch, editor, }) => {
42930
+ const splitListItem = (typeOrName, overrideAttrs = {}) => ({ tr, state, dispatch, editor, }) => {
42946
42931
  var _a;
42947
42932
  const type = getNodeType(typeOrName, state.schema);
42948
42933
  const { $from, $to } = state.selection;
@@ -42978,7 +42963,10 @@ so this becomes the fallback color for the slot */ ''}
42978
42963
  // eslint-disable-next-line
42979
42964
  const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;
42980
42965
  // Add a second list item with an empty default start node
42981
- const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);
42966
+ const newNextTypeAttributes = {
42967
+ ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),
42968
+ ...overrideAttrs,
42969
+ };
42982
42970
  const nextType = ((_a = type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.createAndFill(newNextTypeAttributes)) || undefined;
42983
42971
  wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined));
42984
42972
  const start = $from.before($from.depth - (depthBefore - 1));
@@ -43000,8 +42988,14 @@ so this becomes the fallback color for the slot */ ''}
43000
42988
  return true;
43001
42989
  }
43002
42990
  const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null;
43003
- const newTypeAttributes = getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs);
43004
- const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);
42991
+ const newTypeAttributes = {
42992
+ ...getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs),
42993
+ ...overrideAttrs,
42994
+ };
42995
+ const newNextTypeAttributes = {
42996
+ ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),
42997
+ ...overrideAttrs,
42998
+ };
43005
42999
  tr.delete($from.pos, $to.pos);
43006
43000
  const types = nextType
43007
43001
  ? [
@@ -43727,8 +43721,8 @@ img.ProseMirror-separator {
43727
43721
  display: inline !important;
43728
43722
  border: none !important;
43729
43723
  margin: 0 !important;
43730
- width: 1px !important;
43731
- height: 1px !important;
43724
+ width: 0 !important;
43725
+ height: 0 !important;
43732
43726
  }
43733
43727
 
43734
43728
  .ProseMirror-gapcursor {
@@ -43793,6 +43787,10 @@ img.ProseMirror-separator {
43793
43787
  constructor(options = {}) {
43794
43788
  super();
43795
43789
  this.isFocused = false;
43790
+ /**
43791
+ * The editor is considered initialized after the `create` event has been emitted.
43792
+ */
43793
+ this.isInitialized = false;
43796
43794
  this.extensionStorage = {};
43797
43795
  this.options = {
43798
43796
  element: document.createElement('div'),
@@ -43843,6 +43841,7 @@ img.ProseMirror-separator {
43843
43841
  }
43844
43842
  this.commands.focus(this.options.autofocus);
43845
43843
  this.emit('create', { editor: this });
43844
+ this.isInitialized = true;
43846
43845
  }, 0);
43847
43846
  }
43848
43847
  /**
@@ -55328,6 +55327,7 @@ img.ProseMirror-separator {
55328
55327
  */
55329
55328
  const TextStyle$1 = Mark.create({
55330
55329
  name: 'textStyle',
55330
+ priority: 101,
55331
55331
  addOptions() {
55332
55332
  return {
55333
55333
  HTMLAttributes: {},
@@ -58112,10 +58112,20 @@ img.ProseMirror-separator {
58112
58112
  }
58113
58113
  // From DOMPurify
58114
58114
  // https://github.com/cure53/DOMPurify/blob/main/src/regexp.js
58115
- const ATTR_WHITESPACE = /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g; // eslint-disable-line no-control-regex
58116
- const IS_ALLOWED_URI = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i; // eslint-disable-line no-useless-escape
58117
- function isAllowedUri(uri) {
58118
- return !uri || uri.replace(ATTR_WHITESPACE, '').match(IS_ALLOWED_URI);
58115
+ // eslint-disable-next-line no-control-regex
58116
+ const ATTR_WHITESPACE = /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g;
58117
+ function isAllowedUri(uri, protocols) {
58118
+ const allowedProtocols = ['http', 'https', 'ftp', 'ftps', 'mailto', 'tel', 'callto', 'sms', 'cid', 'xmpp'];
58119
+ if (protocols) {
58120
+ protocols.forEach(protocol => {
58121
+ const nextProtocol = (typeof protocol === 'string' ? protocol : protocol.scheme);
58122
+ if (nextProtocol) {
58123
+ allowedProtocols.push(nextProtocol);
58124
+ }
58125
+ });
58126
+ }
58127
+ // eslint-disable-next-line no-useless-escape
58128
+ return !uri || uri.replace(ATTR_WHITESPACE, '').match(new RegExp(`^(?:(?:${allowedProtocols.join('|')}):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))`, 'i'));
58119
58129
  }
58120
58130
  /**
58121
58131
  * This extension allows you to create links.
@@ -58160,6 +58170,9 @@ img.ProseMirror-separator {
58160
58170
  return {
58161
58171
  href: {
58162
58172
  default: null,
58173
+ parseHTML(element) {
58174
+ return element.getAttribute('href');
58175
+ },
58163
58176
  },
58164
58177
  target: {
58165
58178
  default: this.options.HTMLAttributes.target,
@@ -58178,16 +58191,16 @@ img.ProseMirror-separator {
58178
58191
  getAttrs: dom => {
58179
58192
  const href = dom.getAttribute('href');
58180
58193
  // prevent XSS attacks
58181
- if (!href || !isAllowedUri(href)) {
58194
+ if (!href || !isAllowedUri(href, this.options.protocols)) {
58182
58195
  return false;
58183
58196
  }
58184
- return { href };
58197
+ return null;
58185
58198
  },
58186
58199
  }];
58187
58200
  },
58188
58201
  renderHTML({ HTMLAttributes }) {
58189
58202
  // prevent XSS attacks
58190
- if (!isAllowedUri(HTMLAttributes.href)) {
58203
+ if (!isAllowedUri(HTMLAttributes.href, this.options.protocols)) {
58191
58204
  // strip out the href
58192
58205
  return ['a', mergeAttributes(this.options.HTMLAttributes, { ...HTMLAttributes, href: '' }), 0];
58193
58206
  }
@@ -58370,9 +58383,9 @@ img.ProseMirror-separator {
58370
58383
  const started = !prev.active && next.active;
58371
58384
  const stopped = prev.active && !next.active;
58372
58385
  const changed = !started && !stopped && prev.query !== next.query;
58373
- const handleStart = started;
58386
+ const handleStart = started || (moved && changed);
58374
58387
  const handleChange = changed || moved;
58375
- const handleExit = stopped;
58388
+ const handleExit = stopped || (moved && changed);
58376
58389
  // Cancel when suggestion isn't active
58377
58390
  if (!handleStart && !handleChange && !handleExit) {
58378
58391
  return;
@@ -58746,6 +58759,7 @@ img.ProseMirror-separator {
58746
58759
  */
58747
58760
  const TextStyle = Mark.create({
58748
58761
  name: 'textStyle',
58762
+ priority: 101,
58749
58763
  addOptions() {
58750
58764
  return {
58751
58765
  HTMLAttributes: {},
@@ -58816,6 +58830,10 @@ img.ProseMirror-separator {
58816
58830
  : 1;
58817
58831
  },
58818
58832
  },
58833
+ type: {
58834
+ default: undefined,
58835
+ parseHTML: element => element.getAttribute('type'),
58836
+ },
58819
58837
  };
58820
58838
  },
58821
58839
  parseHTML() {
@@ -62053,7 +62071,7 @@ img.ProseMirror-separator {
62053
62071
  ...columnDef
62054
62072
  };
62055
62073
  const accessorKey = resolvedColumnDef.accessorKey;
62056
- let id = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? accessorKey.replace('.', '_') : undefined) != null ? _ref : typeof resolvedColumnDef.header === 'string' ? resolvedColumnDef.header : undefined;
62074
+ let id = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? typeof String.prototype.replaceAll === 'function' ? accessorKey.replaceAll('.', '_') : accessorKey.replace(/\./g, '_') : undefined) != null ? _ref : typeof resolvedColumnDef.header === 'string' ? resolvedColumnDef.header : undefined;
62057
62075
  let accessorFn;
62058
62076
  if (resolvedColumnDef.accessorFn) {
62059
62077
  accessorFn = resolvedColumnDef.accessorFn;
@@ -62462,8 +62480,8 @@ img.ProseMirror-separator {
62462
62480
  };
62463
62481
 
62464
62482
  const includesString = (row, columnId, filterValue) => {
62465
- var _row$getValue;
62466
- const search = filterValue.toLowerCase();
62483
+ var _filterValue$toString, _row$getValue;
62484
+ const search = filterValue == null || (_filterValue$toString = filterValue.toString()) == null ? void 0 : _filterValue$toString.toLowerCase();
62467
62485
  return Boolean((_row$getValue = row.getValue(columnId)) == null || (_row$getValue = _row$getValue.toString()) == null || (_row$getValue = _row$getValue.toLowerCase()) == null ? void 0 : _row$getValue.includes(search));
62468
62486
  };
62469
62487
  includesString.autoRemove = val => testFalsey(val);
@@ -67247,7 +67265,8 @@ focus outline in that case.
67247
67265
  instance.options.isScrollingResetDelay
67248
67266
  );
67249
67267
  const createHandler = (isScrolling) => () => {
67250
- offset = element[instance.options.horizontal ? "scrollLeft" : "scrollTop"];
67268
+ const { horizontal, isRtl } = instance.options;
67269
+ offset = horizontal ? element["scrollLeft"] * (isRtl && -1 || 1) : element["scrollTop"];
67251
67270
  fallback();
67252
67271
  cb(offset, isScrolling);
67253
67272
  };
@@ -67358,20 +67377,36 @@ focus outline in that case.
67358
67377
  lanes: 1,
67359
67378
  isScrollingResetDelay: 150,
67360
67379
  enabled: true,
67380
+ isRtl: false,
67361
67381
  ...opts2
67362
67382
  };
67363
67383
  };
67364
- this.notify = (force, sync) => {
67384
+ this.notify = (sync) => {
67365
67385
  var _a, _b;
67366
- const { startIndex, endIndex } = this.range ?? {
67367
- startIndex: void 0,
67368
- endIndex: void 0
67369
- };
67370
- const range = this.calculateRange();
67371
- if (force || startIndex !== (range == null ? void 0 : range.startIndex) || endIndex !== (range == null ? void 0 : range.endIndex)) {
67372
- (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);
67373
- }
67386
+ (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, sync);
67374
67387
  };
67388
+ this.maybeNotify = memo(
67389
+ () => {
67390
+ this.calculateRange();
67391
+ return [
67392
+ this.isScrolling,
67393
+ this.range ? this.range.startIndex : null,
67394
+ this.range ? this.range.endIndex : null
67395
+ ];
67396
+ },
67397
+ (isScrolling) => {
67398
+ this.notify(isScrolling);
67399
+ },
67400
+ {
67401
+ key: "maybeNotify",
67402
+ debug: () => this.options.debug,
67403
+ initialDeps: [
67404
+ this.isScrolling,
67405
+ this.range ? this.range.startIndex : null,
67406
+ this.range ? this.range.endIndex : null
67407
+ ]
67408
+ }
67409
+ );
67375
67410
  this.cleanup = () => {
67376
67411
  this.unsubs.filter(Boolean).forEach((d) => d());
67377
67412
  this.unsubs = [];
@@ -67391,7 +67426,7 @@ focus outline in that case.
67391
67426
  if (this.scrollElement !== scrollElement) {
67392
67427
  this.cleanup();
67393
67428
  if (!scrollElement) {
67394
- this.notify(false, false);
67429
+ this.maybeNotify();
67395
67430
  return;
67396
67431
  }
67397
67432
  this.scrollElement = scrollElement;
@@ -67407,7 +67442,7 @@ focus outline in that case.
67407
67442
  this.unsubs.push(
67408
67443
  this.options.observeElementRect(this, (rect) => {
67409
67444
  this.scrollRect = rect;
67410
- this.notify(false, false);
67445
+ this.maybeNotify();
67411
67446
  })
67412
67447
  );
67413
67448
  this.unsubs.push(
@@ -67415,9 +67450,8 @@ focus outline in that case.
67415
67450
  this.scrollAdjustments = 0;
67416
67451
  this.scrollDirection = isScrolling ? this.getScrollOffset() < offset ? "forward" : "backward" : null;
67417
67452
  this.scrollOffset = offset;
67418
- const prevIsScrolling = this.isScrolling;
67419
67453
  this.isScrolling = isScrolling;
67420
- this.notify(prevIsScrolling !== isScrolling, isScrolling);
67454
+ this.maybeNotify();
67421
67455
  })
67422
67456
  );
67423
67457
  }
@@ -67490,7 +67524,6 @@ focus outline in that case.
67490
67524
  this.getMeasurements = memo(
67491
67525
  () => [this.getMeasurementOptions(), this.itemSizeCache],
67492
67526
  ({ count, paddingStart, scrollMargin, getItemKey, enabled }, itemSizeCache) => {
67493
- var _a;
67494
67527
  if (!enabled) {
67495
67528
  this.measurementsCache = [];
67496
67529
  this.itemSizeCache.clear();
@@ -67506,33 +67539,6 @@ focus outline in that case.
67506
67539
  this.pendingMeasuredCacheIndexes = [];
67507
67540
  const measurements = this.measurementsCache.slice(0, min);
67508
67541
  for (let i = min; i < count; i++) {
67509
- let measureElement2 = (_a = this.measurementsCache[i]) == null ? void 0 : _a.measureElement;
67510
- if (!measureElement2) {
67511
- measureElement2 = (node) => {
67512
- const key2 = getItemKey(i);
67513
- const prevNode = this.elementsCache.get(key2);
67514
- if (!node) {
67515
- if (prevNode) {
67516
- this.observer.unobserve(prevNode);
67517
- this.elementsCache.delete(key2);
67518
- }
67519
- return;
67520
- }
67521
- if (prevNode !== node) {
67522
- if (prevNode) {
67523
- this.observer.unobserve(prevNode);
67524
- }
67525
- this.observer.observe(node);
67526
- this.elementsCache.set(key2, node);
67527
- }
67528
- if (node.isConnected) {
67529
- this.resizeItem(
67530
- i,
67531
- this.options.measureElement(node, void 0, this)
67532
- );
67533
- }
67534
- };
67535
- }
67536
67542
  const key = getItemKey(i);
67537
67543
  const furthestMeasurement = this.options.lanes === 1 ? measurements[i - 1] : this.getFurthestMeasurement(measurements, i);
67538
67544
  const start = furthestMeasurement ? furthestMeasurement.end + this.options.gap : paddingStart + scrollMargin;
@@ -67546,8 +67552,7 @@ focus outline in that case.
67546
67552
  size,
67547
67553
  end,
67548
67554
  key,
67549
- lane,
67550
- measureElement: measureElement2
67555
+ lane
67551
67556
  };
67552
67557
  }
67553
67558
  this.measurementsCache = measurements;
@@ -67604,29 +67609,26 @@ focus outline in that case.
67604
67609
  return parseInt(indexStr, 10);
67605
67610
  };
67606
67611
  this._measureElement = (node, entry) => {
67607
- const i = this.indexFromElement(node);
67608
- const item = this.getMeasurements()[i];
67609
- if (!item || !node.isConnected) {
67610
- this.elementsCache.forEach((cached, key) => {
67611
- if (cached === node) {
67612
- this.observer.unobserve(node);
67613
- this.elementsCache.delete(key);
67614
- }
67615
- });
67612
+ const index = this.indexFromElement(node);
67613
+ const item = this.measurementsCache[index];
67614
+ if (!item) {
67616
67615
  return;
67617
67616
  }
67618
- const prevNode = this.elementsCache.get(item.key);
67617
+ const key = item.key;
67618
+ const prevNode = this.elementsCache.get(key);
67619
67619
  if (prevNode !== node) {
67620
67620
  if (prevNode) {
67621
67621
  this.observer.unobserve(prevNode);
67622
67622
  }
67623
67623
  this.observer.observe(node);
67624
- this.elementsCache.set(item.key, node);
67624
+ this.elementsCache.set(key, node);
67625
+ }
67626
+ if (node.isConnected) {
67627
+ this.resizeItem(index, this.options.measureElement(node, entry, this));
67625
67628
  }
67626
- this.resizeItem(i, this.options.measureElement(node, entry, this));
67627
67629
  };
67628
67630
  this.resizeItem = (index, size) => {
67629
- const item = this.getMeasurements()[index];
67631
+ const item = this.measurementsCache[index];
67630
67632
  if (!item) {
67631
67633
  return;
67632
67634
  }
@@ -67644,11 +67646,17 @@ focus outline in that case.
67644
67646
  }
67645
67647
  this.pendingMeasuredCacheIndexes.push(item.index);
67646
67648
  this.itemSizeCache = new Map(this.itemSizeCache.set(item.key, size));
67647
- this.notify(true, false);
67649
+ this.notify(false);
67648
67650
  }
67649
67651
  };
67650
67652
  this.measureElement = (node) => {
67651
67653
  if (!node) {
67654
+ this.elementsCache.forEach((cached, key) => {
67655
+ if (!cached.isConnected) {
67656
+ this.observer.unobserve(cached);
67657
+ this.elementsCache.delete(key);
67658
+ }
67659
+ });
67652
67660
  return;
67653
67661
  }
67654
67662
  this._measureElement(node, void 0);
@@ -67665,7 +67673,7 @@ focus outline in that case.
67665
67673
  return virtualItems;
67666
67674
  },
67667
67675
  {
67668
- key: "getIndexes",
67676
+ key: "getVirtualItems",
67669
67677
  debug: () => this.options.debug
67670
67678
  }
67671
67679
  );
@@ -67709,7 +67717,7 @@ focus outline in that case.
67709
67717
  };
67710
67718
  this.getOffsetForIndex = (index, align = "auto") => {
67711
67719
  index = Math.max(0, Math.min(index, this.options.count - 1));
67712
- const item = this.getMeasurements()[index];
67720
+ const item = this.measurementsCache[index];
67713
67721
  if (!item) {
67714
67722
  return void 0;
67715
67723
  }
@@ -67809,9 +67817,8 @@ focus outline in that case.
67809
67817
  this.options.scrollToFn(offset, { behavior, adjustments }, this);
67810
67818
  };
67811
67819
  this.measure = () => {
67812
- var _a, _b;
67813
67820
  this.itemSizeCache = /* @__PURE__ */ new Map();
67814
- (_b = (_a = this.options).onChange) == null ? void 0 : _b.call(_a, this, false);
67821
+ this.notify(false);
67815
67822
  };
67816
67823
  this.setOptions(opts);
67817
67824
  }