devexpress-richedit 26.1.2-beta → 26.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/bin/gulpfile.js +1 -1
  2. package/bin/index-custom.js +1 -1
  3. package/bin/localization-builder.js +1 -1
  4. package/bin/nspell-index.js +1 -1
  5. package/bin/nspell.webpack.config.js +1 -1
  6. package/bin/webpack-externals.js +1 -1
  7. package/bin/webpack.config.js +1 -1
  8. package/dist/dx.richedit.css +26 -0
  9. package/dist/dx.richedit.d.ts +1 -1
  10. package/dist/dx.richedit.js +6016 -5627
  11. package/dist/dx.richedit.min.js +3 -3
  12. package/dist/pdfkit.js +21908 -22350
  13. package/dist/pdfkit.min.js +1 -1
  14. package/index.d.ts +1 -1
  15. package/index.js +1 -1
  16. package/lib/client/client-rich-edit.d.ts +0 -1
  17. package/lib/client/client-rich-edit.js +2 -25
  18. package/lib/client/default-localization.js +1 -0
  19. package/lib/common/canvas/canvas-manager.d.ts +1 -1
  20. package/lib/common/canvas/canvas-manager.js +7 -3
  21. package/lib/common/canvas/double-tap-detector.d.ts +10 -0
  22. package/lib/common/canvas/double-tap-detector.js +28 -0
  23. package/lib/common/canvas/renderer-class-names.d.ts +2 -0
  24. package/lib/common/canvas/renderer-class-names.js +2 -0
  25. package/lib/common/canvas/renderes/common/document-renderer.d.ts +20 -7
  26. package/lib/common/canvas/renderes/common/document-renderer.js +236 -47
  27. package/lib/common/canvas/renderes/common/simple-view-renderer.d.ts +3 -1
  28. package/lib/common/canvas/renderes/common/simple-view-renderer.js +35 -2
  29. package/lib/common/canvas/renderes/view-manager.d.ts +3 -0
  30. package/lib/common/canvas/renderes/view-manager.js +34 -7
  31. package/lib/common/commands/border-command-options.d.ts +7 -0
  32. package/lib/common/commands/border-command-options.js +8 -0
  33. package/lib/common/commands/dialogs/dialog-border-shading-command.js +13 -6
  34. package/lib/common/commands/dialogs/dialog-custom-numbering-list-command.js +1 -1
  35. package/lib/common/commands/tables/toggle-table-cells-border-command.d.ts +1 -1
  36. package/lib/common/commands/tables/toggle-table-cells-border-command.js +10 -3
  37. package/lib/common/event-manager.js +2 -0
  38. package/lib/common/layout/main-structures/layout-boxes/layout-box.js +1 -1
  39. package/lib/common/layout/main-structures/layout-column.d.ts +1 -0
  40. package/lib/common/layout/main-structures/layout-column.js +3 -0
  41. package/lib/common/layout/selection/layout-selection-items.d.ts +3 -0
  42. package/lib/common/layout/selection/layout-selection-items.js +5 -0
  43. package/lib/common/layout-engine/selection/selection-formatter.js +7 -3
  44. package/lib/common/layout-formatter/box/generator/box-infos-generator.js +8 -4
  45. package/lib/common/layout-formatter/row/result.d.ts +1 -0
  46. package/lib/common/layout-formatter/row/result.js +11 -1
  47. package/lib/common/layout-formatter/row/size-engine/row-formatting-info.d.ts +2 -1
  48. package/lib/common/layout-formatter/row/size-engine/row-formatting-info.js +7 -4
  49. package/lib/common/model/sub-document.d.ts +12 -5
  50. package/lib/common/model/sub-document.js +36 -31
  51. package/lib/common/rich-edit-core.js +1 -1
  52. package/lib/common/screen-reader-manager.d.ts +6 -3
  53. package/lib/common/screen-reader-manager.js +66 -49
  54. package/lib/common/string-resources.d.ts +23 -0
  55. package/lib/common/string-resources.js +43 -0
  56. package/package.json +3 -3
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.d.ts)
3
- * Version: 26.1.2-beta
3
+ * Version: 26.1.3
4
4
  * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs",
6
6
  */
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.js)
3
- * Version: 26.1.2-beta
3
+ * Version: 26.1.3
4
4
  * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs",
6
6
  */
@@ -94,7 +94,6 @@ export declare class ClientRichEdit implements IControlOwner {
94
94
  private initBars;
95
95
  initRibbon(ribbon: Ribbon, fonts: FontsSettings): void;
96
96
  private initDialogManager;
97
- private getStringResources;
98
97
  private initLosingChangesWatcher;
99
98
  private attachEvents;
100
99
  private canUseResizeObserver;
@@ -1,11 +1,9 @@
1
- import { formatMessage } from 'devextreme/localization';
2
1
  import { currentTheme } from 'devextreme/viz/themes';
3
2
  import { RichEditClientCommand } from '../common/commands/client-command';
4
3
  import { DocumentInfo } from '../common/rich-edit-core';
5
4
  import { IsModified } from '../common/model/json/enums/json-top-level-enums';
6
5
  import { RichOptions } from '../common/model/options/rich-options';
7
6
  import { StylesManager } from '../common/model/styles-manager';
8
- import { StringResources } from '../common/string-resources';
9
7
  import { Browser } from '@devexpress/utils/lib/browser';
10
8
  import { DomEventHandlersHolder } from '@devexpress/utils/lib/class/event-handlers-holder';
11
9
  import { DomUtils } from '@devexpress/utils/lib/utils/dom';
@@ -33,6 +31,7 @@ import { FullScreenHelper } from './ui/full-screen-helper';
33
31
  import config from 'devextreme/core/config';
34
32
  import { SizeUtils } from '../common/utils/size-utils';
35
33
  import { DocumentCapability } from '../common/model/options/control';
34
+ import { getStringResources } from '../common/string-resources';
36
35
  export class ClientRichEdit {
37
36
  get clientQuickSearchPanel() {
38
37
  if (!this._clientQuickSearchPanel)
@@ -168,7 +167,7 @@ export class ClientRichEdit {
168
167
  options.spellChecker = settings.spellCheck;
169
168
  options.nonce = settings.nonce;
170
169
  options.control.allowZoom = settings.view.allowZoom ? DocumentCapability.Enabled : DocumentCapability.Disabled;
171
- this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view, this.getStringResources());
170
+ this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view, getStringResources());
172
171
  }
173
172
  initCore() {
174
173
  const documentInfo = new DocumentInfo("", false);
@@ -264,28 +263,6 @@ export class ClientRichEdit {
264
263
  initDialogManager() {
265
264
  this.dialogManager = new DialogManager(this.element, this.core);
266
265
  }
267
- getStringResources() {
268
- const sr = new StringResources();
269
- sr.headerFooter.evenPageFooter = formatMessage('XtraRichEditStringId.Caption_EvenPageFooter');
270
- sr.headerFooter.evenPageHeader = formatMessage('XtraRichEditStringId.Caption_EvenPageHeader');
271
- sr.headerFooter.firstPageFooter = formatMessage('XtraRichEditStringId.Caption_FirstPageFooter');
272
- sr.headerFooter.firstPageHeader = formatMessage('XtraRichEditStringId.Caption_FirstPageHeader');
273
- sr.headerFooter.footer = formatMessage('XtraRichEditStringId.Caption_PageFooter');
274
- sr.headerFooter.header = formatMessage('XtraRichEditStringId.Caption_PageHeader');
275
- sr.headerFooter.oddPageFooter = formatMessage('XtraRichEditStringId.Caption_OddPageFooter');
276
- sr.headerFooter.oddPageHeader = formatMessage('XtraRichEditStringId.Caption_OddPageHeader');
277
- sr.headerFooter.sameAsPrevious = formatMessage('XtraRichEditStringId.Caption_SameAsPrevious');
278
- sr.seqCaptionPrefixes.figurePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixFigure');
279
- sr.seqCaptionPrefixes.tablePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixTable');
280
- sr.seqCaptionPrefixes.equationPrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixEquation');
281
- sr.commonLabels.noTocEntriesFound = formatMessage('XtraRichEditStringId.Msg_NoTocEntriesFound');
282
- sr.commonLabels.clickToFollowHyperlink = formatMessage('XtraRichEditStringId.Msg_ClickToFollowHyperlink');
283
- sr.commonLabels.currentDocumentHyperlinkTooltip = formatMessage('XtraRichEditStringId.Caption_CurrentDocumentHyperlinkTooltip');
284
- sr.quickSearchPanel.of = formatMessage('ASPxRichEditStringId.FindReplace_Of');
285
- sr.quickSearchPanel.items = formatMessage('ASPxRichEditStringId.FindReplace_Items');
286
- sr.quickSearchPanel.noMatches = formatMessage('ASPxRichEditStringId.FindReplace_NoMatches');
287
- return sr;
288
- }
289
266
  initLosingChangesWatcher(settings) {
290
267
  this.losingChangesWatcher = new LosingChangesWatcher(settings.enabled ?
291
268
  () => this.core.getModifiedState() == IsModified.True :
@@ -2239,6 +2239,7 @@ export function loadDefaultMessages() {
2239
2239
  "AspNetCoreRichEditStringId.LinkAnnouncement": "link",
2240
2240
  "AspNetCoreRichEditStringId.OutOfLinkAnnouncement": "out of link",
2241
2241
  "AspNetCoreRichEditStringId.BlankAnnouncement": "blank",
2242
+ "AspNetCoreRichEditStringId.PageBreakAnnouncement": "page break",
2242
2243
  }
2243
2244
  });
2244
2245
  }
@@ -12,7 +12,7 @@ export declare class CanvasManager extends BatchUpdatableObject {
12
12
  private scrollIntervalID;
13
13
  private lastMousePosition;
14
14
  private canvasPosition;
15
- private doubleTapStartDate;
15
+ private doubleTapDetector;
16
16
  private pointer;
17
17
  private blockNotPointerEvents;
18
18
  private lastPointerPosition;
@@ -10,6 +10,7 @@ import { PopupUtils } from '@devexpress/utils/lib/utils/popup';
10
10
  import { RichMouseEvent } from '../event-manager';
11
11
  import { MouseEventSource } from '../mouse-handler/mouse-event-source';
12
12
  import { CursorPointer } from '../mouse-handler/mouse-handler/mouse-handler';
13
+ import { DoubleTapDetector } from './double-tap-detector';
13
14
  import { ResizeBoxListener } from './listeners/resize-box-listener';
14
15
  import { SimpleViewCanvasSizeManager } from './renderes/common/document-renderer';
15
16
  import { SizeUtils } from '../utils/size-utils';
@@ -19,6 +20,8 @@ const CSSCLASS_FOCUSED = "dxreInFocus";
19
20
  const AUTOSCROLL_AREA_SIZE = 10;
20
21
  const AUTOSCROLL_STEP = 10;
21
22
  const MSTOUCH_MOVE_SENSITIVITY = 5;
23
+ const DOUBLE_TAP_MAX_DISTANCE = 20;
24
+ const DOUBLE_TAP_MAX_INTERVAL = 600;
22
25
  export class CanvasManager extends BatchUpdatableObject {
23
26
  get sizes() { return this.viewManager.sizes; }
24
27
  get scroll() { return this.viewManager.scroll; }
@@ -27,6 +30,7 @@ export class CanvasManager extends BatchUpdatableObject {
27
30
  super();
28
31
  this.lastMousePosition = { x: -1, y: -1 };
29
32
  this.canvasPosition = { x: -1, y: -1 };
33
+ this.doubleTapDetector = new DoubleTapDetector(DOUBLE_TAP_MAX_DISTANCE, DOUBLE_TAP_MAX_INTERVAL);
30
34
  this.pointer = CursorPointer.Auto;
31
35
  this.blockNotPointerEvents = false;
32
36
  this.lastPointerPosition = { x: -1, y: -1 };
@@ -137,12 +141,12 @@ export class CanvasManager extends BatchUpdatableObject {
137
141
  onCanvasTouchStartInternal(evt) {
138
142
  this.saveMousePosition(evt);
139
143
  let richMouseEvent = new RichMouseEvent(evt, this.getLayoutPoint(evt, true), CanvasManager.getMouseEventSource(EvtUtils.getEventSource(evt)), this.scroll.lastScrollTop, this.scroll.lastScrollLeft);
140
- if (this.doubleTapStartDate && ((new Date()) - this.doubleTapStartDate) < 600) {
141
- this.doubleTapStartDate = null;
144
+ const evtX = EvtUtils.getEventX(evt);
145
+ const evtY = EvtUtils.getEventY(evt);
146
+ if (this.doubleTapDetector.isDoubleTap(evtX, evtY)) {
142
147
  this.onCanvasDoubleTap(richMouseEvent);
143
148
  }
144
149
  else {
145
- this.doubleTapStartDate = new Date();
146
150
  this.eventManager.onTouchStart(richMouseEvent);
147
151
  }
148
152
  }
@@ -0,0 +1,10 @@
1
+ export declare class DoubleTapDetector {
2
+ private readonly maxDistance;
3
+ private readonly maxInterval;
4
+ private lastTime;
5
+ private lastX;
6
+ private lastY;
7
+ constructor(maxDistance: number, maxInterval: number);
8
+ isDoubleTap(x: number, y: number): boolean;
9
+ reset(): void;
10
+ }
@@ -0,0 +1,28 @@
1
+ export class DoubleTapDetector {
2
+ constructor(maxDistance, maxInterval) {
3
+ this.maxDistance = maxDistance;
4
+ this.maxInterval = maxInterval;
5
+ this.lastTime = null;
6
+ this.lastX = -1;
7
+ this.lastY = -1;
8
+ }
9
+ isDoubleTap(x, y) {
10
+ const now = Date.now();
11
+ const result = this.lastTime !== null &&
12
+ (now - this.lastTime) < this.maxInterval &&
13
+ Math.abs(x - this.lastX) <= this.maxDistance &&
14
+ Math.abs(y - this.lastY) <= this.maxDistance;
15
+ if (result) {
16
+ this.reset();
17
+ }
18
+ else {
19
+ this.lastTime = now;
20
+ this.lastX = x;
21
+ this.lastY = y;
22
+ }
23
+ return result;
24
+ }
25
+ reset() {
26
+ this.lastTime = null;
27
+ }
28
+ }
@@ -37,6 +37,7 @@ export declare const RendererClassNames: {
37
37
  FIELD_BOX_LEVEL3: string;
38
38
  BOX_SPACE: string;
39
39
  BOX: string;
40
+ BOX_SELECTED: string;
40
41
  HIDDEN_BOX: string;
41
42
  PICTURE: string;
42
43
  START_BOOKMARK: string;
@@ -46,6 +47,7 @@ export declare const RendererClassNames: {
46
47
  SELECTION_MISSPELLED: string;
47
48
  SELECTION_SEARCH: string;
48
49
  SELECTION_ROW: string;
50
+ SELECTION_PICTURE_ROW: string;
49
51
  SELECTION_CURSOR: string;
50
52
  SELECTION_FLOATING_OBJECTS: string;
51
53
  ANCHOR: string;
@@ -37,6 +37,7 @@ export const RendererClassNames = {
37
37
  FIELD_BOX_LEVEL3: "dxreFieldBoxLevel3",
38
38
  BOX_SPACE: "dxreBoxSpace",
39
39
  BOX: "dxreBox",
40
+ BOX_SELECTED: "dxreBoxSelected",
40
41
  HIDDEN_BOX: "dxreHiddenBox",
41
42
  PICTURE: "dxrePic",
42
43
  START_BOOKMARK: "dxreStartBookmark",
@@ -46,6 +47,7 @@ export const RendererClassNames = {
46
47
  SELECTION_MISSPELLED: "dxreSelMisspelled",
47
48
  SELECTION_SEARCH: "dxreSelSearch",
48
49
  SELECTION_ROW: "dxreSelRow",
50
+ SELECTION_PICTURE_ROW: "dxreSelRowPic",
49
51
  SELECTION_CURSOR: "dxreSelCursor",
50
52
  SELECTION_FLOATING_OBJECTS: "dxreSelFloatingObjects",
51
53
  ANCHOR: "dxreAnchor",
@@ -22,6 +22,7 @@ import { CacheImageInfo as existingInfo } from '../../../model/caches/images';
22
22
  import { Shape } from '../../../model/shapes/shape';
23
23
  import { Rectangle } from '@devexpress/utils/lib/geometry/rectangle';
24
24
  import { Size } from '@devexpress/utils/lib/geometry/size';
25
+ import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
25
26
  import { CanvasManager } from '../../canvas-manager';
26
27
  import { ViewManager } from '../view-manager';
27
28
  import { IRichEditControl } from '../../../interfaces/i-rich-edit-core';
@@ -45,14 +46,20 @@ export declare class SimpleViewCanvasSizeManager implements IModelChangesListene
45
46
  }
46
47
  export declare abstract class DocumentRenderer implements IPictureRenderer {
47
48
  protected viewManager: ViewManager;
49
+ protected isForcedColorsModeActive: boolean;
50
+ private selectionSegmentBoxesCache;
51
+ protected isSelectionChangeCacheEnabled: boolean;
48
52
  private get cache();
49
53
  constructor(viewManager: ViewManager);
50
54
  onViewTypeChanged(): void;
51
55
  applyPageChange(layoutPage: LayoutPage, pageChange: PageChange): void;
56
+ updateSelectedIntervalsPageChanges(layoutPage: LayoutPage, pageIndex: number, intervals?: FixedInterval[], isMain?: boolean): void;
57
+ private addSelectedPageAreaChange;
58
+ private findIntersectingLayoutElement;
52
59
  protected applyAnchorPictureChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, ancPicChange: AnchoredPictureChange): void;
53
60
  protected applyMainPageAreaChange(pageCache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
54
61
  protected applyOtherPageAreaChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
55
- protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number): void;
62
+ protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number, pageAreaModelOffset: number): void;
56
63
  static applyChange(topLevelNode: Node, change: LayoutChangeBase, getContainer: GetSomeCanvasElementContainer, getRenderedElement: () => HTMLElement): void;
57
64
  getPageRender(layoutPageIndex: number, layoutPage: LayoutPage): HTMLElement;
58
65
  renderPage(layoutPage: LayoutPage, layoutPageIndex: number, renderInnerContent: boolean): void;
@@ -65,11 +72,17 @@ export declare abstract class DocumentRenderer implements IPictureRenderer {
65
72
  protected renderPageContent(page: LayoutPage, pageIndex: number): void;
66
73
  protected static updatePageColor(pageElement: HTMLElement, newColor: number): void;
67
74
  protected static getPageAreaClassname(area: LayoutPageArea): string;
68
- protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox, renderContent?: boolean): HTMLElement;
69
- protected renderColumn(column: LayoutColumn, level: number, _isMainPageArea: boolean): HTMLElement;
70
- renderRow(row: LayoutRow, level: number): HTMLElement;
75
+ protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox, pageStartPosition?: number): HTMLElement;
76
+ protected renderColumn(column: LayoutColumn, level: number, pageAreaModelOffset: number, _isMainPageArea: boolean): HTMLElement;
77
+ renderRow(row: LayoutRow, level: number, columnModelOffset?: number): HTMLElement;
71
78
  private boxHasNormalScriptedUnderline;
72
- protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, skipUnderlineScript?: boolean): BoxRenderResult;
79
+ protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, rowModelOffset: number, skipUnderlineScript?: boolean): BoxRenderResult;
80
+ updateForcedColorsModeState(): boolean;
81
+ private renderSingleBox;
82
+ private getSelectedIntervalsForBox;
83
+ private getSelectionSegmentBoxes;
84
+ private getOrCreateSelectionSegmentBox;
85
+ private createSelectionSegmentBox;
73
86
  private renderVerticalAlignContainer;
74
87
  private renderColorContainer;
75
88
  private renderStrikeoutContainer;
@@ -129,8 +142,8 @@ export declare class DocumentRendererPageCache {
129
142
  protected init(): void;
130
143
  }
131
144
  export declare class BoxRenderResult {
132
- html: string | DocumentFragment;
145
+ html: DocumentFragment;
133
146
  increaseRowHeight: boolean;
134
- constructor(html: string | DocumentFragment, increaseRowHeight: boolean);
147
+ constructor(html: DocumentFragment, increaseRowHeight: boolean);
135
148
  toString(): string;
136
149
  }