@aeriz/wysiwyg 1.0.4 → 2.0.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 (132) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +82 -573
  3. package/angular/README.md +10 -4
  4. package/angular/aeriz-editor.directive.ts +40 -18
  5. package/dist/adapters/jquery.cjs +1 -1
  6. package/dist/adapters/jquery.js +14 -14
  7. package/dist/adapters/shared.cjs +1 -1
  8. package/dist/adapters/shared.js +59 -56
  9. package/dist/adapters/vue.cjs +1 -1
  10. package/dist/adapters/vue.js +64 -56
  11. package/dist/adapters/vue2.cjs +1 -1
  12. package/dist/adapters/vue2.js +24 -17
  13. package/dist/adapters/wc.cjs +1 -1
  14. package/dist/adapters/wc.js +108 -72
  15. package/dist/aeriz-wysiwyg-adapter.js +24 -32
  16. package/dist/aeriz-wysiwyg-adapter.min.js +1 -1
  17. package/dist/aeriz-wysiwyg-highlight.js +964 -0
  18. package/dist/aeriz-wysiwyg-highlight.min.js +5 -0
  19. package/dist/aeriz-wysiwyg-jquery.js +25 -32
  20. package/dist/aeriz-wysiwyg-jquery.min.js +1 -1
  21. package/dist/aeriz-wysiwyg-wc.js +80 -43
  22. package/dist/aeriz-wysiwyg-wc.min.js +1 -1
  23. package/dist/aeriz-wysiwyg.cjs +3688 -1757
  24. package/dist/aeriz-wysiwyg.css +2104 -1904
  25. package/dist/aeriz-wysiwyg.esm.js +3688 -1757
  26. package/dist/aeriz-wysiwyg.esm.min.js +4904 -3538
  27. package/dist/aeriz-wysiwyg.js +3688 -1757
  28. package/dist/aeriz-wysiwyg.min.cjs +53 -40
  29. package/dist/aeriz-wysiwyg.min.css +1 -1
  30. package/dist/aeriz-wysiwyg.min.js +53 -40
  31. package/dist/highlight.cjs +5 -0
  32. package/dist/highlight.js +895 -0
  33. package/dist/server.cjs +24 -19
  34. package/dist/server.js +612 -251
  35. package/dist-types/adapters/shared.d.ts +0 -8
  36. package/dist-types/adapters/shared.d.ts.map +1 -1
  37. package/dist-types/adapters/vue.d.ts +62 -21
  38. package/dist-types/adapters/vue.d.ts.map +1 -1
  39. package/dist-types/adapters/vue2.d.ts +33 -14
  40. package/dist-types/adapters/vue2.d.ts.map +1 -1
  41. package/dist-types/adapters/wc.d.ts +15 -6
  42. package/dist-types/adapters/wc.d.ts.map +1 -1
  43. package/dist-types/cjs/adapters/shared.d.cts +0 -8
  44. package/dist-types/cjs/adapters/vue.d.cts +62 -21
  45. package/dist-types/cjs/adapters/vue2.d.cts +33 -14
  46. package/dist-types/cjs/adapters/wc.d.cts +15 -6
  47. package/dist-types/cjs/core/AerizEditor.d.cts +238 -48
  48. package/dist-types/cjs/core/AerizViewer.d.cts +7 -0
  49. package/dist-types/cjs/core/block-meta.d.cts +40 -0
  50. package/dist-types/cjs/core/block-tracker.d.cts +64 -0
  51. package/dist-types/cjs/core/blocks.d.cts +39 -4
  52. package/dist-types/cjs/core/fonts.d.cts +33 -46
  53. package/dist-types/cjs/core/highlight.d.cts +2 -0
  54. package/dist-types/cjs/core/history.d.cts +28 -10
  55. package/dist-types/cjs/core/html-to-blocks.d.cts +10 -0
  56. package/dist-types/cjs/core/i18n.d.cts +44 -0
  57. package/dist-types/cjs/core/import-html.d.cts +0 -13
  58. package/dist-types/cjs/core/insert-fragment.d.cts +21 -0
  59. package/dist-types/cjs/core/paste-clean.d.cts +36 -0
  60. package/dist-types/cjs/core/sanitize-dom.d.cts +21 -0
  61. package/dist-types/cjs/core/sanitize-html.d.cts +8 -0
  62. package/dist-types/cjs/core/sanitize-policy.d.cts +22 -0
  63. package/dist-types/cjs/core/selection.d.cts +5 -0
  64. package/dist-types/cjs/core/table-grid.d.cts +87 -0
  65. package/dist-types/cjs/core/table-ops.d.cts +2 -22
  66. package/dist-types/cjs/highlight/index.d.cts +5 -0
  67. package/dist-types/cjs/index.d.cts +19 -11
  68. package/dist-types/cjs/server/index.d.cts +4 -5
  69. package/dist-types/cjs/types/index.d.cts +63 -15
  70. package/dist-types/cjs/ui/Toolbar.d.cts +10 -0
  71. package/dist-types/cjs/ui/doc-tools.d.cts +58 -0
  72. package/dist-types/cjs/ui/popovers.d.cts +14 -25
  73. package/dist-types/core/AerizEditor.d.ts +238 -48
  74. package/dist-types/core/AerizEditor.d.ts.map +1 -1
  75. package/dist-types/core/AerizViewer.d.ts +7 -0
  76. package/dist-types/core/AerizViewer.d.ts.map +1 -1
  77. package/dist-types/core/block-meta.d.ts +40 -0
  78. package/dist-types/core/block-meta.d.ts.map +1 -1
  79. package/dist-types/core/block-policy.d.ts.map +1 -1
  80. package/dist-types/core/block-tracker.d.ts +64 -0
  81. package/dist-types/core/block-tracker.d.ts.map +1 -0
  82. package/dist-types/core/blocks.d.ts +39 -4
  83. package/dist-types/core/blocks.d.ts.map +1 -1
  84. package/dist-types/core/fonts.d.ts +33 -46
  85. package/dist-types/core/fonts.d.ts.map +1 -1
  86. package/dist-types/core/highlight.d.ts +2 -0
  87. package/dist-types/core/highlight.d.ts.map +1 -1
  88. package/dist-types/core/history.d.ts +28 -10
  89. package/dist-types/core/history.d.ts.map +1 -1
  90. package/dist-types/core/html-mini.d.ts.map +1 -1
  91. package/dist-types/core/html-to-blocks.d.ts +10 -0
  92. package/dist-types/core/html-to-blocks.d.ts.map +1 -0
  93. package/dist-types/core/i18n.d.ts +44 -0
  94. package/dist-types/core/i18n.d.ts.map +1 -1
  95. package/dist-types/core/import-html.d.ts +0 -13
  96. package/dist-types/core/import-html.d.ts.map +1 -1
  97. package/dist-types/core/import-markdown.d.ts.map +1 -1
  98. package/dist-types/core/insert-fragment.d.ts +21 -0
  99. package/dist-types/core/insert-fragment.d.ts.map +1 -0
  100. package/dist-types/core/markdown-export.d.ts.map +1 -1
  101. package/dist-types/core/paste-clean.d.ts +36 -0
  102. package/dist-types/core/paste-clean.d.ts.map +1 -0
  103. package/dist-types/core/render-string.d.ts.map +1 -1
  104. package/dist-types/core/sanitize-dom.d.ts +21 -0
  105. package/dist-types/core/sanitize-dom.d.ts.map +1 -0
  106. package/dist-types/core/sanitize-html.d.ts +8 -0
  107. package/dist-types/core/sanitize-html.d.ts.map +1 -0
  108. package/dist-types/core/sanitize-policy.d.ts +22 -0
  109. package/dist-types/core/sanitize-policy.d.ts.map +1 -0
  110. package/dist-types/core/selection.d.ts +5 -0
  111. package/dist-types/core/selection.d.ts.map +1 -1
  112. package/dist-types/core/snapshot.d.ts.map +1 -1
  113. package/dist-types/core/table-grid.d.ts +87 -0
  114. package/dist-types/core/table-grid.d.ts.map +1 -0
  115. package/dist-types/core/table-ops.d.ts +2 -22
  116. package/dist-types/core/table-ops.d.ts.map +1 -1
  117. package/dist-types/highlight/index.d.ts +5 -0
  118. package/dist-types/highlight/index.d.ts.map +1 -0
  119. package/dist-types/index.d.ts +19 -11
  120. package/dist-types/index.d.ts.map +1 -1
  121. package/dist-types/server/index.d.ts +4 -5
  122. package/dist-types/server/index.d.ts.map +1 -1
  123. package/dist-types/types/index.d.ts +63 -15
  124. package/dist-types/types/index.d.ts.map +1 -1
  125. package/dist-types/ui/Toolbar.d.ts +10 -0
  126. package/dist-types/ui/Toolbar.d.ts.map +1 -1
  127. package/dist-types/ui/doc-tools.d.ts +58 -0
  128. package/dist-types/ui/doc-tools.d.ts.map +1 -0
  129. package/dist-types/ui/icons.d.ts.map +1 -1
  130. package/dist-types/ui/popovers.d.ts +14 -25
  131. package/dist-types/ui/popovers.d.ts.map +1 -1
  132. package/package.json +70 -5
@@ -0,0 +1,22 @@
1
+ export type TagAction = 'keep' | 'unwrap' | 'drop';
2
+ export declare function tagAction(tag: string): TagAction;
3
+ /**
4
+ * 속성 하나를 판정한다. 남길 값(필요하면 고친 값) 또는 버리라는 뜻의 `null`.
5
+ *
6
+ * `tag` · `name` 은 소문자로 넘긴다.
7
+ */
8
+ export declare function cleanAttr(tag: string, name: string, value: string): string | null;
9
+ export declare function safeId(value: string): string | null;
10
+ /**
11
+ * 인라인 `style` 값을 정화한다. 위험한 선언만 빼고 나머지는 그대로 둔다.
12
+ *
13
+ * `url(...)` 은 이미지 URL 로 안전한 것(http(s), data:image, 상대 경로) 만
14
+ * 남긴다. `url(javascript:…)` 는 오래된 브라우저에서 실행된다.
15
+ */
16
+ export declare function cleanStyle(css: string): string;
17
+ /**
18
+ * 새 창으로 여는 링크에 `rel="noopener noreferrer"` 를 보장한다.
19
+ * 열린 페이지가 `window.opener` 로 원래 페이지를 바꿔치기하는 것을 막는다.
20
+ */
21
+ export declare function relForTarget(target: string | null, rel: string | null): string | null;
22
+ //# sourceMappingURL=sanitize-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-policy.d.ts","sourceRoot":"","sources":["../../src/core/sanitize-policy.ts"],"names":[],"mappings":"AAmCA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAoCnD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAKhD;AAkDD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuBjF;AAiBD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnD;AAMD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqB9C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAMrF"}
@@ -20,6 +20,11 @@ export declare function captureSelectionOffsets(root: HTMLElement): SelectionOff
20
20
  * 문서가 짧아져 오프셋이 넘치면 가장 가까운 위치(문서 끝) 에 둔다.
21
21
  */
22
22
  export declare function restoreSelectionOffsets(root: HTMLElement, saved: SelectionOffsets): void;
23
+ /** 문자 오프셋에 해당하는 (텍스트 노드, 노드 안 offset). */
24
+ export declare function pointAtTextOffset(root: HTMLElement, offset: number): {
25
+ node: Node;
26
+ offset: number;
27
+ };
23
28
  /**
24
29
  * 캐럿이 블록의 맨 끝에 있는지.
25
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/core/selection.ts"],"names":[],"mappings":"AAcA,0BAA0B;AAC1B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAE9E;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,GAChB,gBAAgB,GAAG,IAAI,CAgBzB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAcN;AAwBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAavC"}
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/core/selection.ts"],"names":[],"mappings":"AAcA,0BAA0B;AAC1B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAE9E;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,GAChB,gBAAgB,GAAG,IAAI,CAgBzB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,gBAAgB,GACtB,IAAI,CAcN;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,GACb;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBhC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAa/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CAavC"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/core/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGjE;AAqBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,aAAa,EAAE,CAEjB;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAatE"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/core/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGjE;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,aAAa,EAAE,CAEjB;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAatE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * 표 격자 모델 — 병합 셀(`rowspan` · `colspan`) 을 반영한 좌표.
3
+ *
4
+ * ## 왜 필요한가
5
+ *
6
+ * DOM 의 `<tr>` 안 셀 순번은 **열 번호가 아니다.** 위 행의 `rowspan` 이 내려와
7
+ * 자리를 차지하면 그 행의 첫 `<td>` 가 2열일 수 있고, `colspan="2"` 셀 다음
8
+ * 셀은 3열이다. 1.0 은 셀 순번을 열 번호로 써서, 엑셀 · 한글에서 가져온 병합
9
+ * 표에 열을 넣으면 머리글과 데이터가 어긋났다.
10
+ *
11
+ * 여기서는 표를 한 번 훑어 "몇 행 몇 열 칸을 어느 셀이 차지하는가" 를 담은
12
+ * 격자를 만들고, 행 · 열 삽입과 삭제 · 병합 · 분할을 모두 그 격자 위에서
13
+ * 계산한다. 모든 조작은 끝난 뒤에도 표가 **직사각형**(모든 행의 칸 수가 같음)
14
+ * 이도록 유지한다.
15
+ */
16
+ /** 격자 위 셀 하나. `row` · `col` 은 셀이 시작하는 칸(왼쪽 위) 이다. */
17
+ export interface GridCell {
18
+ el: HTMLTableCellElement;
19
+ row: number;
20
+ col: number;
21
+ rowSpan: number;
22
+ colSpan: number;
23
+ }
24
+ export interface TableGrid {
25
+ /** 표의 모든 행 (thead · tbody · tfoot 순서 그대로). */
26
+ rows: HTMLTableRowElement[];
27
+ /** `slots[r][c]` = 그 칸을 차지하는 셀. 빈 칸(모양이 깨진 표) 은 null. */
28
+ slots: (GridCell | null)[][];
29
+ /** 열 수. */
30
+ width: number;
31
+ /** 셀 element → 격자 정보. */
32
+ cells: Map<HTMLTableCellElement, GridCell>;
33
+ }
34
+ /** 직사각형 범위. 양 끝 포함. */
35
+ export interface GridRect {
36
+ top: number;
37
+ left: number;
38
+ bottom: number;
39
+ right: number;
40
+ }
41
+ /** 표를 훑어 격자를 만든다. */
42
+ export declare function buildGrid(table: HTMLTableElement): TableGrid;
43
+ /** 셀이 덮는 범위. */
44
+ export declare function rectOf(cell: GridCell): GridRect;
45
+ /**
46
+ * 두 셀을 모서리로 하는 직사각형. 걸치는 병합 셀이 있으면 그 셀이 통째로
47
+ * 들어오도록 범위를 넓힌다 — 병합 셀의 일부만 고르는 일은 없다.
48
+ */
49
+ export declare function expandRect(grid: TableGrid, rect: GridRect): GridRect;
50
+ /** 직사각형 안의 셀들 (문서 순서, 중복 없음). */
51
+ export declare function cellsInRect(grid: TableGrid, rect: GridRect): HTMLTableCellElement[];
52
+ /** 두 셀을 모서리로 한 선택 범위의 셀들 (병합 셀을 통째로 포함). */
53
+ export declare function cellsBetween(table: HTMLTableElement, a: HTMLTableCellElement, b: HTMLTableCellElement): HTMLTableCellElement[];
54
+ /** `cell` 이 있는 행의 위/아래에 행을 넣는다. 새 행의 첫 셀을 돌려준다. */
55
+ export declare function insertRow(table: HTMLTableElement, cell: HTMLTableCellElement, where: 'above' | 'below'): HTMLTableCellElement | null;
56
+ /** `cell` 이 덮는 행들을 지운다. 표에 행이 하나뿐이면 아무 것도 하지 않는다. */
57
+ export declare function deleteRow(table: HTMLTableElement, cell: HTMLTableCellElement): boolean;
58
+ /** `cell` 이 있는 열의 왼쪽/오른쪽에 열을 넣는다. */
59
+ export declare function insertColumn(table: HTMLTableElement, cell: HTMLTableCellElement, where: 'left' | 'right'): void;
60
+ /** `cell` 이 덮는 열들을 지운다. 열이 하나뿐이면 아무 것도 하지 않는다. */
61
+ export declare function deleteColumn(table: HTMLTableElement, cell: HTMLTableCellElement): boolean;
62
+ /** 고른 셀들을 하나로 합칠 수 있는지 (두 칸 이상을 덮어야 한다). */
63
+ export declare function canMerge(table: HTMLTableElement, cells: readonly HTMLTableCellElement[]): boolean;
64
+ /**
65
+ * 고른 셀들을 감싸는 직사각형을 셀 하나로 합친다. 합쳐진 셀(왼쪽 위) 을
66
+ * 돌려준다. 다른 셀의 내용은 줄을 바꿔 뒤에 이어 붙인다 — 한글 · 워드와 같다.
67
+ */
68
+ export declare function mergeCells(table: HTMLTableElement, cells: readonly HTMLTableCellElement[]): HTMLTableCellElement | null;
69
+ /** 병합 셀을 1×1 칸들로 나눈다. 나눌 것이 없으면 false. */
70
+ export declare function splitCell(table: HTMLTableElement, cell: HTMLTableCellElement): boolean;
71
+ /** 셀이 병합 셀인지. */
72
+ export declare function isMerged(cell: HTMLTableCellElement): boolean;
73
+ /** 격자 순서(행 우선) 로 다음 셀. 마지막 셀이면 null. */
74
+ export declare function gridNextCell(table: HTMLTableElement, cell: HTMLTableCellElement): HTMLTableCellElement | null;
75
+ /** 격자 순서로 이전 셀. 첫 셀이면 null. */
76
+ export declare function gridPreviousCell(table: HTMLTableElement, cell: HTMLTableCellElement): HTMLTableCellElement | null;
77
+ /**
78
+ * 행 · 열을 지운 뒤 캐럿을 둘 셀. 지워지는 범위 바로 아래(오른쪽) 셀, 없으면
79
+ * 바로 위(왼쪽) 셀. 지우기 **전에** 부른다.
80
+ */
81
+ export declare function neighborAfterDelete(table: HTMLTableElement, cell: HTMLTableCellElement, axis: 'row' | 'col'): HTMLTableCellElement | null;
82
+ /**
83
+ * 열 너비를 끌어 바꿀 때 너비를 줄 셀들 — `cell` 의 오른쪽 경계 열에 있는
84
+ * 1칸짜리 셀. 병합 셀의 너비는 그 열들의 합이라 브라우저가 맞춘다.
85
+ */
86
+ export declare function columnCells(table: HTMLTableElement, cell: HTMLTableCellElement): HTMLTableCellElement[];
87
+ //# sourceMappingURL=table-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-grid.d.ts","sourceRoot":"","sources":["../../src/core/table-grid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,oBAAoB,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,8CAA8C;IAC9C,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,yDAAyD;IACzD,KAAK,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7B,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;CAC5C;AAED,uBAAuB;AACvB,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AA6BD,qBAAqB;AACrB,wBAAgB,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CA6B5D;AAuCD,gBAAgB;AAChB,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAO/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAkBpE;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAanF;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,CAAC,EAAE,oBAAoB,EACvB,CAAC,EAAE,oBAAoB,GACtB,oBAAoB,EAAE,CAcxB;AAuBD,mDAAmD;AACnD,wBAAgB,SAAS,CACvB,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,OAAO,GAAG,OAAO,GACvB,oBAAoB,GAAG,IAAI,CAuC7B;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAUtF;AAyBD,qCAAqC;AACrC,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,MAAM,GAAG,OAAO,GACtB,IAAI,CAiCN;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAmBzF;AAiBD,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,oBAAoB,EAAE,GAAG,OAAO,CAMjG;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,SAAS,oBAAoB,EAAE,GACrC,oBAAoB,GAAG,IAAI,CAoB7B;AAED,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAiBtF;AAED,iBAAiB;AACjB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAE5D;AA4BD,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,GAAG,IAAI,CAI7G;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,GAAG,IAAI,CAIjH;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE,KAAK,GAAG,KAAK,GAClB,oBAAoB,GAAG,IAAI,CAW7B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAUvG"}
@@ -1,30 +1,10 @@
1
1
  /**
2
- * 표 셀의 기하와 이동.
2
+ * 표 셀 하나에 대한 판정 — 노드가 속한 셀, 포인터가 셀 가장자리에 있는지.
3
3
  *
4
- * 표 편집은 "지금 어느 셀인가" 를 계속 되묻는 일이다 — 캐럿이 놓인 셀, 드래그
5
- * 로 걸친 셀 범위, 마우스가 가장자리에 닿았는지, Tab 을 눌렀을 때 다음 셀.
6
- * 그 판정들만 여기 모은다. 에디터 인스턴스 상태를 보지 않는 순수 계산이라
7
- * 따로 두면 표 동작을 고칠 때 에디터 본체를 읽지 않아도 된다.
8
- *
9
- * **rowspan / colspan 은 고려하지 않는다.** 이 에디터는 둘 다 만들지 않으며,
10
- * 병합 셀을 지원하게 되면 여기 있는 인덱스 계산은 전부 다시 짜야 한다.
4
+ * 행 · 열 · 병합처럼 표 전체 모양을 따지는 계산은 `table-grid` 에 있다.
11
5
  */
12
6
  /** 임의의 노드에서 가장 가까운 td/th element. 없으면 null. */
13
7
  export declare function nearestCell(node: Node): HTMLTableCellElement | null;
14
- /**
15
- * 다음 표 셀. 행 끝이면 다음 행의 첫 셀, 표의 마지막 셀이면 **새 행을 만들어**
16
- * 그 첫 셀을 돌려준다 — Tab 만으로 표를 끝까지 채울 수 있도록.
17
- */
18
- export declare function nextTableCell(cell: HTMLTableCellElement, table: HTMLTableElement): HTMLTableCellElement | null;
19
- /** 이전 표 셀. 첫 셀이면 null. */
20
- export declare function previousTableCell(cell: HTMLTableCellElement): HTMLTableCellElement | null;
21
- /**
22
- * `startCell` 과 `endCell` 을 모서리로 하는 사각 영역의 모든 td/th.
23
- *
24
- * thead 와 tbody 가 섞여 있어도 `querySelectorAll('tr')` 의 document order 로
25
- * 단일 행 인덱스를 매긴다 — 사용자 눈에 보이는 순서와 같다.
26
- */
27
- export declare function cellsInRectangle(table: HTMLTableElement, startCell: HTMLTableCellElement, endCell: HTMLTableCellElement): HTMLTableCellElement[];
28
8
  /** 셀의 우/하 가장자리에 포인터가 있으면 'right' / 'bottom'. 아니면 null. */
29
9
  export declare function detectCellEdge(cell: HTMLTableCellElement, x: number, y: number): 'right' | 'bottom' | null;
30
10
  //# sourceMappingURL=table-ops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-ops.d.ts","sourceRoot":"","sources":["../../src/core/table-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,oBAAoB,GAAG,IAAI,CAMnE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,gBAAgB,GACtB,oBAAoB,GAAG,IAAI,CAO7B;AAED,0BAA0B;AAC1B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,oBAAoB,GACzB,oBAAoB,GAAG,IAAI,CAM7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,gBAAgB,EACvB,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,EAAE,CA8BxB;AAKD,0DAA0D;AAC1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,oBAAoB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,GAAG,QAAQ,GAAG,IAAI,CAQ3B"}
1
+ {"version":3,"file":"table-ops.d.ts","sourceRoot":"","sources":["../../src/core/table-ops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,oBAAoB,GAAG,IAAI,CAMnE;AAKD,0DAA0D;AAC1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,oBAAoB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,GAAG,QAAQ,GAAG,IAAI,CAQ3B"}
@@ -0,0 +1,5 @@
1
+ import type { CodeHighlighter } from '../types/index.js';
2
+ export type { CodeHighlighter } from '../types/index.js';
3
+ /** 기본 제공 언어 16 종(Plain Text 포함) 의 색칠기. */
4
+ export declare const highlighter: CodeHighlighter;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/highlight/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,0CAA0C;AAC1C,eAAO,MAAM,WAAW,EAAE,eAGzB,CAAC"}
@@ -1,22 +1,30 @@
1
+ /**
2
+ * `@aeriz/wysiwyg` — 브라우저 진입점. 스타일시트를 부수 효과로 불러온다.
3
+ *
4
+ * 여기서 내보내는 것이 공개 API 의 전부다. 에디터 내부(블록 레지스트리 ·
5
+ * 정규화 · HTML 파서 · 로케일 사전) 는 내보내지 않는다 — 내보내면 고칠 때마다
6
+ * 호환이 깨진다. 서버(Node · workerd · Deno) 에서는 CSS 를 끌어오지 않는
7
+ * `@aeriz/wysiwyg/server` 를 쓴다.
8
+ */
1
9
  // (CSS 부수 효과 import 는 타입 선언에서 제거됨 — scripts/strip-css-imports.mjs)
2
10
  export { AerizEditor } from './core/AerizEditor.js';
3
- export type { EditorState, EditorStateListener, InlineState, } from './core/AerizEditor.js';
11
+ export type { EditorState, EditorStateListener, InlineState } from './core/AerizEditor.js';
4
12
  export { AerizViewer } from './core/AerizViewer.js';
5
13
  export type { ViewerOptions } from './core/AerizViewer.js';
6
- export { ALIGN_CLASS_BY_VALUE, ALL_INLINE_MARKS, BLOCK_ID_ATTR, BLOCK_TYPES, BLOCK_TYPE_BY_KIND, BlockIdRegistry, applyBlockClassNames, applyBlockInlineStyles, assignMissingIds, classifyBlockElement, extractInlineContent, fillInlineContent, findBlockFrom, getBlockLabel, isElementBlank, listBlocks, normalizeContent, placeCaretAtStart, readBlockStyleTheme, renderBlock, renderBlocks, serializeBlock, serializeBlocks, restoreAlignFromClasses, stripEditorOnlyAttrs, stripEditorOnlyNodes, } from './core/blocks.js';
7
- export type { BlockStyleTheme } from './core/blocks.js';
8
- export type { Block, BlockAttrs, BlockAttrsByKind, BlockIdResolver, BlockKind, BlockMatch, BlockSnapshot, BlockType, BlockquoteAttrs, BulletListAttrs, ClassifyResult, CodeBlockAttrs, FileAttrs, HeadingAttrs, HeadingLevel, HrAttrs, ImageAttrs, ImportedHtmlAttrs, InlineMarkName, LinkCardAttrs, OrderedListAttrs, ParagraphAttrs, Snapshot, TableAttrs, UnknownAttrs, YoutubeAttrs, } from './core/blocks.js';
9
- export { getLocale, setLocale, t } from './core/i18n.js';
10
- export type { Locale, Strings } from './core/i18n.js';
11
- export type { EditorOptions, HtmlStyleMode, SerializeHtmlOptions, ToolbarConfig, ToolbarItem, ToolbarItemName, } from './types/index.js';
14
+ export type { EditorErrorCode, EditorOptions, HtmlStyleMode, SerializeHtmlOptions, ToolbarConfig, ToolbarItem, ToolbarItemName, UploadOptions, CodeHighlighter, } from './types/index.js';
12
15
  export { DEFAULT_TOOLBAR } from './types/index.js';
13
- export { SNAPSHOT_VERSION, snapshotVersionOf, upgradeSnapshot, upgradeSnapshots, } from './core/snapshot.js';
14
- export { renderBlockToHTML, renderBlocksToHTML } from './core/render-string.js';
16
+ export { DEFAULT_FONTS, DEFAULT_FONT_SIZES } from './core/fonts.js';
17
+ export type { FontFamily } from './core/fonts.js';
18
+ export type { Locale } from './core/i18n.js';
19
+ export { SNAPSHOT_VERSION, upgradeSnapshots } from './core/snapshot.js';
20
+ export { renderBlocksToHTML } from './core/render-string.js';
15
21
  export type { RenderHtmlOptions } from './core/render-string.js';
22
+ export { sanitizeHTML } from './core/sanitize-html.js';
23
+ export { htmlToBlocks } from './core/html-to-blocks.js';
16
24
  export { blocksToMarkdown } from './core/markdown-export.js';
17
25
  export type { MarkdownOptions } from './core/markdown-export.js';
26
+ export { markdownToBlocks, markdownToHtml } from './core/import-markdown.js';
18
27
  export { blocksToPlainText } from './core/plain-text.js';
19
28
  export type { PlainTextOptions } from './core/plain-text.js';
20
- export { decodeEntities, escapeAttr, escapeHtml, parseHtmlFragment, serializeNodes, textOf, textWithBlockBreaks, } from './core/html-mini.js';
21
- export type { HtmlElementNode, HtmlNode, HtmlText } from './core/html-mini.js';
29
+ export type { Block, BlockAttrs, BlockAttrsByKind, BlockKind, BlockSnapshot, BlockquoteAttrs, BulletListAttrs, CodeBlockAttrs, FileAttrs, HeadingAttrs, HeadingLevel, HrAttrs, ImageAttrs, ImportedHtmlAttrs, InlineMarkName, LinkCardAttrs, OrderedListAttrs, ParagraphAttrs, Snapshot, TableAttrs, UnknownAttrs, YoutubeAttrs, } from './core/blocks.js';
22
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EACV,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnD,YAAY,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ1C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EACL,cAAc,EACd,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,YAAY,EACV,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,eAAe,CAAC"}
@@ -24,14 +24,13 @@
24
24
  * },
25
25
  * };
26
26
  */
27
- export { renderBlockToHTML, renderBlocksToHTML, } from '../core/render-string.js';
27
+ export { renderBlocksToHTML } from '../core/render-string.js';
28
28
  export type { RenderHtmlOptions } from '../core/render-string.js';
29
+ export { sanitizeHTML } from '../core/sanitize-html.js';
29
30
  export { blocksToMarkdown } from '../core/markdown-export.js';
30
31
  export type { MarkdownOptions } from '../core/markdown-export.js';
31
32
  export { blocksToPlainText } from '../core/plain-text.js';
32
33
  export type { PlainTextOptions } from '../core/plain-text.js';
33
- export { SNAPSHOT_VERSION, snapshotVersionOf, upgradeSnapshot, upgradeSnapshots, } from '../core/snapshot.js';
34
- export type { Block, BlockAttrs, BlockAttrsByKind, BlockKind, BlockSnapshot, BlockquoteAttrs, BulletListAttrs, CodeBlockAttrs, FileAttrs, HeadingAttrs, HeadingLevel, HrAttrs, ImageAttrs, ImportedHtmlAttrs, InlineMarkName, LinkCardAttrs, OrderedListAttrs, ParagraphAttrs, Snapshot, TableAttrs, UnknownAttrs, YoutubeAttrs, } from '../core/blocks.js';
35
- export { decodeEntities, escapeAttr, escapeHtml, parseHtmlFragment, serializeNodes, textOf, textWithBlockBreaks, } from '../core/html-mini.js';
36
- export type { HtmlElementNode, HtmlNode, HtmlText } from '../core/html-mini.js';
34
+ export { SNAPSHOT_VERSION, upgradeSnapshots } from '../core/snapshot.js';
35
+ export type { BlockAttrs, BlockAttrsByKind, BlockKind, BlockSnapshot, BlockquoteAttrs, BulletListAttrs, CodeBlockAttrs, FileAttrs, HeadingAttrs, HeadingLevel, HrAttrs, ImageAttrs, ImportedHtmlAttrs, InlineMarkName, LinkCardAttrs, OrderedListAttrs, ParagraphAttrs, Snapshot, TableAttrs, UnknownAttrs, YoutubeAttrs, } from '../core/blocks.js';
37
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EACL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAI1B,YAAY,EACV,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EACL,cAAc,EACd,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAItE,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -1,5 +1,6 @@
1
+ import type { FontFamily } from '../core/fonts.js';
1
2
  export type ToolbarItem = ToolbarItemName | '|';
2
- export type ToolbarItemName = 'undo' | 'redo' | 'blockType' | 'fontFamily' | 'fontSize' | 'bold' | 'italic' | 'underline' | 'strike' | 'color' | 'backgroundColor' | 'align' | 'cellBg' | 'tableMenu' | 'codeLang' | 'bulletList' | 'orderedList' | 'blockquote' | 'codeBlock' | 'link' | 'image' | 'table' | 'hr' | 'clearFormat';
3
+ export type ToolbarItemName = 'undo' | 'redo' | 'blockType' | 'fontFamily' | 'fontSize' | 'bold' | 'italic' | 'underline' | 'strike' | 'superscript' | 'subscript' | 'color' | 'backgroundColor' | 'align' | 'cellBg' | 'tableMenu' | 'codeLang' | 'bulletList' | 'orderedList' | 'blockquote' | 'codeBlock' | 'link' | 'image' | 'table' | 'hr' | 'clearFormat' | 'lineHeight' | 'letterSpacing' | 'specialChar' | 'findReplace' | 'source' | 'print' | 'fullscreen';
3
4
  export interface ToolbarConfig {
4
5
  items: ToolbarItem[];
5
6
  sticky?: boolean;
@@ -24,6 +25,12 @@ export interface EditorOptions {
24
25
  element: HTMLElement;
25
26
  initialHTML?: string;
26
27
  placeholder?: string;
28
+ /**
29
+ * 아래쪽 상태바(되돌리기 · 블록 수 · 글자 수) 를 보일지. 기본 `true`.
30
+ */
31
+ statusBar?: boolean;
32
+ /** 본문 편집 영역의 접근성 이름(aria-label). 기본은 로케일의 "본문 편집기". */
33
+ ariaLabel?: string;
27
34
  toolbar?: ToolbarConfig | false;
28
35
  theme?: 'light' | 'dark';
29
36
  /** UI 언어. 'en' / 'ko' / 'ja' / 'zh'. 기본 'ko'. */
@@ -35,27 +42,68 @@ export interface EditorOptions {
35
42
  htmlStyles?: HtmlStyleMode;
36
43
  onChange?: (html: string) => void;
37
44
  /**
38
- * 직접 업로드 핸들러. 우선 적용된다. 미설정 + `imageUploadUrl` 만 있을 때는
39
- * 에디터가 multipart/form-data 로 그 URL 에 POST 한 응답 JSON 의
40
- * `url` 필드를 사용한다.
45
+ * 읽기 전용. 글을 고칠 수 없고 툴바는 인쇄 · 전체 화면만 쓸 수 있다.
46
+ * 나중에 바꾸려면 `editor.setReadOnly()`.
47
+ */
48
+ readOnly?: boolean;
49
+ /**
50
+ * 에디터 높이. 숫자는 px, 문자열은 CSS 값('60vh' 등). 지정하면 본문이 그 안에서
51
+ * 스크롤된다. 지정하지 않으면 부모 높이를 채우고 최소 320px 이다.
41
52
  */
42
- onImageUpload?: (file: File) => Promise<string>;
53
+ height?: number | string;
54
+ /** 그림 · 파일 올리기. 없으면 다이얼로그의 "올리기" 탭이 꺼지고 붙여넣은 그림은 문서에 그대로 담긴다. */
55
+ upload?: UploadOptions;
43
56
  /**
44
- * 서버 이미지 업로드 API URL. 설정 시 이미지 다이얼로그의 "업로드" 탭이
45
- * 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
57
+ * 에디터 안에서 난 오류(올리기 실패 등). 지정하지 않으면 콘솔에 남긴다.
58
+ * `code` 로 종류를 가린다.
46
59
  */
47
- imageUploadUrl?: string;
60
+ onError?: (error: Error, context: {
61
+ code: EditorErrorCode;
62
+ }) => void;
48
63
  /**
49
- * 파일 첨부 직접 업로드 핸들러. 첨부 다이얼로그의 "업로드" 탭에서 사용.
50
- * 미설정 + `fileUploadUrl` 만 있을 때는 에디터가 multipart/form-data 로
51
- * POST 한 응답 JSON 의 `url` 필드를 사용한다.
64
+ * 코드 블록 색칠기. 없으면 코드는 색 없이 보이고 언어 고르기 버튼도 숨는다.
65
+ * 기본 색칠기는 `import { highlighter } from '@aeriz/wysiwyg/highlight'`.
52
66
  */
53
- onFileUpload?: (file: File) => Promise<string>;
67
+ highlighter?: CodeHighlighter;
54
68
  /**
55
- * 서버 파일 업로드 API URL. 설정 시 파일 첨부 다이얼로그의 "업로드" 탭이
56
- * 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
69
+ * 글꼴 드롭다운 목록. 기본은 한국 문서에서 쓰는 시스템 글꼴(맑은 고딕 · 굴림 ·
70
+ * 돋움 · 바탕 · 궁서 …) 이며 네트워크를 쓰지 않는다. 웹폰트는 `cssUrl` 을
71
+ * 함께 주면 드롭다운을 처음 열 때 받는다. 이 PC 에 없는 글꼴은 목록에서 빠진다.
72
+ *
73
+ * `{ label: '', stack: '' }` 항목은 "기본 글꼴"(서식 지우기) 이다.
57
74
  */
58
- fileUploadUrl?: string;
75
+ fonts?: ReadonlyArray<FontFamily>;
76
+ /** 글자 크기 드롭다운 목록(pt). 기본 8 ~ 48pt. */
77
+ fontSizes?: ReadonlyArray<number>;
78
+ }
79
+ /** `onError` 의 오류 종류. */
80
+ export type EditorErrorCode = 'upload' | 'paste';
81
+ /**
82
+ * 그림 · 파일 올리기 설정. 둘 중 하나를 준다.
83
+ *
84
+ * - `url` — 그 주소로 `multipart/form-data`(필드 `file`, `kind`) 를 POST 하고,
85
+ * 응답 JSON 의 `url` 을 쓴다. 인증이 필요하면 `headers`.
86
+ * - `handler` — 직접 올리고 주소를 돌려준다 (S3 서명 URL 등).
87
+ */
88
+ /**
89
+ * 코드 블록 색칠기. `highlight` 는 글을 받아 HTML 을 돌려준다. 결과는 `<span class>`
90
+ * 만 남기고 걸러서 넣으므로, 다른 태그나 속성은 무시된다.
91
+ */
92
+ export interface CodeHighlighter {
93
+ /** 언어 고르기 목록. `id` 는 `<code data-language>` 에 저장된다. */
94
+ languages: ReadonlyArray<{
95
+ id: string;
96
+ label: string;
97
+ }>;
98
+ highlight(code: string, languageId: string | undefined): string;
99
+ }
100
+ export interface UploadOptions {
101
+ url?: string;
102
+ /** `url` 로 보낼 때 붙일 헤더. 함수면 보낼 때마다 불러 최신 토큰을 쓴다. */
103
+ headers?: Record<string, string> | (() => Record<string, string>);
104
+ handler?: (file: File, kind: 'image' | 'file') => Promise<string>;
105
+ /** 올릴 수 있는 최대 크기(바이트). 넘으면 올리지 않고 `onError('upload')`. */
106
+ maxSize?: number;
59
107
  }
60
108
  export declare const DEFAULT_TOOLBAR: ToolbarConfig;
61
109
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,GAAG,CAAC;AAEhD,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,MAAM,GACN,WAAW,GACX,YAAY,GACZ,UAAU,GACV,MAAM,GACN,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,OAAO,GACP,iBAAiB,GACjB,OAAO,GACP,QAAQ,GACR,WAAW,GACX,UAAU,GACV,YAAY,GACZ,aAAa,GACb,YAAY,GACZ,WAAW,GACX,MAAM,GACN,OAAO,GACP,OAAO,GACP,IAAI,GACJ,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,4BAA4B;AAC5B,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC;IAChC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,iDAAiD;IACjD,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,aAiC7B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,21 @@
1
1
  import type { ToolbarConfig, ToolbarItemName } from '../types/index.js';
2
2
  export interface ToolbarHandlers {
3
3
  onAction: (name: ToolbarItemName, anchor: HTMLElement) => void;
4
+ /** 툴바에서 Esc — 본문으로 돌아간다. */
5
+ onEscape: () => void;
4
6
  }
5
7
  export declare class Toolbar {
6
8
  readonly element: HTMLDivElement;
7
9
  private buttons;
8
10
  constructor(config: ToolbarConfig, handlers: ToolbarHandlers);
11
+ /** 툴바에 있는 항목 이름들. */
12
+ names(): ToolbarItemName[];
13
+ /** 툴바로 포커스를 옮긴다 (Alt+F10). 마지막으로 머문 버튼, 없으면 첫 버튼. */
14
+ focus(): void;
15
+ /** 소스 보기처럼 툴바 대부분을 잠글 때. `except` 는 계속 쓸 수 있다. */
16
+ setAllEnabled(enabled: boolean, except: ToolbarItemName): void;
17
+ private focusable;
18
+ private handleKeydown;
9
19
  setActive(name: ToolbarItemName, active: boolean): void;
10
20
  setEnabled(name: ToolbarItemName, enabled: boolean): void;
11
21
  /** 조건부 항목을 완전히 숨긴다 (display:none). 허용 블록으로 돌아오면 다시 보임. */
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/ui/Toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,eAAe,EAAE,MAAM,UAAU,CAAC;AAI5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAChE;AA4CD,qBAAa,OAAO;IAClB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,OAAO,CAAiD;gBAEpD,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe;IA2B5D,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAOvD,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAMzD,0DAA0D;IAC1D,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAMzD;;;OAGG;IACH,mBAAmB,IAAI,IAAI;IAU3B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;CA4BrB"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/ui/Toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,eAAe,EAAE,MAAM,UAAU,CAAC;AAI5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/D,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAqDD,qBAAa,OAAO;IAClB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,OAAO,CAAiD;gBAEpD,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe;IA0C5D,qBAAqB;IACrB,KAAK,IAAI,eAAe,EAAE;IAI1B,qDAAqD;IACrD,KAAK,IAAI,IAAI;IAMb,kDAAkD;IAClD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAO9D,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa;IAkBrB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAWvD,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAMzD,0DAA0D;IAC1D,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOzD;;;OAGG;IACH,mBAAmB,IAAI,IAAI;IAW3B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;CA8BrB"}
@@ -0,0 +1,58 @@
1
+ /** 줄 간격(%). 한글의 기본값 160% 를 포함한다. */
2
+ export declare const LINE_HEIGHTS: ReadonlyArray<number>;
3
+ /** 자간(em 의 백분율). 한글의 자간 -5% 는 letter-spacing: -0.05em 이다. */
4
+ export declare const LETTER_SPACINGS: ReadonlyArray<number>;
5
+ /** 줄 간격 드롭다운. `current` 는 지금 블록의 line-height(%), 모르면 null. */
6
+ export declare function openLineHeightDropdown(anchor: HTMLElement, onPick: (percent: number) => void, current: number | null): void;
7
+ /** 자간 드롭다운. 값은 em 의 백분율(-5 → -0.05em). */
8
+ export declare function openLetterSpacingDropdown(anchor: HTMLElement, onPick: (percent: number) => void, current: number | null): void;
9
+ /** 특수 문자 표. 고르면 `onPick(char)` — 팝오버는 열어 둔다(여러 개 넣기). */
10
+ export declare function openSpecialCharDropdown(anchor: HTMLElement, onPick: (char: string) => void): void;
11
+ interface Match {
12
+ range: Range;
13
+ }
14
+ /**
15
+ * 본문 안 글자 검색. 블록마다 텍스트 노드를 이어 붙인 문자열에서 찾으므로
16
+ * 굵게 · 색 같은 서식 경계를 넘는 낱말도 찾는다. 블록 경계는 넘지 않는다.
17
+ */
18
+ export declare function findInContent(root: HTMLElement, query: string, matchCase: boolean): Match[];
19
+ export interface FindPanelHost {
20
+ content: HTMLElement;
21
+ /** 바꾸기 전에 부른다 — 이력이 한 단계로 묶이도록. */
22
+ beforeChange(): void;
23
+ /** 바꾼 뒤에 부른다. */
24
+ afterChange(): void;
25
+ }
26
+ /**
27
+ * 찾기 · 바꾸기 패널. 에디터 위쪽에 붙는 작은 막대다 — 모달로 띄우면 찾은
28
+ * 자리를 가린다.
29
+ */
30
+ export declare class FindPanel {
31
+ private readonly host;
32
+ readonly element: HTMLDivElement;
33
+ private readonly findInput;
34
+ private readonly replaceInput;
35
+ private readonly caseBox;
36
+ private readonly status;
37
+ private matches;
38
+ private index;
39
+ constructor(host: FindPanelHost);
40
+ get isOpen(): boolean;
41
+ open(): void;
42
+ close(): void;
43
+ /** 문서가 바뀌면 다시 찾는다 (열려 있을 때만). */
44
+ refresh(): void;
45
+ private search;
46
+ private step;
47
+ private paint;
48
+ private replaceOne;
49
+ private replaceAll;
50
+ }
51
+ /**
52
+ * 문서만 인쇄한다 — 툴바 · 핸들 · 페이지의 다른 부분 없이. 보이지 않는 iframe
53
+ * 에 `getHTML()` 결과(스타일이 인라인으로 들어 있다) 를 넣고 그 창을 인쇄한다.
54
+ * iframe 은 스크립트를 돌리지 않는다(sandbox) — 인쇄만 허용한다.
55
+ */
56
+ export declare function printHtml(html: string, title: string): void;
57
+ export {};
58
+ //# sourceMappingURL=doc-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-tools.d.ts","sourceRoot":"","sources":["../../src/ui/doc-tools.ts"],"names":[],"mappings":"AAYA,oCAAoC;AACpC,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,CAAiD,CAAC;AAEjG,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,MAAM,CAAkC,CAAC;AAiCrF,8DAA8D;AAC9D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACjC,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,IAAI,CAON;AAED,0CAA0C;AAC1C,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACjC,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,IAAI,CAWN;AAcD,yDAAyD;AACzD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CA8BjG;AAID,UAAU,KAAK;IACb,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,CAmC3F;AAaD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,mCAAmC;IACnC,YAAY,IAAI,IAAI,CAAC;IACrB,iBAAiB;IACjB,WAAW,IAAI,IAAI,CAAC;CACrB;AAoBD;;;GAGG;AACH,qBAAa,SAAS;IASR,OAAO,CAAC,QAAQ,CAAC,IAAI;IARjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,KAAK,CAAM;gBAEU,IAAI,EAAE,aAAa;IA+ChD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,IAAI,IAAI;IAUZ,KAAK,IAAI,IAAI;IAUb,iCAAiC;IACjC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,KAAK;IAwBb,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,UAAU;CAUnB;AAyCD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA8B3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/ui/icons.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqCxC,CAAC"}
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/ui/icons.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgDxC,CAAC"}
@@ -1,4 +1,7 @@
1
1
  import type { BlockAttrs, BlockKind } from '../core/blocks.js';
2
+ import type { FontFamily } from '../core/fonts.js';
3
+ /** contentEditable 선택 영역이 사라지지 않도록 mousedown 시 포커스 이동을 막는다. */
4
+ export declare function preserveSelection(el: HTMLElement): void;
2
5
  export declare const COLOR_PALETTE: string[];
3
6
  export declare function openColorPicker(anchor: HTMLElement, onPick: (color: string | null) => void, recents?: ReadonlyArray<string>): void;
4
7
  /**
@@ -12,46 +15,30 @@ export interface BlockTypeChoice {
12
15
  }
13
16
  export declare function openBlockTypeDropdown(anchor: HTMLElement, onPick: (choice: BlockTypeChoice) => void): void;
14
17
  export declare function openAlignDropdown(anchor: HTMLElement, onPick: (value: 'left' | 'center' | 'right' | 'justify') => void): void;
15
- export interface FontFamilyChoice {
16
- id: string;
17
- label: string;
18
- stack: string;
19
- }
20
18
  /**
21
- * 글꼴 선택 드롭다운. 첫 호출 시 모든 글꼴 CSS 를 lazy 로드(Google Fonts +
22
- * Pretendard CDN), 항목 라벨은 각 글꼴 자신으로 미리보기 렌더한다.
23
- *
24
- * - `currentId` 가 지정되면 해당 글꼴 항목에 `aw-popover-item-active` 적용
25
- * - 선택 시 `onPick(choice)` 호출 + 팝오버 닫힘
19
+ * 글꼴 드롭다운. 항목 이름 옆 미리보기('가A') 만 그 글꼴로 그린다.
20
+ * 이 PC 에 없는 글꼴은 확인되는 대로 목록에서 빠진다.
26
21
  */
27
- export declare function openFontFamilyDropdown(anchor: HTMLElement, onPick: (choice: FontFamilyChoice) => void, currentId?: string): void;
22
+ export declare function openFontFamilyDropdown(anchor: HTMLElement, fonts: ReadonlyArray<FontFamily>, onPick: (font: FontFamily) => void, current?: FontFamily | null): void;
28
23
  export interface CodeLanguageChoice {
29
24
  id: string;
30
25
  label: string;
31
26
  }
32
27
  /**
33
- * 코드 블록의 언어 선택 드롭다운. highlight.ts 의 LANGUAGES 를 그대로 노출.
28
+ * 코드 블록의 언어 선택 드롭다운. 색칠기(`highlighter.languages`) 의 목록을 보여 준다.
34
29
  *
35
30
  * - `currentId` 가 일치하는 항목에 active(✓) 표시
36
31
  * - 선택 시 onPick(choice) 호출 + 팝오버 닫힘
37
32
  */
38
- export declare function openCodeLanguageDropdown(anchor: HTMLElement, onPick: (choice: CodeLanguageChoice) => void, currentId?: string): void;
39
- export type TableMenuAction = 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'deleteRow' | 'deleteCol';
33
+ export declare function openCodeLanguageDropdown(anchor: HTMLElement, languages: ReadonlyArray<CodeLanguageChoice>, onPick: (choice: CodeLanguageChoice) => void, currentId?: string): void;
34
+ export type TableMenuAction = 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'deleteRow' | 'deleteCol' | 'mergeCells' | 'splitCell';
40
35
  /**
41
36
  * 표 편집 드롭다운 — 행/열 추가·삭제. 활성 블록이 table 일 때만 의미가 있어
42
37
  * AerizEditor 가 toolbar 'tableMenu' 항목 클릭 시점에 호출.
43
38
  */
44
- export declare function openTableMenuDropdown(anchor: HTMLElement, onPick: (action: TableMenuAction) => void): void;
45
- export interface FontSizeChoice {
46
- px: number;
47
- }
48
- /**
49
- * 글자 크기 프리셋 드롭다운. FONT_SIZES 의 px 값을 작은 라벨로 나열.
50
- *
51
- * - `currentPx` 가 일치하는 항목에 active 표시
52
- * - 선택 시 `onPick({ px })` 호출 + 팝오버 닫힘
53
- */
54
- export declare function openFontSizeDropdown(anchor: HTMLElement, onPick: (choice: FontSizeChoice) => void, currentPx?: number): void;
39
+ export declare function openTableMenuDropdown(anchor: HTMLElement, onPick: (action: TableMenuAction) => void, disabled?: ReadonlySet<TableMenuAction>): void;
40
+ /** 글자 크기(pt) 드롭다운. `current` 와 같은 항목에 표시. */
41
+ export declare function openFontSizeDropdown(anchor: HTMLElement, sizes: ReadonlyArray<number>, onPick: (pt: number) => void, current?: number | null): void;
55
42
  /**
56
43
  * 기능 미구현 메뉴 항목용 placeholder 드롭다운.
57
44
  * 항목명만 노출하고 "준비 중" 메시지를 보여준다.
@@ -67,4 +54,6 @@ export interface TableSizeChoice {
67
54
  cols: number;
68
55
  }
69
56
  export declare function openTableDropdown(anchor: HTMLElement, onPick: (choice: TableSizeChoice) => void): void;
57
+ export declare function anchorPopover(popover: HTMLElement, anchor: HTMLElement): void;
58
+ export declare function closeAllPopovers(): void;
70
59
  //# sourceMappingURL=popovers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"popovers.d.ts","sourceRoot":"","sources":["../../src/ui/popovers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqB5D,eAAO,MAAM,aAAa,UAKzB,CAAC;AAEF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EACtC,OAAO,GAAE,aAAa,CAAC,MAAM,CAAM,GAClC,IAAI,CA6FN;AAID;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,gBAAgB,CAAC;IAClD,KAAK,EAAE,UAAU,CAAC;CACnB;AA+HD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACxC,IAAI,CA4CN;AAID,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,KAAK,IAAI,GAC/D,IAAI,CAgCN;AAID,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,EAC1C,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAyDN;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,EAC5C,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CA+BN;AAID,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,UAAU,GACV,SAAS,GACT,UAAU,GACV,WAAW,GACX,WAAW,CAAC;AAoBhB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACxC,IAAI,CA2BN;AAID,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,EACxC,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CA+BN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB/E;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACxC,IAAI,CA8FN"}
1
+ {"version":3,"file":"popovers.d.ts","sourceRoot":"","sources":["../../src/ui/popovers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAEvD;AAID,eAAO,MAAM,aAAa,UAKzB,CAAC;AAEF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EACtC,OAAO,GAAE,aAAa,CAAC,MAAM,CAAM,GAClC,IAAI,CA6FN;AAID;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,gBAAgB,CAAC;IAClD,KAAK,EAAE,UAAU,CAAC;CACnB;AA6ID,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACxC,IAAI,CA4CN;AAID,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,KAAK,IAAI,GAC/D,IAAI,CAgCN;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,EAChC,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,EAClC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,GAC1B,IAAI,CAwDN;AAID,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,EAC5C,MAAM,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,EAC5C,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CA+BN;AAID,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,UAAU,GACV,SAAS,GACT,UAAU,GACV,WAAW,GACX,WAAW,GACX,YAAY,GACZ,WAAW,CAAC;AAsBhB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,EACzC,QAAQ,GAAE,WAAW,CAAC,eAAe,CAAa,GACjD,IAAI,CA4BN;AAID,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,IAAI,CA+BN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiB/E;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACxC,IAAI,CA8FN;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CA4D7E;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}