@aeriz/wysiwyg 1.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.
- package/LICENSE +201 -0
- package/dist/aeriz-wysiwyg.css +1471 -0
- package/dist/aeriz-wysiwyg.esm.js +5602 -0
- package/dist/aeriz-wysiwyg.esm.min.js +4227 -0
- package/dist/aeriz-wysiwyg.js +5605 -0
- package/dist/aeriz-wysiwyg.min.css +1 -0
- package/dist/aeriz-wysiwyg.min.js +23 -0
- package/dist-types/core/AerizEditor.d.ts +337 -0
- package/dist-types/core/AerizEditor.d.ts.map +1 -0
- package/dist-types/core/AerizViewer.d.ts +49 -0
- package/dist-types/core/AerizViewer.d.ts.map +1 -0
- package/dist-types/core/blocks.d.ts +303 -0
- package/dist-types/core/blocks.d.ts.map +1 -0
- package/dist-types/core/fonts.d.ts +49 -0
- package/dist-types/core/fonts.d.ts.map +1 -0
- package/dist-types/core/highlight.d.ts +44 -0
- package/dist-types/core/highlight.d.ts.map +1 -0
- package/dist-types/core/i18n.d.ts +209 -0
- package/dist-types/core/i18n.d.ts.map +1 -0
- package/dist-types/core/import-html.d.ts +28 -0
- package/dist-types/core/import-html.d.ts.map +1 -0
- package/dist-types/core/import-markdown.d.ts +37 -0
- package/dist-types/core/import-markdown.d.ts.map +1 -0
- package/dist-types/index.d.ts +11 -0
- package/dist-types/index.d.ts.map +1 -0
- package/dist-types/types/index.d.ts +40 -0
- package/dist-types/types/index.d.ts.map +1 -0
- package/dist-types/ui/Toolbar.d.ts +21 -0
- package/dist-types/ui/Toolbar.d.ts.map +1 -0
- package/dist-types/ui/dialogs.d.ts +74 -0
- package/dist-types/ui/dialogs.d.ts.map +1 -0
- package/dist-types/ui/icons.d.ts +2 -0
- package/dist-types/ui/icons.d.ts.map +1 -0
- package/dist-types/ui/popovers.d.ts +70 -0
- package/dist-types/ui/popovers.d.ts.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import type { EditorOptions } from '../types';
|
|
2
|
+
import { Toolbar } from '../ui/Toolbar';
|
|
3
|
+
import type { Block, BlockAttrs, BlockKind, BlockSnapshot } from './blocks';
|
|
4
|
+
export type { Block, BlockAttrs, BlockKind, BlockMatch, BlockSnapshot, BlockType, ClassifyResult, HeadingLevel, } from './blocks';
|
|
5
|
+
export interface InlineState {
|
|
6
|
+
bold: boolean;
|
|
7
|
+
italic: boolean;
|
|
8
|
+
underline: boolean;
|
|
9
|
+
strike: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface EditorState {
|
|
12
|
+
blocks: Block[];
|
|
13
|
+
activeBlockId: string | null;
|
|
14
|
+
inline: InlineState;
|
|
15
|
+
}
|
|
16
|
+
export type EditorStateListener = (state: EditorState) => void;
|
|
17
|
+
export declare class AerizEditor {
|
|
18
|
+
readonly root: HTMLDivElement;
|
|
19
|
+
readonly content: HTMLDivElement;
|
|
20
|
+
readonly toolbar: Toolbar | null;
|
|
21
|
+
private readonly contentWrap;
|
|
22
|
+
private readonly handlesLayer;
|
|
23
|
+
private readonly dropIndicator;
|
|
24
|
+
private readonly handles;
|
|
25
|
+
private readonly blockLabelPill;
|
|
26
|
+
private readonly statusBar;
|
|
27
|
+
private readonly statusBlockEl;
|
|
28
|
+
private readonly statusBlocksEl;
|
|
29
|
+
private readonly statusCharsEl;
|
|
30
|
+
private readonly statusSourceEl;
|
|
31
|
+
private readonly options;
|
|
32
|
+
private readonly observer;
|
|
33
|
+
private readonly blockIds;
|
|
34
|
+
private readonly idFor;
|
|
35
|
+
private readonly listeners;
|
|
36
|
+
private readonly handleSelectionChange;
|
|
37
|
+
private readonly handleResize;
|
|
38
|
+
private state;
|
|
39
|
+
private destroyed;
|
|
40
|
+
private syncQueued;
|
|
41
|
+
private lastSerialized;
|
|
42
|
+
/** 사용자가 색 다이얼로그에서 직접 고른 색상의 LRU. 에디터 인스턴스 메모리에만 유지. */
|
|
43
|
+
private recentCustomColors;
|
|
44
|
+
constructor(options: EditorOptions);
|
|
45
|
+
/**
|
|
46
|
+
* 본문 HTML 을 반환한다. 외부 컨텍스트에서도 에디터에서 보이는 그대로
|
|
47
|
+
* 동일한 시각으로 렌더되도록, 호출 시점의 테마 변수(--aw-primary 등) 를
|
|
48
|
+
* 읽어 블록 단위 인라인 스타일에 베이크한다. 에디터 내부 DOM 자체는
|
|
49
|
+
* 변형되지 않으며(clone 트리에 적용), data-block-kind / data-block-label /
|
|
50
|
+
* data-block-focused 같은 에디터 전용 속성은 출력에서 제거된다.
|
|
51
|
+
* data-block-id 는 보존.
|
|
52
|
+
*/
|
|
53
|
+
getHTML(): string;
|
|
54
|
+
/** 가공 없는 원본 innerHTML. 직렬화 검증/디버그 용도. */
|
|
55
|
+
getRawHTML(): string;
|
|
56
|
+
setHTML(html: string): void;
|
|
57
|
+
focus(): void;
|
|
58
|
+
setTheme(theme: 'light' | 'dark'): void;
|
|
59
|
+
getState(): EditorState;
|
|
60
|
+
getBlocks(): Block[];
|
|
61
|
+
/**
|
|
62
|
+
* 본문 블록들을 직렬화 가능한 BlockSnapshot 배열로 반환한다.
|
|
63
|
+
* AerizViewer.setBlocks(snapshots) 가 받아 동일한 트리를 렌더할 수 있다.
|
|
64
|
+
*/
|
|
65
|
+
serialize(): BlockSnapshot[];
|
|
66
|
+
/**
|
|
67
|
+
* data-block-id 로 본문에서 블록을 찾아 반환. 없으면 null.
|
|
68
|
+
*/
|
|
69
|
+
findBlockById(id: string): Block | null;
|
|
70
|
+
getActiveBlock(): Block | null;
|
|
71
|
+
/**
|
|
72
|
+
* 블록 유형을 변경/추가한다.
|
|
73
|
+
* - `targetBlockId` 지정 시 그 id 의 블록을 강제 대상으로 한다 (다이얼로그
|
|
74
|
+
* 확인 등으로 선택이 다른 곳으로 넘어간 뒤에도 원래 블록을 정확히 변환).
|
|
75
|
+
* - 미지정 시 현재 active block 사용. 둘 다 없으면 본문 끝에 새 블록 추가.
|
|
76
|
+
*/
|
|
77
|
+
setBlockType(kind: BlockKind, attrs?: BlockAttrs, targetBlockId?: string): void;
|
|
78
|
+
private replaceBlock;
|
|
79
|
+
private appendBlock;
|
|
80
|
+
onStateChange(listener: EditorStateListener): () => void;
|
|
81
|
+
destroy(): void;
|
|
82
|
+
/**
|
|
83
|
+
* DOM 변화 후 호출되는 reconcile 진입점.
|
|
84
|
+
* 누락된 data-block-id 를 채우고, 자기 쓰기로 발생한 옵저버 레코드를
|
|
85
|
+
* takeRecords 로 흡수한 뒤 onChange + queueSync.
|
|
86
|
+
*/
|
|
87
|
+
private flush;
|
|
88
|
+
private handleToolbarAction;
|
|
89
|
+
/**
|
|
90
|
+
* 인라인 마크(bold/italic/underline/strike) 토글. 활성 블록의 allowedMarks
|
|
91
|
+
* 에 포함되지 않은 마크면 무시. styleWithCSS=true 모드로 deprecated 태그
|
|
92
|
+
* (<b>/<i>/<u>) 대신 `<span style="font-weight:bold">` 형태가 만들어진다.
|
|
93
|
+
*
|
|
94
|
+
* 'strike' 는 execCommand 표준 명령명이 'strikeThrough'.
|
|
95
|
+
*/
|
|
96
|
+
private applyMark;
|
|
97
|
+
/**
|
|
98
|
+
* 색상 선택기에서 받은 색을 LRU 에 누적하고 selection 에 적용한다.
|
|
99
|
+
* `command` 가 'foreColor' 면 글자색, 'hiliteColor' 면 글 배경색.
|
|
100
|
+
*/
|
|
101
|
+
private handleColorPick;
|
|
102
|
+
/**
|
|
103
|
+
* selection 에 색상을 적용. styleWithCSS=true 모드로 `<span style="color:…">`
|
|
104
|
+
* 또는 `<span style="background-color:…">` 형태가 만들어진다.
|
|
105
|
+
* `null` 은 '기본색' — 'inherit' 으로 부모 색을 따라가도록.
|
|
106
|
+
*/
|
|
107
|
+
private applyColor;
|
|
108
|
+
/**
|
|
109
|
+
* 정렬을 활성 블록(또는 표 셀) 에 적용한다.
|
|
110
|
+
*
|
|
111
|
+
* execCommand('justify*') 는 일부 브라우저에서 blockquote 안의 <p> 에 적용
|
|
112
|
+
* 시 blockquote 를 <div style="text-align:..."> 로 바꿔버리는 잘 알려진
|
|
113
|
+
* 버그가 있어 직접 DOM 조작으로 대체한다.
|
|
114
|
+
*
|
|
115
|
+
* 적용 대상:
|
|
116
|
+
* paragraph / heading → element 자체
|
|
117
|
+
* blockquote → 안의 <p> (없으면 자기 자신)
|
|
118
|
+
* table 단일 셀 → 캐럿이 들어 있는 td/th
|
|
119
|
+
* table 다중 셀 마킹 → 각 cell.style.textAlign 일괄
|
|
120
|
+
*/
|
|
121
|
+
private applyAlign;
|
|
122
|
+
/** 캐럿이 들어 있는 표 셀(td/th) 반환. 표 밖이면 null. */
|
|
123
|
+
private getActiveTableCell;
|
|
124
|
+
/**
|
|
125
|
+
* 현재 활성 셀(들) 을 반환한다.
|
|
126
|
+
* 1순위: 커스텀 드래그-셀렉션으로 마킹된 `.aw-cell-selected` 셀들
|
|
127
|
+
* 2순위: 브라우저 selection range 가 가리키는 표 셀(들)
|
|
128
|
+
* 3순위: 캐럿이 들어 있는 단일 셀
|
|
129
|
+
*/
|
|
130
|
+
private getSelectedTableCells;
|
|
131
|
+
private cellSelStart;
|
|
132
|
+
private cellSelDrag;
|
|
133
|
+
private handleCellSelStart;
|
|
134
|
+
private handleCellSelMove;
|
|
135
|
+
private handleCellSelEnd;
|
|
136
|
+
/** `.aw-cell-selected` 마킹을 모두 제거. */
|
|
137
|
+
private clearCellSelection;
|
|
138
|
+
/**
|
|
139
|
+
* 표 셀 배열 각각에 `cell.style.fontSize` 를 직접 설정. Range API 의 wrap
|
|
140
|
+
* 경로(셀 중첩 버그 발생) 를 우회하기 위한 안전한 다중 셀 적용 경로.
|
|
141
|
+
*/
|
|
142
|
+
private applyFontSizeToCells;
|
|
143
|
+
/**
|
|
144
|
+
* 캡처해 둔 셀(들) 에 배경색을 일괄 적용. null 이면 inline background-color
|
|
145
|
+
* 제거. `<th>` 의 stylesheet 배경(0,1,2 specificity) 보다 inline + !important
|
|
146
|
+
* 가 항상 우선하도록 setProperty('important') 로 박는다.
|
|
147
|
+
*/
|
|
148
|
+
private applyCellBgToCells;
|
|
149
|
+
/** 표 편집 드롭다운에서 받은 액션을 분기 실행. */
|
|
150
|
+
private runTableMenu;
|
|
151
|
+
/** 활성 셀의 행 위/아래에 새 행 삽입. 같은 열 수, 빈 td 로 채움. */
|
|
152
|
+
private insertRow;
|
|
153
|
+
/** 활성 셀이 속한 열의 좌/우에 새 열 삽입. 모든 행에 빈 td 추가. */
|
|
154
|
+
private insertColumn;
|
|
155
|
+
/** 활성 셀의 행 전체 삭제. 마지막 행이면 보존(빈 표 회피). */
|
|
156
|
+
private deleteRow;
|
|
157
|
+
/**
|
|
158
|
+
* 코드 블록 input 마다 호출되는 debounced rehighlight. 활성 블록이 codeBlock
|
|
159
|
+
* 이고 data-language 가 설정돼 있을 때만 동작 — 타이핑 멈춘 뒤 300ms 후 1 회.
|
|
160
|
+
*/
|
|
161
|
+
private codeHighlightTimer;
|
|
162
|
+
private scheduleCodeHighlight;
|
|
163
|
+
/**
|
|
164
|
+
* code 블록의 언어를 변경하고 즉시 highlight 를 다시 적용. 캐럿 위치는
|
|
165
|
+
* 텍스트 offset 으로 보존.
|
|
166
|
+
*/
|
|
167
|
+
private applyCodeLanguage;
|
|
168
|
+
/**
|
|
169
|
+
* `<code>` element 의 텍스트를 highlight 후 innerHTML 로 갱신. 셀렉션이
|
|
170
|
+
* code 안에 있다면 textContent offset 으로 caret 위치 보존.
|
|
171
|
+
*/
|
|
172
|
+
private rehighlightCode;
|
|
173
|
+
/**
|
|
174
|
+
* 본문에서 모든 codeBlock 을 순회하며 highlight 적용. setHTML / 초기 로드
|
|
175
|
+
* / 외부 import 후 호출.
|
|
176
|
+
*/
|
|
177
|
+
private rehighlightAllCodeBlocks;
|
|
178
|
+
/** 활성 셀의 열 전체 삭제. 마지막 열이면 보존(빈 표 회피). */
|
|
179
|
+
private deleteColumn;
|
|
180
|
+
/**
|
|
181
|
+
* 마우스 이동 시 셀 우/하 가장자리에서 col-resize / row-resize 커서 표시.
|
|
182
|
+
* 드래그 진행 중에는 별도 핸들러가 cursor 를 관리하므로 skip.
|
|
183
|
+
*/
|
|
184
|
+
private handleTableCursor;
|
|
185
|
+
private tableResize;
|
|
186
|
+
/**
|
|
187
|
+
* 셀 가장자리 / 이미지·유튜브 리사이즈 핸들 mousedown 진입점.
|
|
188
|
+
* - 셀: 우(col-resize) / 하(row-resize) 가장자리 6px 영역
|
|
189
|
+
* - 이미지·유튜브: 우하단 `.aw-resize-handle` element (corner resize)
|
|
190
|
+
*/
|
|
191
|
+
private handleTableResizeStart;
|
|
192
|
+
private handleTableResizeMove;
|
|
193
|
+
/**
|
|
194
|
+
* 이미지/유튜브 좌상단 정렬 컨트롤 클릭 핸들러. data-align 에 따라 wrapper
|
|
195
|
+
* 의 marginLeft / marginRight 를 조정 — left/center/right.
|
|
196
|
+
*/
|
|
197
|
+
private handleBlockAlignClick;
|
|
198
|
+
/**
|
|
199
|
+
* 이미지 / 유튜브 wrapper 의 너비를 드래그로 조정. 높이는 자동 (이미지는
|
|
200
|
+
* 종횡비 유지, 유튜브는 CSS aspect-ratio 16/9). mouseup 에서 cursor 복귀
|
|
201
|
+
* + flush.
|
|
202
|
+
*/
|
|
203
|
+
private startBlockResize;
|
|
204
|
+
private currentTheme;
|
|
205
|
+
/**
|
|
206
|
+
* 선택 영역에 글꼴을 적용한다.
|
|
207
|
+
* `styleWithCSS=true` 모드의 execCommand('fontName') 가 `<font face=…>` 대신
|
|
208
|
+
* `<span style="font-family: …">` 를 생성하도록 강제한다. selection 이
|
|
209
|
+
* 비어 있으면(캐럿만) 다음 입력 글꼴이 결정된다(브라우저 기본 동작).
|
|
210
|
+
*/
|
|
211
|
+
private applyFontFamily;
|
|
212
|
+
/**
|
|
213
|
+
* 현재 selection 의 anchor 노드 기준 computed font-family 를 읽어 알려진
|
|
214
|
+
* FONT_FAMILIES id 와 매칭. 글꼴 드롭다운의 active 표시에 사용.
|
|
215
|
+
*/
|
|
216
|
+
private detectActiveFontId;
|
|
217
|
+
/**
|
|
218
|
+
* 선택 영역에 글자 크기를 적용한다. execCommand('fontSize') 는 1~7 만 받기
|
|
219
|
+
* 때문에 px 적용을 위해 Range API 로 직접 `<span style="font-size: Xpx">`
|
|
220
|
+
* wrap 한다.
|
|
221
|
+
*
|
|
222
|
+
* **다중 셀 선택**(커스텀 마킹 또는 셀 경계를 넘는 browser range) 의 경우엔
|
|
223
|
+
* Range.extractContents 가 셀들을 묶어 한 셀 안에 끼워넣는 셀 중첩 버그가
|
|
224
|
+
* 있어 — 셀별로 `cell.style.fontSize` 를 직접 설정하는 안전한 경로를 사용.
|
|
225
|
+
*/
|
|
226
|
+
private applyFontSize;
|
|
227
|
+
/**
|
|
228
|
+
* 현재 selection 의 anchor 노드 기준 computed font-size 를 px 정수로 읽어
|
|
229
|
+
* FONT_SIZES 의 값과 일치할 때만 반환. 글자 크기 드롭다운의 active 표시에
|
|
230
|
+
* 사용.
|
|
231
|
+
*/
|
|
232
|
+
private detectActiveFontSize;
|
|
233
|
+
/**
|
|
234
|
+
* 블록 유형 드롭다운을 열어 사용자 선택 결과를 처리한다.
|
|
235
|
+
* 툴바의 blockType 버튼 / 활성 블록 라벨 pill 양쪽 진입점이 동일한 분기
|
|
236
|
+
* 로직(리치 블록 다이얼로그 분기 + targetId 보존) 을 공유한다.
|
|
237
|
+
*/
|
|
238
|
+
private openBlockTypeMenu;
|
|
239
|
+
/**
|
|
240
|
+
* 링크 다이얼로그를 열어 URL/텍스트를 받은 뒤 linkCard 블록으로 변환/추가.
|
|
241
|
+
* 표시 텍스트가 비어 있으면 URL 을 텍스트로 사용. `targetId` 가 있으면
|
|
242
|
+
* 그 id 의 블록을 정확히 변환 대상으로 삼는다.
|
|
243
|
+
*/
|
|
244
|
+
private openLinkDialogAndApply;
|
|
245
|
+
/**
|
|
246
|
+
* 이미지 다이얼로그(임베드/URL/업로드)를 열어 src 를 받은 뒤 image 블록으로
|
|
247
|
+
* 변환/추가.
|
|
248
|
+
*/
|
|
249
|
+
private openImageDialogAndApply;
|
|
250
|
+
/**
|
|
251
|
+
* 유튜브 다이얼로그를 열어 URL 을 받고, 영상 ID 를 추출해 youtube 블록으로
|
|
252
|
+
* 변환/추가. 잘못된 URL 이면 무시.
|
|
253
|
+
*/
|
|
254
|
+
private openYouTubeDialogAndApply;
|
|
255
|
+
/**
|
|
256
|
+
* HTML 가져오기 다이얼로그를 열어 사용자가 고른 HTML 을 iframe 으로 로드/
|
|
257
|
+
* 처리한 뒤 본문에 element 들을 삽입한다.
|
|
258
|
+
*
|
|
259
|
+
* - `targetId` 가 있으면 그 블록 바로 뒤에 삽입, 없으면 본문 끝에 append.
|
|
260
|
+
* - 삽입된 element 는 MutationObserver flush 가 새 data-block-id 를 발급.
|
|
261
|
+
*/
|
|
262
|
+
private openImportHtmlDialogAndApply;
|
|
263
|
+
/**
|
|
264
|
+
* Markdown 가져오기 다이얼로그를 열어 사용자가 입력한 markdown 을 파싱해
|
|
265
|
+
* 본문에 element 들을 삽입한다. importHtml 과 동일한 삽입 정책을 따른다.
|
|
266
|
+
*/
|
|
267
|
+
private openMarkdownImportDialogAndApply;
|
|
268
|
+
/**
|
|
269
|
+
* 파일 첨부 다이얼로그(URL/업로드)를 열어 src 를 받은 뒤 file 블록으로
|
|
270
|
+
* 변환/추가. src 가 비어 있으면 무시. 파일명이 없으면 URL 의 마지막
|
|
271
|
+
* segment 를 fallback 으로 사용.
|
|
272
|
+
*/
|
|
273
|
+
private openFileAttachmentDialogAndApply;
|
|
274
|
+
/**
|
|
275
|
+
* 파일 업로드 핸들러를 결정. onFileUpload 가 우선, 없으면 fileUploadUrl 에
|
|
276
|
+
* multipart/form-data POST 후 응답 JSON 의 `url` 필드를 사용. 둘 다 없으면
|
|
277
|
+
* undefined → 다이얼로그 업로드 탭 비활성.
|
|
278
|
+
*/
|
|
279
|
+
private resolveFileUploadFn;
|
|
280
|
+
/**
|
|
281
|
+
* 이미지 업로드 핸들러를 결정. options.onImageUpload 가 우선이며, 없으면
|
|
282
|
+
* options.imageUploadUrl 로 multipart/form-data POST 후 응답 JSON 의
|
|
283
|
+
* `url` 필드를 사용. 둘 다 없으면 undefined → 다이얼로그 업로드 탭 비활성.
|
|
284
|
+
*/
|
|
285
|
+
private resolveImageUploadFn;
|
|
286
|
+
/**
|
|
287
|
+
* `src` 의 이미지를 figure>img 블록으로 본문에 삽입.
|
|
288
|
+
* 활성 블록이 있으면 그 블록을 image 로 변환, 없으면 본문 끝에 추가.
|
|
289
|
+
*/
|
|
290
|
+
private insertImageBlock;
|
|
291
|
+
private queueSync;
|
|
292
|
+
private sync;
|
|
293
|
+
private handleKeyDown;
|
|
294
|
+
/**
|
|
295
|
+
* 활성 블록 뒤에 새 빈 단락을 만들고 캐럿을 그 안에 둔다.
|
|
296
|
+
* 인용구 / 코드 블록의 Enter 탈출 동작에 사용.
|
|
297
|
+
*/
|
|
298
|
+
private exitBlockOnEnter;
|
|
299
|
+
private syncBlockHandles;
|
|
300
|
+
private repositionHandles;
|
|
301
|
+
private positionHandle;
|
|
302
|
+
private createBlockHandle;
|
|
303
|
+
/**
|
|
304
|
+
* `blockId` 의 블록 뒤에 빈 단락을 삽입하고 캐럿을 그 단락으로 이동.
|
|
305
|
+
* MutationObserver flush 가 새 단락에 신규 data-block-id 를 발급한다.
|
|
306
|
+
*/
|
|
307
|
+
private insertParagraphAfter;
|
|
308
|
+
private handleDragOver;
|
|
309
|
+
private handleDrop;
|
|
310
|
+
private handleDragLeave;
|
|
311
|
+
private findDropTarget;
|
|
312
|
+
private showDropIndicator;
|
|
313
|
+
private hideDropIndicator;
|
|
314
|
+
/**
|
|
315
|
+
* 본문 블록들에 data-block-kind / data-block-label 을 갱신하고,
|
|
316
|
+
* 활성 블록에 data-block-focused 를 표기한다. CSS 가 이 속성을 읽어
|
|
317
|
+
* 포커스 인디케이터와 라벨 태그를 그린다.
|
|
318
|
+
*
|
|
319
|
+
* 자기 쓰기로 발생한 attributes 레코드는 takeRecords 로 흡수.
|
|
320
|
+
*/
|
|
321
|
+
/**
|
|
322
|
+
* 활성 블록 위쪽에 떠 있는 인터랙티브 라벨 pill 갱신.
|
|
323
|
+
* - 활성 블록이 없으면 숨김
|
|
324
|
+
* - 활성 블록의 라벨 텍스트로 갱신, 위치를 블록 상단에 맞춤
|
|
325
|
+
* - 클릭 시 openBlockTypeDropdown 가 열려 블록 유형을 즉시 변경 가능
|
|
326
|
+
*/
|
|
327
|
+
private syncBlockLabelPill;
|
|
328
|
+
/**
|
|
329
|
+
* 하단 Status Bar 갱신.
|
|
330
|
+
* - 좌측: 활성 블록 라벨 + id (없으면 — )
|
|
331
|
+
* - 우측: 총 블록 수, 본문 글자 수(공백 제외)
|
|
332
|
+
*/
|
|
333
|
+
private syncStatusBar;
|
|
334
|
+
private syncBlockMarkers;
|
|
335
|
+
private applyToolbarState;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=AerizEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AerizEditor.d.ts","sourceRoot":"","sources":["../../src/core/AerizEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Block, BlockSnapshot } from './blocks';
|
|
2
|
+
export interface ViewerOptions {
|
|
3
|
+
/** 마운트할 호스트 element */
|
|
4
|
+
element: HTMLElement;
|
|
5
|
+
/** 초기 블록 상태 (1차 입력 경로). HTML 이 아닌 상태 모델을 사용. */
|
|
6
|
+
initialBlocks?: BlockSnapshot[];
|
|
7
|
+
/** 초기 테마 */
|
|
8
|
+
theme?: 'light' | 'dark';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 편집 불가 모드의 읽기 전용 뷰어.
|
|
12
|
+
*
|
|
13
|
+
* 입력은 HTML 문자열이 아닌 BlockSnapshot 배열(상태 모델)이다.
|
|
14
|
+
* 각 snapshot 은 BlockType 레지스트리를 통해 새 element 로 렌더되며, 결과는
|
|
15
|
+
* AerizEditor 와 같은 `.aeriz-wysiwyg .aw-content` 트리에 들어가 동일한
|
|
16
|
+
* CSS 규칙(테마 변수 포함)이 그대로 적용된다.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const editor = new AerizEditor({ element: editorMount });
|
|
20
|
+
* const viewer = new AerizViewer({ element: viewerMount });
|
|
21
|
+
* editor.onStateChange(() => viewer.setBlocks(editor.serialize()));
|
|
22
|
+
*/
|
|
23
|
+
export declare class AerizViewer {
|
|
24
|
+
readonly root: HTMLDivElement;
|
|
25
|
+
readonly content: HTMLDivElement;
|
|
26
|
+
private readonly blockIds;
|
|
27
|
+
private readonly idFor;
|
|
28
|
+
private destroyed;
|
|
29
|
+
constructor(options: ViewerOptions);
|
|
30
|
+
/**
|
|
31
|
+
* BlockSnapshot 배열로부터 본문을 다시 렌더한다.
|
|
32
|
+
* 동일한 BlockType 레지스트리로 element 를 만들어 채우므로 외부 HTML 파싱
|
|
33
|
+
* 경로를 거치지 않는다.
|
|
34
|
+
*/
|
|
35
|
+
setBlocks(blocks: BlockSnapshot[]): void;
|
|
36
|
+
/** 현재 본문의 BlockSnapshot 배열을 반환한다. */
|
|
37
|
+
getBlocks(): BlockSnapshot[];
|
|
38
|
+
/** 임의의 노드를 받아 그 노드가 속한 블록을 반환한다. 본문 밖이면 null. */
|
|
39
|
+
getBlockOf(node: Node): Block | null;
|
|
40
|
+
/**
|
|
41
|
+
* 외부 컨텍스트(이메일, 다른 페이지의 HTML 영역 등) 에서도 동일한 시각으로
|
|
42
|
+
* 보이도록 portable 인라인 스타일을 입힌 자급자족적 HTML 을 반환한다.
|
|
43
|
+
*/
|
|
44
|
+
getHTML(): string;
|
|
45
|
+
setTheme(theme: 'light' | 'dark'): void;
|
|
46
|
+
destroy(): void;
|
|
47
|
+
private listBlocksInternal;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=AerizViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AerizViewer.d.ts","sourceRoot":"","sources":["../../src/core/AerizViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAarD,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,gDAAgD;IAChD,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY;IACZ,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyD;IAC/E,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,aAAa;IA8BlC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAKxC,qCAAqC;IACrC,SAAS,IAAI,aAAa,EAAE;IAI5B,iDAAiD;IACjD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI;IAKpC;;;OAGG;IACH,OAAO,IAAI,MAAM;IAUjB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,kBAAkB;CAG3B"}
|