@moda-editor/core 0.3.1 → 0.3.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 (137) hide show
  1. package/dist/commands.d.ts.map +1 -1
  2. package/dist/commands.js +14 -1
  3. package/dist/commands.js.map +1 -1
  4. package/dist/editor/editor.d.ts.map +1 -1
  5. package/dist/editor/editor.js +3 -1
  6. package/dist/editor/editor.js.map +1 -1
  7. package/dist/features/code-block.d.ts.map +1 -1
  8. package/dist/features/code-block.js +10 -2
  9. package/dist/features/code-block.js.map +1 -1
  10. package/dist/features/code-edit.d.ts.map +1 -1
  11. package/dist/features/code-edit.js.map +1 -1
  12. package/dist/features/code-format.js.map +1 -1
  13. package/dist/features/hard-break.d.ts.map +1 -1
  14. package/dist/features/hard-break.js +2 -0
  15. package/dist/features/hard-break.js.map +1 -1
  16. package/dist/features/heading.d.ts.map +1 -1
  17. package/dist/features/heading.js +3 -1
  18. package/dist/features/heading.js.map +1 -1
  19. package/dist/features/horizontal-rule.d.ts.map +1 -1
  20. package/dist/features/horizontal-rule.js.map +1 -1
  21. package/dist/features/image.d.ts.map +1 -1
  22. package/dist/features/image.js.map +1 -1
  23. package/dist/features/link.d.ts.map +1 -1
  24. package/dist/features/link.js.map +1 -1
  25. package/dist/features/marks.d.ts.map +1 -1
  26. package/dist/features/marks.js +25 -3
  27. package/dist/features/marks.js.map +1 -1
  28. package/dist/features/search.d.ts.map +1 -1
  29. package/dist/features/search.js +1 -7
  30. package/dist/features/search.js.map +1 -1
  31. package/dist/features/table.d.ts.map +1 -1
  32. package/dist/features/table.js +30 -7
  33. package/dist/features/table.js.map +1 -1
  34. package/dist/fixtures/external-pastes.d.ts +33 -0
  35. package/dist/fixtures/external-pastes.d.ts.map +1 -0
  36. package/dist/fixtures/external-pastes.js +134 -0
  37. package/dist/fixtures/external-pastes.js.map +1 -0
  38. package/dist/history.d.ts.map +1 -1
  39. package/dist/history.js +57 -2
  40. package/dist/history.js.map +1 -1
  41. package/dist/index.d.ts +6 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/model/node.d.ts.map +1 -1
  46. package/dist/model/node.js +1 -2
  47. package/dist/model/node.js.map +1 -1
  48. package/dist/model/schema.d.ts +7 -0
  49. package/dist/model/schema.d.ts.map +1 -1
  50. package/dist/model/schema.js.map +1 -1
  51. package/dist/model/traverse.d.ts +10 -3
  52. package/dist/model/traverse.d.ts.map +1 -1
  53. package/dist/model/traverse.js +13 -5
  54. package/dist/model/traverse.js.map +1 -1
  55. package/dist/parse/html.d.ts.map +1 -1
  56. package/dist/parse/html.js +33 -3
  57. package/dist/parse/html.js.map +1 -1
  58. package/dist/presets/markdown-parse.d.ts.map +1 -1
  59. package/dist/presets/markdown-parse.js +9 -0
  60. package/dist/presets/markdown-parse.js.map +1 -1
  61. package/dist/presets/markdown.d.ts.map +1 -1
  62. package/dist/presets/markdown.js +7 -6
  63. package/dist/presets/markdown.js.map +1 -1
  64. package/dist/presets/starter.d.ts.map +1 -1
  65. package/dist/presets/starter.js.map +1 -1
  66. package/dist/state/apply.d.ts.map +1 -1
  67. package/dist/state/apply.js +1 -3
  68. package/dist/state/apply.js.map +1 -1
  69. package/dist/state/input-rules.d.ts.map +1 -1
  70. package/dist/state/input-rules.js +4 -0
  71. package/dist/state/input-rules.js.map +1 -1
  72. package/dist/state/insert-ops.d.ts.map +1 -1
  73. package/dist/state/insert-ops.js +9 -2
  74. package/dist/state/insert-ops.js.map +1 -1
  75. package/dist/state/list-ops.d.ts.map +1 -1
  76. package/dist/state/list-ops.js.map +1 -1
  77. package/dist/state/navigate.d.ts.map +1 -1
  78. package/dist/state/navigate.js +14 -4
  79. package/dist/state/navigate.js.map +1 -1
  80. package/dist/state/resolve-insert.d.ts.map +1 -1
  81. package/dist/state/resolve-insert.js +12 -1
  82. package/dist/state/resolve-insert.js.map +1 -1
  83. package/dist/styles.css +27 -12
  84. package/dist/theme.d.ts.map +1 -1
  85. package/dist/theme.js.map +1 -1
  86. package/dist/view/decoration.d.ts.map +1 -1
  87. package/dist/view/decoration.js +60 -44
  88. package/dist/view/decoration.js.map +1 -1
  89. package/dist/view/highlight-registry.d.ts.map +1 -1
  90. package/dist/view/highlight-registry.js.map +1 -1
  91. package/dist/view/ime.d.ts +22 -1
  92. package/dist/view/ime.d.ts.map +1 -1
  93. package/dist/view/ime.js +124 -56
  94. package/dist/view/ime.js.map +1 -1
  95. package/dist/view/input-beforeinput.d.ts +25 -0
  96. package/dist/view/input-beforeinput.d.ts.map +1 -0
  97. package/dist/view/input-beforeinput.js +330 -0
  98. package/dist/view/input-beforeinput.js.map +1 -0
  99. package/dist/view/input-keys.d.ts +25 -0
  100. package/dist/view/input-keys.d.ts.map +1 -0
  101. package/dist/view/input-keys.js +69 -0
  102. package/dist/view/input-keys.js.map +1 -0
  103. package/dist/view/input-pointer.d.ts +24 -0
  104. package/dist/view/input-pointer.d.ts.map +1 -0
  105. package/dist/view/input-pointer.js +96 -0
  106. package/dist/view/input-pointer.js.map +1 -0
  107. package/dist/view/input-selection.d.ts +41 -0
  108. package/dist/view/input-selection.d.ts.map +1 -0
  109. package/dist/view/input-selection.js +219 -0
  110. package/dist/view/input-selection.js.map +1 -0
  111. package/dist/view/input.d.ts +39 -30
  112. package/dist/view/input.d.ts.map +1 -1
  113. package/dist/view/input.js +84 -679
  114. package/dist/view/input.js.map +1 -1
  115. package/dist/view/mount.d.ts +7 -0
  116. package/dist/view/mount.d.ts.map +1 -1
  117. package/dist/view/mount.js +107 -19
  118. package/dist/view/mount.js.map +1 -1
  119. package/dist/view/node-selection.d.ts.map +1 -1
  120. package/dist/view/node-selection.js +1 -3
  121. package/dist/view/node-selection.js.map +1 -1
  122. package/dist/view/render.d.ts.map +1 -1
  123. package/dist/view/render.js +10 -3
  124. package/dist/view/render.js.map +1 -1
  125. package/dist/widget/core.d.ts +37 -0
  126. package/dist/widget/core.d.ts.map +1 -0
  127. package/dist/widget/core.js +117 -0
  128. package/dist/widget/core.js.map +1 -0
  129. package/dist/widget/mount.d.ts +24 -0
  130. package/dist/widget/mount.d.ts.map +1 -0
  131. package/dist/widget/mount.js +45 -0
  132. package/dist/widget/mount.js.map +1 -0
  133. package/dist/widget/types.d.ts +44 -0
  134. package/dist/widget/types.d.ts.map +1 -0
  135. package/dist/widget/types.js +8 -0
  136. package/dist/widget/types.js.map +1 -0
  137. package/package.json +2 -6
@@ -0,0 +1,330 @@
1
+ import { nodeAt } from "../model/traverse.js";
2
+ import { parseHTML } from "../parse/html.js";
3
+ import { pointBefore, pointAfter } from "../state/navigate.js";
4
+ import { normalizeRange, pointEq } from "../state/selection.js";
5
+ import { isLeafPoint } from "./caret.js";
6
+ import { domToPoint } from "./dom.js";
7
+ import { blockCtx, rangeCtx } from "./hook-ctx.js";
8
+ import { nodeSelectionBeforeInput } from "./node-selection.js";
9
+ import { blockHasContent, pointBlockPath } from "../commands.js";
10
+ import { dispatchFormatInput } from "./keys.js";
11
+ /** beforeinput 리스너를 생성한다 */
12
+ export function createBeforeInputHandler(deps) {
13
+ const { editor, el, readDomSel, ime } = deps;
14
+ return (e) => {
15
+ if (!editor.editable || e.isComposing)
16
+ return;
17
+ // DOM 셀렉션을 흡수 플러시 전에 읽어둔다 — 커밋 끝점 좌표라
18
+ // 흡수된 텍스트를 포함해 정확하고, 플러시의 리렌더가 DOM
19
+ // 셀렉션을 doc(조합 시작점)으로 되돌리기 전의 값이다
20
+ const domSel = readDomSel();
21
+ // 조합 세션 게이트 — swallow(조합 중 무시)/prevent(커밋 에코 차단)/
22
+ // proceed(정상 처리 — 흡수 대기 중의 구조 입력은 플러시 후 통과)
23
+ const gated = ime.gate(e, domSel);
24
+ if (gated === "swallow")
25
+ return;
26
+ if (gated === "prevent") {
27
+ e.preventDefault();
28
+ return;
29
+ }
30
+ const ds = editor.state.selection;
31
+ // 노드 셀렉션 — DOM 캐럿은 클릭 전 위치에 멈춰 있어 신뢰 불가.
32
+ // 삭제는 노드를 통째로 지우고, 텍스트/개행 입력은 노드 뒤 블록
33
+ // 경계에서 일어나는 것으로 처리한다 (노드는 유지)
34
+ if (ds.type === "node") {
35
+ e.preventDefault();
36
+ nodeSelectionBeforeInput(editor, e);
37
+ return;
38
+ }
39
+ // DOM 셀렉션이 무효하면(리렌더로 분리된 노드 위 등) doc 셀렉션으로
40
+ // 폴백 — 여기까지 왔으면 doc 셀렉션은 항상 텍스트다
41
+ const sel = domSel ?? { anchor: ds.anchor, focus: ds.focus };
42
+ const tr = editor.state.tr();
43
+ switch (e.inputType) {
44
+ case "insertText":
45
+ case "insertCompositionText": {
46
+ e.preventDefault();
47
+ const data = e.data ?? "";
48
+ if (!data)
49
+ return;
50
+ // 커밋 에코가 흡수 타이머보다 늦게 도착한 경우 — DOM과 doc에
51
+ // 이미 같은 글자가 있으므로 다시 넣으면 "세세"가 된다
52
+ if (ime.isLateEcho(data, domSel))
53
+ return;
54
+ // 범위 삭제 뒤엔 삭제 전 좌표가 무효 — 정규화한 앞점 기준으로 삽입
55
+ const r = normalizeRange(sel);
56
+ // 입력 훅 — 기능이 글자 가로채기(코드블록 자동 쌍·타입오버 등)를
57
+ // 구현한다. true 반환 = 소비 → 기본 삽입/입력 규칙을 건너뛴다
58
+ let consumed = false;
59
+ if (editor.inputHooks.length) {
60
+ const ctx = blockCtx(editor, r, tr);
61
+ if (ctx) {
62
+ for (const h of editor.inputHooks) {
63
+ if (h.insertText?.(ctx, data, e.inputType)) {
64
+ consumed = true;
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ }
70
+ if (!consumed) {
71
+ if (!pointEq(r.anchor, r.focus))
72
+ tr.delete(r);
73
+ tr.insertText(data, r.anchor).setMeta("history.group", "type");
74
+ // 마크다운 입력 규칙 — 삽입+변환이 같은 tr이라 하나의 undo 단위
75
+ tr.applyInputRules(editor.inputRules);
76
+ editor.dispatch(tr);
77
+ }
78
+ break;
79
+ }
80
+ case "insertParagraph":
81
+ case "insertLineBreak": {
82
+ e.preventDefault();
83
+ const r = normalizeRange(sel);
84
+ // 분기 판단은 삭제 전 문서의 캐럿 블록 기준 — 경계 포인트
85
+ // (빈 블록의 {path:블록,offset:0} 관례)도 안쪽 블록으로 내려
86
+ // 해석해야 빈 리스트 아이템의 Enter가 lift로 잡힌다
87
+ const blockPath = pointBlockPath(editor.state.doc, editor.state.schema, r.anchor);
88
+ const parentPath = blockPath?.slice(0, -1);
89
+ const parent = parentPath?.length
90
+ ? nodeAt(editor.state.doc, parentPath)
91
+ : undefined;
92
+ const pspec = parent
93
+ ? editor.state.schema.nodeSpec(parent.type)
94
+ : undefined;
95
+ if (!pointEq(r.anchor, r.focus)) {
96
+ tr.delete(r);
97
+ // 삭제 후에는 tr.selection(삭제 붕괴점) 기준 — 삭제 전 좌표는 무효
98
+ tr.split();
99
+ editor.dispatch(tr);
100
+ }
101
+ else {
102
+ // 입력 훅 — 기능이 개행 가로채기(코드블록 자동 들여쓰기·
103
+ // 블록 탈출 등)를 구현한다. true 반환 = 소비
104
+ let consumed = false;
105
+ if (editor.inputHooks.length) {
106
+ const ctx = blockCtx(editor, r, tr);
107
+ if (ctx) {
108
+ for (const h of editor.inputHooks) {
109
+ if (h.insertParagraph?.(ctx)) {
110
+ consumed = true;
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ }
116
+ if (!consumed) {
117
+ if (parentPath && pspec?.listItem) {
118
+ // 리스트 아이템 — 빈 아이템이면 리스트 탈출, 아니면 아이템 분할.
119
+ // 텍스트 길이만 보면 멘션·hardBreak만 담은 아이템이
120
+ // "비었다"로 오판돼 Enter에 내용이 통째로 리프트된다
121
+ const kids = parent.content ?? [];
122
+ const empty = kids.length === 1 &&
123
+ !blockHasContent(editor.state.schema, kids[0]);
124
+ if (empty) {
125
+ tr.liftItem(parentPath);
126
+ }
127
+ else {
128
+ tr.splitItem(parentPath, r.anchor);
129
+ }
130
+ }
131
+ else {
132
+ tr.split(r.anchor);
133
+ }
134
+ editor.dispatch(tr);
135
+ }
136
+ }
137
+ break;
138
+ }
139
+ case "deleteContentBackward":
140
+ case "deleteContentForward": {
141
+ e.preventDefault();
142
+ if (!pointEq(sel.anchor, sel.focus)) {
143
+ tr.delete(sel);
144
+ }
145
+ else {
146
+ // 입력 훅 — collapsed Backspace 가로채기 (코드블록 쌍 삭제 등).
147
+ // true 반환 = 소비 → 아래 기본 삭제 경로를 건너뛴다
148
+ let consumed = false;
149
+ if (e.inputType === "deleteContentBackward" &&
150
+ editor.inputHooks.length) {
151
+ const ctx = blockCtx(editor, { anchor: sel.anchor, focus: sel.focus }, tr);
152
+ if (ctx) {
153
+ for (const h of editor.inputHooks) {
154
+ if (h.deleteBackward?.(ctx)) {
155
+ consumed = true;
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ if (consumed)
162
+ break;
163
+ // 브라우저가 계산한 실제 삭제 범위 — 이모지(서로게이트
164
+ // 페어)·결합문자·ZWJ 클러스터는 코드 유닛 하나만 지우면
165
+ // 깨지므로 targetRange를 우선 쓴다. 단, 방향에 맞는 끝점이
166
+ // 캐럿이어야 신뢰한다 — Chrome은 블록 경계 Backspace에
167
+ // 캐럿 "뒤" 글자 범위를 반환하는 버그가 있어 그대로 지우면
168
+ // 머지 대신 다음 글자가 날아간다
169
+ const tr0 = e.getTargetRanges?.()[0];
170
+ const ta = tr0 && domToPoint(el, tr0.startContainer, tr0.startOffset);
171
+ const tf = tr0 && domToPoint(el, tr0.endContainer, tr0.endOffset);
172
+ const backward = e.inputType === "deleteContentBackward";
173
+ const onCaret = backward
174
+ ? tf && pointEq(tf, sel.focus)
175
+ : ta && pointEq(ta, sel.focus);
176
+ // 끝점이 요소 레벨 포인트(컨테이너 자식 경계, 블록 머지 시 Chrome이
177
+ // (P,0) 같은 위치를 줌)면 tr.delete가 해석하지 못한다 — 리프
178
+ // 포인트를 주는 pointBefore/After 폴백으로 돌린다
179
+ if (ta &&
180
+ tf &&
181
+ !pointEq(ta, tf) &&
182
+ onCaret &&
183
+ isLeafPoint(editor.state.doc, ta) &&
184
+ isLeafPoint(editor.state.doc, tf)) {
185
+ tr.delete(normalizeRange({ anchor: ta, focus: tf }));
186
+ tr.setMeta("history.group", "delete");
187
+ editor.dispatch(tr);
188
+ break;
189
+ }
190
+ const boundary = e.inputType === "deleteContentBackward"
191
+ ? pointBefore(editor.state.doc, sel.focus)
192
+ : pointAfter(editor.state.doc, sel.focus);
193
+ if (!boundary)
194
+ return;
195
+ tr.delete(e.inputType === "deleteContentBackward"
196
+ ? { anchor: boundary, focus: sel.focus }
197
+ : { anchor: sel.focus, focus: boundary });
198
+ }
199
+ tr.setMeta("history.group", "delete");
200
+ editor.dispatch(tr);
201
+ break;
202
+ }
203
+ case "insertFromPaste": {
204
+ e.preventDefault();
205
+ const html = e.dataTransfer?.getData("text/html");
206
+ const text = e.dataTransfer?.getData("text/plain") ?? "";
207
+ const r = normalizeRange(sel);
208
+ // 기능 훅 — 링크 URL 감싸기·코드블록 순수 텍스트 등.
209
+ // 하나라도 소비하면 기본 경로를 건너뛴다
210
+ const ctx = rangeCtx(editor, r, tr);
211
+ const data = { html, text };
212
+ let consumed = false;
213
+ for (const h of editor.inputHooks) {
214
+ if (h.insertFromPaste?.(ctx, data)) {
215
+ consumed = true;
216
+ break;
217
+ }
218
+ }
219
+ if (consumed)
220
+ break;
221
+ if (!pointEq(r.anchor, r.focus))
222
+ tr.delete(r);
223
+ if (html) {
224
+ const nodes = parseHTML(html, editor.state.schema);
225
+ if (nodes.length) {
226
+ tr.insertSlice(r.anchor, nodes).setMeta("paste", true);
227
+ editor.dispatch(tr);
228
+ break;
229
+ }
230
+ }
231
+ if (!text)
232
+ return;
233
+ tr.insertText(text, r.anchor).setMeta("paste", true);
234
+ editor.dispatch(tr);
235
+ break;
236
+ }
237
+ case "insertFromDrop":
238
+ case "insertReplacementText": {
239
+ // 텍스트 드롭·자동고침 — 핸들러가 없으면 브라우저가 DOM을 직접
240
+ // 바꿔 doc과 어긋난다. 이미지 파일 드롭은 onDrop이 먼저 잡는다
241
+ e.preventDefault();
242
+ const data = e.data ?? e.dataTransfer?.getData("text/plain") ?? "";
243
+ // insertReplacementText는 교체 대상 범위를 준다 (자동고침)
244
+ let r = normalizeRange(sel);
245
+ if (e.inputType === "insertReplacementText") {
246
+ const tr0 = e.getTargetRanges?.()[0];
247
+ const a = tr0 && domToPoint(el, tr0.startContainer, tr0.startOffset);
248
+ const f = tr0 && domToPoint(el, tr0.endContainer, tr0.endOffset);
249
+ if (a && f)
250
+ r = normalizeRange({ anchor: a, focus: f });
251
+ }
252
+ if (!pointEq(r.anchor, r.focus))
253
+ tr.delete(r);
254
+ if (data) {
255
+ tr.insertText(data, r.anchor).setMeta("history.group", "type");
256
+ }
257
+ editor.dispatch(tr);
258
+ break;
259
+ }
260
+ // 단어/줄 단위·드래그·잘라내기 삭제 — macOS Option-Delete는
261
+ // deleteWord*, Ctrl-K는 deleteSoftLine*, Cmd-X는 deleteByCut으로
262
+ // 온다. getTargetRanges가 브라우저가 계산한 정확한 범위를 주므로
263
+ // 그것을 쓰고, 없으면 현재 선택을 지운다. 잘라내기의 클립보드
264
+ // 쓰기는 cut 이벤트의 디폴트라 beforeinput을 막아도 채워진다
265
+ case "deleteWordBackward":
266
+ case "deleteWordForward":
267
+ case "deleteSoftLineBackward":
268
+ case "deleteSoftLineForward":
269
+ case "deleteEntireSoftLine":
270
+ case "deleteHardLineBackward":
271
+ case "deleteHardLineForward":
272
+ case "deleteByDrag":
273
+ case "deleteByCut": {
274
+ e.preventDefault();
275
+ const tr0 = e.getTargetRanges?.()[0];
276
+ const a = tr0 && domToPoint(el, tr0.startContainer, tr0.startOffset);
277
+ const f = tr0 && domToPoint(el, tr0.endContainer, tr0.endOffset);
278
+ // 캐럿 끝점이 삭제 방향과 맞을 때만 목표 범위를 신뢰한다 —
279
+ // 블록 경계에서 Chrome이 반대 방향 범위를 주는 버그가 있다.
280
+ // 방향 없는 타입(drag/cut/entire)은 항상 신뢰한다. 끝점이 요소
281
+ // 레벨 포인트면 tr.delete가 해석 못하므로 리프만 받는다
282
+ const delBack = e.inputType.endsWith("Backward");
283
+ const delFwd = e.inputType.endsWith("Forward");
284
+ const trusted = a &&
285
+ f &&
286
+ !pointEq(a, f) &&
287
+ isLeafPoint(editor.state.doc, a) &&
288
+ isLeafPoint(editor.state.doc, f) &&
289
+ (!delBack || pointEq(f, sel.focus)) &&
290
+ (!delFwd || pointEq(a, sel.focus));
291
+ const r = trusted
292
+ ? normalizeRange({ anchor: a, focus: f })
293
+ : normalizeRange(sel);
294
+ tr.delete(r).setMeta("history.group", "delete");
295
+ editor.dispatch(tr);
296
+ break;
297
+ }
298
+ // 모바일·컨텍스트 메뉴·리더의 서식 명령 — 네이티브 execCommand가
299
+ // DOM을 직접 바꾸면 어긋나므로 우리 커맨드로 매핑한다
300
+ // (매핑 테이블은 keys.ts의 dispatchFormatInput)
301
+ case "insertFromYank":
302
+ case "insertFromPasteAsQuotation": {
303
+ // macOS 킬링 붙여넣기(Ctrl-Y)·인용 붙여넣기 — 있으면 순수
304
+ // 텍스트로 삽입한다
305
+ e.preventDefault();
306
+ const data = e.data ?? e.dataTransfer?.getData("text/plain") ?? "";
307
+ if (!data)
308
+ return;
309
+ const r = normalizeRange(sel);
310
+ if (!pointEq(r.anchor, r.focus))
311
+ tr.delete(r);
312
+ tr.insertText(data, r.anchor).setMeta("history.group", "type");
313
+ editor.dispatch(tr);
314
+ break;
315
+ }
316
+ default:
317
+ // format*/history*/insert*List 등 — 커맨드 디스패치 테이블에 위임
318
+ if (dispatchFormatInput(editor, e.inputType)) {
319
+ e.preventDefault();
320
+ break;
321
+ }
322
+ // 나머지 타입(insertTranspose, formatFontColor 등)은 우리가
323
+ // 처리하지 않는다 — 그대로 두면 브라우저가 DOM만 바꿔 doc과
324
+ // 영구히 어긋나므로 기본 동작을 막아 no-op으로 둔다
325
+ e.preventDefault();
326
+ break;
327
+ }
328
+ };
329
+ }
330
+ //# sourceMappingURL=input-beforeinput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-beforeinput.js","sourceRoot":"","sources":["../../src/view/input-beforeinput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Editor } from "../editor/editor.js";
2
+ import type { ImeSession } from "./ime.js";
3
+ /**
4
+ * keydown 핸들러 — 키맵 디스패치·Mod-A 전체 선택·노드 셀렉션 키
5
+ * 처리·줄 경계 내비게이션.
6
+ *
7
+ * bindEditorInput에서 분리된 모듈 — 키 입력을 트랜잭션 커맨드로
8
+ * 번역하는 경로만 담는다. beforeinput이 실제 편집을 처리하므로
9
+ * 여기선 "명령" 성격의 키만 다룬다.
10
+ */
11
+ export interface KeydownDeps {
12
+ editor: Editor;
13
+ el: HTMLElement;
14
+ /** IME 세션 — 조합 중 키는 모두 무시한다 */
15
+ ime: ImeSession;
16
+ /**
17
+ * DOM 셀렉션을 doc에 즉시 흡수하는 동기화 — 클릭 직후 키 입력처럼
18
+ * selectionchange가 아직 도착하지 않은 창에 doc 셀렉션이 stale하다.
19
+ * PM domObserver.flush 관례로 키 처리 전에 먼저 호출한다.
20
+ */
21
+ syncDocSelection: () => void;
22
+ }
23
+ /** keydown 리스너를 생성한다 */
24
+ export declare function createKeydownHandler(deps: KeydownDeps): (e: KeyboardEvent) => void;
25
+ //# sourceMappingURL=input-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-keys.d.ts","sourceRoot":"","sources":["../../src/view/input-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,WAAW,CAAC;IAChB,+BAA+B;IAC/B,GAAG,EAAE,UAAU,CAAC;IAChB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,wBAAwB;AACxB,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,GAChB,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAuE5B"}
@@ -0,0 +1,69 @@
1
+ import { textSelection } from "../state/selection.js";
2
+ import { lineNav } from "./line-nav.js";
3
+ import { nodeSelectionKeydown } from "./node-selection.js";
4
+ import { LINE_NAV_KEYS, normalizeKey } from "./keys.js";
5
+ /** keydown 리스너를 생성한다 */
6
+ export function createKeydownHandler(deps) {
7
+ const { editor, el, ime, syncDocSelection } = deps;
8
+ /**
9
+ * 키맵 — 확장의 keymap을 순서대로 매칭해 첫 true 커맨드가 이긴다.
10
+ * false 반환은 다음 바인딩으로 폴스루 (PM keymap 관례).
11
+ */
12
+ return (e) => {
13
+ if (ime.active || e.isComposing || !editor.editable)
14
+ return;
15
+ const key = normalizeKey(e);
16
+ // Mod-A 전체 선택은 직접 처리 — 중첩 편집 호스트(.me-node-view 안의
17
+ // contenteditable 아울렛)가 있으면 Chromium의 네이티브 selectAll이
18
+ // 셀렉션을 펼치지 못하고 문서 시작으로 collapse한다
19
+ if (key === "Mod-a") {
20
+ e.preventDefault();
21
+ editor.dispatch(editor.state
22
+ .tr()
23
+ .setSelection(textSelection({ path: [], offset: 0 }, { path: [], offset: editor.state.doc.content?.length ?? 0 })));
24
+ return;
25
+ }
26
+ // 클릭 직후 키 입력처럼 selectionchange가 아직 도착하지 않은 창에는
27
+ // doc 셀렉션이 stale하다 — PM domObserver.flush 관례로 키 처리 전에
28
+ // DOM 셀렉션을 먼저 흡수한다. 노드 셀렉션 중엔 DOM 캐럿이 무의미한
29
+ // stale 위치라 덮어쓰지 않는다
30
+ if (editor.state.selection.type !== "node")
31
+ syncDocSelection();
32
+ // 노드 셀렉션(이미지 클릭 등) — DOM 캐럿이 없으므로 네이티브
33
+ // 키 동작은 모두 무시하고 모델에서 처리한다. Backspace/Delete는
34
+ // 노드 삭제, Enter는 노드 뒤에 새 블록, 화살표/Escape는 텍스트
35
+ // 셀렉션으로 붕괴, 인쇄 문자는 노드 뒤에 삽입(노드는 유지).
36
+ // Mod/Alt 조합(undo·키맵 등)은 아래 키맵 루프에 넘긴다
37
+ if (editor.state.selection.type === "node" &&
38
+ nodeSelectionKeydown(editor, e, key)) {
39
+ e.preventDefault();
40
+ return;
41
+ }
42
+ for (const km of editor.keymaps) {
43
+ const cmd = km[key];
44
+ if (!cmd)
45
+ continue;
46
+ const tr = editor.state.tr();
47
+ const handled = cmd({
48
+ state: editor.state,
49
+ tr,
50
+ dispatch: () => editor.dispatch(tr),
51
+ });
52
+ if (handled) {
53
+ e.preventDefault();
54
+ return;
55
+ }
56
+ }
57
+ // Blink은 중첩 인라인(mark용 span+strong 등)이 있는 contenteditable에서
58
+ // Home/End·Cmd+←/→의 줄 경계 계산을 확률적으로 놓쳐 캐럿이 안 움직인다
59
+ // (실사용의 "두 번 눌러야 함" 원인). 좌표 히트테스트로 시각적 줄 경계를
60
+ // 직접 계산해 네이티브 동작을 대체한다 — 실패하면 기본 동작에 맡긴다.
61
+ // Ctrl+←/→는 비-Mac에서 단어 이동이라 metaKey(Cmd)일 때만 가로챈다
62
+ if (LINE_NAV_KEYS.has(key) &&
63
+ (!key.includes("Arrow") || e.metaKey) &&
64
+ lineNav(editor, el, key)) {
65
+ e.preventDefault();
66
+ }
67
+ };
68
+ }
69
+ //# sourceMappingURL=input-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-keys.js","sourceRoot":"","sources":["../../src/view/input-keys.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAyBxD,wBAAwB;AACxB,MAAM,UAAU,oBAAoB,CAClC,IAAiB;IAEjB,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAEnD;;;OAGG;IACH,OAAO,CAAC,CAAgB,EAAE,EAAE;QAC1B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,kDAAkD;QAClD,sDAAsD;QACtD,kCAAkC;QAClC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,KAAK;iBACT,EAAE,EAAE;iBACJ,YAAY,CACX,aAAa,CACX,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EACvB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,CAC5D,CACF,CACJ,CAAC;YACF,OAAO;QACT,CAAC;QACD,+CAA+C;QAC/C,sDAAsD;QACtD,2CAA2C;QAC3C,qBAAqB;QACrB,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;YAAE,gBAAgB,EAAE,CAAC;QAC/D,uCAAuC;QACvC,6CAA6C;QAC7C,4CAA4C;QAC5C,qCAAqC;QACrC,uCAAuC;QACvC,IACE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;YACtC,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EACpC,CAAC;YACD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,GAAG,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,EAAE;gBACF,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;aACpC,CAAC,CAAC;YACH,IAAI,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;QACH,CAAC;QACD,2DAA2D;QAC3D,iDAAiD;QACjD,6CAA6C;QAC7C,0CAA0C;QAC1C,kDAAkD;QAClD,IACE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YACtB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACrC,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,EACxB,CAAC;YACD,CAAC,CAAC,cAAc,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Editor } from "../editor/editor.js";
2
+ import type { ImeSession } from "./ime.js";
3
+ /**
4
+ * 포인터·클립보드·드래그 드롭 핸들러 — 마우스 클릭(체크박스 마커·
5
+ * atom 노드 선택), paste 파일 디스패치, dragover/drop.
6
+ *
7
+ * bindEditorInput에서 분리된 모듈 — DOM 이벤트를 받아 모델
8
+ * 트랜잭션이나 기능 훅으로 중계하는 경로만 담는다.
9
+ */
10
+ export interface PointerDeps {
11
+ editor: Editor;
12
+ el: HTMLElement;
13
+ /** IME 세션 — 조합 중 paste/drop은 무시한다 */
14
+ ime: ImeSession;
15
+ }
16
+ export interface PointerHandlers {
17
+ onMouseDown(e: MouseEvent): void;
18
+ onPaste(e: ClipboardEvent): void;
19
+ onDragOver(e: DragEvent): void;
20
+ onDrop(e: DragEvent): void;
21
+ }
22
+ /** 포인터·클립보드·DnD 리스너 묶음을 생성한다 */
23
+ export declare function createPointerHandlers(deps: PointerDeps): PointerHandlers;
24
+ //# sourceMappingURL=input-pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-pointer.d.ts","sourceRoot":"","sources":["../../src/view/input-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,WAAW,CAAC;IAChB,qCAAqC;IACrC,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC5B;AAED,gCAAgC;AAChC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAsFxE"}
@@ -0,0 +1,96 @@
1
+ import { nodeAt } from "../model/traverse.js";
2
+ import { caretPointFromXY } from "./caret.js";
3
+ import { PATH_ATTR } from "./dom.js";
4
+ import { dispatchFiles } from "./hook-ctx.js";
5
+ import { trySelectAtom } from "./node-selection.js";
6
+ /** 포인터·클립보드·DnD 리스너 묶음을 생성한다 */
7
+ export function createPointerHandlers(deps) {
8
+ const { editor, el, ime } = deps;
9
+ /**
10
+ * 체크박스 아이템(taskItem)의 마커 영역 클릭 — ::before 마커는
11
+ * 의사요소라 이벤트 타겟이 li 자신이 되고, 클릭이 li의 패딩
12
+ * 영역(마커 존 ~28px)에 떨어진다. 자식 블록 위 클릭은 p가
13
+ * 타겟이므로 li가 data-me-path를 가지면서 타겟이 li인 경우만
14
+ * 마커 클릭으로 해석한다.
15
+ */
16
+ const onMouseDown = (e) => {
17
+ if (!editor.editable)
18
+ return;
19
+ const t = e.target;
20
+ if (!(t instanceof Element))
21
+ return;
22
+ // 노드 뷰 내부 크롬에는 data-me-path가 없다 — 가장 가까운 경로
23
+ // 조상으로 해석한다 (trySelectAtom이 atom 노드를 잡는다)
24
+ const pathEl = t.hasAttribute(PATH_ATTR) ? t : t.closest(`[${PATH_ATTR}]`);
25
+ if (!pathEl)
26
+ return;
27
+ // .me-editor 자신은 data-me-path=""다 — "".split(",") → [NaN]이
28
+ // 아니라 [0]으로 매핑돼 배경 클릭이 첫 블록으로 오인된다
29
+ const raw = pathEl.getAttribute(PATH_ATTR) ?? "";
30
+ const path = raw === "" ? [] : raw.split(",").map(Number);
31
+ if (!path.length)
32
+ return;
33
+ const node = nodeAt(editor.state.doc, path);
34
+ const spec = node && editor.state.schema.nodeSpec(node.type);
35
+ // 체크박스 마커 판정은 타겟 자신이 li일 때만 — 안쪽 자식 클릭은
36
+ // 경로가 자식 것이라 마커 존으로 오인하면 안 된다
37
+ if (pathEl === t && spec?.checkbox) {
38
+ // offsetX는 패딩 가장자리 기준 — 마커 존 밖이면 무시
39
+ if (e.offsetX > 28)
40
+ return;
41
+ e.preventDefault();
42
+ editor.dispatch(editor.state
43
+ .tr()
44
+ .setNodeAttr(path, "checked", !node?.attrs?.["checked"]));
45
+ return;
46
+ }
47
+ // atom 노드(img/hr 등) 클릭 → NodeSelection — DOM 캐럿 이동을
48
+ // 막고(preventDefault) 모델 셀렉션만 둔다. 오버레이 표시는
49
+ // paintOverlays의 is-selected 마킹 + 각 기능의 paintOverlay가 담당.
50
+ // 같은 노드를 다시 누르면 트랜잭션을 생략한다
51
+ if (trySelectAtom(editor, t)) {
52
+ e.preventDefault();
53
+ }
54
+ };
55
+ /**
56
+ * 붙여넣기 — 클립보드의 파일을 기능 훅으로 위임한다 (이미지 업로드는
57
+ * imageFeature 소유 — Summernote onImageUpload / Quill 관례).
58
+ * 파일이 없거나 소비되지 않으면 폴스루 → beforeinput이 텍스트/HTML을
59
+ * 처리한다.
60
+ */
61
+ const onPaste = (e) => {
62
+ if (ime.active || !editor.editable)
63
+ return;
64
+ // paste 이벤트는 sanitizer·훅 소비 전 원본 페이로드로 발행한다 —
65
+ // 리스너(로깅·커스텀 변환)가 실제 입력을 관측할 수 있는 유일한 지점
66
+ editor.emit("paste", {
67
+ html: e.clipboardData?.getData("text/html") ?? "",
68
+ text: e.clipboardData?.getData("text/plain") ?? "",
69
+ event: e,
70
+ });
71
+ // preventDefault하면 beforeinput이 오지 않는다
72
+ if (dispatchFiles(editor, e.clipboardData, "paste", null)) {
73
+ e.preventDefault();
74
+ }
75
+ };
76
+ /** 드롭을 받으려면 dragover를 먼저 막아야 한다 — 파일(업로드 훅)
77
+ * 외에 텍스트 드래그도 beforeinput insertFromDrop으로 트랜잭션 처리 */
78
+ const onDragOver = (e) => {
79
+ if (!editor.editable)
80
+ return;
81
+ const t = e.dataTransfer?.types;
82
+ if (t?.includes("Files") || t?.includes("text/plain")) {
83
+ e.preventDefault();
84
+ }
85
+ };
86
+ const onDrop = (e) => {
87
+ if (ime.active || !editor.editable)
88
+ return;
89
+ const at = caretPointFromXY(el.ownerDocument, el, e.clientX, e.clientY);
90
+ // 소비되지 않으면 기본 동작(파일을 새 탭으로 여는 것)이 살아있다
91
+ if (dispatchFiles(editor, e.dataTransfer, "drop", at))
92
+ e.preventDefault();
93
+ };
94
+ return { onMouseDown, onPaste, onDragOver, onDrop };
95
+ }
96
+ //# sourceMappingURL=input-pointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-pointer.js","sourceRoot":"","sources":["../../src/view/input-pointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Editor } from "../editor/editor.js";
2
+ import type { Point } from "../state/selection.js";
3
+ import type { ImeSession } from "./ime.js";
4
+ /**
5
+ * contenteditable의 셀렉션·포커스·오버레이 동기화.
6
+ *
7
+ * bindEditorInput에서 분리된 모듈 — "doc 셀렉션 → DOM" 복원
8
+ * (restoreSelection), "DOM 셀렉션 → doc" 흡수(syncDocSelection /
9
+ * selectionchange), 포커스 추적(focusin/focusout), 기능 DOM 오버레이
10
+ * 페인트(paintOverlays)를 한 객체에 캡슐화한다.
11
+ *
12
+ * 내부 상태(lastApplied/pendingSel/focused)는 모두 이 모듈 소유 —
13
+ * 다른 입력 핸들러는 반환된 메서드로만 상호작용한다.
14
+ */
15
+ export interface SelectionSyncDeps {
16
+ editor: Editor;
17
+ el: HTMLElement;
18
+ /** 브라우저/IME가 프레임워크 몰래 바꾼 최상위 블록 경로 (drain 공유) */
19
+ dirtyPaths: Set<string>;
20
+ /** DOM 셀렉션을 Point로 읽는 판독기 */
21
+ readDomSel: () => {
22
+ anchor: Point;
23
+ focus: Point;
24
+ } | null;
25
+ /** IME 세션 — absorbing 창의 복원 건너뛰기·active 가드에 쓴다 */
26
+ ime: ImeSession;
27
+ }
28
+ export interface SelectionSync {
29
+ /** 기능 DOM 오버레이 + 노드 셀렉션 링을 칠한다 */
30
+ paintOverlays(): void;
31
+ /** 렌더 커밋 후 호출 — doc 셀렉션을 DOM 셀렉션으로 복원 */
32
+ restoreSelection(): void;
33
+ /** DOM 셀렉션을 즉시 doc으로 동기화 */
34
+ syncDocSelection(): void;
35
+ onSelectionChange(): void;
36
+ onFocusIn(e: FocusEvent): void;
37
+ onFocusOut(e: FocusEvent): void;
38
+ }
39
+ /** 셀렉션·포커스·오버레이 동기화 객체를 생성한다 */
40
+ export declare function createSelectionSync(deps: SelectionSyncDeps): SelectionSync;
41
+ //# sourceMappingURL=input-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-selection.d.ts","sourceRoot":"","sources":["../../src/view/input-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,WAAW,CAAC;IAChB,iDAAiD;IACjD,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,6BAA6B;IAC7B,UAAU,EAAE,MAAM;QAAE,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,kDAAkD;IAClD,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,aAAa,IAAI,IAAI,CAAC;IACtB,yCAAyC;IACzC,gBAAgB,IAAI,IAAI,CAAC;IACzB,4BAA4B;IAC5B,gBAAgB,IAAI,IAAI,CAAC;IACzB,iBAAiB,IAAI,IAAI,CAAC;IAC1B,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CACjC;AAED,gCAAgC;AAChC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAwO1E"}