slate-angular 16.1.0-next → 16.1.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/components/children/children.component.d.ts +1 -6
  2. package/components/editable/editable.component.d.ts +16 -5
  3. package/components/leaf/token.d.ts +4 -0
  4. package/components/leaves/leaves.component.d.ts +1 -14
  5. package/components/string/string.component.d.ts +8 -0
  6. package/components/text/token.d.ts +5 -0
  7. package/esm2022/components/children/children.component.mjs +5 -31
  8. package/esm2022/components/editable/editable.component.mjs +120 -37
  9. package/esm2022/components/element/default-element.component.mjs +3 -3
  10. package/esm2022/components/element/element.component.mjs +3 -3
  11. package/esm2022/components/leaf/token.mjs +3 -0
  12. package/esm2022/components/leaves/leaves.component.mjs +5 -50
  13. package/esm2022/components/string/string.component.mjs +16 -6
  14. package/esm2022/components/text/default-text.component.mjs +3 -3
  15. package/esm2022/components/text/token.mjs +4 -0
  16. package/esm2022/components/text/void-text.component.mjs +3 -3
  17. package/esm2022/module.mjs +1 -7
  18. package/esm2022/utils/throttle.mjs +18 -0
  19. package/esm2022/view/base.mjs +26 -9
  20. package/esm2022/view/container.mjs +2 -82
  21. package/esm2022/view/context.mjs +1 -1
  22. package/esm2022/view/render/leaves-render.mjs +105 -0
  23. package/esm2022/view/render/list-render.mjs +250 -0
  24. package/esm2022/view/render/utils.mjs +104 -0
  25. package/fesm2022/slate-angular.mjs +914 -702
  26. package/fesm2022/slate-angular.mjs.map +1 -1
  27. package/module.d.ts +6 -8
  28. package/package.json +1 -1
  29. package/utils/throttle.d.ts +2 -0
  30. package/view/base.d.ts +11 -2
  31. package/view/container.d.ts +3 -7
  32. package/view/context.d.ts +8 -2
  33. package/view/render/leaves-render.d.ts +20 -0
  34. package/view/render/list-render.d.ts +31 -0
  35. package/view/render/utils.d.ts +11 -0
  36. package/components/descendant/descendant.component.d.ts +0 -35
  37. package/components/leaf/leaf.component.d.ts +0 -16
  38. package/esm2022/components/descendant/descendant.component.mjs +0 -186
  39. package/esm2022/components/leaf/leaf.component.mjs +0 -38
@@ -1,7 +1,7 @@
1
1
  import { Editor, Range, Transforms, Path, Element, Text as Text$1, Node } from 'slate';
2
2
  import { isKeyHotkey } from 'is-hotkey';
3
3
  import * as i0 from '@angular/core';
4
- import { TemplateRef, Component, ChangeDetectionStrategy, ViewChild, Directive, Input, HostBinding, ViewChildren, InjectionToken, Inject, forwardRef, ElementRef, NgModule } from '@angular/core';
4
+ import { TemplateRef, Component, ChangeDetectionStrategy, ViewChild, Directive, Input, InjectionToken, ComponentRef, IterableDiffers, HostBinding, inject, ViewContainerRef, forwardRef, ElementRef, Inject, NgModule } from '@angular/core';
5
5
  import { direction } from 'direction';
6
6
  import scrollIntoView from 'scroll-into-view-if-needed';
7
7
  import { Subject } from 'rxjs';
@@ -1663,6 +1663,59 @@ function restoreDom(editor, execute) {
1663
1663
  }, 0);
1664
1664
  }
1665
1665
 
1666
+ /**
1667
+ * @deprecated
1668
+ * the special container for angular template
1669
+ * Add the rootNodes of each child component to the parentElement
1670
+ * Remove useless DOM elements, eg: comment...
1671
+ */
1672
+ class ViewContainer {
1673
+ constructor(elementRef, differs) {
1674
+ this.elementRef = elementRef;
1675
+ this.differs = differs;
1676
+ }
1677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive }); }
1678
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.1", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 }); }
1679
+ }
1680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainer, decorators: [{
1681
+ type: Directive
1682
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }]; }, propDecorators: { viewContext: [{
1683
+ type: Input
1684
+ }] } });
1685
+
1686
+ class SlateChildren extends ViewContainer {
1687
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateChildren, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1688
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateChildren, isStandalone: true, selector: "slate-children", inputs: { children: "children", context: "context", viewContext: "viewContext" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1689
+ }
1690
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateChildren, decorators: [{
1691
+ type: Component,
1692
+ args: [{
1693
+ selector: 'slate-children',
1694
+ template: ``,
1695
+ changeDetection: ChangeDetectionStrategy.OnPush,
1696
+ standalone: true,
1697
+ imports: [NgFor]
1698
+ }]
1699
+ }], propDecorators: { children: [{
1700
+ type: Input
1701
+ }], context: [{
1702
+ type: Input
1703
+ }], viewContext: [{
1704
+ type: Input
1705
+ }] } });
1706
+
1707
+ const SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN = new InjectionToken('slate-default-element-token');
1708
+
1709
+ const SLATE_DEFAULT_TEXT_COMPONENT_TOKEN = new InjectionToken('slate-default-text-token');
1710
+ const SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN = new InjectionToken('slate-default-void-text-token');
1711
+
1712
+ function hasBeforeContextChange(value) {
1713
+ if (value.beforeContextChange) {
1714
+ return true;
1715
+ }
1716
+ return false;
1717
+ }
1718
+
1666
1719
  class SlateBlockCard {
1667
1720
  get nativeElement() {
1668
1721
  return this.elementRef.nativeElement;
@@ -1694,116 +1747,450 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
1694
1747
  args: ['centerContianer', { static: true }]
1695
1748
  }] } });
1696
1749
 
1697
- /**
1698
- * Dynamically create/update components or templates
1699
- * Provide rootNodes for the view container
1700
- * If the dynamically created component uses onpush mode, then it must call markForCheck when setting the context
1701
- */
1702
- class ViewContainerItem {
1703
- get rootNodes() {
1704
- return this.getRootNodes();
1750
+ function createEmbeddedViewOrComponent(viewType, context, viewContext, viewContainerRef) {
1751
+ if (isTemplateRef(viewType)) {
1752
+ const embeddedViewContext = {
1753
+ context,
1754
+ viewContext
1755
+ };
1756
+ const embeddedViewRef = viewContainerRef.createEmbeddedView(viewType, embeddedViewContext);
1757
+ embeddedViewRef.detectChanges();
1758
+ return embeddedViewRef;
1705
1759
  }
1706
- getRootNodes() {
1707
- if (this.embeddedViewRef) {
1708
- return this.embeddedViewRef.rootNodes.filter(rootNode => isDOMElement(rootNode));
1709
- }
1710
- if (this.componentRef) {
1711
- return [this.componentRef.instance.nativeElement];
1760
+ if (isComponentType(viewType)) {
1761
+ const componentRef = viewContainerRef.createComponent(viewType, {
1762
+ injector: viewContainerRef.injector
1763
+ });
1764
+ componentRef.instance.viewContext = viewContext;
1765
+ componentRef.instance.context = context;
1766
+ componentRef.changeDetectorRef.detectChanges();
1767
+ return componentRef;
1768
+ }
1769
+ }
1770
+ function renderView(view) {
1771
+ if (view instanceof ComponentRef) {
1772
+ view.changeDetectorRef.detectChanges();
1773
+ }
1774
+ else {
1775
+ view.detectChanges();
1776
+ }
1777
+ }
1778
+ function updateContext(view, newContext, viewContext) {
1779
+ if (view instanceof ComponentRef) {
1780
+ view.instance.context = newContext;
1781
+ }
1782
+ else {
1783
+ const embeddedViewContext = {
1784
+ context: newContext,
1785
+ viewContext
1786
+ };
1787
+ view.context = embeddedViewContext;
1788
+ view.detectChanges();
1789
+ }
1790
+ }
1791
+ function mount(views, blockCards, outletElement) {
1792
+ if (views.length > 0) {
1793
+ const result = [];
1794
+ views.forEach((view, index) => {
1795
+ const blockCard = blockCards ? blockCards[index] : undefined;
1796
+ result.push(...getRootNodes(view, blockCard));
1797
+ });
1798
+ outletElement.append(...result);
1799
+ }
1800
+ }
1801
+ function getRootNodes(ref, blockCard) {
1802
+ if (blockCard) {
1803
+ return [blockCard.instance.nativeElement];
1804
+ }
1805
+ if (ref instanceof ComponentRef) {
1806
+ ref.hostView.rootNodes.forEach(ele => {
1807
+ if (!(ele instanceof HTMLElement)) {
1808
+ ele.remove();
1809
+ }
1810
+ });
1811
+ return [ref.instance.nativeElement];
1812
+ }
1813
+ else {
1814
+ const result = [];
1815
+ ref.rootNodes.forEach(rootNode => {
1816
+ const isHTMLElement = rootNode instanceof HTMLElement;
1817
+ if (isHTMLElement && result.every(item => !item.contains(rootNode))) {
1818
+ result.push(rootNode);
1819
+ }
1820
+ if (!isHTMLElement) {
1821
+ rootNode.remove();
1822
+ }
1823
+ });
1824
+ return result;
1825
+ }
1826
+ }
1827
+ function mountOnItemChange(index, item, views, blockCards, outletElement, viewContext) {
1828
+ const view = views[index];
1829
+ let rootNodes = getRootNodes(view);
1830
+ if (blockCards) {
1831
+ const isBlockCard = viewContext.editor.isBlockCard(item);
1832
+ if (isBlockCard) {
1833
+ const blockCard = blockCards[index];
1834
+ rootNodes = [blockCard.instance.nativeElement];
1712
1835
  }
1713
- return [];
1714
1836
  }
1715
- constructor(viewContainerRef) {
1837
+ if (index === 0) {
1838
+ outletElement.prepend(...rootNodes);
1839
+ }
1840
+ else {
1841
+ const previousView = views[index - 1];
1842
+ const blockCard = blockCards ? blockCards[index - 1] : null;
1843
+ const previousRootNodes = getRootNodes(previousView, blockCard);
1844
+ let previousRootNode = previousRootNodes[previousRootNodes.length - 1];
1845
+ rootNodes.forEach(rootNode => {
1846
+ previousRootNode.insertAdjacentElement('afterend', rootNode);
1847
+ previousRootNode = rootNode;
1848
+ });
1849
+ }
1850
+ }
1851
+
1852
+ class ListRender {
1853
+ constructor(viewContext, viewContainerRef, getOutletElement) {
1854
+ this.viewContext = viewContext;
1716
1855
  this.viewContainerRef = viewContainerRef;
1856
+ this.getOutletElement = getOutletElement;
1857
+ this.views = [];
1858
+ this.blockCards = [];
1859
+ this.contexts = [];
1860
+ this.viewTypes = [];
1717
1861
  this.initialized = false;
1718
1862
  }
1719
- destroyView() {
1720
- if (this.embeddedViewRef) {
1721
- this.embeddedViewRef.destroy();
1722
- this.embeddedViewRef = null;
1863
+ initialize(children, parent, parentPath, childrenContext) {
1864
+ this.initialized = true;
1865
+ this.children = children;
1866
+ children.forEach((descendant, index) => {
1867
+ NODE_TO_INDEX.set(descendant, index);
1868
+ NODE_TO_PARENT.set(descendant, parent);
1869
+ const context = getContext$1(index, descendant, parentPath, childrenContext, this.viewContext);
1870
+ const viewType = getViewType$1(descendant, parent, this.viewContext);
1871
+ const view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
1872
+ const blockCard = createBlockCard(descendant, view, this.viewContainerRef, this.viewContext);
1873
+ this.views.push(view);
1874
+ this.contexts.push(context);
1875
+ this.viewTypes.push(viewType);
1876
+ this.blockCards.push(blockCard);
1877
+ });
1878
+ mount(this.views, this.blockCards, this.getOutletElement());
1879
+ const newDiffers = this.viewContainerRef.injector.get(IterableDiffers);
1880
+ this.differ = newDiffers.find(children).create(trackBy$1(this.viewContext));
1881
+ this.differ.diff(children);
1882
+ }
1883
+ update(children, parent, parentPath, childrenContext) {
1884
+ if (!this.initialized) {
1885
+ this.initialize(children, parent, parentPath, childrenContext);
1886
+ return;
1723
1887
  }
1724
- if (this.componentRef) {
1725
- this.componentRef.destroy();
1726
- this.componentRef = null;
1888
+ const outletElement = this.getOutletElement();
1889
+ const diffResult = this.differ.diff(children);
1890
+ if (diffResult) {
1891
+ const newContexts = [];
1892
+ const newViewTypes = [];
1893
+ const newViews = [];
1894
+ const newBlockCards = [];
1895
+ diffResult.forEachItem(record => {
1896
+ NODE_TO_INDEX.set(record.item, record.currentIndex);
1897
+ NODE_TO_PARENT.set(record.item, parent);
1898
+ let context = getContext$1(record.currentIndex, record.item, parentPath, childrenContext, this.viewContext);
1899
+ const viewType = getViewType$1(record.item, parent, this.viewContext);
1900
+ newViewTypes.push(viewType);
1901
+ let view;
1902
+ let blockCard;
1903
+ if (record.previousIndex === null) {
1904
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
1905
+ blockCard = createBlockCard(record.item, view, this.viewContainerRef, this.viewContext);
1906
+ newContexts.push(context);
1907
+ newViews.push(view);
1908
+ newBlockCards.push(blockCard);
1909
+ mountOnItemChange(record.currentIndex, record.item, newViews, newBlockCards, outletElement, this.viewContext);
1910
+ }
1911
+ else {
1912
+ const previousView = this.views[record.previousIndex];
1913
+ const previousViewType = this.viewTypes[record.previousIndex];
1914
+ const previousContext = this.contexts[record.previousIndex];
1915
+ const previousBlockCard = this.blockCards[record.previousIndex];
1916
+ if (previousViewType !== viewType) {
1917
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
1918
+ blockCard = createBlockCard(record.item, view, this.viewContainerRef, this.viewContext);
1919
+ const firstRootNode = getRootNodes(previousView, previousBlockCard)[0];
1920
+ const newRootNodes = getRootNodes(view, blockCard);
1921
+ firstRootNode.replaceWith(...newRootNodes);
1922
+ previousView.destroy();
1923
+ previousBlockCard?.destroy();
1924
+ }
1925
+ else {
1926
+ view = previousView;
1927
+ blockCard = previousBlockCard;
1928
+ if (memoizedContext(this.viewContext, record.item, previousContext, context)) {
1929
+ context = previousContext;
1930
+ }
1931
+ else {
1932
+ updateContext(previousView, context, this.viewContext);
1933
+ }
1934
+ }
1935
+ newContexts.push(context);
1936
+ newViews.push(view);
1937
+ newBlockCards.push(blockCard);
1938
+ }
1939
+ });
1940
+ diffResult.forEachOperation((record) => {
1941
+ // removed
1942
+ if (record.currentIndex === null) {
1943
+ const view = this.views[record.previousIndex];
1944
+ const blockCard = this.blockCards[record.previousIndex];
1945
+ view.destroy();
1946
+ blockCard?.destroy();
1947
+ }
1948
+ // moved
1949
+ if (record.previousIndex !== null && record.currentIndex !== null) {
1950
+ mountOnItemChange(record.currentIndex, record.item, newViews, newBlockCards, outletElement, this.viewContext);
1951
+ // Solve the block-card DOMElement loss when moving nodes
1952
+ newBlockCards[record.currentIndex]?.instance.append();
1953
+ }
1954
+ });
1955
+ this.viewTypes = newViewTypes;
1956
+ this.views = newViews;
1957
+ this.contexts = newContexts;
1958
+ this.children = children;
1959
+ this.blockCards = newBlockCards;
1960
+ }
1961
+ else {
1962
+ const newContexts = [];
1963
+ this.children.forEach((child, index) => {
1964
+ let context = getContext$1(index, child, parentPath, childrenContext, this.viewContext);
1965
+ const previousContext = this.contexts[index];
1966
+ if (memoizedContext(this.viewContext, child, previousContext, context)) {
1967
+ context = previousContext;
1968
+ }
1969
+ else {
1970
+ updateContext(this.views[index], context, this.viewContext);
1971
+ }
1972
+ newContexts.push(context);
1973
+ });
1974
+ this.contexts = newContexts;
1727
1975
  }
1728
1976
  }
1729
- createView() {
1730
- this.initialized = true;
1731
- this.viewType = this.getViewType();
1732
- const context = this.getContext();
1733
- if (isTemplateRef(this.viewType)) {
1734
- this.embeddedViewContext = {
1735
- context,
1736
- viewContext: this.viewContext
1737
- };
1738
- const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.viewType, this.embeddedViewContext);
1739
- this.embeddedViewRef = embeddedViewRef;
1977
+ }
1978
+ function getContext$1(index, item, parentPath, childrenContext, viewContext) {
1979
+ if (Element.isElement(item)) {
1980
+ const computedContext = getCommonContext(index, item, parentPath, viewContext, childrenContext);
1981
+ const key = AngularEditor.findKey(viewContext.editor, item);
1982
+ const isInline = viewContext.editor.isInline(item);
1983
+ const isVoid = viewContext.editor.isVoid(item);
1984
+ const elementContext = {
1985
+ element: item,
1986
+ path: parentPath.concat(index),
1987
+ ...computedContext,
1988
+ attributes: {
1989
+ 'data-slate-node': 'element',
1990
+ 'data-slate-key': key.id
1991
+ },
1992
+ decorate: childrenContext.decorate,
1993
+ readonly: childrenContext.readonly
1994
+ };
1995
+ if (isInline) {
1996
+ elementContext.attributes['data-slate-inline'] = true;
1740
1997
  }
1741
- if (isComponentType(this.viewType)) {
1742
- const componentRef = this.viewContainerRef.createComponent(this.viewType);
1743
- componentRef.instance.viewContext = this.viewContext;
1744
- componentRef.instance.context = context;
1745
- this.componentRef = componentRef;
1998
+ if (isVoid) {
1999
+ elementContext.attributes['data-slate-void'] = true;
2000
+ elementContext.attributes.contenteditable = false;
1746
2001
  }
2002
+ return elementContext;
1747
2003
  }
1748
- updateView() {
1749
- const viewType = this.getViewType();
1750
- const context = this.getContext();
1751
- if (this.viewType === viewType) {
1752
- if (this.componentRef) {
1753
- if (this.memoizedContext(this.componentRef.instance.context, context)) {
1754
- return;
1755
- }
1756
- this.componentRef.instance.context = context;
1757
- }
1758
- if (this.embeddedViewRef) {
1759
- if (this.memoizedContext(this.embeddedViewContext.context, context)) {
1760
- return;
2004
+ else {
2005
+ const computedContext = getCommonContext(index, item, parentPath, viewContext, childrenContext);
2006
+ const isLeafBlock = AngularEditor.isLeafBlock(viewContext.editor, childrenContext.parent);
2007
+ const textContext = {
2008
+ decorations: computedContext.decorations,
2009
+ isLast: isLeafBlock && index === childrenContext.parent.children.length - 1,
2010
+ parent: childrenContext.parent,
2011
+ text: item
2012
+ };
2013
+ return textContext;
2014
+ }
2015
+ }
2016
+ function getCommonContext(index, item, parentPath, viewContext, childrenContext) {
2017
+ const p = parentPath.concat(index);
2018
+ try {
2019
+ const ds = childrenContext.decorate([item, p]);
2020
+ // [list-render] performance optimization: reduce the number of calls to the `Editor.range(viewContext.editor, p)` method
2021
+ if (childrenContext.selection || childrenContext.decorations.length > 0) {
2022
+ const range = Editor.range(viewContext.editor, p);
2023
+ const sel = childrenContext.selection && Range.intersection(range, childrenContext.selection);
2024
+ for (const dec of childrenContext.decorations) {
2025
+ const d = Range.intersection(dec, range);
2026
+ if (d) {
2027
+ ds.push(d);
1761
2028
  }
1762
- this.embeddedViewContext.context = context;
1763
2029
  }
2030
+ return { selection: sel, decorations: ds };
1764
2031
  }
1765
2032
  else {
1766
- this.viewType = viewType;
1767
- const firstRootNode = this.rootNodes[0];
1768
- if (isTemplateRef(this.viewType)) {
1769
- this.embeddedViewContext = {
1770
- context,
1771
- viewContext: this.viewContext
1772
- };
1773
- const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.viewType, this.embeddedViewContext);
1774
- firstRootNode.replaceWith(...embeddedViewRef.rootNodes.filter(rootNode => isDOMElement(rootNode)));
1775
- this.destroyView();
1776
- this.embeddedViewRef = embeddedViewRef;
1777
- }
1778
- if (isComponentType(this.viewType)) {
1779
- const componentRef = this.viewContainerRef.createComponent(this.viewType);
1780
- componentRef.instance.viewContext = this.viewContext;
1781
- componentRef.instance.context = context;
1782
- firstRootNode.replaceWith(componentRef.instance.nativeElement);
1783
- this.destroyView();
1784
- this.componentRef = componentRef;
1785
- }
2033
+ return { selection: null, decorations: ds };
1786
2034
  }
1787
2035
  }
1788
- appendBlockCardElement() {
1789
- if (this.blockCardComponentRef) {
1790
- this.blockCardComponentRef.instance.append();
1791
- }
2036
+ catch (error) {
2037
+ this.options.viewContext.editor.onError({
2038
+ code: SlateErrorCode.GetStartPointError,
2039
+ nativeError: error
2040
+ });
2041
+ return { selection: null, decorations: [] };
1792
2042
  }
1793
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainerItem, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1794
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.1", type: ViewContainerItem, inputs: { viewContext: "viewContext" }, ngImport: i0 }); }
1795
2043
  }
1796
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainerItem, decorators: [{
1797
- type: Directive
1798
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { viewContext: [{
1799
- type: Input
1800
- }] } });
2044
+ function getViewType$1(item, parent, viewContext) {
2045
+ if (Element.isElement(item)) {
2046
+ return (viewContext.renderElement && viewContext.renderElement(item)) || viewContext.defaultElement;
2047
+ }
2048
+ else {
2049
+ const isVoid = viewContext.editor.isVoid(parent);
2050
+ return isVoid ? viewContext.defaultVoidText : (viewContext.renderText && viewContext.renderText(item)) || viewContext.defaultText;
2051
+ }
2052
+ }
2053
+ function createBlockCard(item, view, viewContainerRef, viewContext) {
2054
+ const isBlockCard = viewContext.editor.isBlockCard(item);
2055
+ if (isBlockCard) {
2056
+ const rootNodes = getRootNodes(view);
2057
+ const blockCardComponentRef = viewContainerRef.createComponent(SlateBlockCard, {
2058
+ injector: viewContainerRef.injector
2059
+ });
2060
+ blockCardComponentRef.instance.initializeCenter(rootNodes);
2061
+ return blockCardComponentRef;
2062
+ }
2063
+ else {
2064
+ return null;
2065
+ }
2066
+ }
2067
+ function trackBy$1(viewContext) {
2068
+ return (index, node) => {
2069
+ return viewContext.trackBy(node) || AngularEditor.findKey(viewContext.editor, node);
2070
+ };
2071
+ }
2072
+ function memoizedContext(viewContext, descendant, prev, next) {
2073
+ if (Element.isElement(descendant)) {
2074
+ return memoizedElementContext(viewContext, prev, next);
2075
+ }
2076
+ else {
2077
+ return memoizedTextContext(prev, next);
2078
+ }
2079
+ }
2080
+ function memoizedElementContext(viewContext, prev, next) {
2081
+ return (prev.element === next.element &&
2082
+ (!viewContext.isStrictDecorate || prev.decorate === next.decorate) &&
2083
+ prev.readonly === next.readonly &&
2084
+ isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
2085
+ (prev.selection === next.selection || (!!prev.selection && !!next.selection && Range.equals(prev.selection, next.selection))));
2086
+ }
2087
+ function memoizedTextContext(prev, next) {
2088
+ return (next.parent === prev.parent &&
2089
+ next.isLast === prev.isLast &&
2090
+ next.text === prev.text &&
2091
+ isDecoratorRangeListEqual(next.decorations, prev.decorations));
2092
+ }
1801
2093
 
1802
- function hasBeforeContextChange(value) {
1803
- if (value.beforeContextChange) {
1804
- return true;
2094
+ class LeavesRender {
2095
+ constructor(viewContext, viewContainerRef, getOutletElement) {
2096
+ this.viewContext = viewContext;
2097
+ this.viewContainerRef = viewContainerRef;
2098
+ this.getOutletElement = getOutletElement;
2099
+ this.views = [];
2100
+ this.contexts = [];
2101
+ this.viewTypes = [];
2102
+ }
2103
+ initialize(context) {
2104
+ const { leaves, contexts } = this.getLeaves(context);
2105
+ this.leaves = leaves;
2106
+ this.contexts = contexts;
2107
+ this.leaves.forEach((leaf, index) => {
2108
+ const context = getContext(index, this.contexts);
2109
+ const viewType = getViewType(context, this.viewContext);
2110
+ const view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
2111
+ this.views.push(view);
2112
+ this.contexts.push(context);
2113
+ this.viewTypes.push(viewType);
2114
+ });
2115
+ mount(this.views, null, this.getOutletElement());
2116
+ const newDiffers = this.viewContainerRef.injector.get(IterableDiffers);
2117
+ this.differ = newDiffers.find(this.leaves).create(trackBy(this.viewContext));
2118
+ this.differ.diff(this.leaves);
2119
+ }
2120
+ update(context) {
2121
+ const { leaves, contexts } = this.getLeaves(context);
2122
+ const outletElement = this.getOutletElement();
2123
+ const diffResult = this.differ.diff(leaves);
2124
+ if (diffResult) {
2125
+ const newContexts = [];
2126
+ const newViewTypes = [];
2127
+ const newViews = [];
2128
+ diffResult.forEachItem(record => {
2129
+ let context = getContext(record.currentIndex, contexts);
2130
+ const viewType = getViewType(context, this.viewContext);
2131
+ newViewTypes.push(viewType);
2132
+ let view;
2133
+ if (record.previousIndex === null) {
2134
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
2135
+ newContexts.push(context);
2136
+ newViews.push(view);
2137
+ mountOnItemChange(record.currentIndex, record.item, newViews, null, outletElement, this.viewContext);
2138
+ }
2139
+ else {
2140
+ const previousView = this.views[record.previousIndex];
2141
+ const previousViewType = this.viewTypes[record.previousIndex];
2142
+ if (previousViewType !== viewType) {
2143
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
2144
+ const firstRootNode = getRootNodes(previousView, null)[0];
2145
+ const newRootNodes = getRootNodes(view, null);
2146
+ firstRootNode.replaceWith(...newRootNodes);
2147
+ previousView.destroy();
2148
+ }
2149
+ else {
2150
+ view = previousView;
2151
+ updateContext(previousView, context, this.viewContext);
2152
+ }
2153
+ newContexts.push(context);
2154
+ newViews.push(view);
2155
+ }
2156
+ });
2157
+ diffResult.forEachRemovedItem(record => {
2158
+ const view = this.views[record.previousIndex];
2159
+ view.destroy();
2160
+ });
2161
+ diffResult.forEachMovedItem(record => {
2162
+ mountOnItemChange(record.currentIndex, record.item, newViews, null, outletElement, this.viewContext);
2163
+ });
2164
+ this.viewTypes = newViewTypes;
2165
+ this.views = newViews;
2166
+ this.contexts = newContexts;
2167
+ this.leaves = leaves;
2168
+ }
1805
2169
  }
1806
- return false;
2170
+ getLeaves(context) {
2171
+ const leaves = Text$1.decorations(context.text, context.decorations);
2172
+ const contexts = leaves.map((leaf, index) => {
2173
+ return {
2174
+ leaf,
2175
+ text: context.text,
2176
+ parent: context.parent,
2177
+ index,
2178
+ isLast: context.isLast && index === leaves.length - 1
2179
+ };
2180
+ });
2181
+ return { leaves, contexts };
2182
+ }
2183
+ }
2184
+ function getContext(index, leafContexts) {
2185
+ return leafContexts[index];
2186
+ }
2187
+ function getViewType(leafContext, viewContext) {
2188
+ return (viewContext.renderLeaf && viewContext.renderLeaf(leafContext.leaf)) || viewContext.defaultLeaf;
2189
+ }
2190
+ function trackBy(viewContext) {
2191
+ return (index, node) => {
2192
+ return index;
2193
+ };
1807
2194
  }
1808
2195
 
1809
2196
  /**
@@ -1862,7 +2249,7 @@ class BaseLeafComponent extends BaseComponent {
1862
2249
  if (!this.initialized) {
1863
2250
  return;
1864
2251
  }
1865
- this.cdr.markForCheck();
2252
+ this.cdr.detectChanges();
1866
2253
  }
1867
2254
  renderPlaceholder() {
1868
2255
  // issue-1: IME input was interrupted
@@ -1914,7 +2301,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
1914
2301
  class BaseElementComponent extends BaseComponent {
1915
2302
  constructor() {
1916
2303
  super(...arguments);
2304
+ this.viewContainerRef = inject(ViewContainerRef);
1917
2305
  this.initialized = false;
2306
+ this.getOutletElement = () => {
2307
+ return this.elementRef.nativeElement;
2308
+ };
1918
2309
  }
1919
2310
  get element() {
1920
2311
  return this._context && this._context.element;
@@ -1922,6 +2313,9 @@ class BaseElementComponent extends BaseComponent {
1922
2313
  get selection() {
1923
2314
  return this._context && this._context.selection;
1924
2315
  }
2316
+ get path() {
2317
+ return this._context && this._context.path;
2318
+ }
1925
2319
  get decorations() {
1926
2320
  return this._context && this._context.decorations;
1927
2321
  }
@@ -1938,11 +2332,12 @@ class BaseElementComponent extends BaseComponent {
1938
2332
  return this._context && this._context.readonly;
1939
2333
  }
1940
2334
  ngOnInit() {
1941
- this.updateWeakMap();
1942
2335
  for (const key in this._context.attributes) {
1943
2336
  this.nativeElement.setAttribute(key, this._context.attributes[key]);
1944
2337
  }
1945
2338
  this.initialized = true;
2339
+ this.listRender = new ListRender(this.viewContext, this.viewContainerRef, this.getOutletElement);
2340
+ this.listRender.initialize(this.children, this.element, this.path, this.childrenContext);
1946
2341
  }
1947
2342
  updateWeakMap() {
1948
2343
  NODE_TO_ELEMENT.set(this.element, this.nativeElement);
@@ -1959,11 +2354,12 @@ class BaseElementComponent extends BaseComponent {
1959
2354
  }
1960
2355
  onContextChange() {
1961
2356
  this.childrenContext = this.getChildrenContext();
2357
+ this.updateWeakMap();
1962
2358
  if (!this.initialized) {
1963
2359
  return;
1964
2360
  }
1965
- this.cdr.markForCheck();
1966
- this.updateWeakMap();
2361
+ this.listRender.update(this.children, this.element, this.path, this.childrenContext);
2362
+ this.cdr.detectChanges();
1967
2363
  }
1968
2364
  getChildrenContext() {
1969
2365
  return {
@@ -1987,13 +2383,18 @@ class BaseTextComponent extends BaseComponent {
1987
2383
  constructor() {
1988
2384
  super(...arguments);
1989
2385
  this.initialized = false;
2386
+ this.viewContainerRef = inject(ViewContainerRef);
2387
+ this.getOutletElement = () => {
2388
+ return this.elementRef.nativeElement;
2389
+ };
1990
2390
  }
1991
2391
  get text() {
1992
2392
  return this._context && this._context.text;
1993
2393
  }
1994
2394
  ngOnInit() {
1995
- this.updateWeakMap();
1996
2395
  this.initialized = true;
2396
+ this.leavesRender = new LeavesRender(this.viewContext, this.viewContainerRef, this.getOutletElement);
2397
+ this.leavesRender.initialize(this.context);
1997
2398
  }
1998
2399
  updateWeakMap() {
1999
2400
  ELEMENT_TO_NODE.set(this.nativeElement, this.text);
@@ -2005,11 +2406,12 @@ class BaseTextComponent extends BaseComponent {
2005
2406
  }
2006
2407
  }
2007
2408
  onContextChange() {
2409
+ this.updateWeakMap();
2008
2410
  if (!this.initialized) {
2009
2411
  return;
2010
2412
  }
2011
- this.cdr.markForCheck();
2012
- this.updateWeakMap();
2413
+ this.leavesRender.update(this.context);
2414
+ this.cdr.detectChanges();
2013
2415
  }
2014
2416
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: BaseTextComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
2015
2417
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.1", type: BaseTextComponent, usesInheritance: true, ngImport: i0 }); }
@@ -2018,102 +2420,193 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
2018
2420
  type: Directive
2019
2421
  }] });
2020
2422
 
2021
- /**
2022
- * the special container for angular template
2023
- * Add the rootNodes of each child component to the parentElement
2024
- * Remove useless DOM elements, eg: comment...
2025
- */
2026
- class ViewContainer {
2027
- constructor(elementRef, differs) {
2028
- this.elementRef = elementRef;
2029
- this.differs = differs;
2423
+ class SlateLeaves extends ViewContainer {
2424
+ constructor() {
2425
+ super(...arguments);
2426
+ this.initialized = false;
2030
2427
  }
2031
- ngAfterViewInit() {
2032
- const differ = this.differs.find(this.childrenComponent).create((index, item) => {
2033
- return item;
2034
- });
2035
- // first diff
2036
- differ.diff(this.childrenComponent);
2037
- const parentElement = this.elementRef.nativeElement.parentElement;
2038
- if (this.childrenComponent.length > 0) {
2039
- parentElement.insertBefore(this.createFragment(), this.elementRef.nativeElement);
2040
- this.elementRef.nativeElement.remove();
2041
- }
2042
- this.childrenComponent.changes.subscribe(value => {
2043
- const iterableChanges = differ.diff(this.childrenComponent);
2044
- if (iterableChanges) {
2045
- iterableChanges.forEachOperation((record, previousIndex, currentIndex) => {
2046
- // removed
2047
- if (currentIndex === null) {
2048
- return;
2049
- }
2050
- // added or moved
2051
- this.handleContainerItemChange(record, parentElement);
2052
- });
2053
- }
2054
- });
2428
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaves, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2429
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateLeaves, isStandalone: true, selector: "slate-leaves", inputs: { context: "context" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2430
+ }
2431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaves, decorators: [{
2432
+ type: Component,
2433
+ args: [{
2434
+ selector: 'slate-leaves',
2435
+ template: ``,
2436
+ changeDetection: ChangeDetectionStrategy.OnPush,
2437
+ standalone: true,
2438
+ imports: [NgFor]
2439
+ }]
2440
+ }], propDecorators: { context: [{
2441
+ type: Input
2442
+ }] } });
2443
+
2444
+ class SlateVoidText extends BaseTextComponent {
2445
+ ngOnInit() {
2446
+ this.isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
2447
+ super.ngOnInit();
2055
2448
  }
2056
- getPreviousRootNode(currentIndex) {
2057
- if (currentIndex === 0) {
2058
- return null;
2449
+ ngOnChanges() {
2450
+ if (!this.initialized) {
2451
+ return;
2059
2452
  }
2060
- const previousComponent = this.childrenComponent.find((item, index) => index === currentIndex - 1);
2061
- let previousRootNode = previousComponent.rootNodes[previousComponent.rootNodes.length - 1];
2062
- if (previousRootNode) {
2063
- return previousRootNode;
2453
+ this.isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
2454
+ }
2455
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateVoidText, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2456
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateVoidText, isStandalone: true, selector: "span[slateVoidText]", host: { attributes: { "data-slate-spacer": "true", "data-slate-node": "text" }, properties: { "attr.contenteditable": "isLeafBlock" }, classAttribute: "slate-spacer" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2457
+ }
2458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateVoidText, decorators: [{
2459
+ type: Component,
2460
+ args: [{
2461
+ selector: 'span[slateVoidText]',
2462
+ template: ``,
2463
+ changeDetection: ChangeDetectionStrategy.OnPush,
2464
+ host: {
2465
+ '[attr.contenteditable]': 'isLeafBlock',
2466
+ 'data-slate-spacer': 'true',
2467
+ class: 'slate-spacer',
2468
+ 'data-slate-node': 'text'
2469
+ },
2470
+ standalone: true,
2471
+ imports: [SlateLeaves]
2472
+ }]
2473
+ }] });
2474
+
2475
+ class SlateDefaultText extends BaseTextComponent {
2476
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultText, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2477
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultText, isStandalone: true, selector: "span[slateDefaultText]", host: { attributes: { "data-slate-node": "text" } }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2478
+ }
2479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultText, decorators: [{
2480
+ type: Component,
2481
+ args: [{
2482
+ selector: 'span[slateDefaultText]',
2483
+ template: ``,
2484
+ changeDetection: ChangeDetectionStrategy.OnPush,
2485
+ host: {
2486
+ 'data-slate-node': 'text'
2487
+ },
2488
+ standalone: true,
2489
+ imports: [SlateLeaves]
2490
+ }]
2491
+ }] });
2492
+
2493
+ class SlateDefaultElement extends BaseElementComponent {
2494
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultElement, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2495
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultElement, isStandalone: true, selector: "div[slateDefaultElement]", usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2496
+ }
2497
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultElement, decorators: [{
2498
+ type: Component,
2499
+ args: [{
2500
+ selector: 'div[slateDefaultElement]',
2501
+ template: ``,
2502
+ changeDetection: ChangeDetectionStrategy.OnPush,
2503
+ standalone: true,
2504
+ imports: [SlateChildren]
2505
+ }]
2506
+ }] });
2507
+
2508
+ /**
2509
+ * Dynamically create/update components or templates
2510
+ * Provide rootNodes for the view container
2511
+ * If the dynamically created component uses onpush mode, then it must call markForCheck when setting the context
2512
+ */
2513
+ class ViewContainerItem {
2514
+ get rootNodes() {
2515
+ return this.getRootNodes();
2516
+ }
2517
+ getRootNodes() {
2518
+ if (this.embeddedViewRef) {
2519
+ return this.embeddedViewRef.rootNodes.filter(rootNode => isDOMElement(rootNode));
2064
2520
  }
2065
- else {
2066
- return this.getPreviousRootNode(currentIndex - 1);
2521
+ if (this.componentRef) {
2522
+ return [this.componentRef.instance.nativeElement];
2067
2523
  }
2524
+ return [];
2068
2525
  }
2069
- createFragment() {
2070
- const fragment = document.createDocumentFragment();
2071
- this.childrenComponent.forEach((component, index) => {
2072
- fragment.append(...component.rootNodes);
2073
- });
2074
- return fragment;
2075
- }
2076
- handleContainerItemChange(record, parentElement) {
2077
- // first insert
2078
- if (this.elementRef.nativeElement.parentElement && this.elementRef.nativeElement.parentElement === parentElement) {
2079
- const fragment = document.createDocumentFragment();
2080
- fragment.append(...record.item.rootNodes);
2081
- parentElement.insertBefore(fragment, this.elementRef.nativeElement);
2082
- this.elementRef.nativeElement.remove();
2083
- return;
2526
+ constructor(viewContainerRef) {
2527
+ this.viewContainerRef = viewContainerRef;
2528
+ this.initialized = false;
2529
+ }
2530
+ destroyView() {
2531
+ if (this.embeddedViewRef) {
2532
+ this.embeddedViewRef.destroy();
2533
+ this.embeddedViewRef = null;
2084
2534
  }
2085
- // insert at start location
2086
- if (record.currentIndex === 0) {
2087
- const fragment = document.createDocumentFragment();
2088
- fragment.append(...record.item.rootNodes);
2089
- parentElement.prepend(fragment);
2535
+ if (this.componentRef) {
2536
+ this.componentRef.destroy();
2537
+ this.componentRef = null;
2538
+ }
2539
+ }
2540
+ createView() {
2541
+ this.initialized = true;
2542
+ this.viewType = this.getViewType();
2543
+ const context = this.getContext();
2544
+ if (isTemplateRef(this.viewType)) {
2545
+ this.embeddedViewContext = {
2546
+ context,
2547
+ viewContext: this.viewContext
2548
+ };
2549
+ const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.viewType, this.embeddedViewContext);
2550
+ this.embeddedViewRef = embeddedViewRef;
2551
+ }
2552
+ if (isComponentType(this.viewType)) {
2553
+ const componentRef = this.viewContainerRef.createComponent(this.viewType);
2554
+ componentRef.instance.viewContext = this.viewContext;
2555
+ componentRef.instance.context = context;
2556
+ this.componentRef = componentRef;
2557
+ }
2558
+ }
2559
+ updateView() {
2560
+ const viewType = this.getViewType();
2561
+ const context = this.getContext();
2562
+ if (this.viewType === viewType) {
2563
+ if (this.componentRef) {
2564
+ if (this.memoizedContext(this.componentRef.instance.context, context)) {
2565
+ return;
2566
+ }
2567
+ this.componentRef.instance.context = context;
2568
+ }
2569
+ if (this.embeddedViewRef) {
2570
+ if (this.memoizedContext(this.embeddedViewContext.context, context)) {
2571
+ return;
2572
+ }
2573
+ this.embeddedViewContext.context = context;
2574
+ }
2090
2575
  }
2091
2576
  else {
2092
- // insert afterend of previous component end
2093
- let previousRootNode = this.getPreviousRootNode(record.currentIndex);
2094
- if (previousRootNode) {
2095
- record.item.rootNodes.forEach(rootNode => {
2096
- previousRootNode.insertAdjacentElement('afterend', rootNode);
2097
- previousRootNode = rootNode;
2098
- });
2577
+ this.viewType = viewType;
2578
+ const firstRootNode = this.rootNodes[0];
2579
+ if (isTemplateRef(this.viewType)) {
2580
+ this.embeddedViewContext = {
2581
+ context,
2582
+ viewContext: this.viewContext
2583
+ };
2584
+ const embeddedViewRef = this.viewContainerRef.createEmbeddedView(this.viewType, this.embeddedViewContext);
2585
+ firstRootNode.replaceWith(...embeddedViewRef.rootNodes.filter(rootNode => isDOMElement(rootNode)));
2586
+ this.destroyView();
2587
+ this.embeddedViewRef = embeddedViewRef;
2099
2588
  }
2100
- else {
2101
- this.viewContext.editor.onError({
2102
- code: SlateErrorCode.NotFoundPreviousRootNodeError,
2103
- name: 'not found previous rootNode',
2104
- nativeError: null
2105
- });
2589
+ if (isComponentType(this.viewType)) {
2590
+ const componentRef = this.viewContainerRef.createComponent(this.viewType);
2591
+ componentRef.instance.viewContext = this.viewContext;
2592
+ componentRef.instance.context = context;
2593
+ firstRootNode.replaceWith(componentRef.instance.nativeElement);
2594
+ this.destroyView();
2595
+ this.componentRef = componentRef;
2106
2596
  }
2107
2597
  }
2108
- // Solve the block-card DOMElement loss when moving nodes
2109
- record.item.appendBlockCardElement();
2110
2598
  }
2111
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainer, deps: [{ token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Directive }); }
2112
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.1", type: ViewContainer, inputs: { viewContext: "viewContext" }, ngImport: i0 }); }
2599
+ appendBlockCardElement() {
2600
+ if (this.blockCardComponentRef) {
2601
+ this.blockCardComponentRef.instance.append();
2602
+ }
2603
+ }
2604
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainerItem, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
2605
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.1", type: ViewContainerItem, inputs: { viewContext: "viewContext" }, ngImport: i0 }); }
2113
2606
  }
2114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainer, decorators: [{
2607
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ViewContainerItem, decorators: [{
2115
2608
  type: Directive
2116
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.IterableDiffers }]; }, propDecorators: { viewContext: [{
2609
+ }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; }, propDecorators: { viewContext: [{
2117
2610
  type: Input
2118
2611
  }] } });
2119
2612
 
@@ -2159,525 +2652,189 @@ class SlateDefaultString extends BaseComponent {
2159
2652
  removeLineBreakEmptyStringDOM() {
2160
2653
  this.brNode?.remove();
2161
2654
  // remove zero width character
2162
- const zeroWidthCharacterIndex = this.textNode?.textContent.indexOf(`\uFEFF`);
2163
- this.textNode?.deleteData(zeroWidthCharacterIndex, 1);
2164
- this.nativeElement.removeAttribute('data-slate-zero-width');
2165
- this.nativeElement.removeAttribute('data-slate-length');
2166
- }
2167
- createStringDOM() {
2168
- this.nativeElement.setAttribute('data-slate-string', 'true');
2169
- this.updateStringDOM();
2170
- }
2171
- updateStringDOM() {
2172
- // Avoid breaking some browser default behaviors, such as spellCheck, android composition input state
2173
- if (this.nativeElement.textContent !== this.context.text) {
2174
- this.nativeElement.textContent = this.context.text;
2175
- }
2176
- }
2177
- removeStringDOM() {
2178
- this.nativeElement.removeAttribute('data-slate-string');
2179
- this.nativeElement.textContent = '';
2180
- }
2181
- ngOnInit() {
2182
- this.nativeElement.setAttribute('editable-text', '');
2183
- }
2184
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultString, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2185
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultString, isStandalone: true, selector: "span[slateDefaultString]", usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2186
- }
2187
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultString, decorators: [{
2188
- type: Component,
2189
- args: [{
2190
- selector: 'span[slateDefaultString]',
2191
- template: '',
2192
- changeDetection: ChangeDetectionStrategy.OnPush,
2193
- standalone: true
2194
- }]
2195
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; } });
2196
-
2197
- class SlateString extends ViewContainerItem {
2198
- constructor(elementRef, viewContainerRef) {
2199
- super(viewContainerRef);
2200
- this.elementRef = elementRef;
2201
- this.viewContainerRef = viewContainerRef;
2202
- }
2203
- ngOnInit() {
2204
- this.createView();
2205
- }
2206
- ngOnChanges() {
2207
- if (!this.initialized) {
2208
- return;
2209
- }
2210
- this.updateView();
2211
- }
2212
- ngAfterViewInit() {
2213
- this.elementRef.nativeElement.remove();
2214
- }
2215
- // COMPAT: If this is the last text node in an empty block, render a zero-
2216
- // width space that will convert into a line break when copying and pasting
2217
- // to support expected plain text.
2218
- isLineBreakEmptyString() {
2219
- const path = AngularEditor.findPath(this.viewContext.editor, this.context.text);
2220
- const parentPath = Path.parent(path);
2221
- return (this.context.leaf.text === '' &&
2222
- this.context.parent.children[this.context.parent.children.length - 1] === this.context.text &&
2223
- !this.viewContext.editor.isInline(this.context.parent) &&
2224
- Editor.string(this.viewContext.editor, parentPath) === '');
2225
- }
2226
- // COMPAT: If the text is empty, it's because it's on the edge of an inline
2227
- // node, so we render a zero-width space so that the selection can be
2228
- // inserted next to it still.
2229
- isEmptyText() {
2230
- return this.context.leaf.text === '';
2231
- }
2232
- // COMPAT: Browsers will collapse trailing new lines at the end of blocks,
2233
- // so we need to add an extra trailing new lines to prevent that.
2234
- isCompatibleString() {
2235
- return this.context.isLast && this.context.leaf.text.slice(-1) === '\n';
2236
- }
2237
- // COMPAT: Render text inside void nodes with a zero-width space.
2238
- // So the node can contain selection but the text is not visible.
2239
- isVoid() {
2240
- return this.viewContext.editor.isVoid(this.context.parent);
2241
- }
2242
- getViewType() {
2243
- if (this.isVoid()) {
2244
- return this.viewContext.templateComponent.voidStringTemplate;
2245
- }
2246
- if (this.isLineBreakEmptyString()) {
2247
- return SlateDefaultString;
2248
- }
2249
- if (this.isEmptyText()) {
2250
- return this.viewContext.templateComponent.emptyTextTemplate;
2251
- }
2252
- if (this.isCompatibleString()) {
2253
- return this.viewContext.templateComponent.compatibleStringTemplate;
2254
- }
2255
- return SlateDefaultString;
2256
- }
2257
- getType() {
2258
- if (this.isLineBreakEmptyString()) {
2259
- return 'lineBreakEmptyString';
2260
- }
2261
- return 'string';
2262
- }
2263
- getContext() {
2264
- const stringType = this.getType();
2265
- return {
2266
- text: this.context.leaf.text,
2267
- elementStringLength: Node.string(this.context.parent).length,
2268
- type: stringType
2269
- };
2270
- }
2271
- memoizedContext(prev, next) {
2272
- return false;
2273
- }
2274
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateString, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
2275
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateString, isStandalone: true, selector: "span[slateString]", inputs: { context: "context" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2276
- }
2277
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateString, decorators: [{
2278
- type: Component,
2279
- args: [{
2280
- selector: 'span[slateString]',
2281
- template: '',
2282
- changeDetection: ChangeDetectionStrategy.OnPush,
2283
- standalone: true
2284
- }]
2285
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { context: [{
2286
- type: Input
2287
- }] } });
2288
-
2289
- class SlateDefaultLeaf extends BaseLeafComponent {
2290
- onContextChange() {
2291
- super.onContextChange();
2292
- this.renderPlaceholder();
2293
- }
2294
- ngOnDestroy() {
2295
- // Because the placeholder span is not in the current component, it is destroyed along with the current component
2296
- this.destroyPlaceholder();
2297
- }
2298
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultLeaf, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2299
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultLeaf, isStandalone: true, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `<span slateString [context]="context" [viewContext]="viewContext"><span></span></span>`, isInline: true, dependencies: [{ kind: "component", type: SlateString, selector: "span[slateString]", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2300
- }
2301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultLeaf, decorators: [{
2302
- type: Component,
2303
- args: [{
2304
- selector: 'span[slateDefaultLeaf]',
2305
- template: `<span slateString [context]="context" [viewContext]="viewContext"><span></span></span>`,
2306
- changeDetection: ChangeDetectionStrategy.OnPush,
2307
- host: {
2308
- 'data-slate-leaf': 'true'
2309
- },
2310
- standalone: true,
2311
- imports: [SlateString]
2312
- }]
2313
- }] });
2314
-
2315
- class SlateLeaf extends ViewContainerItem {
2316
- ngOnInit() {
2317
- this.createView();
2318
- }
2319
- getContext() {
2320
- return this.context;
2321
- }
2322
- getViewType() {
2323
- return (this.viewContext.renderLeaf && this.viewContext.renderLeaf(this.context.leaf)) || SlateDefaultLeaf;
2324
- }
2325
- memoizedContext(prev, next) {
2326
- return false;
2327
- }
2328
- ngOnChanges(simpleChanges) {
2329
- if (!this.initialized) {
2330
- return;
2331
- }
2332
- this.updateView();
2333
- }
2334
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaf, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2335
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateLeaf, isStandalone: true, selector: "slate-leaf", inputs: { context: "context" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2336
- }
2337
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaf, decorators: [{
2338
- type: Component,
2339
- args: [{
2340
- selector: 'slate-leaf',
2341
- template: '',
2342
- changeDetection: ChangeDetectionStrategy.OnPush,
2343
- standalone: true
2344
- }]
2345
- }], propDecorators: { context: [{
2346
- type: Input
2347
- }] } });
2348
-
2349
- class SlateLeaves extends ViewContainer {
2350
- constructor() {
2351
- super(...arguments);
2352
- this.initialized = false;
2353
- }
2354
- ngOnInit() {
2355
- this.leaves = Text$1.decorations(this.context.text, this.context.decorations);
2356
- this.leafContexts = this.getLeafContexts();
2357
- this.initialized = true;
2358
- }
2359
- getLeafContexts() {
2360
- return this.leaves.map((leaf, index) => {
2361
- return {
2362
- leaf,
2363
- text: this.context.text,
2364
- parent: this.context.parent,
2365
- index,
2366
- isLast: this.context.isLast && index === this.leaves.length - 1
2367
- };
2368
- });
2369
- }
2370
- ngOnChanges(simpleChanges) {
2371
- if (!this.initialized) {
2372
- return;
2373
- }
2374
- const context = simpleChanges['context'];
2375
- const previousValue = context.previousValue;
2376
- const currentValue = context.currentValue;
2377
- if (previousValue.text !== currentValue.text || !isDecoratorRangeListEqual(previousValue.decorations, currentValue.decorations)) {
2378
- this.leaves = Text$1.decorations(this.context.text, this.context.decorations);
2379
- }
2380
- this.leafContexts = this.getLeafContexts();
2381
- }
2382
- trackBy(index, item) {
2383
- return index;
2384
- }
2385
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaves, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2386
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateLeaves, isStandalone: true, selector: "slate-leaves", inputs: { context: "context" }, viewQueries: [{ propertyName: "childrenComponent", predicate: SlateLeaf, descendants: true, read: SlateLeaf }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<slate-leaf
2387
- [context]="context"
2388
- [viewContext]="viewContext"
2389
- *ngFor="let context of leafContexts; trackBy: trackBy"
2390
- ></slate-leaf>`, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SlateLeaf, selector: "slate-leaf", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2391
- }
2392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateLeaves, decorators: [{
2393
- type: Component,
2394
- args: [{
2395
- selector: 'slate-leaves',
2396
- template: `<slate-leaf
2397
- [context]="context"
2398
- [viewContext]="viewContext"
2399
- *ngFor="let context of leafContexts; trackBy: trackBy"
2400
- ></slate-leaf>`,
2401
- changeDetection: ChangeDetectionStrategy.OnPush,
2402
- standalone: true,
2403
- imports: [NgFor, SlateLeaf]
2404
- }]
2405
- }], propDecorators: { context: [{
2406
- type: Input
2407
- }], childrenComponent: [{
2408
- type: ViewChildren,
2409
- args: [SlateLeaf, { read: SlateLeaf }]
2410
- }] } });
2411
-
2412
- class SlateDefaultText extends BaseTextComponent {
2413
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultText, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2414
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultText, isStandalone: true, selector: "span[slateDefaultText]", host: { attributes: { "data-slate-node": "text" } }, usesInheritance: true, ngImport: i0, template: `<slate-leaves [context]="context" [viewContext]="viewContext" [viewContext]="viewContext"></slate-leaves>`, isInline: true, dependencies: [{ kind: "component", type: SlateLeaves, selector: "slate-leaves", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2415
- }
2416
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultText, decorators: [{
2417
- type: Component,
2418
- args: [{
2419
- selector: 'span[slateDefaultText]',
2420
- template: `<slate-leaves [context]="context" [viewContext]="viewContext" [viewContext]="viewContext"></slate-leaves>`,
2421
- changeDetection: ChangeDetectionStrategy.OnPush,
2422
- host: {
2423
- 'data-slate-node': 'text'
2424
- },
2425
- standalone: true,
2426
- imports: [SlateLeaves]
2427
- }]
2428
- }] });
2429
-
2430
- class SlateVoidText extends BaseTextComponent {
2431
- ngOnInit() {
2432
- this.isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
2433
- super.ngOnInit();
2655
+ const zeroWidthCharacterIndex = this.textNode?.textContent.indexOf(`\uFEFF`);
2656
+ this.textNode?.deleteData(zeroWidthCharacterIndex, 1);
2657
+ this.nativeElement.removeAttribute('data-slate-zero-width');
2658
+ this.nativeElement.removeAttribute('data-slate-length');
2434
2659
  }
2435
- ngOnChanges() {
2436
- if (!this.initialized) {
2437
- return;
2660
+ createStringDOM() {
2661
+ this.nativeElement.setAttribute('data-slate-string', 'true');
2662
+ this.updateStringDOM();
2663
+ }
2664
+ updateStringDOM() {
2665
+ // Avoid breaking some browser default behaviors, such as spellCheck, android composition input state
2666
+ if (this.nativeElement.textContent !== this.context.text) {
2667
+ this.nativeElement.textContent = this.context.text;
2438
2668
  }
2439
- this.isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
2440
2669
  }
2441
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateVoidText, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2442
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateVoidText, isStandalone: true, selector: "span[slateVoidText]", host: { attributes: { "data-slate-spacer": "true", "data-slate-node": "text" }, properties: { "attr.contenteditable": "isLeafBlock" }, classAttribute: "slate-spacer" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<slate-leaves [context]="context" [viewContext]="viewContext" [viewContext]="viewContext"></slate-leaves>`, isInline: true, dependencies: [{ kind: "component", type: SlateLeaves, selector: "slate-leaves", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2670
+ removeStringDOM() {
2671
+ this.nativeElement.removeAttribute('data-slate-string');
2672
+ this.nativeElement.textContent = '';
2673
+ }
2674
+ ngOnInit() {
2675
+ this.nativeElement.setAttribute('editable-text', '');
2676
+ }
2677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultString, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
2678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultString, isStandalone: true, selector: "span[slateDefaultString]", usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2443
2679
  }
2444
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateVoidText, decorators: [{
2680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultString, decorators: [{
2445
2681
  type: Component,
2446
2682
  args: [{
2447
- selector: 'span[slateVoidText]',
2448
- template: `<slate-leaves [context]="context" [viewContext]="viewContext" [viewContext]="viewContext"></slate-leaves>`,
2683
+ selector: 'span[slateDefaultString]',
2684
+ template: '',
2449
2685
  changeDetection: ChangeDetectionStrategy.OnPush,
2450
- host: {
2451
- '[attr.contenteditable]': 'isLeafBlock',
2452
- 'data-slate-spacer': 'true',
2453
- class: 'slate-spacer',
2454
- 'data-slate-node': 'text'
2455
- },
2456
- standalone: true,
2457
- imports: [SlateLeaves]
2686
+ standalone: true
2458
2687
  }]
2459
- }] });
2460
-
2461
- const SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN = new InjectionToken('slate-default-element-token');
2688
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; } });
2462
2689
 
2463
- class SlateDescendant extends ViewContainerItem {
2464
- get rootNodes() {
2465
- if (this.blockCardComponentRef) {
2466
- return [this.blockCardComponentRef.instance.nativeElement];
2467
- }
2468
- return super.getRootNodes();
2469
- }
2470
- get isBlockCard() {
2471
- return this.viewContext.editor.isBlockCard(this.descendant);
2472
- }
2473
- constructor(viewContainerRef, defaultElementComponentType) {
2690
+ class SlateString extends ViewContainerItem {
2691
+ constructor(elementRef, viewContainerRef) {
2474
2692
  super(viewContainerRef);
2693
+ this.elementRef = elementRef;
2475
2694
  this.viewContainerRef = viewContainerRef;
2476
- this.defaultElementComponentType = defaultElementComponentType;
2477
2695
  }
2478
2696
  ngOnInit() {
2479
- NODE_TO_INDEX.set(this.descendant, this.index);
2480
- NODE_TO_PARENT.set(this.descendant, this.context.parent);
2481
2697
  this.createView();
2482
- if (this.isBlockCard) {
2483
- this.createBlockCard();
2484
- }
2485
- }
2486
- destroyView() {
2487
- super.destroyView();
2488
- this.destroyBlockCard();
2489
2698
  }
2490
2699
  ngOnChanges() {
2491
2700
  if (!this.initialized) {
2492
2701
  return;
2493
2702
  }
2494
- NODE_TO_INDEX.set(this.descendant, this.index);
2495
- NODE_TO_PARENT.set(this.descendant, this.context.parent);
2496
2703
  this.updateView();
2497
- if (this.isBlockCard) {
2498
- this.updateBlockCard();
2499
- }
2500
2704
  }
2501
- destroyBlockCard() {
2502
- if (this.blockCardComponentRef) {
2503
- this.blockCardComponentRef.destroy();
2504
- this.blockCardComponentRef = null;
2505
- }
2705
+ ngAfterViewInit() {
2706
+ this.elementRef.nativeElement.remove();
2707
+ }
2708
+ // COMPAT: If this is the last text node in an empty block, render a zero-
2709
+ // width space that will convert into a line break when copying and pasting
2710
+ // to support expected plain text.
2711
+ isLineBreakEmptyString() {
2712
+ return (this.context.leaf.text === '' &&
2713
+ this.context.parent.children[this.context.parent.children.length - 1] === this.context.text &&
2714
+ !this.viewContext.editor.isInline(this.context.parent) &&
2715
+ // [list-render] performance optimization: reduce the number of calls to the `Editor.string(editor, path)` method
2716
+ isEmpty(this.viewContext.editor, this.context.parent));
2506
2717
  }
2507
- createBlockCard() {
2508
- const rootNodes = this.rootNodes;
2509
- this.blockCardComponentRef = this.viewContainerRef.createComponent(SlateBlockCard);
2510
- this.blockCardComponentRef.instance.initializeCenter(rootNodes);
2718
+ // COMPAT: If the text is empty, it's because it's on the edge of an inline
2719
+ // node, so we render a zero-width space so that the selection can be
2720
+ // inserted next to it still.
2721
+ isEmptyText() {
2722
+ return this.context.leaf.text === '';
2511
2723
  }
2512
- updateBlockCard() {
2513
- if (this.blockCardComponentRef) {
2514
- return;
2515
- }
2516
- const rootNodes = this.rootNodes;
2517
- this.createBlockCard();
2518
- const firstRootNode = rootNodes[0];
2519
- firstRootNode.replaceWith(this.blockCardComponentRef.instance.nativeElement);
2724
+ // COMPAT: Browsers will collapse trailing new lines at the end of blocks,
2725
+ // so we need to add an extra trailing new lines to prevent that.
2726
+ isCompatibleString() {
2727
+ return this.context.isLast && this.context.leaf.text.slice(-1) === '\n';
2520
2728
  }
2521
- getCommonContext() {
2522
- const path = AngularEditor.findPath(this.viewContext.editor, this.context.parent);
2523
- const p = path.concat(this.index);
2524
- try {
2525
- const range = Editor.range(this.viewContext.editor, p);
2526
- const sel = this.context.selection && Range.intersection(range, this.context.selection);
2527
- const ds = this.context.decorate([this.descendant, p]);
2528
- for (const dec of this.context.decorations) {
2529
- const d = Range.intersection(dec, range);
2530
- if (d) {
2531
- ds.push(d);
2532
- }
2533
- }
2534
- return { selection: sel, decorations: ds };
2535
- }
2536
- catch (error) {
2537
- this.viewContext.editor.onError({
2538
- code: SlateErrorCode.GetStartPointError,
2539
- nativeError: error
2540
- });
2541
- return { selection: null, decorations: [] };
2542
- }
2729
+ // COMPAT: Render text inside void nodes with a zero-width space.
2730
+ // So the node can contain selection but the text is not visible.
2731
+ isVoid() {
2732
+ return this.viewContext.editor.isVoid(this.context.parent);
2543
2733
  }
2544
- getContext() {
2545
- if (Element.isElement(this.descendant)) {
2546
- const computedContext = this.getCommonContext();
2547
- const key = AngularEditor.findKey(this.viewContext.editor, this.descendant);
2548
- const isInline = this.viewContext.editor.isInline(this.descendant);
2549
- const isVoid = this.viewContext.editor.isVoid(this.descendant);
2550
- const elementContext = {
2551
- element: this.descendant,
2552
- ...computedContext,
2553
- attributes: {
2554
- 'data-slate-node': 'element',
2555
- 'data-slate-key': key.id
2556
- },
2557
- decorate: this.context.decorate,
2558
- readonly: this.context.readonly
2559
- };
2560
- if (isInline) {
2561
- elementContext.attributes['data-slate-inline'] = true;
2562
- }
2563
- if (isVoid) {
2564
- elementContext.attributes['data-slate-void'] = true;
2565
- elementContext.attributes.contenteditable = false;
2566
- }
2567
- return elementContext;
2734
+ getViewType() {
2735
+ if (this.isVoid()) {
2736
+ return this.viewContext.templateComponent.voidStringTemplate;
2568
2737
  }
2569
- else {
2570
- const computedContext = this.getCommonContext();
2571
- const isLeafBlock = AngularEditor.isLeafBlock(this.viewContext.editor, this.context.parent);
2572
- const textContext = {
2573
- decorations: computedContext.decorations,
2574
- isLast: isLeafBlock && this.index === this.context.parent.children.length - 1,
2575
- parent: this.context.parent,
2576
- text: this.descendant
2577
- };
2578
- return textContext;
2738
+ if (this.isLineBreakEmptyString()) {
2739
+ return SlateDefaultString;
2579
2740
  }
2580
- }
2581
- getViewType() {
2582
- if (Element.isElement(this.descendant)) {
2583
- return (this.viewContext.renderElement && this.viewContext.renderElement(this.descendant)) || this.defaultElementComponentType;
2741
+ if (this.isEmptyText()) {
2742
+ return this.viewContext.templateComponent.emptyTextTemplate;
2584
2743
  }
2585
- else {
2586
- const isVoid = this.viewContext.editor.isVoid(this.context.parent);
2587
- return isVoid
2588
- ? SlateVoidText
2589
- : (this.viewContext.renderText && this.viewContext.renderText(this.descendant)) || SlateDefaultText;
2744
+ if (this.isCompatibleString()) {
2745
+ return this.viewContext.templateComponent.compatibleStringTemplate;
2590
2746
  }
2747
+ return SlateDefaultString;
2591
2748
  }
2592
- memoizedElementContext(prev, next) {
2593
- return (prev.element === next.element &&
2594
- (!this.viewContext.isStrictDecorate || prev.decorate === next.decorate) &&
2595
- prev.readonly === next.readonly &&
2596
- isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
2597
- (prev.selection === next.selection || (!!prev.selection && !!next.selection && Range.equals(prev.selection, next.selection))));
2749
+ getType() {
2750
+ if (this.isLineBreakEmptyString()) {
2751
+ return 'lineBreakEmptyString';
2752
+ }
2753
+ return 'string';
2598
2754
  }
2599
- memoizedTextContext(prev, next) {
2600
- return (next.parent === prev.parent &&
2601
- next.isLast === prev.isLast &&
2602
- next.text === prev.text &&
2603
- isDecoratorRangeListEqual(next.decorations, prev.decorations));
2755
+ getContext() {
2756
+ const stringType = this.getType();
2757
+ return {
2758
+ text: this.context.leaf.text,
2759
+ elementStringLength: Node.string(this.context.parent).length,
2760
+ type: stringType
2761
+ };
2604
2762
  }
2605
2763
  memoizedContext(prev, next) {
2606
- if (Element.isElement(this.descendant)) {
2607
- return this.memoizedElementContext(prev, next);
2608
- }
2609
- else {
2610
- return this.memoizedTextContext(prev, next);
2611
- }
2764
+ return false;
2612
2765
  }
2613
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDescendant, deps: [{ token: i0.ViewContainerRef }, { token: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
2614
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDescendant, isStandalone: true, selector: "slate-descendant", inputs: { descendant: "descendant", context: "context", viewContext: "viewContext", index: "index" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2766
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateString, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
2767
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateString, isStandalone: true, selector: "span[slateString]", inputs: { context: "context" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2615
2768
  }
2616
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDescendant, decorators: [{
2769
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateString, decorators: [{
2617
2770
  type: Component,
2618
2771
  args: [{
2619
- selector: 'slate-descendant',
2772
+ selector: 'span[slateString]',
2620
2773
  template: '',
2621
2774
  changeDetection: ChangeDetectionStrategy.OnPush,
2622
2775
  standalone: true
2623
2776
  }]
2624
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{
2625
- type: Inject,
2626
- args: [SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN]
2627
- }] }]; }, propDecorators: { descendant: [{
2628
- type: Input
2629
- }], context: [{
2630
- type: Input
2631
- }], viewContext: [{
2632
- type: Input
2633
- }], index: [{
2777
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { context: [{
2634
2778
  type: Input
2635
2779
  }] } });
2780
+ /**
2781
+ * TODO: remove when bump slate
2782
+ * copy from slate
2783
+ * @param editor
2784
+ * @param element
2785
+ * @returns
2786
+ */
2787
+ const isEmpty = (editor, element) => {
2788
+ const { children } = element;
2789
+ const [first] = children;
2790
+ return children.length === 0 || (children.length === 1 && Text$1.isText(first) && first.text === '' && !editor.isVoid(element));
2791
+ };
2636
2792
 
2637
- class SlateChildren extends ViewContainer {
2638
- constructor() {
2639
- super(...arguments);
2640
- this.trackBy = (index, node) => {
2641
- return this.viewContext.trackBy(node) || AngularEditor.findKey(this.viewContext.editor, node);
2642
- };
2793
+ class SlateDefaultLeaf extends BaseLeafComponent {
2794
+ onContextChange() {
2795
+ super.onContextChange();
2796
+ this.renderPlaceholder();
2643
2797
  }
2644
- ngOnInit() { }
2645
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateChildren, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2646
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateChildren, isStandalone: true, selector: "slate-children", inputs: { children: "children", context: "context", viewContext: "viewContext" }, viewQueries: [{ propertyName: "childrenComponent", predicate: SlateDescendant, descendants: true, read: SlateDescendant }], usesInheritance: true, ngImport: i0, template: `<slate-descendant
2647
- [descendant]="descendant"
2648
- [context]="context"
2649
- [viewContext]="viewContext"
2650
- [viewContext]="viewContext"
2651
- [index]="index"
2652
- *ngFor="let descendant of children; let index = index; trackBy: trackBy"
2653
- ></slate-descendant>`, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SlateDescendant, selector: "slate-descendant", inputs: ["descendant", "context", "viewContext", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2798
+ ngOnDestroy() {
2799
+ // Because the placeholder span is not in the current component, it is destroyed along with the current component
2800
+ this.destroyPlaceholder();
2801
+ }
2802
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultLeaf, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2803
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultLeaf, isStandalone: true, selector: "span[slateDefaultLeaf]", host: { attributes: { "data-slate-leaf": "true" } }, usesInheritance: true, ngImport: i0, template: `<span slateString [context]="context" [viewContext]="viewContext"><span></span></span>`, isInline: true, dependencies: [{ kind: "component", type: SlateString, selector: "span[slateString]", inputs: ["context"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2654
2804
  }
2655
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateChildren, decorators: [{
2805
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultLeaf, decorators: [{
2656
2806
  type: Component,
2657
2807
  args: [{
2658
- selector: 'slate-children',
2659
- template: `<slate-descendant
2660
- [descendant]="descendant"
2661
- [context]="context"
2662
- [viewContext]="viewContext"
2663
- [viewContext]="viewContext"
2664
- [index]="index"
2665
- *ngFor="let descendant of children; let index = index; trackBy: trackBy"
2666
- ></slate-descendant>`,
2808
+ selector: 'span[slateDefaultLeaf]',
2809
+ template: `<span slateString [context]="context" [viewContext]="viewContext"><span></span></span>`,
2667
2810
  changeDetection: ChangeDetectionStrategy.OnPush,
2811
+ host: {
2812
+ 'data-slate-leaf': 'true'
2813
+ },
2668
2814
  standalone: true,
2669
- imports: [NgFor, SlateDescendant]
2815
+ imports: [SlateString]
2670
2816
  }]
2671
- }], propDecorators: { children: [{
2672
- type: Input
2673
- }], context: [{
2674
- type: Input
2675
- }], viewContext: [{
2676
- type: Input
2677
- }], childrenComponent: [{
2678
- type: ViewChildren,
2679
- args: [SlateDescendant, { read: SlateDescendant }]
2680
- }] } });
2817
+ }] });
2818
+
2819
+ const SLATE_DEFAULT_LEAF_COMPONENT_TOKEN = new InjectionToken('slate-default-leaf-token');
2820
+
2821
+ const createThrottleRAF = () => {
2822
+ let timerId = null;
2823
+ const throttleRAF = (fn) => {
2824
+ const scheduleFunc = () => {
2825
+ timerId = requestAnimationFrame(() => {
2826
+ timerId = null;
2827
+ fn();
2828
+ });
2829
+ };
2830
+ if (timerId !== null) {
2831
+ cancelAnimationFrame(timerId);
2832
+ timerId = null;
2833
+ }
2834
+ scheduleFunc();
2835
+ };
2836
+ return throttleRAF;
2837
+ };
2681
2838
 
2682
2839
  // not correctly clipboardData on beforeinput
2683
2840
  const forceOnDOMPaste = IS_SAFARI;
@@ -2685,12 +2842,16 @@ class SlateEditable {
2685
2842
  get hasBeforeInputSupport() {
2686
2843
  return HAS_BEFORE_INPUT_SUPPORT;
2687
2844
  }
2688
- constructor(elementRef, renderer2, cdr, ngZone, injector) {
2845
+ constructor(elementRef, renderer2, cdr, ngZone, injector, defaultElement, defaultText, defaultVoidText, defaultLeaf) {
2689
2846
  this.elementRef = elementRef;
2690
2847
  this.renderer2 = renderer2;
2691
2848
  this.cdr = cdr;
2692
2849
  this.ngZone = ngZone;
2693
2850
  this.injector = injector;
2851
+ this.defaultElement = defaultElement;
2852
+ this.defaultText = defaultText;
2853
+ this.defaultVoidText = defaultVoidText;
2854
+ this.defaultLeaf = defaultLeaf;
2694
2855
  this.destroy$ = new Subject();
2695
2856
  this.isComposing = false;
2696
2857
  this.isDraggingInternally = false;
@@ -2712,6 +2873,11 @@ class SlateEditable {
2712
2873
  this.dataSlateEditor = true;
2713
2874
  this.dataSlateNode = 'value';
2714
2875
  this.dataGramm = false;
2876
+ this.viewContainerRef = inject(ViewContainerRef);
2877
+ this.getOutletElement = () => {
2878
+ return this.elementRef.nativeElement;
2879
+ };
2880
+ this.throttleRAF = createThrottleRAF();
2715
2881
  }
2716
2882
  ngOnInit() {
2717
2883
  this.editor.injector = this.injector;
@@ -2737,6 +2903,7 @@ class SlateEditable {
2737
2903
  // add browser class
2738
2904
  let browserClass = IS_FIREFOX ? 'firefox' : IS_SAFARI ? 'safari' : '';
2739
2905
  browserClass && this.elementRef.nativeElement.classList.add(browserClass);
2906
+ this.listRender = new ListRender(this.viewContext, this.viewContainerRef, this.getOutletElement);
2740
2907
  }
2741
2908
  ngOnChanges(simpleChanges) {
2742
2909
  if (!this.initialized) {
@@ -2744,16 +2911,16 @@ class SlateEditable {
2744
2911
  }
2745
2912
  const decorateChange = simpleChanges['decorate'];
2746
2913
  if (decorateChange) {
2747
- this.forceFlush();
2914
+ this.forceRender();
2748
2915
  }
2749
2916
  const placeholderChange = simpleChanges['placeholder'];
2750
2917
  if (placeholderChange) {
2751
- this.detectContext();
2918
+ this.render();
2752
2919
  }
2753
2920
  const readonlyChange = simpleChanges['readonly'];
2754
2921
  if (readonlyChange) {
2755
2922
  IS_READONLY.set(this.editor, this.readonly);
2756
- this.detectContext();
2923
+ this.render();
2757
2924
  this.toSlateSelection();
2758
2925
  }
2759
2926
  }
@@ -2777,6 +2944,12 @@ class SlateEditable {
2777
2944
  this.editor.children = normalize(value);
2778
2945
  }
2779
2946
  this.initializeContext();
2947
+ if (!this.listRender.initialized) {
2948
+ this.listRender.initialize(this.editor.children, this.editor, [], this.context);
2949
+ }
2950
+ else {
2951
+ this.listRender.update(this.editor.children, this.editor, [], this.context);
2952
+ }
2780
2953
  this.cdr.markForCheck();
2781
2954
  }
2782
2955
  }
@@ -2857,11 +3030,15 @@ class SlateEditable {
2857
3030
  // we need to check and do the right thing here.
2858
3031
  if (Range.isBackward(selection)) {
2859
3032
  // eslint-disable-next-line max-len
2860
- domSelection.setBaseAndExtent(newDomRange.endContainer, newDomRange.endOffset, newDomRange.startContainer, newDomRange.startOffset);
3033
+ this.throttleRAF(() => {
3034
+ domSelection.setBaseAndExtent(newDomRange.endContainer, newDomRange.endOffset, newDomRange.startContainer, newDomRange.startOffset);
3035
+ });
2861
3036
  }
2862
3037
  else {
2863
3038
  // eslint-disable-next-line max-len
2864
- domSelection.setBaseAndExtent(newDomRange.startContainer, newDomRange.startOffset, newDomRange.endContainer, newDomRange.endOffset);
3039
+ this.throttleRAF(() => {
3040
+ domSelection.setBaseAndExtent(newDomRange.startContainer, newDomRange.startOffset, newDomRange.endContainer, newDomRange.endOffset);
3041
+ });
2865
3042
  }
2866
3043
  }
2867
3044
  else {
@@ -2886,14 +3063,14 @@ class SlateEditable {
2886
3063
  }
2887
3064
  }
2888
3065
  onChange() {
2889
- this.forceFlush();
3066
+ this.forceRender();
2890
3067
  this.onChangeCallback(this.editor.children);
2891
3068
  }
2892
3069
  ngAfterViewChecked() { }
2893
3070
  ngDoCheck() { }
2894
- forceFlush() {
2895
- this.detectContext();
2896
- this.cdr.detectChanges();
3071
+ forceRender() {
3072
+ this.updateContext();
3073
+ this.listRender.update(this.editor.children, this.editor, [], this.context);
2897
3074
  // repair collaborative editing when Chinese input is interrupted by other users' cursors
2898
3075
  // when the DOMElement where the selection is located is removed
2899
3076
  // the compositionupdate and compositionend events will no longer be fired
@@ -2929,6 +3106,29 @@ class SlateEditable {
2929
3106
  }
2930
3107
  this.toNativeSelection();
2931
3108
  }
3109
+ render() {
3110
+ const changed = this.updateContext();
3111
+ if (changed) {
3112
+ this.listRender.update(this.editor.children, this.editor, [], this.context);
3113
+ }
3114
+ }
3115
+ updateContext() {
3116
+ const decorations = this.generateDecorations();
3117
+ if (this.context.selection !== this.editor.selection ||
3118
+ this.context.decorate !== this.decorate ||
3119
+ this.context.readonly !== this.readonly ||
3120
+ !isDecoratorRangeListEqual(this.context.decorations, decorations)) {
3121
+ this.context = {
3122
+ parent: this.editor,
3123
+ selection: this.editor.selection,
3124
+ decorations: decorations,
3125
+ decorate: this.decorate,
3126
+ readonly: this.readonly
3127
+ };
3128
+ return true;
3129
+ }
3130
+ return false;
3131
+ }
2932
3132
  initializeContext() {
2933
3133
  this.context = {
2934
3134
  parent: this.editor,
@@ -2946,24 +3146,13 @@ class SlateEditable {
2946
3146
  renderText: this.renderText,
2947
3147
  trackBy: this.trackBy,
2948
3148
  isStrictDecorate: this.isStrictDecorate,
2949
- templateComponent: this.templateComponent
3149
+ templateComponent: this.templateComponent,
3150
+ defaultElement: this.defaultElement,
3151
+ defaultText: this.defaultText,
3152
+ defaultVoidText: this.defaultVoidText,
3153
+ defaultLeaf: this.defaultLeaf
2950
3154
  };
2951
3155
  }
2952
- detectContext() {
2953
- const decorations = this.generateDecorations();
2954
- if (this.context.selection !== this.editor.selection ||
2955
- this.context.decorate !== this.decorate ||
2956
- this.context.readonly !== this.readonly ||
2957
- !isDecoratorRangeListEqual(this.context.decorations, decorations)) {
2958
- this.context = {
2959
- parent: this.editor,
2960
- selection: this.editor.selection,
2961
- decorations: decorations,
2962
- decorate: this.decorate,
2963
- readonly: this.readonly
2964
- };
2965
- }
2966
- }
2967
3156
  composePlaceholderDecorate(editor) {
2968
3157
  if (this.placeholderDecorate) {
2969
3158
  return this.placeholderDecorate(editor) || [];
@@ -3267,14 +3456,13 @@ class SlateEditable {
3267
3456
  // solve the problem of cross node Chinese input
3268
3457
  if (Range.isExpanded(selection)) {
3269
3458
  Editor.deleteFragment(this.editor);
3270
- this.forceFlush();
3459
+ this.forceRender();
3271
3460
  }
3272
3461
  }
3273
3462
  if (hasEditableTarget(this.editor, event.target) && !this.isDOMEventHandled(event, this.compositionStart)) {
3274
3463
  this.isComposing = true;
3275
3464
  }
3276
- this.detectContext();
3277
- this.cdr.detectChanges();
3465
+ this.render();
3278
3466
  }
3279
3467
  onDOMCompositionUpdate(event) {
3280
3468
  this.isDOMEventHandled(event, this.compositionUpdate);
@@ -3296,8 +3484,7 @@ class SlateEditable {
3296
3484
  // so we need avoid repeat isnertText by isComposing === true,
3297
3485
  this.isComposing = false;
3298
3486
  }
3299
- this.detectContext();
3300
- this.cdr.detectChanges();
3487
+ this.render();
3301
3488
  }
3302
3489
  onDOMCopy(event) {
3303
3490
  const window = AngularEditor.getWindow(this.editor);
@@ -3670,14 +3857,30 @@ class SlateEditable {
3670
3857
  this.destroy$.complete();
3671
3858
  EDITOR_TO_ON_CHANGE.delete(this.editor);
3672
3859
  }
3673
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateEditable, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
3860
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateEditable, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.Injector }, { token: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN }, { token: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
3674
3861
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateEditable, isStandalone: true, selector: "slate-editable", inputs: { editor: "editor", renderElement: "renderElement", renderLeaf: "renderLeaf", renderText: "renderText", decorate: "decorate", placeholderDecorate: "placeholderDecorate", scrollSelectionIntoView: "scrollSelectionIntoView", isStrictDecorate: "isStrictDecorate", trackBy: "trackBy", readonly: "readonly", placeholder: "placeholder", beforeInput: "beforeInput", blur: "blur", click: "click", compositionEnd: "compositionEnd", compositionUpdate: "compositionUpdate", compositionStart: "compositionStart", copy: "copy", cut: "cut", dragOver: "dragOver", dragStart: "dragStart", dragEnd: "dragEnd", drop: "drop", focus: "focus", keydown: "keydown", paste: "paste", spellCheck: "spellCheck", autoCorrect: "autoCorrect", autoCapitalize: "autoCapitalize" }, host: { properties: { "attr.contenteditable": "readonly ? undefined : true", "attr.role": "readonly ? undefined : 'textbox'", "attr.spellCheck": "!hasBeforeInputSupport ? false : spellCheck", "attr.autoCorrect": "!hasBeforeInputSupport ? 'false' : autoCorrect", "attr.autoCapitalize": "!hasBeforeInputSupport ? 'false' : autoCapitalize", "attr.data-slate-editor": "this.dataSlateEditor", "attr.data-slate-node": "this.dataSlateNode", "attr.data-gramm": "this.dataGramm" }, classAttribute: "slate-editable-container" }, providers: [
3675
3862
  {
3676
3863
  provide: NG_VALUE_ACCESSOR,
3677
3864
  useExisting: forwardRef(() => SlateEditable),
3678
3865
  multi: true
3866
+ },
3867
+ {
3868
+ provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
3869
+ useValue: SlateDefaultElement
3870
+ },
3871
+ {
3872
+ provide: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN,
3873
+ useValue: SlateDefaultText
3874
+ },
3875
+ {
3876
+ provide: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN,
3877
+ useValue: SlateVoidText
3878
+ },
3879
+ {
3880
+ provide: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN,
3881
+ useValue: SlateDefaultLeaf
3679
3882
  }
3680
- ], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\"></slate-children>\n<slate-string-template #templateComponent></slate-string-template>\n", dependencies: [{ kind: "component", type: SlateChildren, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "component", type: SlateStringTemplate, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3883
+ ], viewQueries: [{ propertyName: "templateComponent", first: true, predicate: ["templateComponent"], descendants: true, static: true }, { propertyName: "templateElementRef", first: true, predicate: ["templateComponent"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<slate-string-template #templateComponent></slate-string-template>\n", dependencies: [{ kind: "component", type: SlateStringTemplate, selector: "slate-string-template" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3681
3884
  }
3682
3885
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateEditable, decorators: [{
3683
3886
  type: Component,
@@ -3693,9 +3896,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
3693
3896
  provide: NG_VALUE_ACCESSOR,
3694
3897
  useExisting: forwardRef(() => SlateEditable),
3695
3898
  multi: true
3899
+ },
3900
+ {
3901
+ provide: SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN,
3902
+ useValue: SlateDefaultElement
3903
+ },
3904
+ {
3905
+ provide: SLATE_DEFAULT_TEXT_COMPONENT_TOKEN,
3906
+ useValue: SlateDefaultText
3907
+ },
3908
+ {
3909
+ provide: SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN,
3910
+ useValue: SlateVoidText
3911
+ },
3912
+ {
3913
+ provide: SLATE_DEFAULT_LEAF_COMPONENT_TOKEN,
3914
+ useValue: SlateDefaultLeaf
3696
3915
  }
3697
- ], standalone: true, imports: [SlateChildren, SlateStringTemplate], template: "<slate-children [children]=\"editor.children\" [context]=\"context\" [viewContext]=\"viewContext\"></slate-children>\n<slate-string-template #templateComponent></slate-string-template>\n" }]
3698
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Injector }]; }, propDecorators: { editor: [{
3916
+ ], standalone: true, imports: [SlateChildren, SlateStringTemplate], template: "<slate-string-template #templateComponent></slate-string-template>\n" }]
3917
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.Injector }, { type: undefined, decorators: [{
3918
+ type: Inject,
3919
+ args: [SLATE_DEFAULT_ELEMENT_COMPONENT_TOKEN]
3920
+ }] }, { type: undefined, decorators: [{
3921
+ type: Inject,
3922
+ args: [SLATE_DEFAULT_TEXT_COMPONENT_TOKEN]
3923
+ }] }, { type: undefined, decorators: [{
3924
+ type: Inject,
3925
+ args: [SLATE_DEFAULT_VOID_TEXT_COMPONENT_TOKEN]
3926
+ }] }, { type: undefined, decorators: [{
3927
+ type: Inject,
3928
+ args: [SLATE_DEFAULT_LEAF_COMPONENT_TOKEN]
3929
+ }] }]; }, propDecorators: { editor: [{
3699
3930
  type: Input
3700
3931
  }], renderElement: [{
3701
3932
  type: Input
@@ -3840,28 +4071,13 @@ const preventInsertFromComposition = (event, editor) => {
3840
4071
 
3841
4072
  class SlateElement extends BaseElementComponent {
3842
4073
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateElement, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3843
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateElement, isStandalone: true, selector: "[slateElement]", usesInheritance: true, ngImport: i0, template: '<slate-children [children]="children" [context]="childrenContext" [viewContext]="viewContext"></slate-children><ng-content></ng-content>', isInline: true, dependencies: [{ kind: "component", type: SlateChildren, selector: "slate-children", inputs: ["children", "context", "viewContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4074
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateElement, isStandalone: true, selector: "[slateElement]", usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3844
4075
  }
3845
4076
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateElement, decorators: [{
3846
4077
  type: Component,
3847
4078
  args: [{
3848
4079
  selector: '[slateElement]',
3849
- template: '<slate-children [children]="children" [context]="childrenContext" [viewContext]="viewContext"></slate-children><ng-content></ng-content>',
3850
- changeDetection: ChangeDetectionStrategy.OnPush,
3851
- standalone: true,
3852
- imports: [SlateChildren]
3853
- }]
3854
- }] });
3855
-
3856
- class SlateDefaultElement extends BaseElementComponent {
3857
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultElement, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3858
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SlateDefaultElement, isStandalone: true, selector: "div[slateDefaultElement]", usesInheritance: true, ngImport: i0, template: `<slate-children [children]="children" [context]="childrenContext" [viewContext]="viewContext"></slate-children>`, isInline: true, dependencies: [{ kind: "component", type: SlateChildren, selector: "slate-children", inputs: ["children", "context", "viewContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3859
- }
3860
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SlateDefaultElement, decorators: [{
3861
- type: Component,
3862
- args: [{
3863
- selector: 'div[slateDefaultElement]',
3864
- template: `<slate-children [children]="children" [context]="childrenContext" [viewContext]="viewContext"></slate-children>`,
4080
+ template: '<ng-content></ng-content>',
3865
4081
  changeDetection: ChangeDetectionStrategy.OnPush,
3866
4082
  standalone: true,
3867
4083
  imports: [SlateChildren]
@@ -3878,10 +4094,8 @@ class SlateModule {
3878
4094
  SlateDefaultText,
3879
4095
  SlateString,
3880
4096
  SlateStringTemplate,
3881
- SlateDescendant,
3882
4097
  SlateChildren,
3883
4098
  SlateBlockCard,
3884
- SlateLeaf,
3885
4099
  SlateLeaves,
3886
4100
  SlateDefaultLeaf,
3887
4101
  SlateDefaultString], exports: [SlateEditable,
@@ -3909,10 +4123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
3909
4123
  SlateDefaultText,
3910
4124
  SlateString,
3911
4125
  SlateStringTemplate,
3912
- SlateDescendant,
3913
4126
  SlateChildren,
3914
4127
  SlateBlockCard,
3915
- SlateLeaf,
3916
4128
  SlateLeaves,
3917
4129
  SlateDefaultLeaf,
3918
4130
  SlateDefaultString
@@ -3942,5 +4154,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
3942
4154
  * Generated bundle index. Do not edit.
3943
4155
  */
3944
4156
 
3945
- export { AngularEditor, BaseComponent, BaseElementComponent, BaseLeafComponent, BaseTextComponent, DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText, EDITOR_TO_ELEMENT, EDITOR_TO_ON_CHANGE, EDITOR_TO_PLACEHOLDER, EDITOR_TO_WINDOW, ELEMENT_TO_COMPONENT, ELEMENT_TO_NODE, FAKE_LEFT_BLOCK_CARD_OFFSET, FAKE_RIGHT_BLOCK_CARD_OFFSET, HAS_BEFORE_INPUT_SUPPORT, IS_ANDROID, IS_APPLE, IS_CHROME, IS_CHROME_LEGACY, IS_CLICKING, IS_DRAGGING, IS_EDGE_LEGACY, IS_FIREFOX, IS_FIREFOX_LEGACY, IS_FOCUSED, IS_IOS, IS_QQBROWSER, IS_READONLY, IS_SAFARI, IS_UC_MOBILE, IS_WECHATBROWSER, KEY_TO_ELEMENT, Key, NODE_TO_ELEMENT, NODE_TO_INDEX, NODE_TO_KEY, NODE_TO_PARENT, PLACEHOLDER_SYMBOL, SlateChildren, SlateDefaultString, SlateEditable, SlateElement, SlateErrorCode, SlateLeaves, SlateModule, SlateString, check, defaultScrollSelectionIntoView, getCardTargetAttribute, getClipboardData, getDefaultView, getEditableChild, getEditableChildAndIndex, getPlainText, getSlateFragmentAttribute, hasBeforeContextChange, hasBlockCard, hasBlockCardWithNode, hasEditableTarget, hasShadowRoot, hotkeys, isCardCenterByTargetAttr, isCardLeft, isCardLeftByTargetAttr, isCardRightByTargetAttr, isComponentType, isDOMComment, isDOMElement, isDOMNode, isDOMSelection, isDOMText, isDecoratorRangeListEqual, isPlainTextOnlyPaste, isTemplateRef, isValid, normalize, normalizeDOMPoint, shallowCompare, withAngular };
4157
+ export { AngularEditor, BaseComponent, BaseElementComponent, BaseLeafComponent, BaseTextComponent, DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText, EDITOR_TO_ELEMENT, EDITOR_TO_ON_CHANGE, EDITOR_TO_PLACEHOLDER, EDITOR_TO_WINDOW, ELEMENT_TO_COMPONENT, ELEMENT_TO_NODE, FAKE_LEFT_BLOCK_CARD_OFFSET, FAKE_RIGHT_BLOCK_CARD_OFFSET, HAS_BEFORE_INPUT_SUPPORT, IS_ANDROID, IS_APPLE, IS_CHROME, IS_CHROME_LEGACY, IS_CLICKING, IS_DRAGGING, IS_EDGE_LEGACY, IS_FIREFOX, IS_FIREFOX_LEGACY, IS_FOCUSED, IS_IOS, IS_QQBROWSER, IS_READONLY, IS_SAFARI, IS_UC_MOBILE, IS_WECHATBROWSER, KEY_TO_ELEMENT, Key, NODE_TO_ELEMENT, NODE_TO_INDEX, NODE_TO_KEY, NODE_TO_PARENT, PLACEHOLDER_SYMBOL, SlateChildren, SlateDefaultString, SlateEditable, SlateElement, SlateErrorCode, SlateLeaves, SlateModule, SlateString, check, defaultScrollSelectionIntoView, getCardTargetAttribute, getClipboardData, getDefaultView, getEditableChild, getEditableChildAndIndex, getPlainText, getSlateFragmentAttribute, hasBeforeContextChange, hasBlockCard, hasBlockCardWithNode, hasEditableTarget, hasShadowRoot, hotkeys, isCardCenterByTargetAttr, isCardLeft, isCardLeftByTargetAttr, isCardRightByTargetAttr, isComponentType, isDOMComment, isDOMElement, isDOMNode, isDOMSelection, isDOMText, isDecoratorRangeListEqual, isEmpty, isPlainTextOnlyPaste, isTemplateRef, isValid, normalize, normalizeDOMPoint, shallowCompare, withAngular };
3946
4158
  //# sourceMappingURL=slate-angular.mjs.map