@one2x/medeo-rte 0.2.0 → 0.3.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/README.md +33 -5
  2. package/dist/index.js +2270 -1609
  3. package/dist/index.js.map +1 -1
  4. package/dist/style.css +32 -3
  5. package/dist/types/commands/shortcuts.d.ts +14 -0
  6. package/dist/types/commands/shortcuts.d.ts.map +1 -1
  7. package/dist/types/commands/types.d.ts +6 -0
  8. package/dist/types/commands/types.d.ts.map +1 -1
  9. package/dist/types/editor.d.ts +67 -0
  10. package/dist/types/editor.d.ts.map +1 -1
  11. package/dist/types/input/caretMotion.d.ts +23 -0
  12. package/dist/types/input/caretMotion.d.ts.map +1 -0
  13. package/dist/types/input/caretMotion.selfcheck.d.ts +2 -0
  14. package/dist/types/input/caretMotion.selfcheck.d.ts.map +1 -0
  15. package/dist/types/input/ime.d.ts +9 -0
  16. package/dist/types/input/ime.d.ts.map +1 -1
  17. package/dist/types/input/keyboard.d.ts.map +1 -1
  18. package/dist/types/layout/engine.d.ts.map +1 -1
  19. package/dist/types/layout/harness.d.ts.map +1 -1
  20. package/dist/types/layout/measure.d.ts +11 -0
  21. package/dist/types/layout/measure.d.ts.map +1 -1
  22. package/dist/types/layout/types.d.ts +8 -0
  23. package/dist/types/layout/types.d.ts.map +1 -1
  24. package/dist/types/model/blocks.d.ts.map +1 -1
  25. package/dist/types/model/types.d.ts +11 -3
  26. package/dist/types/model/types.d.ts.map +1 -1
  27. package/dist/types/operations/slice.d.ts.map +1 -1
  28. package/dist/types/operations/text.d.ts.map +1 -1
  29. package/dist/types/operations/virtualBlock.d.ts +6 -0
  30. package/dist/types/operations/virtualBlock.d.ts.map +1 -1
  31. package/dist/types/paint/canvasPainter.d.ts +27 -1
  32. package/dist/types/paint/canvasPainter.d.ts.map +1 -1
  33. package/dist/types/paint/htmlPainter.d.ts +3 -0
  34. package/dist/types/paint/htmlPainter.d.ts.map +1 -1
  35. package/dist/types/paint/types.d.ts +2 -0
  36. package/dist/types/paint/types.d.ts.map +1 -1
  37. package/dist/types/perf.d.ts +55 -0
  38. package/dist/types/perf.d.ts.map +1 -0
  39. package/package.json +2 -2
@@ -1,5 +1,11 @@
1
1
  import { CaretPos, DocLayout, SelRect } from '../layout/types';
2
2
  import { PaintBackend } from './types';
3
+ /**
4
+ * 画布左右各比文档宽出这么多:mark 等块的 paddingX 外扩在行首行尾会画到内容区外,
5
+ * 画布若恰好等宽就会被裁掉。画布整体左移 GUTTER 并平移绘制坐标,文字位置不变;
6
+ * 配套的 style.css 给 .mini-page-wrap 左右各留同样宽度的可视区(负 margin 抵消)。
7
+ */
8
+ export declare const CANVAS_GUTTER = 5;
3
9
  export declare class CanvasPainter implements PaintBackend {
4
10
  private host;
5
11
  private surface;
@@ -16,14 +22,34 @@ export declare class CanvasPainter implements PaintBackend {
16
22
  private embeds;
17
23
  private embedCache;
18
24
  private hasContent;
25
+ private hoverId;
26
+ /** 画布窗口在文档坐标里的顶部与高度(CSS px) */
27
+ private winTop;
28
+ private winH;
29
+ private onScroll;
30
+ /** 上次重画用的像素密度(dpr × 缩放),变了就得整窗重画 */
31
+ private lastScale;
32
+ private zoomRaf;
33
+ private zoomTimer;
34
+ private lastZoomPaint;
35
+ /** 缩放手势事件很密:节流到约 100ms 一次,手势停下后再精确补一次 */
36
+ private onVisualViewport;
19
37
  mount(host: HTMLElement): void;
38
+ /** 画布像素密度:dpr × 双指缩放倍数(封顶) */
39
+ private pixelScale;
20
40
  getSurface(): HTMLElement;
21
41
  paintDoc(layout: DocLayout): void;
42
+ setHoverBlock(id: string | null): void;
22
43
  paintSelection(rects: SelRect[]): void;
23
44
  paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
24
45
  destroy(): void;
46
+ /** 可视区在文档坐标里的 [top, bottom]。找不到容器时就当整篇可见。 */
47
+ private visibleRange;
48
+ /** 按当前可视区决定画布窗口位置。返回是否挪了窗口。 */
49
+ private placeWindow;
50
+ /** 滚动/窗口尺寸变化:可视区离开画布窗口时挪窗口并整体重画 */
51
+ private followViewport;
25
52
  private resize;
26
- /** 只重画脏区带:clip 到那一条,擦白,再画与之相交的内容。 */
27
53
  private redrawContent;
28
54
  private redrawChrome;
29
55
  private fillSelectionRect;
@@ -1 +1 @@
1
- {"version":3,"file":"canvasPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/canvasPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,GAAG,CAAyC;IACpD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,UAAU,CAAS;IAE3B,KAAK,CAAC,IAAI,EAAE,WAAW;IAiBvB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAc1B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAK/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAO5E,OAAO;IAgBP,OAAO,CAAC,MAAM;IAqBd,qCAAqC;IACrC,OAAO,CAAC,aAAa;IA8DrB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,SAAS;IAmCjB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,OAAO;CAYhB"}
1
+ {"version":3,"file":"canvasPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/canvasPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAY,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,aAAa,IAAI,CAAC;AAc/B,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,GAAG,CAAyC;IACpD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAuB;IACtC,+BAA+B;IAC/B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,oCAAoC;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,yCAAyC;IACzC,OAAO,CAAC,gBAAgB,CAYtB;IAEF,KAAK,CAAC,IAAI,EAAE,WAAW;IAuBvB,8BAA8B;IAC9B,OAAO,CAAC,UAAU;IAMlB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAc1B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAqB/B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAK/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAO5E,OAAO;IAuBP,6CAA6C;IAC7C,OAAO,CAAC,YAAY;IAcpB,+BAA+B;IAC/B,OAAO,CAAC,WAAW;IAanB,mCAAmC;IACnC,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,MAAM;IAgCd,OAAO,CAAC,aAAa;IA2DrB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,SAAS;IAmCjB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,OAAO;CAYhB"}
@@ -9,9 +9,12 @@ export declare class HtmlPainter implements PaintBackend {
9
9
  private trails;
10
10
  private embeds;
11
11
  private embedCache;
12
+ private hoverId;
12
13
  mount(host: HTMLElement): void;
13
14
  getSurface(): HTMLElement;
14
15
  paintDoc(layout: DocLayout): void;
16
+ setHoverBlock(id: string | null): void;
17
+ private applyHover;
15
18
  paintSelection(rects: SelRect[]): void;
16
19
  paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
17
20
  destroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"htmlPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/htmlPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAW,OAAO,EAA+B,MAAM,iBAAiB,CAAC;AAErG,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IAEpD,KAAK,CAAC,IAAI,EAAE,WAAW;IAuBvB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAiC1B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAY/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAM5E,OAAO;CAWR"}
1
+ {"version":3,"file":"htmlPainter.d.ts","sourceRoot":"","sources":["../../../src/paint/htmlPainter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAW,OAAO,EAA+B,MAAM,iBAAiB,CAAC;AAErG,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,OAAO,CAAuB;IAEtC,KAAK,CAAC,IAAI,EAAE,WAAW;IAuBvB,UAAU,IAAI,WAAW;IAKzB,QAAQ,CAAC,MAAM,EAAE,SAAS;IAkC1B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM/B,OAAO,CAAC,UAAU;IAQlB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;IAY/B,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,QAAQ,EAAO;IAM5E,OAAO;CAWR"}
@@ -24,6 +24,8 @@ export interface PaintBackend {
24
24
  paintDoc(layout: DocLayout): void;
25
25
  paintSelection(rects: SelRect[]): void;
26
26
  paintCaret(caret: CaretPos | null, visible: boolean, trails?: CaretPos[]): void;
27
+ /** 悬停中的 mark 块 id(null 取消);只重画受影响的块。可选实现。 */
28
+ setHoverBlock?(id: string | null): void;
27
29
  getSurface(): HTMLElement;
28
30
  destroy(): void;
29
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/paint/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChF,UAAU,IAAI,WAAW,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,WAAW,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/paint/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChF,6CAA6C;IAC7C,aAAa,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACxC,UAAU,IAAI,WAAW,CAAC;IAC1B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,WAAW,CAAC;IACvB,KAAK,EAAE,WAAW,CAAC;CACpB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 开发用性能探针。默认不开,开了之后才给 Editor 实例打补丁,不开时零开销。
3
+ *
4
+ * editor.perf.start() // 开始采样,同时开始监测帧间隔
5
+ * ...连续打字 / 按住方向键 / 中文输入法连续上屏...
6
+ * editor.perf.report() // console.table 输出并返回数据;editor.perf.stop() 停止并还原
7
+ *
8
+ * 口径:
9
+ * - 各阶段耗时是 JS 同步耗时(ms),不含浏览器合成、光栅化。
10
+ * - `→下一帧` 是从处理函数开始到下一次 requestAnimationFrame 回调开始的时间,
11
+ * 近似“输入到上屏”的延迟;真正画完还要再加一帧里的合成时间。
12
+ * - 表格里的 fps 列 = 1000 / 该项耗时,表示“如果每一帧都只做这件事,最高能跑多少帧”,上限显示 999;
13
+ * 只有 `→下一帧` 行和底部的“帧”行接近真实体感帧率。
14
+ * - 帧间隔取 requestAnimationFrame 相邻回调的间隔。注意光标闪烁本身每帧都在跑 rAF,
15
+ * 所以空闲时也会有帧;有意义的是“操作期间”掉不掉帧。
16
+ */
17
+ export interface PerfStat {
18
+ count: number;
19
+ avg: number;
20
+ p95: number;
21
+ max: number;
22
+ }
23
+ export declare class PerfProbe {
24
+ private target;
25
+ private getPainter;
26
+ private painter;
27
+ private originals;
28
+ private painterOriginal;
29
+ private samples;
30
+ private frames;
31
+ private raf;
32
+ private lastFrame;
33
+ private running;
34
+ constructor(editor: object, getPainter: () => object);
35
+ get active(): boolean;
36
+ start(): void;
37
+ stop(): void;
38
+ reset(): void;
39
+ /** 汇总并输出到控制台,返回原始统计。 */
40
+ report(): {
41
+ rows: Record<string, PerfStat>;
42
+ frames: {
43
+ 样本帧数: number;
44
+ 平均帧率: number;
45
+ 帧间隔p95_ms: number;
46
+ 最长帧_ms: number;
47
+ '\u8D85\u8FC716.7ms\u7684\u5E27': number;
48
+ 超过33ms的帧: number;
49
+ };
50
+ };
51
+ private record;
52
+ private time;
53
+ private patch;
54
+ }
55
+ //# sourceMappingURL=perf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAqBD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM;IAKpD,IAAI,MAAM,YAET;IAED,KAAK;IAsBL,IAAI;IAkBJ,KAAK;IAKL,wBAAwB;IACxB,MAAM;;;;;;;;;;;IAuCN,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,KAAK;CAkBd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@one2x/medeo-rte",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "自绘文档渲染引擎:字符流模型,排版输出纯几何,绘制后端可替换(HTML / Canvas)",
6
6
  "repository": {
@@ -39,7 +39,7 @@
39
39
  "build": "tsc --noEmit && vite build",
40
40
  "build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.build.json",
41
41
  "preview": "vite preview",
42
- "selfcheck": "npx --yes tsx src/operations/selfcheck.ts && npx --yes tsx src/mutations/selfcheck.ts && npx --yes tsx src/edits/selfcheck.ts && npx --yes tsx src/commands/selfcheck.ts && npx --yes tsx src/layout/selfcheck.ts",
42
+ "selfcheck": "npx --yes tsx src/operations/selfcheck.ts && npx --yes tsx src/mutations/selfcheck.ts && npx --yes tsx src/edits/selfcheck.ts && npx --yes tsx src/commands/selfcheck.ts && npx --yes tsx src/input/caretMotion.selfcheck.ts && npx --yes tsx src/layout/selfcheck.ts",
43
43
  "prepare": "npm run build:lib"
44
44
  },
45
45
  "peerDependencies": {