@textbus/platform-browser 3.0.0-alpha.48 → 3.0.0-alpha.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { Observable } from '@tanbo/stream';
2
2
  import { Injector } from '@tanbo/di';
3
- import { Commander, Controller, Keyboard, Scheduler, Selection } from '@textbus/core';
3
+ import { Commander, Controller, Keyboard, Scheduler, Selection, Slot } from '@textbus/core';
4
4
  import { Parser } from '../dom-support/parser';
5
5
  import { Caret, CaretPosition, Input, Scroller } from './types';
6
6
  interface CaretStyle {
@@ -8,12 +8,18 @@ interface CaretStyle {
8
8
  lineHeight: string;
9
9
  fontSize: string;
10
10
  }
11
+ interface CompositionState {
12
+ slot: Slot;
13
+ index: number;
14
+ data: string;
15
+ }
11
16
  declare class ExperimentalCaret implements Caret {
12
17
  private scheduler;
13
18
  private editorMask;
14
19
  onPositionChange: Observable<CaretPosition | null>;
15
20
  onStyleChange: Observable<CaretStyle>;
16
21
  elementRef: HTMLElement;
22
+ compositionState: CompositionState | null;
17
23
  get rect(): DOMRect;
18
24
  private timer;
19
25
  private caret;
@@ -27,6 +33,7 @@ declare class ExperimentalCaret implements Caret {
27
33
  private styleChangeEvent;
28
34
  private oldRange;
29
35
  private isFixed;
36
+ private compositionElement;
30
37
  constructor(scheduler: Scheduler, editorMask: HTMLElement);
31
38
  refresh(isFixedCaret?: boolean): void;
32
39
  show(range: Range, restart: boolean): void;
@@ -51,6 +58,9 @@ export declare class MagicInput extends Input {
51
58
  caret: ExperimentalCaret;
52
59
  set disabled(b: boolean);
53
60
  get disabled(): boolean;
61
+ private isSafari;
62
+ private isMac;
63
+ private isWindows;
54
64
  private _disabled;
55
65
  private container;
56
66
  private subscription;
@@ -58,9 +68,6 @@ export declare class MagicInput extends Input {
58
68
  private textarea;
59
69
  private isFocus;
60
70
  private nativeFocus;
61
- private isSafari;
62
- private isMac;
63
- private isWindows;
64
71
  private isSougouPinYin;
65
72
  constructor(parser: Parser, keyboard: Keyboard, commander: Commander, selection: Selection, controller: Controller, scheduler: Scheduler, injector: Injector);
66
73
  focus(range: Range, restart: boolean): void;
@@ -1361,6 +1361,7 @@ class ExperimentalCaret {
1361
1361
  constructor(scheduler, editorMask) {
1362
1362
  this.scheduler = scheduler;
1363
1363
  this.editorMask = editorMask;
1364
+ this.compositionState = null;
1364
1365
  this.timer = null;
1365
1366
  this.oldPosition = null;
1366
1367
  this._display = true;
@@ -1370,6 +1371,11 @@ class ExperimentalCaret {
1370
1371
  this.styleChangeEvent = new Subject();
1371
1372
  this.oldRange = null;
1372
1373
  this.isFixed = false;
1374
+ this.compositionElement = createElement('span', {
1375
+ styles: {
1376
+ textDecoration: 'underline'
1377
+ }
1378
+ });
1373
1379
  this.onPositionChange = this.positionChangeEvent.pipe(distinctUntilChanged());
1374
1380
  this.onStyleChange = this.styleChangeEvent.asObservable();
1375
1381
  this.elementRef = createElement('div', {
@@ -1502,6 +1508,14 @@ class ExperimentalCaret {
1502
1508
  this.positionChangeEvent.next(null);
1503
1509
  return;
1504
1510
  }
1511
+ if (this.compositionState) {
1512
+ const compositionElement = this.compositionElement;
1513
+ compositionElement.innerText = this.compositionState.data;
1514
+ nativeRange = nativeRange.cloneRange();
1515
+ nativeRange.insertNode(compositionElement);
1516
+ nativeRange.selectNodeContents(compositionElement);
1517
+ nativeRange.collapse();
1518
+ }
1505
1519
  const rect = getLayoutRectByRange(nativeRange);
1506
1520
  const { fontSize, lineHeight, color } = getComputedStyle(node);
1507
1521
  let height;
@@ -1571,15 +1585,15 @@ let MagicInput = class MagicInput extends Input {
1571
1585
  this.injector = injector;
1572
1586
  this.composition = false;
1573
1587
  this.caret = new ExperimentalCaret(this.scheduler, this.injector.get(VIEW_MASK));
1588
+ this.isSafari = isSafari();
1589
+ this.isMac = isMac();
1590
+ this.isWindows = isWindows();
1574
1591
  this._disabled = false;
1575
1592
  this.container = this.createEditableFrame();
1576
1593
  this.subscription = new Subscription();
1577
1594
  this.textarea = null;
1578
1595
  this.isFocus = false;
1579
1596
  this.nativeFocus = false;
1580
- this.isSafari = isSafari();
1581
- this.isMac = isMac();
1582
- this.isWindows = isWindows();
1583
1597
  this.isSougouPinYin = false; // 有 bug 版本搜狗拼音
1584
1598
  this.onReady = new Promise(resolve => {
1585
1599
  this.subscription.add(fromEvent(this.container, 'load').subscribe(() => {
@@ -1753,6 +1767,19 @@ let MagicInput = class MagicInput extends Input {
1753
1767
  }));
1754
1768
  }
1755
1769
  handleInput(textarea) {
1770
+ let startIndex = 0;
1771
+ this.subscription.add(fromEvent(textarea, 'compositionstart').subscribe(() => {
1772
+ startIndex = this.selection.startOffset;
1773
+ }), fromEvent(textarea, 'compositionupdate').subscribe(ev => {
1774
+ this.caret.compositionState = {
1775
+ slot: this.selection.startSlot,
1776
+ index: startIndex,
1777
+ data: ev.data
1778
+ };
1779
+ this.caret.refresh(true);
1780
+ }), fromEvent(textarea, 'compositionend').subscribe(() => {
1781
+ this.caret.compositionState = null;
1782
+ }));
1756
1783
  this.subscription.add(merge(fromEvent(textarea, 'beforeinput').pipe(filter(ev => {
1757
1784
  ev.preventDefault();
1758
1785
  if (this.isSafari) {
@@ -1786,7 +1813,7 @@ let MagicInput = class MagicInput extends Input {
1786
1813
  display: 'block',
1787
1814
  height: '100%',
1788
1815
  position: 'relative',
1789
- top: this.isWindows ? '6px' : '0'
1816
+ top: this.isWindows ? '3px' : '0'
1790
1817
  }
1791
1818
  });
1792
1819
  }
@@ -1908,7 +1935,7 @@ let NativeInput = class NativeInput extends Input {
1908
1935
  set disabled(b) {
1909
1936
  this._disabled = b;
1910
1937
  if (b && !this.controller.readonly) {
1911
- this.documentView.contentEditable = b ? 'true' : 'false';
1938
+ this.documentView.contentEditable = b ? 'false' : 'true';
1912
1939
  }
1913
1940
  }
1914
1941
  get disabled() {
@@ -2609,7 +2636,7 @@ class Viewer extends Starter {
2609
2636
  });
2610
2637
  const styleEl = document.createElement('style');
2611
2638
  docStyles.push(...(options.styleSheets || []));
2612
- editModeStyles.push(`#${this.id} *::selection{background-color: rgba(18, 150, 219, .2); color:inherit}`, ...(options.editingStyleSheets || []));
2639
+ editModeStyles.push(`#${this.id} *::selection{background-color: rgba(18, 150, 219, .4); color:inherit}`, ...(options.editingStyleSheets || []));
2613
2640
  this.styleSheet = Viewer.cssMin(docStyles.join(''));
2614
2641
  styleEl.innerHTML = this.styleSheet + Viewer.cssMin(editModeStyles.join(''));
2615
2642
  this.resourceNodes.push(styleEl);
package/bundles/index.js CHANGED
@@ -1363,6 +1363,7 @@ class ExperimentalCaret {
1363
1363
  constructor(scheduler, editorMask) {
1364
1364
  this.scheduler = scheduler;
1365
1365
  this.editorMask = editorMask;
1366
+ this.compositionState = null;
1366
1367
  this.timer = null;
1367
1368
  this.oldPosition = null;
1368
1369
  this._display = true;
@@ -1372,6 +1373,11 @@ class ExperimentalCaret {
1372
1373
  this.styleChangeEvent = new stream.Subject();
1373
1374
  this.oldRange = null;
1374
1375
  this.isFixed = false;
1376
+ this.compositionElement = createElement('span', {
1377
+ styles: {
1378
+ textDecoration: 'underline'
1379
+ }
1380
+ });
1375
1381
  this.onPositionChange = this.positionChangeEvent.pipe(stream.distinctUntilChanged());
1376
1382
  this.onStyleChange = this.styleChangeEvent.asObservable();
1377
1383
  this.elementRef = createElement('div', {
@@ -1504,6 +1510,14 @@ class ExperimentalCaret {
1504
1510
  this.positionChangeEvent.next(null);
1505
1511
  return;
1506
1512
  }
1513
+ if (this.compositionState) {
1514
+ const compositionElement = this.compositionElement;
1515
+ compositionElement.innerText = this.compositionState.data;
1516
+ nativeRange = nativeRange.cloneRange();
1517
+ nativeRange.insertNode(compositionElement);
1518
+ nativeRange.selectNodeContents(compositionElement);
1519
+ nativeRange.collapse();
1520
+ }
1507
1521
  const rect = getLayoutRectByRange(nativeRange);
1508
1522
  const { fontSize, lineHeight, color } = getComputedStyle(node);
1509
1523
  let height;
@@ -1573,15 +1587,15 @@ exports.MagicInput = class MagicInput extends Input {
1573
1587
  this.injector = injector;
1574
1588
  this.composition = false;
1575
1589
  this.caret = new ExperimentalCaret(this.scheduler, this.injector.get(VIEW_MASK));
1590
+ this.isSafari = isSafari();
1591
+ this.isMac = isMac();
1592
+ this.isWindows = isWindows();
1576
1593
  this._disabled = false;
1577
1594
  this.container = this.createEditableFrame();
1578
1595
  this.subscription = new stream.Subscription();
1579
1596
  this.textarea = null;
1580
1597
  this.isFocus = false;
1581
1598
  this.nativeFocus = false;
1582
- this.isSafari = isSafari();
1583
- this.isMac = isMac();
1584
- this.isWindows = isWindows();
1585
1599
  this.isSougouPinYin = false; // 有 bug 版本搜狗拼音
1586
1600
  this.onReady = new Promise(resolve => {
1587
1601
  this.subscription.add(stream.fromEvent(this.container, 'load').subscribe(() => {
@@ -1755,6 +1769,19 @@ exports.MagicInput = class MagicInput extends Input {
1755
1769
  }));
1756
1770
  }
1757
1771
  handleInput(textarea) {
1772
+ let startIndex = 0;
1773
+ this.subscription.add(stream.fromEvent(textarea, 'compositionstart').subscribe(() => {
1774
+ startIndex = this.selection.startOffset;
1775
+ }), stream.fromEvent(textarea, 'compositionupdate').subscribe(ev => {
1776
+ this.caret.compositionState = {
1777
+ slot: this.selection.startSlot,
1778
+ index: startIndex,
1779
+ data: ev.data
1780
+ };
1781
+ this.caret.refresh(true);
1782
+ }), stream.fromEvent(textarea, 'compositionend').subscribe(() => {
1783
+ this.caret.compositionState = null;
1784
+ }));
1758
1785
  this.subscription.add(stream.merge(stream.fromEvent(textarea, 'beforeinput').pipe(stream.filter(ev => {
1759
1786
  ev.preventDefault();
1760
1787
  if (this.isSafari) {
@@ -1788,7 +1815,7 @@ exports.MagicInput = class MagicInput extends Input {
1788
1815
  display: 'block',
1789
1816
  height: '100%',
1790
1817
  position: 'relative',
1791
- top: this.isWindows ? '6px' : '0'
1818
+ top: this.isWindows ? '3px' : '0'
1792
1819
  }
1793
1820
  });
1794
1821
  }
@@ -1910,7 +1937,7 @@ exports.NativeInput = class NativeInput extends Input {
1910
1937
  set disabled(b) {
1911
1938
  this._disabled = b;
1912
1939
  if (b && !this.controller.readonly) {
1913
- this.documentView.contentEditable = b ? 'true' : 'false';
1940
+ this.documentView.contentEditable = b ? 'false' : 'true';
1914
1941
  }
1915
1942
  }
1916
1943
  get disabled() {
@@ -2611,7 +2638,7 @@ class Viewer extends core.Starter {
2611
2638
  });
2612
2639
  const styleEl = document.createElement('style');
2613
2640
  docStyles.push(...(options.styleSheets || []));
2614
- editModeStyles.push(`#${this.id} *::selection{background-color: rgba(18, 150, 219, .2); color:inherit}`, ...(options.editingStyleSheets || []));
2641
+ editModeStyles.push(`#${this.id} *::selection{background-color: rgba(18, 150, 219, .4); color:inherit}`, ...(options.editingStyleSheets || []));
2615
2642
  this.styleSheet = Viewer.cssMin(docStyles.join(''));
2616
2643
  styleEl.innerHTML = this.styleSheet + Viewer.cssMin(editModeStyles.join(''));
2617
2644
  this.resourceNodes.push(styleEl);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textbus/platform-browser",
3
- "version": "3.0.0-alpha.48",
3
+ "version": "3.0.0-alpha.50",
4
4
  "description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
5
5
  "main": "./bundles/index.js",
6
6
  "module": "./bundles/index.esm.js",
@@ -27,7 +27,7 @@
27
27
  "dependencies": {
28
28
  "@tanbo/di": "^1.1.4",
29
29
  "@tanbo/stream": "^1.1.9",
30
- "@textbus/core": "^3.0.0-alpha.48",
30
+ "@textbus/core": "^3.0.0-alpha.50",
31
31
  "reflect-metadata": "^0.1.13"
32
32
  },
33
33
  "devDependencies": {
@@ -48,5 +48,5 @@
48
48
  "bugs": {
49
49
  "url": "https://github.com/textbus/textbus.git/issues"
50
50
  },
51
- "gitHead": "8108b90e79ef7cac2ef80a153f1aff8695e6f4ad"
51
+ "gitHead": "ad396a0f17fc18d1eaddd2532f223c1252cf5d6f"
52
52
  }