@one2x/medeo-rte 2.1.0 → 2.2.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 (42) hide show
  1. package/dist/index.js +5181 -4875
  2. package/dist/index.js.map +1 -1
  3. package/dist/types/editor/caretBlink.d.ts +43 -0
  4. package/dist/types/editor/caretBlink.d.ts.map +1 -0
  5. package/dist/types/editor/caretBlink.selfcheck.d.ts +2 -0
  6. package/dist/types/editor/caretBlink.selfcheck.d.ts.map +1 -0
  7. package/dist/types/editor/composition.d.ts +36 -0
  8. package/dist/types/editor/composition.d.ts.map +1 -0
  9. package/dist/types/editor/events.d.ts +61 -0
  10. package/dist/types/editor/events.d.ts.map +1 -0
  11. package/dist/types/editor/markNav.d.ts +121 -0
  12. package/dist/types/editor/markNav.d.ts.map +1 -0
  13. package/dist/types/editor/markNav.selfcheck.d.ts +2 -0
  14. package/dist/types/editor/markNav.selfcheck.d.ts.map +1 -0
  15. package/dist/types/editor/overlay.d.ts +91 -0
  16. package/dist/types/editor/overlay.d.ts.map +1 -0
  17. package/dist/types/editor/overlay.selfcheck.d.ts +2 -0
  18. package/dist/types/editor/overlay.selfcheck.d.ts.map +1 -0
  19. package/dist/types/editor/overlayDom.d.ts +59 -0
  20. package/dist/types/editor/overlayDom.d.ts.map +1 -0
  21. package/dist/types/editor/pointer.d.ts +114 -0
  22. package/dist/types/editor/pointer.d.ts.map +1 -0
  23. package/dist/types/editor/pointer.selfcheck.d.ts +2 -0
  24. package/dist/types/editor/pointer.selfcheck.d.ts.map +1 -0
  25. package/dist/types/editor/refEditing.d.ts +50 -0
  26. package/dist/types/editor/refEditing.d.ts.map +1 -0
  27. package/dist/types/editor/refEditing.selfcheck.d.ts +2 -0
  28. package/dist/types/editor/refEditing.selfcheck.d.ts.map +1 -0
  29. package/dist/types/editor/session.d.ts +69 -0
  30. package/dist/types/editor/session.d.ts.map +1 -0
  31. package/dist/types/editor/skinState.d.ts +57 -0
  32. package/dist/types/editor/skinState.d.ts.map +1 -0
  33. package/dist/types/editor/skinState.selfcheck.d.ts +2 -0
  34. package/dist/types/editor/skinState.selfcheck.d.ts.map +1 -0
  35. package/dist/types/editor.d.ts +31 -156
  36. package/dist/types/editor.d.ts.map +1 -1
  37. package/dist/types/index.d.ts +1 -1
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/types/model/document.d.ts +16 -0
  40. package/dist/types/model/document.d.ts.map +1 -1
  41. package/dist/types/mutations/apply.d.ts.map +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 光标闪烁和残影。
3
+ *
4
+ * 光标画在哪由装饰几何(overlay.ts)在状态变化时算一次,交给这里的 `update`。
5
+ * 闪烁循环每帧只按时间算透明度、重画光标,不再重算位置、样式和输入法靶子。
6
+ *
7
+ * - HTML 实心光标靠 CSS 动画闪,不起 rAF(每帧写 opacity 会把动画掐掉)。
8
+ * - Canvas 实心光标按墙钟闪,位置一变从亮重新开始,和原生光标一致。
9
+ * - 彩虹光标按余弦渐变透明度。
10
+ */
11
+ import type { CaretPos } from '../layout/types';
12
+ export interface BlinkMode {
13
+ /** 彩虹光标 */
14
+ rainbow: boolean;
15
+ /** Canvas 绘制后端 */
16
+ canvas: boolean;
17
+ /** 画光标残影 */
18
+ trail: boolean;
19
+ }
20
+ export type PaintCaret = (caret: CaretPos | null, visible: boolean, trails: CaretPos[]) => void;
21
+ export declare class CaretBlinker {
22
+ private readonly paint;
23
+ private readonly mode;
24
+ private readonly now;
25
+ private caret;
26
+ private visible;
27
+ private epoch;
28
+ private posKey;
29
+ private raf;
30
+ private trails;
31
+ private lastKey;
32
+ constructor(paint: PaintCaret, mode: () => BlinkMode, now?: () => number);
33
+ /** 光标位置或可见性变了:记下来并立即画一次,残影在位置变化时追加 */
34
+ update(caret: CaretPos, visible: boolean): void;
35
+ /** 从亮开始重新闪。需要逐帧闪的模式起一个 rAF 循环 */
36
+ restart(): void;
37
+ /** 停掉闪烁循环 */
38
+ stop(): void;
39
+ /** 此刻的透明度。HTML 实心光标返回 undefined,交给 CSS */
40
+ opacityAt(caret: CaretPos): number | undefined;
41
+ private draw;
42
+ }
43
+ //# sourceMappingURL=caretBlink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caretBlink.d.ts","sourceRoot":"","sources":["../../../src/editor/caretBlink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;AAKhG,qBAAa,YAAY;IAUrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXtB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAM;gBAGF,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,SAAS,EACrB,GAAG,GAAE,MAAM,MAAgC;IAG9D,sCAAsC;IACtC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO;IAcxC,iCAAiC;IACjC,OAAO;IAaP,aAAa;IACb,IAAI;IAKJ,0CAA0C;IAC1C,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;IAc9C,OAAO,CAAC,IAAI;CAQb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=caretBlink.selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caretBlink.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/caretBlink.selfcheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import type { CaretAffinity, OperationRun } from '../operations';
2
+ export declare class Composition {
3
+ /** 当前组合串 */
4
+ text: string;
5
+ /** 组合串镜像插入模型的起点;null 表示当前没有进行中的组合 */
6
+ anchor: number | null;
7
+ /** 当前已镜像插入模型的组合串长度,用于下次幂等替换时删旧 */
8
+ len: number;
9
+ /** 组合开始时光标在 mark 边界上贴哪一侧,整段组合沿用 */
10
+ affinity: CaretAffinity;
11
+ /**
12
+ * 最近一次把组合串插进文档的操作记录。确认时字已经在文档里,用它补进撤销栈,
13
+ * 不再删掉重插。只含插入,不含更早的临时串。
14
+ */
15
+ insert: OperationRun | null;
16
+ /** 组合刚落成正式编辑,紧接着的 insertText 是同一次确认的回声,跳过 */
17
+ commitText: string | null;
18
+ /** 有组合串镜像在文档里 */
19
+ get active(): boolean;
20
+ /** 组合开始:记下锚点和亲和 */
21
+ begin(anchor: number, affinity: CaretAffinity): void;
22
+ /** 镜像已经撤掉或落定:清掉组合串的记账。回声标记不动 */
23
+ clearMirror(): void;
24
+ /** 换文档时整体清空 */
25
+ reset(): void;
26
+ /**
27
+ * 确认时能不能就地落定:镜像的就是确认的这串字、文档里那一段还是它、也不需要
28
+ * 走 Markdown 转换。能的话返回那次插入的操作记录,调用方把它补进撤销栈。
29
+ */
30
+ settleableRun(text: string, docTextAt: (start: number, end: number) => string): OperationRun | null;
31
+ /** 就地落定后记一笔,好认出紧跟着来的回声 */
32
+ markCommitted(text: string): void;
33
+ /** 这次 insertText 是不是刚落定那串字的回声。只认一次 */
34
+ consumeEcho(text: string): boolean;
35
+ }
36
+ //# sourceMappingURL=composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../src/editor/composition.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjE,qBAAa,WAAW;IACtB,YAAY;IACZ,IAAI,SAAM;IACV,qCAAqC;IACrC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,kCAAkC;IAClC,GAAG,SAAK;IACR,mCAAmC;IACnC,QAAQ,EAAE,aAAa,CAAc;IACrC;;;OAGG;IACH,MAAM,EAAE,YAAY,GAAG,IAAI,CAAQ;IACnC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,iBAAiB;IACjB,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,mBAAmB;IACnB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAO7C,gCAAgC;IAChC,WAAW;IAOX,eAAe;IACf,KAAK;IAKL;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,YAAY,GAAG,IAAI;IASnG,0BAA0B;IAC1B,aAAa,CAAC,IAAI,EAAE,MAAM;IAK1B,sCAAsC;IACtC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAMnC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 编辑器对外事件:订阅、静默期合并、派发。
3
+ *
4
+ * 除 `markclick` 外都不是同步调用:同一类事件在静默期内只留最后一次,
5
+ * 停止输入 {@link CALLBACK_QUIET_MS} 毫秒后一起送出。监听里读到的是送出当时的文档。
6
+ * 这里不认识编辑器,只管排队和送达。
7
+ */
8
+ export interface MarkEvent {
9
+ id: string;
10
+ }
11
+ export interface MarkSelectEvent {
12
+ id: string | null;
13
+ }
14
+ /**
15
+ * - `change`:文档内容变化
16
+ * - `selectionchange`:选区或光标移动
17
+ * - `statechange`:{@link EditorState} 任一字段可能已变,用于同步工具栏
18
+ * - `layoutchange`:重新排版完成,可从 {@link Editor.getLayout} 取新几何
19
+ * - `markclick`:点击某个 mark,参数是块 id。锁定中不发
20
+ * - `markenter` / `markleave`:光标进入或离开 mark(含空 mark 和内侧边界)
21
+ * - `markselect`:方向键整段选中的 mark 变了。光标只是停在里面不算。`id` 为 `null` 表示没有这块选中
22
+ * - `slotselect`:光标落到芯片上或离开。芯片比 mark 更靠上
23
+ */
24
+ export type EditorEventMap = {
25
+ change: void;
26
+ selectionchange: void;
27
+ statechange: void;
28
+ layoutchange: void;
29
+ markclick: MarkEvent;
30
+ markenter: MarkEvent;
31
+ markleave: MarkEvent;
32
+ /** 光标落到最上层 mark 时发出;离开所有 mark,或改落到芯片上时 `id` 为 `null` */
33
+ markselect: MarkSelectEvent;
34
+ /** 光标落到芯片上时发出;离开时 `id` 为 `null` */
35
+ slotselect: MarkSelectEvent;
36
+ };
37
+ export type EditorEvent = keyof EditorEventMap;
38
+ export type EventArgs<K extends EditorEvent> = EditorEventMap[K] extends void ? [] : [EditorEventMap[K]];
39
+ export type EventHandler<K extends EditorEvent> = EditorEventMap[K] extends void ? () => void : (payload: EditorEventMap[K]) => void;
40
+ /** 停手这么久,才把积压的 change / 选区 / 排版事件发给宿主。 */
41
+ export declare const CALLBACK_QUIET_MS = 500;
42
+ export declare class EditorEventBus {
43
+ private readonly onDelivered;
44
+ /** 静默期里同一类无参事件只保留一条,顺序按第一次出现。 */
45
+ private pendingVoid;
46
+ /** 带 id 的进入/离开。选中态只留最新的一条。 */
47
+ private pendingMarks;
48
+ private timer;
49
+ private destroyed;
50
+ private listeners;
51
+ /** @param onDelivered 每次送达后回报监听耗时(毫秒),给性能面板记账。 */
52
+ constructor(onDelivered?: (ms: number) => void);
53
+ on<K extends EditorEvent>(event: K, handler: EventHandler<K>): () => void;
54
+ emit<K extends EditorEvent>(event: K, ...args: EventArgs<K>): void;
55
+ /** 卸载:丢掉积压,之后什么都不再送。 */
56
+ destroy(): void;
57
+ /** 停手后把积压事件按出现顺序交给监听。监听里再发的事件重新计时,不插进这一批。 */
58
+ private flush;
59
+ private deliver;
60
+ }
61
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/editor/events.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,IAAI,CAAC;IACb,eAAe,EAAE,IAAI,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,wDAAwD;IACxD,UAAU,EAAE,eAAe,CAAC;IAC5B,mCAAmC;IACnC,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzG,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS,IAAI,GAC5E,MAAM,IAAI,GACV,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAKzC,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,qBAAa,cAAc;IAoBb,OAAO,CAAC,QAAQ,CAAC,WAAW;IAnBxC,iCAAiC;IACjC,OAAO,CAAC,WAAW,CAAqB;IACxC,8BAA8B;IAC9B,OAAO,CAAC,YAAY,CAAkD;IACtE,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAUf;IAEF,kDAAkD;gBACrB,WAAW,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAe;IAEzE,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKzE,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAqB3D,wBAAwB;IACxB,OAAO;IAQP,6CAA6C;IAC7C,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * mark / 芯片的光标导航:纯函数。
3
+ *
4
+ * 只读文档、光标会话和「哪些 mark 正在生成中被锁定」,不碰 DOM、不读排版几何。
5
+ * 所以 mark 交互的规则(撞上先整段选中、button 不进内侧、重叠时选哪一块……)
6
+ * 可以在 Node 里直接断言,见 markNav.selfcheck.ts。规则口径见 docs/virtual-blocks.md「交互」。
7
+ *
8
+ * 查询函数回答「此刻是什么情况」,转换函数返回 {@link NavMove}:光标该落到哪、
9
+ * 要不要进入整段选中态。真正改会话、重画、滚动由门面做。
10
+ *
11
+ * 上下键要按目标列找行,依赖排版,仍在门面里。
12
+ */
13
+ import type { DocumentModel } from '../model/document';
14
+ import type { Selection, VirtualBlock } from '../model/types';
15
+ import type { CaretAffinity } from '../operations';
16
+ import type { ArmedSide, CaretState } from './session';
17
+ export interface NavEnv {
18
+ readonly doc: DocumentModel;
19
+ /** 生成中、带 label 的 mark:光标进不去 */
20
+ locked(id: string): boolean;
21
+ /** 该下标的嵌入对象已经排出了框。视口排版下窗口外的可能还没有;不传当作都有 */
22
+ embedLaidOut?(index: number): boolean;
23
+ }
24
+ /** 一次导航的结果。`arm` 非空表示进入整段选中态,否则退出选中态。 */
25
+ export interface NavMove {
26
+ sel: Selection;
27
+ affinity: CaretState['affinity'];
28
+ arm: {
29
+ id: string;
30
+ side: ArmedSide | null;
31
+ } | null;
32
+ }
33
+ type Dir = 1 | -1;
34
+ export declare function hasSelectedChrome(block: VirtualBlock): boolean;
35
+ export declare function markSelectable(env: NavEnv, block: VirtualBlock): boolean;
36
+ /** `chrome.selectable === false` 的芯片或其它嵌入。光标不选中它。 */
37
+ export declare function embedSkipped(env: NavEnv, index: number): boolean;
38
+ /** index 恰好是某个有字 mark 的起点或终点 */
39
+ export declare function isMarkBoundary(env: NavEnv, s: CaretState, index: number): boolean;
40
+ export declare function nonEmptyMarkEndsAt(env: NavEnv, index: number): boolean;
41
+ export declare const selectableMarkStartsAt: (env: NavEnv, index: number) => boolean;
42
+ export declare const selectableMarkEndsAt: (env: NavEnv, index: number) => boolean;
43
+ export declare const unselectableMarkStartsAt: (env: NavEnv, index: number) => boolean;
44
+ export declare const unselectableMarkEndsAt: (env: NavEnv, index: number) => boolean;
45
+ /** 有文字、且允许光标进入的 mark 边界。不可选中的块不在这里换内外侧。 */
46
+ export declare function selectableMarkBoundary(env: NavEnv, index: number): boolean;
47
+ /** 光标在 mark 边界上贴哪一侧。不是边界或记录对不上时按 backward。 */
48
+ export declare function caretAffinity(env: NavEnv, s: CaretState): CaretAffinity;
49
+ /** 光标(落在 index)算不算在这块 mark 里面。button 没有内侧。 */
50
+ export declare function caretInsideMark(env: NavEnv, s: CaretState, block: VirtualBlock, index: number): boolean;
51
+ /** 有字 mark 的右缘上正好停着一块零宽灰字 */
52
+ export declare function emptyPlaceholderAtMarkEnd(env: NavEnv, index: number): boolean;
53
+ /** 落在 index 上、配了选中皮的零宽灰字 mark */
54
+ export declare function emptyMarkWithSelectedAt(env: NavEnv, index: number): VirtualBlock | null;
55
+ /** 光标在零宽灰字里面(还没进入选中态) */
56
+ export declare function insideEmptyMarkWithSelected(env: NavEnv, s: CaretState): VirtualBlock | null;
57
+ /** 当前处在选中态的零宽灰字 mark */
58
+ export declare function armedEmptyMark(env: NavEnv, s: CaretState): VirtualBlock | null;
59
+ /** 当前处在选中态的 button mark */
60
+ export declare function armedButtonMark(env: NavEnv, s: CaretState): VirtualBlock | null;
61
+ /** 选区正好盖满一块有字 mark */
62
+ export declare function wholeSelectedMark(env: NavEnv, s: CaretState): VirtualBlock | null;
63
+ /** 选区盖满的那块正是选中态的那块 */
64
+ export declare function armedWholeMark(env: NavEnv, s: CaretState): VirtualBlock | null;
65
+ /** 光标在块外,朝 dir 走会撞上的 mark。同一边多块时取范围最大的 */
66
+ export declare function markEntering(env: NavEnv, s: CaretState, dir: Dir): VirtualBlock | null;
67
+ /** 光标在块内边界上,朝 dir 走会离开的 mark。同一边多块时取范围最小的 */
68
+ export declare function markLeaving(env: NavEnv, s: CaretState, dir: Dir): VirtualBlock | null;
69
+ /** 从零宽灰字朝 dir 出去时贴着的那块有字 mark(最小的那块) */
70
+ export declare function selectedMarkAtEmptyExit(env: NavEnv, index: number, dir: Dir): VirtualBlock | null;
71
+ /** 从块内穿过贴边的不可选中芯片往外走时,要整段选中的那块 */
72
+ export declare function unselectableSlotExit(env: NavEnv, s: CaretState, dir: Dir): VirtualBlock | null;
73
+ /** 光标(折叠)落在 button mark 里面时,那块最小的 button */
74
+ export declare function buttonContainingCaret(env: NavEnv, s: CaretState): VirtualBlock | null;
75
+ export declare function caretInsideEditableMark(env: NavEnv, s: CaretState): boolean;
76
+ /** 正好选中一颗可选中的嵌入对象时,它的下标 */
77
+ export declare function selectedEmbedIndex(env: NavEnv, s: CaretState): number | null;
78
+ /** 锁定的 mark 当成不可选中,交给区间跳过的计算 */
79
+ export declare function selectabilityBlocks(env: NavEnv): VirtualBlock[];
80
+ /**
81
+ * 把落点挪到不可选中 mark 的外面。`dir` 为 0 时就近。
82
+ * 挪过了就按挪的方向给亲和;一步正好落在不可选中块的端点上时,亲和也要贴在外侧。
83
+ */
84
+ export declare function placeOutsideUnselectable(env: NavEnv, index: number, dir: Dir | 0): {
85
+ index: number;
86
+ affinity: CaretAffinity | null;
87
+ };
88
+ /** 按码点走一步,跳过表格结构标记 */
89
+ export declare function stepIndex(env: NavEnv, index: number, dir: Dir): number;
90
+ export declare function isStructural(ch: string): boolean;
91
+ /** 整段选中这块。`dir` 是焦点要停的那一侧:1 停在左端,-1 停在右端 */
92
+ export declare function selectWholeMark(block: VirtualBlock, dir: Dir): NavMove;
93
+ /** 零宽灰字进入选中态,焦点记在 `side` 一侧 */
94
+ export declare function armEmptyMark(block: VirtualBlock, side: ArmedSide): NavMove;
95
+ /** 从 button 选中态按同方向直接到另一侧的外面 */
96
+ export declare function leaveButtonMark(block: VirtualBlock, dir: Dir): NavMove;
97
+ /** 有字 mark 在选中态时再按一次:朝内进入这一侧的内侧,朝外离开 */
98
+ export declare function stepArmedMark(env: NavEnv, s: CaretState, block: VirtualBlock, dir: Dir): NavMove;
99
+ /** 零宽灰字在选中态时再按一次 */
100
+ export declare function stepArmedEmpty(env: NavEnv, s: CaretState, block: VirtualBlock, dir: Dir): NavMove;
101
+ /**
102
+ * 不扩选时按左右键,mark 和芯片的特殊规则。返回 null 表示没有命中特殊规则,
103
+ * 按普通字符走({@link moveHorizontal} 的后半段)。
104
+ */
105
+ export declare function stepMarkHorizontal(env: NavEnv, s: CaretState, dir: Dir): NavMove | null;
106
+ /**
107
+ * 左右键一次。`extend` 为真是 Shift 扩选。返回 null 表示什么都不做(文档开头按 ←)。
108
+ */
109
+ export declare function moveHorizontal(env: NavEnv, s: CaretState, dir: Dir, extend: boolean): NavMove | null;
110
+ /**
111
+ * 光标落进 button mark 里面时推到两端之一(button 没有内侧)。没有要推的返回 null。
112
+ * `preferEnd` 可按点击位置决定推到哪端;不给就按离哪端近。
113
+ */
114
+ export declare function normalizeButtonCaret(env: NavEnv, s: CaretState, preferEnd?: (block: VirtualBlock) => boolean | undefined): Pick<NavMove, 'sel' | 'affinity'> | null;
115
+ /**
116
+ * 把一次导航落到会话上,得到下一份状态:没进入选中态就退出选中态,再把落进
117
+ * button 的光标推到两端。门面做的是同样的事(外加重画),自检用它模拟按键。
118
+ */
119
+ export declare function settle(env: NavEnv, s: CaretState, move: NavMove): CaretState;
120
+ export {};
121
+ //# sourceMappingURL=markNav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markNav.d.ts","sourceRoot":"","sources":["../../../src/editor/markNav.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markNav.selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markNav.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/markNav.selfcheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import type { CaretPos, CaretStop, DocLayout, ImageBox, LineBox, SelRect } from '../layout/types';
2
+ import type { EmbedEntity } from '../model/types';
3
+ import type { NavEnv } from './markNav';
4
+ import type { CaretState } from './session';
5
+ /** 装饰几何要用到的 chrome 配置,字段同 `EditorChrome` */
6
+ export interface OverlayChrome {
7
+ focusMarkBorderGap?: number;
8
+ focusMarkWidth?: number;
9
+ selectionHeight?: number;
10
+ }
11
+ export interface OverlayInput {
12
+ layout: DocLayout;
13
+ env: NavEnv;
14
+ caret: CaretState;
15
+ chrome: OverlayChrome;
16
+ /** 焦点在编辑器里、且不在嵌入对象自己的输入控件上 */
17
+ focused: boolean;
18
+ /** 系统输入法正在组合 */
19
+ imeComposing: boolean;
20
+ /** 组合串镜像在文档里的起点,没有组合时为 null */
21
+ composeAnchor: number | null;
22
+ }
23
+ /** 一帧装饰 */
24
+ export interface OverlayFrame {
25
+ /** 选区高亮矩形。整段选中 mark、选中嵌入对象时为空,只留它们自己的选中皮 */
26
+ selection: SelRect[];
27
+ /** 光标位置。不显示时也照算,输入法靶子要用 */
28
+ caret: CaretPos;
29
+ /** 要不要画光标:聚焦、折叠、不在 mark 选中态 */
30
+ showCaret: boolean;
31
+ /** 焦点竖线(未按缺口收短),芯片外框的缺口按它算。没有时为 null */
32
+ focusMark: CaretPos | null;
33
+ /** 实际画出来的焦点竖线:选中芯片且设了缺口时上下收短 */
34
+ paintedFocusMark: CaretPos | null;
35
+ /** 焦点竖线两端画成圆头(设了缺口且处在整段选中态) */
36
+ focusRounded: boolean;
37
+ /** 输入法候选框的定位点:组合中锚在组合起点,否则跟光标 */
38
+ imeAnchor: CaretPos;
39
+ /** 正好选中的那颗嵌入对象 */
40
+ selectedEmbed: ImageBox | null;
41
+ }
42
+ /** 焦点竖线的缓存:只在排版和选区都没变时复用 */
43
+ export interface FocusMarkMemo {
44
+ layout: DocLayout;
45
+ anchor: number;
46
+ focus: number;
47
+ pos: CaretPos;
48
+ }
49
+ /** 光标所在的可视行(折行边界上的同一下标以光标实际画的那一行为准)。 */
50
+ export declare function lineAt(layout: DocLayout, index: number): LineBox | null;
51
+ /** 该下标在它那一行上的停靠点 */
52
+ export declare function caretStopAt(layout: DocLayout, index: number): CaretStop | null;
53
+ /** 在该下标结束的 mark 底色边缘(最后一个命中的行),没有则 null */
54
+ export declare function markEndEdge(layout: DocLayout, index: number): {
55
+ line: LineBox;
56
+ stop: CaretStop;
57
+ } | null;
58
+ /** 正好选中的嵌入对象的框 */
59
+ export declare function selectedEmbedBox(layout: DocLayout, env: NavEnv, s: CaretState): ImageBox | null;
60
+ /** 正好选中的芯片(internalSlot / hostSlot) */
61
+ export declare function selectedSlot(layout: DocLayout, env: NavEnv, s: CaretState): EmbedEntity | null;
62
+ /** 主文档光标位置。mark 边界上贴后一个字时画在底色外侧 */
63
+ export declare function mainCaretPos(layout: DocLayout, env: NavEnv, s: CaretState): CaretPos;
64
+ /** 同步块编辑中的光标(换算到外层坐标)。不在编辑或芯片没排出来时为 null */
65
+ export declare function refCaretPos(layout: DocLayout, s: CaretState): CaretPos | null;
66
+ /** 组合串起点的位置,输入法候选框锚在这里 */
67
+ export declare function composeCaretPos(layout: DocLayout, s: CaretState, composeAnchor: number | null): CaretPos;
68
+ /** 整段选中 mark(含零宽灰字)时焦点竖线的位置:进入侧的外侧 */
69
+ export declare function armedOuterFocusPos(layout: DocLayout, env: NavEnv, s: CaretState): CaretPos | null;
70
+ /**
71
+ * 设了 `focusMarkBorderGap` 时,把焦点竖线对齐到选中边框的中线上(mark 或芯片的进入侧)。
72
+ * 没设缺口、或当前没有整段选中的块时原样返回。
73
+ */
74
+ export declare function alignSelectedFocus(input: OverlayInput, pos: CaretPos): CaretPos;
75
+ /**
76
+ * 焦点竖线:有文字选区、整段选中 mark 或选中芯片时画在焦点那一端。
77
+ * `memo` 是可选的缓存格子,排版和选区都没变时直接复用上次的结果。
78
+ */
79
+ export declare function focusMarkPos(input: OverlayInput, memo?: {
80
+ current: FocusMarkMemo | null;
81
+ }): CaretPos | null;
82
+ /** 选区高亮矩形 */
83
+ export declare function selectionPaintRects(input: OverlayInput, selectedEmbed: ImageBox | null): SelRect[];
84
+ /**
85
+ * 算一帧装饰。`withSelection: false` 时不算选区矩形(返回空数组),
86
+ * 光标闪烁这类只重画光标层的路径用它,免得每帧都算一遍选区。
87
+ */
88
+ export declare function computeOverlay(input: OverlayInput, memo?: {
89
+ current: FocusMarkMemo | null;
90
+ }, withSelection?: boolean): OverlayFrame;
91
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../src/editor/overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=overlay.selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/overlay.selfcheck.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import type { CaretPos, DocLayout, ImageBox } from '../layout/types';
2
+ import type { VirtualBlockChrome } from '../model/types';
3
+ export interface OverlayNodes {
4
+ /** 内容定位上下文,芯片和同步块节点都在它下面 */
5
+ pageInner: HTMLElement;
6
+ embedFrame: HTMLElement;
7
+ handle: HTMLElement;
8
+ imeBar: HTMLElement;
9
+ placeholderEl: HTMLElement;
10
+ }
11
+ /** 空文档占位要画成什么样,null 表示不显示 */
12
+ export interface PlaceholderSpec {
13
+ text: string;
14
+ left: number;
15
+ top: number;
16
+ maxWidth: number;
17
+ fontSize: number;
18
+ lineHeight: number;
19
+ color: string;
20
+ opacity: string;
21
+ }
22
+ export interface SlotSkinInput {
23
+ layout: DocLayout;
24
+ chromeOf: (entityId: string) => VirtualBlockChrome | undefined;
25
+ hovered: string | null;
26
+ selected: string | null;
27
+ /** 选中芯片的焦点竖线,缺口按它挖。只在需要时才调 */
28
+ focus: () => CaretPos | null;
29
+ selectionHeight?: number;
30
+ focusMarkBorderGap?: number;
31
+ }
32
+ export interface RefNodeInfo {
33
+ count: number;
34
+ title: string;
35
+ }
36
+ export declare class OverlayDom {
37
+ private readonly nodes;
38
+ private slotState;
39
+ private refKey;
40
+ private placeholderKey;
41
+ constructor(nodes: OverlayNodes);
42
+ /** 配置变了(如 setChrome)但排版没变:下一次全部重画 */
43
+ invalidate(): void;
44
+ /** 选中嵌入对象时的蓝框和右下角缩放手柄 */
45
+ embedFrame(img: ImageBox | null, refEditing: boolean): void;
46
+ /** 自绘的组合区下划线:从组合起点铺 `width` 宽。`width` 为 0 时隐藏 */
47
+ composeUnderline(anchor: CaretPos, width: number, thickness: number): void;
48
+ /** 空文档占位 */
49
+ placeholder(spec: PlaceholderSpec | null): void;
50
+ /** 同步块芯片:引用数、标题、编辑中、选中。排版和两个 id 都没变就跳过 */
51
+ refNodes(layout: DocLayout, selected: string | null, editing: string | null, info: (entityId: string) => RefNodeInfo | null): void;
52
+ /**
53
+ * 芯片外框:底色、边、圆角、字体,选中时挖出焦点竖线的缺口。
54
+ * 排版换了就全部重画;否则只重画悬停、选中前后变了的那几颗。
55
+ */
56
+ slots(input: SlotSkinInput): void;
57
+ private paintSlot;
58
+ }
59
+ //# sourceMappingURL=overlayDom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayDom.d.ts","sourceRoot":"","sources":["../../../src/editor/overlayDom.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIzD,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,WAAW,CAAC;CAC5B;AAED,6BAA6B;AAC7B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,OAAO,CAAC,SAAS,CAAuF;IACxG,OAAO,CAAC,MAAM,CAAuF;IACrG,OAAO,CAAC,cAAc,CAAM;gBAEC,KAAK,EAAE,YAAY;IAEhD,qCAAqC;IACrC,UAAU;IAMV,yBAAyB;IACzB,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAE,UAAU,EAAE,OAAO;IAyBpD,iDAAiD;IACjD,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IASnE,YAAY;IACZ,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAqBxC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI;IAY3H;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa;IAsB1B,OAAO,CAAC,SAAS;CAoDlB"}
@@ -0,0 +1,114 @@
1
+ import type { ImageBox } from '../layout/types';
2
+ import type { RefEditTarget } from './session';
3
+ /** 拖拽会话。null 表示没在拖。 */
4
+ export type DragSession =
5
+ /** 在正文里拖选。anchor 是按下时的选区锚点 */
6
+ {
7
+ kind: 'select';
8
+ anchor: number;
9
+ }
10
+ /** 在同步块内部拖选。anchor 是片段坐标 */
11
+ | {
12
+ kind: 'refSelect';
13
+ anchor: number;
14
+ }
15
+ /** 拖右下角手柄缩放嵌入对象 */
16
+ | {
17
+ kind: 'embedResize';
18
+ id: string;
19
+ startX: number;
20
+ startW: number;
21
+ startH: number;
22
+ }
23
+ /** 拖表格列边界 */
24
+ | {
25
+ kind: 'colResize';
26
+ tableStart: number;
27
+ col: number;
28
+ startX: number;
29
+ widths: number[];
30
+ };
31
+ /** 列边界命中结果,同 `hitColBorder` */
32
+ export interface ColBorderHit {
33
+ tableStart: number;
34
+ col: number;
35
+ widths: number[];
36
+ }
37
+ /** 按下时门面算好的事实 */
38
+ export interface PointerDownFacts {
39
+ /** 点中的引用芯片(只在点中的是 ref 时给) */
40
+ refBox: ImageBox | null;
41
+ /** 正在编辑的同步块 */
42
+ refEdit: RefEditTarget | null;
43
+ /**
44
+ * 点在交互型嵌入对象(代码块、公式、宿主芯片……)的节点上。`onControl` 表示点在里面
45
+ * 真正的输入控件上;`index` 是它在文档里的下标,取不到时为 null。没点在上面给 null。
46
+ */
47
+ embed: {
48
+ index: number | null;
49
+ onControl: boolean;
50
+ } | null;
51
+ /** 上一次点击后还在继续输入,这次点击只恢复光标 */
52
+ keepTyping: boolean;
53
+ shift: boolean;
54
+ /** Cmd 或 Ctrl */
55
+ mod: boolean;
56
+ /** 点中的表格列边界 */
57
+ colBorder: ColBorderHit | null;
58
+ }
59
+ /** 按下时点中的是什么 */
60
+ export type PointerDownTarget =
61
+ /** 不在同步块里时点中引用芯片:整颗选中 */
62
+ {
63
+ kind: 'refChip';
64
+ box: ImageBox;
65
+ }
66
+ /** 同步块编辑中点回同一片段的引用:在片段里放光标、开始片段拖选 */
67
+ | {
68
+ kind: 'refInner';
69
+ box: ImageBox;
70
+ }
71
+ /** 点在嵌入对象里的输入控件上:交给控件,编辑器不介入 */
72
+ | {
73
+ kind: 'embedControl';
74
+ }
75
+ /** 点在嵌入对象的外框上:整颗选中 */
76
+ | {
77
+ kind: 'embedFrame';
78
+ index: number | null;
79
+ }
80
+ /** 还在继续输入:只恢复光标,不挪 */
81
+ | {
82
+ kind: 'resumeTyping';
83
+ }
84
+ /** 点在表格列边界上:开始拖列宽 */
85
+ | {
86
+ kind: 'colBorder';
87
+ border: ColBorderHit;
88
+ }
89
+ /** 其余:落光标、开始拖选 */
90
+ | {
91
+ kind: 'text';
92
+ };
93
+ /**
94
+ * 分类一次按下。`exitRef` 为真表示先退出同步块编辑再处理(点到了片段外面)。
95
+ */
96
+ export declare function classifyPointerDown(f: PointerDownFacts): {
97
+ target: PointerDownTarget;
98
+ exitRef: boolean;
99
+ };
100
+ /**
101
+ * 拖缩放手柄时的新尺寸。保持宽高比的按起始比例算高;不保持的只给宽,高由插件按新宽度量。
102
+ * 最小宽度 40。
103
+ */
104
+ export declare function embedResizeSize(s: Extract<DragSession, {
105
+ kind: 'embedResize';
106
+ }>, clientX: number, keepAspectRatio: boolean): {
107
+ width: number;
108
+ height?: number;
109
+ };
110
+ /** 拖列边界时的新列宽:只在相邻两列之间挪,两列都不小于最小列宽,总宽不变。 */
111
+ export declare function colResizeWidths(s: Extract<DragSession, {
112
+ kind: 'colResize';
113
+ }>, clientX: number): number[];
114
+ //# sourceMappingURL=pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/editor/pointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pointer.selfcheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.selfcheck.d.ts","sourceRoot":"","sources":["../../../src/editor/pointer.selfcheck.ts"],"names":[],"mappings":""}