@aeriz/wysiwyg 1.0.2 → 1.0.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.
- package/README.md +610 -96
- package/angular/README.md +112 -0
- package/angular/aeriz-editor.directive.ts +243 -0
- package/angular/aeriz-wysiwyg.module.ts +14 -0
- package/angular/index.ts +5 -0
- package/dist/adapters/jquery.cjs +1 -0
- package/dist/adapters/jquery.js +91 -0
- package/dist/adapters/react.cjs +1 -0
- package/dist/adapters/react.js +66 -0
- package/dist/adapters/shared.cjs +1 -0
- package/dist/adapters/shared.js +87 -0
- package/dist/adapters/svelte.cjs +1 -0
- package/dist/adapters/svelte.js +29 -0
- package/dist/adapters/vue.cjs +1 -0
- package/dist/adapters/vue.js +110 -0
- package/dist/adapters/vue2.cjs +1 -0
- package/dist/adapters/vue2.js +117 -0
- package/dist/adapters/wc.cjs +1 -0
- package/dist/adapters/wc.js +207 -0
- package/dist/aeriz-wysiwyg-adapter.js +169 -0
- package/dist/aeriz-wysiwyg-adapter.min.js +1 -0
- package/dist/aeriz-wysiwyg-jquery.js +275 -0
- package/dist/aeriz-wysiwyg-jquery.min.js +1 -0
- package/dist/aeriz-wysiwyg-wc.js +401 -0
- package/dist/aeriz-wysiwyg-wc.min.js +1 -0
- package/dist/aeriz-wysiwyg.cjs +6912 -0
- package/dist/aeriz-wysiwyg.css +37 -129
- package/dist/aeriz-wysiwyg.esm.js +1170 -149
- package/dist/aeriz-wysiwyg.esm.min.js +2057 -1209
- package/dist/aeriz-wysiwyg.js +1169 -148
- package/dist/aeriz-wysiwyg.min.cjs +54 -0
- package/dist/aeriz-wysiwyg.min.css +1 -1
- package/dist/aeriz-wysiwyg.min.js +44 -13
- package/dist/server.cjs +32 -0
- package/dist/server.js +666 -0
- package/dist-types/adapters/jquery.d.ts +34 -0
- package/dist-types/adapters/jquery.d.ts.map +1 -0
- package/dist-types/adapters/react.d.ts +28 -0
- package/dist-types/adapters/react.d.ts.map +1 -0
- package/dist-types/adapters/shared.d.ts +83 -0
- package/dist-types/adapters/shared.d.ts.map +1 -0
- package/dist-types/adapters/svelte.d.ts +38 -0
- package/dist-types/adapters/svelte.d.ts.map +1 -0
- package/dist-types/adapters/vue.d.ts +189 -0
- package/dist-types/adapters/vue.d.ts.map +1 -0
- package/dist-types/adapters/vue2.d.ts +175 -0
- package/dist-types/adapters/vue2.d.ts.map +1 -0
- package/dist-types/adapters/wc.d.ts +96 -0
- package/dist-types/adapters/wc.d.ts.map +1 -0
- package/dist-types/cjs/adapters/jquery.d.cts +34 -0
- package/dist-types/cjs/adapters/react.d.cts +28 -0
- package/dist-types/cjs/adapters/shared.d.cts +83 -0
- package/dist-types/cjs/adapters/svelte.d.cts +38 -0
- package/dist-types/cjs/adapters/vue.d.cts +189 -0
- package/dist-types/cjs/adapters/vue2.d.cts +175 -0
- package/dist-types/cjs/adapters/wc.d.cts +96 -0
- package/dist-types/cjs/core/AerizEditor.d.cts +357 -0
- package/dist-types/cjs/core/AerizViewer.d.cts +61 -0
- package/dist-types/cjs/core/block-meta.d.cts +32 -0
- package/dist-types/cjs/core/blocks.d.cts +368 -0
- package/dist-types/cjs/core/fonts.d.cts +60 -0
- package/dist-types/cjs/core/highlight.d.cts +44 -0
- package/dist-types/cjs/core/html-mini.d.cts +65 -0
- package/dist-types/cjs/core/i18n.d.cts +209 -0
- package/dist-types/cjs/core/import-html.d.cts +39 -0
- package/dist-types/cjs/core/import-markdown.d.cts +37 -0
- package/dist-types/cjs/core/markdown-export.d.cts +30 -0
- package/dist-types/cjs/core/plain-text.d.cts +17 -0
- package/dist-types/cjs/core/render-string.d.cts +68 -0
- package/dist-types/cjs/core/snapshot.d.cts +51 -0
- package/dist-types/cjs/index.d.cts +20 -0
- package/dist-types/cjs/server/index.d.cts +37 -0
- package/dist-types/cjs/types/index.d.cts +61 -0
- package/dist-types/cjs/ui/Toolbar.d.cts +21 -0
- package/dist-types/cjs/ui/dialogs.d.cts +74 -0
- package/dist-types/cjs/ui/icons.d.cts +2 -0
- package/dist-types/cjs/ui/popovers.d.cts +70 -0
- package/dist-types/core/AerizEditor.d.ts +30 -10
- package/dist-types/core/AerizEditor.d.ts.map +1 -1
- package/dist-types/core/AerizViewer.d.ts +16 -4
- package/dist-types/core/AerizViewer.d.ts.map +1 -1
- package/dist-types/core/block-meta.d.ts +32 -0
- package/dist-types/core/block-meta.d.ts.map +1 -0
- package/dist-types/core/blocks.d.ts +62 -7
- package/dist-types/core/blocks.d.ts.map +1 -1
- package/dist-types/core/fonts.d.ts +11 -0
- package/dist-types/core/fonts.d.ts.map +1 -1
- package/dist-types/core/html-mini.d.ts +65 -0
- package/dist-types/core/html-mini.d.ts.map +1 -0
- package/dist-types/core/import-html.d.ts.map +1 -1
- package/dist-types/core/markdown-export.d.ts +30 -0
- package/dist-types/core/markdown-export.d.ts.map +1 -0
- package/dist-types/core/plain-text.d.ts +17 -0
- package/dist-types/core/plain-text.d.ts.map +1 -0
- package/dist-types/core/render-string.d.ts +68 -0
- package/dist-types/core/render-string.d.ts.map +1 -0
- package/dist-types/core/snapshot.d.ts +51 -0
- package/dist-types/core/snapshot.d.ts.map +1 -0
- package/dist-types/index.d.ts +19 -10
- package/dist-types/index.d.ts.map +1 -1
- package/dist-types/server/index.d.ts +37 -0
- package/dist-types/server/index.d.ts.map +1 -0
- package/dist-types/types/index.d.ts +21 -0
- package/dist-types/types/index.d.ts.map +1 -1
- package/dist-types/ui/Toolbar.d.ts +1 -1
- package/dist-types/ui/popovers.d.ts +1 -1
- package/dist-types/ui/popovers.d.ts.map +1 -1
- package/package.json +213 -58
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 다국어 (i18n) 문자열 사전 — UI 정적 라벨, tooltip, 다이얼로그 제목/필드,
|
|
3
|
+
* 블록 라벨, 팝오버 항목 등.
|
|
4
|
+
*
|
|
5
|
+
* 4 개 로케일: 영어 / 한국어 / 일본어 / 중국어(간체).
|
|
6
|
+
*
|
|
7
|
+
* 사용 모델 — 모듈 레벨 "current locale" 을 두고 `t()` accessor 로 어디서든
|
|
8
|
+
* 같은 사전을 참조한다. `AerizEditor` 가 옵션에 따라 시작 시 setLocale() 1 회.
|
|
9
|
+
*/
|
|
10
|
+
export type Locale = 'en' | 'ko' | 'ja' | 'zh';
|
|
11
|
+
export interface Strings {
|
|
12
|
+
toolbar: {
|
|
13
|
+
undo: string;
|
|
14
|
+
redo: string;
|
|
15
|
+
blockType: string;
|
|
16
|
+
fontFamily: string;
|
|
17
|
+
fontSize: string;
|
|
18
|
+
bold: string;
|
|
19
|
+
italic: string;
|
|
20
|
+
underline: string;
|
|
21
|
+
strike: string;
|
|
22
|
+
color: string;
|
|
23
|
+
backgroundColor: string;
|
|
24
|
+
align: string;
|
|
25
|
+
cellBg: string;
|
|
26
|
+
tableMenu: string;
|
|
27
|
+
codeLang: string;
|
|
28
|
+
bulletList: string;
|
|
29
|
+
orderedList: string;
|
|
30
|
+
blockquote: string;
|
|
31
|
+
codeBlock: string;
|
|
32
|
+
link: string;
|
|
33
|
+
image: string;
|
|
34
|
+
table: string;
|
|
35
|
+
hr: string;
|
|
36
|
+
clearFormat: string;
|
|
37
|
+
blockTypeChangeTooltip: string;
|
|
38
|
+
blockMoveTooltip: string;
|
|
39
|
+
addBelowTooltip: string;
|
|
40
|
+
};
|
|
41
|
+
blocks: {
|
|
42
|
+
paragraph: string;
|
|
43
|
+
/** "Heading {n}" 형식 — caller 가 {n} 을 level 숫자로 치환 */
|
|
44
|
+
heading: string;
|
|
45
|
+
bulletList: string;
|
|
46
|
+
orderedList: string;
|
|
47
|
+
blockquote: string;
|
|
48
|
+
codeBlock: string;
|
|
49
|
+
image: string;
|
|
50
|
+
table: string;
|
|
51
|
+
hr: string;
|
|
52
|
+
linkCard: string;
|
|
53
|
+
youtube: string;
|
|
54
|
+
file: string;
|
|
55
|
+
importedHtml: string;
|
|
56
|
+
unknown: string;
|
|
57
|
+
};
|
|
58
|
+
blockMenu: {
|
|
59
|
+
body: string;
|
|
60
|
+
h1: string;
|
|
61
|
+
h2: string;
|
|
62
|
+
h3: string;
|
|
63
|
+
bulletList: string;
|
|
64
|
+
orderedList: string;
|
|
65
|
+
blockquote: string;
|
|
66
|
+
codeBlock: string;
|
|
67
|
+
hr: string;
|
|
68
|
+
link: string;
|
|
69
|
+
image: string;
|
|
70
|
+
table: string;
|
|
71
|
+
youtube: string;
|
|
72
|
+
file: string;
|
|
73
|
+
importHtml: string;
|
|
74
|
+
importMarkdown: string;
|
|
75
|
+
};
|
|
76
|
+
align: {
|
|
77
|
+
left: string;
|
|
78
|
+
center: string;
|
|
79
|
+
right: string;
|
|
80
|
+
justify: string;
|
|
81
|
+
};
|
|
82
|
+
color: {
|
|
83
|
+
customColor: string;
|
|
84
|
+
defaultColor: string;
|
|
85
|
+
recent: string;
|
|
86
|
+
};
|
|
87
|
+
tableMenu: {
|
|
88
|
+
rowAbove: string;
|
|
89
|
+
rowBelow: string;
|
|
90
|
+
colLeft: string;
|
|
91
|
+
colRight: string;
|
|
92
|
+
deleteRow: string;
|
|
93
|
+
deleteCol: string;
|
|
94
|
+
};
|
|
95
|
+
fontFamily: {
|
|
96
|
+
systemDefault: string;
|
|
97
|
+
};
|
|
98
|
+
blockAlign: {
|
|
99
|
+
left: string;
|
|
100
|
+
center: string;
|
|
101
|
+
right: string;
|
|
102
|
+
};
|
|
103
|
+
comingSoon: {
|
|
104
|
+
label: string;
|
|
105
|
+
};
|
|
106
|
+
dialogs: {
|
|
107
|
+
confirm: string;
|
|
108
|
+
cancel: string;
|
|
109
|
+
insert: string;
|
|
110
|
+
apply: string;
|
|
111
|
+
importBtn: string;
|
|
112
|
+
close: string;
|
|
113
|
+
selectedFileNone: string;
|
|
114
|
+
dropOrClick: string;
|
|
115
|
+
};
|
|
116
|
+
link: {
|
|
117
|
+
title: string;
|
|
118
|
+
text: string;
|
|
119
|
+
textPlaceholder: string;
|
|
120
|
+
url: string;
|
|
121
|
+
urlPlaceholder: string;
|
|
122
|
+
openNewWindow: string;
|
|
123
|
+
};
|
|
124
|
+
image: {
|
|
125
|
+
title: string;
|
|
126
|
+
embedTab: string;
|
|
127
|
+
embedTabTitle: string;
|
|
128
|
+
urlTab: string;
|
|
129
|
+
urlTabTitle: string;
|
|
130
|
+
uploadTab: string;
|
|
131
|
+
uploadTabTitle: string;
|
|
132
|
+
uploadDisabledTitle: string;
|
|
133
|
+
embedDropzone: string;
|
|
134
|
+
urlLabel: string;
|
|
135
|
+
urlPlaceholder: string;
|
|
136
|
+
uploadDropzone: string;
|
|
137
|
+
noUploadApi: string;
|
|
138
|
+
};
|
|
139
|
+
youtube: {
|
|
140
|
+
title: string;
|
|
141
|
+
urlLabel: string;
|
|
142
|
+
urlPlaceholder: string;
|
|
143
|
+
formatHint: string;
|
|
144
|
+
};
|
|
145
|
+
table: {
|
|
146
|
+
title: string;
|
|
147
|
+
statusZero: string;
|
|
148
|
+
/** "{r} × {c} 표" 형식 — caller 가 {r}, {c} 치환 */
|
|
149
|
+
statusFormat: string;
|
|
150
|
+
pickerHint: string;
|
|
151
|
+
};
|
|
152
|
+
importHtml: {
|
|
153
|
+
title: string;
|
|
154
|
+
fileSelect: string;
|
|
155
|
+
pasteLabel: string;
|
|
156
|
+
pastePlaceholder: string;
|
|
157
|
+
hint: string;
|
|
158
|
+
errEmpty: string;
|
|
159
|
+
errNoBody: string;
|
|
160
|
+
errFailed: string;
|
|
161
|
+
};
|
|
162
|
+
importMarkdown: {
|
|
163
|
+
title: string;
|
|
164
|
+
fileSelect: string;
|
|
165
|
+
pasteLabel: string;
|
|
166
|
+
pastePlaceholder: string;
|
|
167
|
+
hint: string;
|
|
168
|
+
errEmpty: string;
|
|
169
|
+
errNoBody: string;
|
|
170
|
+
errFailed: string;
|
|
171
|
+
};
|
|
172
|
+
fileAttach: {
|
|
173
|
+
title: string;
|
|
174
|
+
urlTab: string;
|
|
175
|
+
urlTabTitle: string;
|
|
176
|
+
uploadTab: string;
|
|
177
|
+
uploadTabTitle: string;
|
|
178
|
+
uploadDisabledTitle: string;
|
|
179
|
+
urlLabel: string;
|
|
180
|
+
urlPlaceholder: string;
|
|
181
|
+
nameLabel: string;
|
|
182
|
+
namePlaceholder: string;
|
|
183
|
+
noUploadApi: string;
|
|
184
|
+
uploadDropzone: string;
|
|
185
|
+
uploadComplete: string;
|
|
186
|
+
uploadFailed: string;
|
|
187
|
+
errEmpty: string;
|
|
188
|
+
};
|
|
189
|
+
status: {
|
|
190
|
+
/** "{label} ({id8})" 의 prefix 라벨용 */
|
|
191
|
+
noActive: string;
|
|
192
|
+
/** "{n} 블록(s)" — {n} 치환 */
|
|
193
|
+
blocksCount: string;
|
|
194
|
+
/** "텍스트 {n} 자" — {n} 치환 */
|
|
195
|
+
chars: string;
|
|
196
|
+
/** "소스 {n}" — {n} 치환 (formatCount 결과) */
|
|
197
|
+
source: string;
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export declare function setLocale(locale: Locale): void;
|
|
201
|
+
export declare function getLocale(): Locale;
|
|
202
|
+
/** 현재 활성화된 strings 사전을 반환. 모든 UI 코드에서 호출 진입점. */
|
|
203
|
+
export declare function t(): Strings;
|
|
204
|
+
/**
|
|
205
|
+
* 템플릿 치환 유틸. `{key}` 패턴을 `vars[key]` 로 치환.
|
|
206
|
+
* 예: format('Heading {n}', { n: 1 }) → 'Heading 1'
|
|
207
|
+
*/
|
|
208
|
+
export declare function format(template: string, vars: Record<string, string | number>): string;
|
|
209
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 외부 HTML 문서를 가져와 모든 스타일을 인라인으로 베이크한다.
|
|
3
|
+
*
|
|
4
|
+
* 흐름:
|
|
5
|
+
* 1. 숨김 iframe 을 만들고 srcdoc 으로 HTML 주입
|
|
6
|
+
* 2. iframe load 이벤트(=body 의 마지막 동기 스크립트까지 실행 완료) +
|
|
7
|
+
* 추가 RAF/idle 대기 → setTimeout(0) 류 비동기 스타일 적용까지 안정화
|
|
8
|
+
* 3. body 트리 전체를 walk 하면서 각 element 의 computed style 중
|
|
9
|
+
* "캐스케이드로 채워지지 않을" 속성만 인라인 style 속성으로 베이크
|
|
10
|
+
* 4. iframe 제거 후 변환된 element 들의 outerHTML 배열 반환
|
|
11
|
+
*
|
|
12
|
+
* 다른 origin / iframe contentDocument 접근 제한이 발생하면 reject.
|
|
13
|
+
*/
|
|
14
|
+
export interface ImportHtmlOptions {
|
|
15
|
+
/** iframe load 후 추가 idle 대기(ms). Tailwind CDN 등 런타임 스타일 주입을
|
|
16
|
+
* 기다리기 위해 기본 1000ms. */
|
|
17
|
+
settleMs?: number;
|
|
18
|
+
/** iframe load timeout(ms). 기본 30_000. */
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
/** 화면 밖 iframe 폭. computed style 의 width/height 단위 변환에 영향. */
|
|
21
|
+
width?: number;
|
|
22
|
+
/**
|
|
23
|
+
* 가져온 element 들이 최종적으로 삽입될 destination element. 지정하면
|
|
24
|
+
* 해당 위치의 CSS 캐스케이드를 고려한 baseline 비교로 인라인 스타일을 더
|
|
25
|
+
* 엄격하게 추려낸다 — destination 의 descendant selector 룰
|
|
26
|
+
* (`.aw-content blockquote { ... }` 등) 이 imported 트리에 적용될 값을
|
|
27
|
+
* baseline 으로 간주해, 같은 값이면 인라인을 박지 않는다.
|
|
28
|
+
*
|
|
29
|
+
* 미지정 시 iframe 단독 baseline (UA 기본값) 으로 처리되어, 결과 트리가
|
|
30
|
+
* destination 의 descendant 룰에 영향받을 수 있다.
|
|
31
|
+
*/
|
|
32
|
+
mountTarget?: HTMLElement;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 외부 HTML 을 받아 인라인 스타일이 베이크된 element 배열을 반환한다.
|
|
36
|
+
* 호출자는 원하는 위치에 `appendChild` / `insertBefore` 등으로 삽입하면 된다.
|
|
37
|
+
*/
|
|
38
|
+
export declare function importHtmlWithComputedStyles(html: string, options?: ImportHtmlOptions): Promise<HTMLElement[]>;
|
|
39
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 가벼운 Markdown → HTMLElement[] 변환기.
|
|
3
|
+
*
|
|
4
|
+
* 외부 의존성 없이 CommonMark 의 자주 쓰이는 문법만 지원한다 — 에디터의
|
|
5
|
+
* 네이티브 블록 유형(p / h1~6 / ul / ol / blockquote / pre / hr / table /
|
|
6
|
+
* a / img) 으로 직접 매핑되도록 결과 구조를 단순하게 유지.
|
|
7
|
+
*
|
|
8
|
+
* 지원 문법 (블록):
|
|
9
|
+
* - ATX 제목: `# … ###### …`
|
|
10
|
+
* - 단락
|
|
11
|
+
* - 글머리 목록: `- `, `* `, `+ `
|
|
12
|
+
* - 번호 목록: `1. `
|
|
13
|
+
* - 인용구: `> …`
|
|
14
|
+
* - 코드 블록: ```lang\n…\n```
|
|
15
|
+
* - 구분선: `---`, `***`, `___`
|
|
16
|
+
* - 표 (GFM): `| a | b |\n|---|---|\n…`
|
|
17
|
+
*
|
|
18
|
+
* 지원 문법 (인라인):
|
|
19
|
+
* - 굵게: `**…**`, `__…__`
|
|
20
|
+
* - 기울임: `*…*`, `_…_`
|
|
21
|
+
* - 취소선: `~~…~~`
|
|
22
|
+
* - 인라인 코드: `` `…` ``
|
|
23
|
+
* - 링크: `[text](url)`
|
|
24
|
+
* - 이미지: ``
|
|
25
|
+
* - 자동 링크: `<https://…>`
|
|
26
|
+
* - 줄바꿈: 줄 끝 두 칸 공백 → `<br>`
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Markdown 문자열을 본문에 삽입할 수 있는 HTMLElement 배열로 변환한다.
|
|
30
|
+
* 결과 element 들은 에디터의 네이티브 블록 유형으로 인식 가능한 표준 태그.
|
|
31
|
+
*/
|
|
32
|
+
export declare function markdownToBlocks(md: string): HTMLElement[];
|
|
33
|
+
/**
|
|
34
|
+
* Markdown 문자열을 HTML 문자열로 변환. 외부 직접 사용 가능 (테스트 등).
|
|
35
|
+
*/
|
|
36
|
+
export declare function markdownToHtml(md: string): string;
|
|
37
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BlockSnapshot[]` → 마크다운. DOM 을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* `import-markdown.ts` 의 역방향이다. 포맷 종속을 푸는 탈출구 — 저장된 글을
|
|
5
|
+
* 언제든 에디터 밖으로 꺼낼 수 있게 한다.
|
|
6
|
+
*
|
|
7
|
+
* ## 표현 범위
|
|
8
|
+
*
|
|
9
|
+
* 마크다운으로 표현할 수 없는 서식은 다음 두 갈래로 처리한다.
|
|
10
|
+
* - **원시 HTML 로 보존** — 밑줄(`<u>`), 위/아래 첨자, 가져온 HTML 블록.
|
|
11
|
+
* GFM 은 인라인 HTML 을 허용하므로 정보가 사라지지 않는다.
|
|
12
|
+
* - **버림** — 글자색 · 배경색 · 글자 크기 · 글꼴 · 정렬. 마크다운에 대응
|
|
13
|
+
* 개념이 없고 HTML 로 남기면 결과가 마크다운이라 부르기 어려워진다.
|
|
14
|
+
*/
|
|
15
|
+
import type { BlockSnapshot } from './blocks.cjs';
|
|
16
|
+
export interface MarkdownOptions {
|
|
17
|
+
/**
|
|
18
|
+
* 글머리 목록 기호. 기본 `'-'`.
|
|
19
|
+
*/
|
|
20
|
+
bullet?: '-' | '*' | '+';
|
|
21
|
+
/**
|
|
22
|
+
* 표를 GFM 표로 낼지. 기본 `true`.
|
|
23
|
+
* `false` 면 표를 원시 HTML 로 보존한다 (셀 병합 등 GFM 이 표현할 수 없는
|
|
24
|
+
* 구조를 잃지 않아야 할 때).
|
|
25
|
+
*/
|
|
26
|
+
gfmTables?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** 스냅샷 배열을 마크다운 문서로 변환한다. */
|
|
29
|
+
export declare function blocksToMarkdown(snapshots: readonly BlockSnapshot[], options?: MarkdownOptions): string;
|
|
30
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `BlockSnapshot[]` → 평문. DOM 을 쓰지 않는다.
|
|
3
|
+
*
|
|
4
|
+
* 전문 검색(FTS) 색인 · 요약 스니펫 · 글자 수 계산용이다. 서식은 전부 버리고
|
|
5
|
+
* **사람이 읽는 텍스트만** 남긴다. 이미지는 `alt`, 링크는 표시 텍스트,
|
|
6
|
+
* 파일 첨부는 파일명이 텍스트로 들어간다 — 색인에 걸려야 의미가 있는 값들이다.
|
|
7
|
+
*/
|
|
8
|
+
import type { BlockSnapshot } from './blocks.cjs';
|
|
9
|
+
export interface PlainTextOptions {
|
|
10
|
+
/** 블록 사이 구분자. 기본 `'\n\n'`. 색인용으로 `' '` 를 쓰기도 한다. */
|
|
11
|
+
blockSeparator?: string;
|
|
12
|
+
/** 표 셀 구분자. 기본 `'\t'`. */
|
|
13
|
+
cellSeparator?: string;
|
|
14
|
+
}
|
|
15
|
+
/** 스냅샷 배열에서 평문을 추출한다. */
|
|
16
|
+
export declare function blocksToPlainText(snapshots: readonly BlockSnapshot[], options?: PlainTextOptions): string;
|
|
17
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM 없이 `BlockSnapshot[]` → HTML 문자열.
|
|
3
|
+
*
|
|
4
|
+
* `document` / `window` 를 **모듈 최상위에서도, 함수 안에서도** 참조하지 않는다.
|
|
5
|
+
* Cloudflare Workers(workerd) · Node · Deno · Bun 어디서든 그대로 동작한다.
|
|
6
|
+
*
|
|
7
|
+
* ## 보장
|
|
8
|
+
*
|
|
9
|
+
* - **결정적** — 같은 입력이면 항상 같은 문자열. 난수 · 현재 시각 · 순회 순서에
|
|
10
|
+
* 의존하는 값을 쓰지 않는다. 따라서 재렌더 결과의 diff 가 의미를 갖는다.
|
|
11
|
+
* - **멱등** — 같은 스냅샷을 몇 번 렌더해도 결과가 누적되거나 변하지 않는다.
|
|
12
|
+
* - **에디터 전용 마크업 없음** — 리사이즈 핸들 · 정렬 컨트롤 · `contenteditable`
|
|
13
|
+
* 같은 편집 보조 마크업은 출력에 포함되지 않는다.
|
|
14
|
+
*
|
|
15
|
+
* ## 브라우저 렌더 경로와의 관계
|
|
16
|
+
*
|
|
17
|
+
* DOM 경로(`renderBlock`) 와 **같은 결과**를 내는 것이 목표다. 모든 블록은
|
|
18
|
+
* `snapshot.html` 을 그대로 싣고, `html` 이 비어 있을 때만 `attrs` 로 골격을
|
|
19
|
+
* 조립한다 (`AerizViewer` 도 같은 규칙).
|
|
20
|
+
*
|
|
21
|
+
* 원자 블록(이미지 · 유튜브 · 링크 카드 · 파일) 도 예외가 아니다. 예전에는
|
|
22
|
+
* `attrs` 로만 다시 조립했는데, 그러면 `<figcaption>` 처럼 `attrs` 에 없는
|
|
23
|
+
* 사용자 컨텐츠가 **서버 렌더에서만** 사라져 같은 스냅샷이 브라우저와 서버에서
|
|
24
|
+
* 다르게 보였다.
|
|
25
|
+
*
|
|
26
|
+
* 편집 보조 마크업(정렬 컨트롤 · 리사이즈 핸들) 은 1.0.3 부터 `serialize()` 가
|
|
27
|
+
* 애초에 싣지 않지만, 그 이전 데이터를 위해 읽는 쪽에서도 걷어낸다.
|
|
28
|
+
*/
|
|
29
|
+
import type { BlockSnapshot } from './blocks.cjs';
|
|
30
|
+
export interface RenderHtmlOptions {
|
|
31
|
+
/**
|
|
32
|
+
* 각 블록에 `data-block-id` 를 남길지. 기본 `true`.
|
|
33
|
+
*
|
|
34
|
+
* 저장된 스냅샷과 렌더된 HTML 을 대조해야 하는 경우(앵커 링크, 코멘트 위치
|
|
35
|
+
* 고정 등) 켜 두고, 순수 발행용 HTML 이면 끈다.
|
|
36
|
+
*/
|
|
37
|
+
blockIds?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* 감싸는 컨테이너.
|
|
40
|
+
* - `'none'` (기본) — 블록들만 이어붙인 조각
|
|
41
|
+
* - `'content'` — `<div class="aeriz-wysiwyg"><div class="aw-content">…`
|
|
42
|
+
* 로 감싼다. 배포된 `aeriz-wysiwyg.min.css` 를 함께 로드하면 에디터와 같은
|
|
43
|
+
* 시각으로 렌더된다 (클래스 기반 스타일링 경로).
|
|
44
|
+
*/
|
|
45
|
+
wrapper?: 'none' | 'content';
|
|
46
|
+
/** `wrapper: 'content'` 일 때 컨테이너에 부여할 테마. */
|
|
47
|
+
theme?: 'light' | 'dark';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 스냅샷 배열을 HTML 문자열로 렌더한다.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* // Cloudflare Worker
|
|
54
|
+
* import { renderBlocksToHTML } from '@aeriz/wysiwyg/server';
|
|
55
|
+
*
|
|
56
|
+
* const html = renderBlocksToHTML(post.blocks, { wrapper: 'content' });
|
|
57
|
+
*/
|
|
58
|
+
export declare function renderBlocksToHTML(snapshots: readonly BlockSnapshot[], options?: RenderHtmlOptions): string;
|
|
59
|
+
/**
|
|
60
|
+
* 단일 스냅샷을 HTML 문자열로 렌더한다.
|
|
61
|
+
*
|
|
62
|
+
* 스트리밍 · 블록 단위 캐시처럼 블록을 하나씩 렌더하는 호출자를 위해 공개돼
|
|
63
|
+
* 있다. `renderBlocksToHTML` 과 **같은 정규화**를 거쳐야 하므로 여기서도
|
|
64
|
+
* `upgradeSnapshot` 을 적용한다 — 빠뜨리면 모르는 kind 가 exhaustive 분기로
|
|
65
|
+
* 떨어져 빈 문자열이 되고, 블록이 조용히 사라진다.
|
|
66
|
+
*/
|
|
67
|
+
export declare function renderBlockToHTML(snapshot: BlockSnapshot, options?: Pick<RenderHtmlOptions, 'blockIds'>): string;
|
|
68
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlockSnapshot 스키마 버전과 마이그레이션 진입점.
|
|
3
|
+
*
|
|
4
|
+
* 이 모듈은 **DOM 을 전혀 참조하지 않는다**. `document` / `window` 가 없는
|
|
5
|
+
* 런타임(Cloudflare workerd, Node, Deno) 에서 그대로 import 할 수 있어야 하므로
|
|
6
|
+
* blocks.ts 로부터는 타입만 가져온다.
|
|
7
|
+
*/
|
|
8
|
+
import type { BlockSnapshot } from './blocks.cjs';
|
|
9
|
+
/**
|
|
10
|
+
* 현재 직렬화 스키마 버전.
|
|
11
|
+
*
|
|
12
|
+
* `serializeBlock()` 은 항상 이 값을 `snapshot.version` 에 기록한다.
|
|
13
|
+
*
|
|
14
|
+
* ## 버전 변경 정책
|
|
15
|
+
*
|
|
16
|
+
* 버전을 올리는 경우 — 저장된 데이터를 그대로 읽으면 **의미가 달라지는** 변경:
|
|
17
|
+
* - `kind` 의 삭제 또는 의미 변경
|
|
18
|
+
* - 기존 `attrs` 필드의 삭제 · 이름 변경 · 타입 변경 · 단위 변경
|
|
19
|
+
* - `html` 필드가 담는 내용의 범위 변경 (예: 인라인 컨텐츠 → 전체 outerHTML)
|
|
20
|
+
*
|
|
21
|
+
* 버전을 올리지 않는 경우 — 구버전 데이터를 그대로 읽어도 안전한 변경:
|
|
22
|
+
* - 새로운 `kind` 추가 (구버전 데이터에는 등장하지 않음)
|
|
23
|
+
* - 새로운 optional `attrs` 필드 추가
|
|
24
|
+
* - 렌더 결과의 시각적 변경 (CSS · 마크업 세부)
|
|
25
|
+
*
|
|
26
|
+
* 버전이 올라가면 {@link upgradeSnapshots} 에 해당 단계의 변환을 추가하고,
|
|
27
|
+
* 이 상수를 올린다. 읽기 경로(`AerizViewer.setBlocks` /
|
|
28
|
+
* `renderBlocksToHTML`) 는 모두 upgrade 를 거치도록 유지한다.
|
|
29
|
+
*/
|
|
30
|
+
export declare const SNAPSHOT_VERSION = 1;
|
|
31
|
+
/**
|
|
32
|
+
* 스냅샷의 스키마 버전. `version` 이 없으면 버전 필드 도입 이전 데이터이므로
|
|
33
|
+
* 1 로 간주한다 (1.0.x 까지의 출력이 여기 해당한다).
|
|
34
|
+
*/
|
|
35
|
+
export declare function snapshotVersionOf(snapshot: BlockSnapshot): number;
|
|
36
|
+
/**
|
|
37
|
+
* 저장된 스냅샷을 현재 스키마로 정규화한다.
|
|
38
|
+
*
|
|
39
|
+
* 읽기 경로의 단일 관문이다. 지금(v1) 은 실질 변환이 없고 다음만 보정한다.
|
|
40
|
+
* - `version` 누락 → 1 로 채움
|
|
41
|
+
* - 모르는 `kind` → `'unknown'` 으로 강등 (미래 버전으로 저장된 글을 구버전
|
|
42
|
+
* 클라이언트가 열었을 때 렌더가 통째로 깨지는 대신 해당 블록만 원문 유지)
|
|
43
|
+
* - `html` 누락 → 빈 문자열
|
|
44
|
+
*
|
|
45
|
+
* 버전이 올라가면 여기에 단계별 변환(1→2, 2→3 …) 을 순차 적용하는 형태로
|
|
46
|
+
* 확장한다.
|
|
47
|
+
*/
|
|
48
|
+
export declare function upgradeSnapshots(input: readonly BlockSnapshot[]): BlockSnapshot[];
|
|
49
|
+
/** 단일 스냅샷 정규화. {@link upgradeSnapshots} 의 단위 연산. */
|
|
50
|
+
export declare function upgradeSnapshot(snapshot: BlockSnapshot): BlockSnapshot;
|
|
51
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// (CSS 부수 효과 import 는 타입 선언에서 제거됨 — scripts/strip-css-imports.mjs)
|
|
2
|
+
export { AerizEditor } from './core/AerizEditor.cjs';
|
|
3
|
+
export type { EditorState, EditorStateListener, InlineState, } from './core/AerizEditor.cjs';
|
|
4
|
+
export { AerizViewer } from './core/AerizViewer.cjs';
|
|
5
|
+
export type { ViewerOptions } from './core/AerizViewer.cjs';
|
|
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.cjs';
|
|
7
|
+
export type { BlockStyleTheme } from './core/blocks.cjs';
|
|
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.cjs';
|
|
9
|
+
export type { EditorOptions, HtmlStyleMode, SerializeHtmlOptions, ToolbarConfig, ToolbarItem, ToolbarItemName, } from './types/index.cjs';
|
|
10
|
+
export { DEFAULT_TOOLBAR } from './types/index.cjs';
|
|
11
|
+
export { SNAPSHOT_VERSION, snapshotVersionOf, upgradeSnapshot, upgradeSnapshots, } from './core/snapshot.cjs';
|
|
12
|
+
export { renderBlockToHTML, renderBlocksToHTML } from './core/render-string.cjs';
|
|
13
|
+
export type { RenderHtmlOptions } from './core/render-string.cjs';
|
|
14
|
+
export { blocksToMarkdown } from './core/markdown-export.cjs';
|
|
15
|
+
export type { MarkdownOptions } from './core/markdown-export.cjs';
|
|
16
|
+
export { blocksToPlainText } from './core/plain-text.cjs';
|
|
17
|
+
export type { PlainTextOptions } from './core/plain-text.cjs';
|
|
18
|
+
export { decodeEntities, escapeAttr, escapeHtml, parseHtmlFragment, serializeNodes, textOf, textWithBlockBreaks, } from './core/html-mini.cjs';
|
|
19
|
+
export type { HtmlElementNode, HtmlNode, HtmlText } from './core/html-mini.cjs';
|
|
20
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@aeriz/wysiwyg/server` — DOM 없는 런타임용 진입점.
|
|
3
|
+
*
|
|
4
|
+
* 이 모듈은 **CSS 를 import 하지 않으며**, import 그래프 전체가
|
|
5
|
+
* `document` / `window` 를 참조하지 않는다. Cloudflare Workers(workerd) ·
|
|
6
|
+
* Node · Deno · Bun 에서 그대로 쓸 수 있다.
|
|
7
|
+
*
|
|
8
|
+
* 브라우저용 기본 진입점(`@aeriz/wysiwyg`) 은 스타일시트를 부수 효과로
|
|
9
|
+
* 불러오고 에디터/뷰어가 DOM 을 직접 만들기 때문에 서버에서 쓸 수 없다.
|
|
10
|
+
* 저장된 스냅샷을 HTML · 마크다운 · 평문으로 바꾸는 일만 필요하면 여기서
|
|
11
|
+
* 가져오면 된다.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Cloudflare Worker — 저장된 글을 HTML 로 재렌더
|
|
15
|
+
* import { renderBlocksToHTML, blocksToPlainText } from '@aeriz/wysiwyg/server';
|
|
16
|
+
*
|
|
17
|
+
* export default {
|
|
18
|
+
* async fetch(req, env) {
|
|
19
|
+
* const post = await env.DB.get('post:1', 'json');
|
|
20
|
+
* return new Response(
|
|
21
|
+
* renderBlocksToHTML(post.blocks, { wrapper: 'content' }),
|
|
22
|
+
* { headers: { 'content-type': 'text/html; charset=utf-8' } },
|
|
23
|
+
* );
|
|
24
|
+
* },
|
|
25
|
+
* };
|
|
26
|
+
*/
|
|
27
|
+
export { renderBlockToHTML, renderBlocksToHTML, } from '../core/render-string.cjs';
|
|
28
|
+
export type { RenderHtmlOptions } from '../core/render-string.cjs';
|
|
29
|
+
export { blocksToMarkdown } from '../core/markdown-export.cjs';
|
|
30
|
+
export type { MarkdownOptions } from '../core/markdown-export.cjs';
|
|
31
|
+
export { blocksToPlainText } from '../core/plain-text.cjs';
|
|
32
|
+
export type { PlainTextOptions } from '../core/plain-text.cjs';
|
|
33
|
+
export { SNAPSHOT_VERSION, snapshotVersionOf, upgradeSnapshot, upgradeSnapshots, } from '../core/snapshot.cjs';
|
|
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.cjs';
|
|
35
|
+
export { decodeEntities, escapeAttr, escapeHtml, parseHtmlFragment, serializeNodes, textOf, textWithBlockBreaks, } from '../core/html-mini.cjs';
|
|
36
|
+
export type { HtmlElementNode, HtmlNode, HtmlText } from '../core/html-mini.cjs';
|
|
37
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
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 interface ToolbarConfig {
|
|
4
|
+
items: ToolbarItem[];
|
|
5
|
+
sticky?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* HTML 출력의 스타일 전략.
|
|
9
|
+
*
|
|
10
|
+
* - `'inline'` — 테마 색을 블록 인라인 style 에 베이크. 스타일시트 없이도
|
|
11
|
+
* 에디터와 같은 시각으로 렌더된다 (기본값).
|
|
12
|
+
* - `'class'` — 테마 스타일을 베이크하지 않고 `aw-block-*` / `aw-align-*`
|
|
13
|
+
* 클래스만 남긴다. `style` 속성을 제거하는 서버 sanitizer 를 통과해야 할 때
|
|
14
|
+
* 쓴다. 출력은 `aeriz-wysiwyg.min.css` 가 로드된 페이지의
|
|
15
|
+
* `.aeriz-wysiwyg > .aw-content` 안에 넣는 것을 전제로 한다.
|
|
16
|
+
*/
|
|
17
|
+
export type HtmlStyleMode = 'inline' | 'class';
|
|
18
|
+
/** `getHTML()` 호출 단위 옵션. */
|
|
19
|
+
export interface SerializeHtmlOptions {
|
|
20
|
+
/** 스타일 전략. 미지정 시 인스턴스 기본값을 따른다. */
|
|
21
|
+
styles?: HtmlStyleMode;
|
|
22
|
+
}
|
|
23
|
+
export interface EditorOptions {
|
|
24
|
+
element: HTMLElement;
|
|
25
|
+
initialHTML?: string;
|
|
26
|
+
placeholder?: string;
|
|
27
|
+
toolbar?: ToolbarConfig | false;
|
|
28
|
+
theme?: 'light' | 'dark';
|
|
29
|
+
/** UI 언어. 'en' / 'ko' / 'ja' / 'zh'. 기본 'ko'. */
|
|
30
|
+
locale?: 'en' | 'ko' | 'ja' | 'zh';
|
|
31
|
+
/**
|
|
32
|
+
* `getHTML()` 과 `onChange` 가 내보내는 HTML 의 스타일 전략. 기본 `'inline'`.
|
|
33
|
+
* `getHTML({ styles })` 로 호출 단위 재정의 가능.
|
|
34
|
+
*/
|
|
35
|
+
htmlStyles?: HtmlStyleMode;
|
|
36
|
+
onChange?: (html: string) => void;
|
|
37
|
+
/**
|
|
38
|
+
* 직접 업로드 핸들러. 우선 적용된다. 미설정 + `imageUploadUrl` 만 있을 때는
|
|
39
|
+
* 에디터가 multipart/form-data 로 그 URL 에 POST 한 응답 JSON 의
|
|
40
|
+
* `url` 필드를 사용한다.
|
|
41
|
+
*/
|
|
42
|
+
onImageUpload?: (file: File) => Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* 서버 이미지 업로드 API URL. 설정 시 이미지 다이얼로그의 "업로드" 탭이
|
|
45
|
+
* 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
|
|
46
|
+
*/
|
|
47
|
+
imageUploadUrl?: string;
|
|
48
|
+
/**
|
|
49
|
+
* 파일 첨부 직접 업로드 핸들러. 첨부 다이얼로그의 "업로드" 탭에서 사용.
|
|
50
|
+
* 미설정 + `fileUploadUrl` 만 있을 때는 에디터가 multipart/form-data 로
|
|
51
|
+
* POST 한 응답 JSON 의 `url` 필드를 사용한다.
|
|
52
|
+
*/
|
|
53
|
+
onFileUpload?: (file: File) => Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* 서버 파일 업로드 API URL. 설정 시 파일 첨부 다이얼로그의 "업로드" 탭이
|
|
56
|
+
* 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
|
|
57
|
+
*/
|
|
58
|
+
fileUploadUrl?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare const DEFAULT_TOOLBAR: ToolbarConfig;
|
|
61
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolbarConfig, ToolbarItemName } from '../types/index.cjs';
|
|
2
|
+
export interface ToolbarHandlers {
|
|
3
|
+
onAction: (name: ToolbarItemName, anchor: HTMLElement) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare class Toolbar {
|
|
6
|
+
readonly element: HTMLDivElement;
|
|
7
|
+
private buttons;
|
|
8
|
+
constructor(config: ToolbarConfig, handlers: ToolbarHandlers);
|
|
9
|
+
setActive(name: ToolbarItemName, active: boolean): void;
|
|
10
|
+
setEnabled(name: ToolbarItemName, enabled: boolean): void;
|
|
11
|
+
/** 조건부 항목을 완전히 숨긴다 (display:none). 허용 블록으로 돌아오면 다시 보임. */
|
|
12
|
+
setVisible(name: ToolbarItemName, visible: boolean): void;
|
|
13
|
+
/**
|
|
14
|
+
* 모든 자식 버튼이 숨겨진 그룹을 함께 숨긴다 — `|` 구분자 padding 이 외롭게
|
|
15
|
+
* 남지 않도록. applyToolbarState 에서 visibility 갱신 후 호출.
|
|
16
|
+
*/
|
|
17
|
+
syncGroupVisibility(): void;
|
|
18
|
+
private createGroup;
|
|
19
|
+
private createButton;
|
|
20
|
+
}
|
|
21
|
+
// (소스맵은 CJS 선언 사본에서 제외됨 — scripts/finalize-types.mjs)
|