@ubermensch1218/hwpxeditor 0.1.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/dist/index.cjs +2626 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +411 -0
- package/dist/index.d.ts +411 -0
- package/dist/index.js +2563 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { HwpxDocument, Style, RunStyle, HwpxOxmlParagraph, HwpxPackage } from '@ubermensch1218/hwpxcore';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
import * as zustand from 'zustand';
|
|
5
|
+
|
|
6
|
+
declare function Editor(): react_jsx_runtime.JSX.Element;
|
|
7
|
+
|
|
8
|
+
declare function PageView(): react_jsx_runtime.JSX.Element;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* EditorViewModel — pure data structures derived from HwpxDocument for rendering.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
interface RunVM {
|
|
15
|
+
text: string;
|
|
16
|
+
bold: boolean;
|
|
17
|
+
italic: boolean;
|
|
18
|
+
underline: boolean;
|
|
19
|
+
strikethrough: boolean;
|
|
20
|
+
color: string | null;
|
|
21
|
+
fontFamily: string | null;
|
|
22
|
+
fontSize: number | null;
|
|
23
|
+
highlightColor: string | null;
|
|
24
|
+
letterSpacing: number | null;
|
|
25
|
+
charPrIdRef: string | null;
|
|
26
|
+
}
|
|
27
|
+
interface TableCellVM {
|
|
28
|
+
row: number;
|
|
29
|
+
col: number;
|
|
30
|
+
rowSpan: number;
|
|
31
|
+
colSpan: number;
|
|
32
|
+
widthPx: number;
|
|
33
|
+
heightPx: number;
|
|
34
|
+
text: string;
|
|
35
|
+
isAnchor: boolean;
|
|
36
|
+
}
|
|
37
|
+
interface TableVM {
|
|
38
|
+
rowCount: number;
|
|
39
|
+
colCount: number;
|
|
40
|
+
cells: TableCellVM[][];
|
|
41
|
+
tableIndex: number;
|
|
42
|
+
}
|
|
43
|
+
interface ImageVM {
|
|
44
|
+
dataUrl: string;
|
|
45
|
+
widthPx: number;
|
|
46
|
+
heightPx: number;
|
|
47
|
+
binaryItemIdRef: string;
|
|
48
|
+
}
|
|
49
|
+
interface ParagraphVM {
|
|
50
|
+
runs: RunVM[];
|
|
51
|
+
tables: TableVM[];
|
|
52
|
+
images: ImageVM[];
|
|
53
|
+
alignment: string;
|
|
54
|
+
lineSpacing: number;
|
|
55
|
+
spacingBefore: number;
|
|
56
|
+
spacingAfter: number;
|
|
57
|
+
firstLineIndent: number;
|
|
58
|
+
marginLeftPx: number;
|
|
59
|
+
marginRightPx: number;
|
|
60
|
+
paragraphIndex: number;
|
|
61
|
+
}
|
|
62
|
+
interface SectionVM {
|
|
63
|
+
pageWidthPx: number;
|
|
64
|
+
pageHeightPx: number;
|
|
65
|
+
marginTopPx: number;
|
|
66
|
+
marginBottomPx: number;
|
|
67
|
+
marginLeftPx: number;
|
|
68
|
+
marginRightPx: number;
|
|
69
|
+
paragraphs: ParagraphVM[];
|
|
70
|
+
sectionIndex: number;
|
|
71
|
+
}
|
|
72
|
+
interface EditorViewModel {
|
|
73
|
+
sections: SectionVM[];
|
|
74
|
+
}
|
|
75
|
+
declare function buildViewModel(doc: HwpxDocument): EditorViewModel;
|
|
76
|
+
|
|
77
|
+
interface PageProps {
|
|
78
|
+
section: SectionVM;
|
|
79
|
+
}
|
|
80
|
+
declare function Page({ section }: PageProps): react_jsx_runtime.JSX.Element;
|
|
81
|
+
|
|
82
|
+
interface ParagraphBlockProps {
|
|
83
|
+
paragraph: ParagraphVM;
|
|
84
|
+
sectionIndex: number;
|
|
85
|
+
/** Index of this paragraph within the section's paragraphs array */
|
|
86
|
+
localIndex: number;
|
|
87
|
+
}
|
|
88
|
+
declare function ParagraphBlock({ paragraph, sectionIndex, localIndex, }: ParagraphBlockProps): react_jsx_runtime.JSX.Element;
|
|
89
|
+
|
|
90
|
+
interface RunSpanProps {
|
|
91
|
+
run: RunVM;
|
|
92
|
+
}
|
|
93
|
+
declare function RunSpan({ run }: RunSpanProps): react_jsx_runtime.JSX.Element;
|
|
94
|
+
|
|
95
|
+
interface ImageBlockProps {
|
|
96
|
+
image: ImageVM;
|
|
97
|
+
}
|
|
98
|
+
declare function ImageBlock({ image }: ImageBlockProps): react_jsx_runtime.JSX.Element;
|
|
99
|
+
|
|
100
|
+
interface TableBlockProps {
|
|
101
|
+
table: TableVM;
|
|
102
|
+
sectionIndex: number;
|
|
103
|
+
paragraphIndex: number;
|
|
104
|
+
}
|
|
105
|
+
declare function TableBlock({ table, sectionIndex, paragraphIndex }: TableBlockProps): react_jsx_runtime.JSX.Element;
|
|
106
|
+
|
|
107
|
+
interface TableCellProps {
|
|
108
|
+
cell: TableCellVM;
|
|
109
|
+
sectionIndex: number;
|
|
110
|
+
paragraphIndex: number;
|
|
111
|
+
tableIndex: number;
|
|
112
|
+
}
|
|
113
|
+
declare function TableCell({ cell, sectionIndex, paragraphIndex, tableIndex, }: TableCellProps): react_jsx_runtime.JSX.Element | null;
|
|
114
|
+
|
|
115
|
+
declare function RibbonToolbar(): react_jsx_runtime.JSX.Element;
|
|
116
|
+
|
|
117
|
+
declare function SecondaryToolbar(): react_jsx_runtime.JSX.Element;
|
|
118
|
+
|
|
119
|
+
interface ToolbarButtonProps {
|
|
120
|
+
icon: ReactNode;
|
|
121
|
+
label?: string;
|
|
122
|
+
active?: boolean;
|
|
123
|
+
disabled?: boolean;
|
|
124
|
+
onClick?: () => void;
|
|
125
|
+
title?: string;
|
|
126
|
+
size?: "sm" | "md";
|
|
127
|
+
className?: string;
|
|
128
|
+
}
|
|
129
|
+
declare function ToolbarButton({ icon, label, active, disabled, onClick, title, size, className, }: ToolbarButtonProps): react_jsx_runtime.JSX.Element;
|
|
130
|
+
|
|
131
|
+
interface ToolbarDropdownProps {
|
|
132
|
+
value: string;
|
|
133
|
+
options: {
|
|
134
|
+
value: string;
|
|
135
|
+
label: string;
|
|
136
|
+
}[];
|
|
137
|
+
onChange: (value: string) => void;
|
|
138
|
+
disabled?: boolean;
|
|
139
|
+
title?: string;
|
|
140
|
+
className?: string;
|
|
141
|
+
width?: string;
|
|
142
|
+
icon?: ReactNode;
|
|
143
|
+
}
|
|
144
|
+
declare function ToolbarDropdown({ value, options, onChange, disabled, title, className, width, icon, }: ToolbarDropdownProps): react_jsx_runtime.JSX.Element;
|
|
145
|
+
|
|
146
|
+
declare function ToolbarDivider(): react_jsx_runtime.JSX.Element;
|
|
147
|
+
|
|
148
|
+
interface ColorPickerProps {
|
|
149
|
+
color: string;
|
|
150
|
+
onChange: (color: string) => void;
|
|
151
|
+
icon: ReactNode;
|
|
152
|
+
title?: string;
|
|
153
|
+
disabled?: boolean;
|
|
154
|
+
}
|
|
155
|
+
declare function ColorPicker({ color, onChange, icon, title, disabled, }: ColorPickerProps): react_jsx_runtime.JSX.Element;
|
|
156
|
+
|
|
157
|
+
interface RibbonGroupProps {
|
|
158
|
+
label: string;
|
|
159
|
+
children: ReactNode;
|
|
160
|
+
}
|
|
161
|
+
declare function RibbonGroup({ label, children }: RibbonGroupProps): react_jsx_runtime.JSX.Element;
|
|
162
|
+
|
|
163
|
+
declare function ClipboardGroup(): react_jsx_runtime.JSX.Element;
|
|
164
|
+
|
|
165
|
+
declare function InsertGroup(): react_jsx_runtime.JSX.Element;
|
|
166
|
+
|
|
167
|
+
interface StyleSelectorProps {
|
|
168
|
+
value: string;
|
|
169
|
+
onChange: (value: string) => void;
|
|
170
|
+
disabled?: boolean;
|
|
171
|
+
}
|
|
172
|
+
declare function StyleSelector({ value, onChange, disabled }: StyleSelectorProps): react_jsx_runtime.JSX.Element;
|
|
173
|
+
|
|
174
|
+
interface FontSelectorProps {
|
|
175
|
+
value: string;
|
|
176
|
+
onChange: (value: string) => void;
|
|
177
|
+
disabled?: boolean;
|
|
178
|
+
}
|
|
179
|
+
declare function FontSelector({ value, onChange, disabled }: FontSelectorProps): react_jsx_runtime.JSX.Element;
|
|
180
|
+
|
|
181
|
+
interface FontSizeInputProps {
|
|
182
|
+
value: number;
|
|
183
|
+
onChange: (value: number) => void;
|
|
184
|
+
disabled?: boolean;
|
|
185
|
+
}
|
|
186
|
+
declare function FontSizeInput({ value, onChange, disabled }: FontSizeInputProps): react_jsx_runtime.JSX.Element;
|
|
187
|
+
|
|
188
|
+
declare function CharFormatButtons(): react_jsx_runtime.JSX.Element;
|
|
189
|
+
|
|
190
|
+
declare function AlignmentButtons(): react_jsx_runtime.JSX.Element;
|
|
191
|
+
|
|
192
|
+
declare function LineSpacingControl(): react_jsx_runtime.JSX.Element;
|
|
193
|
+
|
|
194
|
+
declare function FormatSidebar(): react_jsx_runtime.JSX.Element | null;
|
|
195
|
+
|
|
196
|
+
interface SidebarSectionProps {
|
|
197
|
+
title: string;
|
|
198
|
+
children: ReactNode;
|
|
199
|
+
defaultOpen?: boolean;
|
|
200
|
+
}
|
|
201
|
+
declare function SidebarSection({ title, children, defaultOpen, }: SidebarSectionProps): react_jsx_runtime.JSX.Element;
|
|
202
|
+
|
|
203
|
+
interface SidebarFieldProps {
|
|
204
|
+
label: string;
|
|
205
|
+
children: ReactNode;
|
|
206
|
+
}
|
|
207
|
+
declare function SidebarField({ label, children }: SidebarFieldProps): react_jsx_runtime.JSX.Element;
|
|
208
|
+
|
|
209
|
+
declare function CharFormatPanel(): react_jsx_runtime.JSX.Element;
|
|
210
|
+
|
|
211
|
+
declare function ParaFormatPanel(): react_jsx_runtime.JSX.Element;
|
|
212
|
+
|
|
213
|
+
interface BorderSettingsProps {
|
|
214
|
+
disabled?: boolean;
|
|
215
|
+
}
|
|
216
|
+
declare function BorderSettings({ disabled }: BorderSettingsProps): react_jsx_runtime.JSX.Element;
|
|
217
|
+
|
|
218
|
+
interface BackgroundSettingsProps {
|
|
219
|
+
disabled?: boolean;
|
|
220
|
+
}
|
|
221
|
+
declare function BackgroundSettings({ disabled }: BackgroundSettingsProps): react_jsx_runtime.JSX.Element;
|
|
222
|
+
|
|
223
|
+
declare function HorizontalRuler(): react_jsx_runtime.JSX.Element | null;
|
|
224
|
+
|
|
225
|
+
declare function FileUpload(): react_jsx_runtime.JSX.Element;
|
|
226
|
+
|
|
227
|
+
declare function NewDocumentButton(): react_jsx_runtime.JSX.Element;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Constants for the HWPX editor UI — font lists, style presets, alignment/spacing options.
|
|
231
|
+
*/
|
|
232
|
+
declare const FONT_FAMILIES: readonly ["맑은 고딕", "함초롬돋움", "함초롬바탕", "나눔고딕", "나눔명조", "나눔바른고딕", "바탕", "돋움", "굴림", "궁서", "Arial", "Times New Roman", "Courier New", "Verdana", "Georgia"];
|
|
233
|
+
type FontFamily = (typeof FONT_FAMILIES)[number];
|
|
234
|
+
declare const FONT_SIZES: readonly [8, 9, 10, 10.5, 11, 12, 14, 16, 18, 20, 22, 24, 28, 32, 36, 48, 72];
|
|
235
|
+
interface StylePreset {
|
|
236
|
+
id: string;
|
|
237
|
+
name: string;
|
|
238
|
+
engName: string;
|
|
239
|
+
}
|
|
240
|
+
declare const STYLE_PRESETS: StylePreset[];
|
|
241
|
+
type AlignmentType = "LEFT" | "CENTER" | "RIGHT" | "JUSTIFY" | "DISTRIBUTE";
|
|
242
|
+
interface AlignmentOption {
|
|
243
|
+
value: AlignmentType;
|
|
244
|
+
label: string;
|
|
245
|
+
shortcut?: string;
|
|
246
|
+
}
|
|
247
|
+
declare const ALIGNMENT_OPTIONS: AlignmentOption[];
|
|
248
|
+
interface LineSpacingOption {
|
|
249
|
+
value: number;
|
|
250
|
+
label: string;
|
|
251
|
+
}
|
|
252
|
+
declare const LINE_SPACING_OPTIONS: LineSpacingOption[];
|
|
253
|
+
declare const UNDERLINE_TYPES: readonly ["NONE", "SOLID", "DASH", "DOT", "DASH_DOT", "DASH_DOT_DOT", "LONG_DASH", "DOUBLE", "WAVE", "HEAVY_WAVE", "DOUBLE_WAVE"];
|
|
254
|
+
declare const COLOR_PRESETS: readonly ["#000000", "#333333", "#555555", "#777777", "#999999", "#BBBBBB", "#DDDDDD", "#FFFFFF", "#FF0000", "#FF6600", "#FFCC00", "#33CC33", "#0099FF", "#3366FF", "#6633CC", "#CC33CC", "#FF9999", "#FFCC99", "#FFFF99", "#CCFFCC", "#99CCFF", "#9999FF", "#CC99FF", "#FF99CC", "#CC0000", "#CC6600", "#CC9900", "#009900", "#006699", "#003399", "#330099", "#990066"];
|
|
255
|
+
declare const HIGHLIGHT_COLORS: readonly [{
|
|
256
|
+
readonly value: "#FFFF00";
|
|
257
|
+
readonly label: "노랑";
|
|
258
|
+
}, {
|
|
259
|
+
readonly value: "#00FF00";
|
|
260
|
+
readonly label: "연두";
|
|
261
|
+
}, {
|
|
262
|
+
readonly value: "#00FFFF";
|
|
263
|
+
readonly label: "하늘";
|
|
264
|
+
}, {
|
|
265
|
+
readonly value: "#FF00FF";
|
|
266
|
+
readonly label: "분홍";
|
|
267
|
+
}, {
|
|
268
|
+
readonly value: "#0000FF";
|
|
269
|
+
readonly label: "파랑";
|
|
270
|
+
}, {
|
|
271
|
+
readonly value: "#FF0000";
|
|
272
|
+
readonly label: "빨강";
|
|
273
|
+
}, {
|
|
274
|
+
readonly value: "#008000";
|
|
275
|
+
readonly label: "초록";
|
|
276
|
+
}, {
|
|
277
|
+
readonly value: "#800080";
|
|
278
|
+
readonly label: "보라";
|
|
279
|
+
}, {
|
|
280
|
+
readonly value: "#808080";
|
|
281
|
+
readonly label: "회색";
|
|
282
|
+
}, {
|
|
283
|
+
readonly value: "none";
|
|
284
|
+
readonly label: "없음";
|
|
285
|
+
}];
|
|
286
|
+
type SidebarTab = "char" | "para";
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* format-bridge.ts — Bridge between UI and @ubermensch1218/hwpxcore formatting APIs.
|
|
290
|
+
*
|
|
291
|
+
* Reads charPr / paraPr from the document and converts to UI-friendly formats.
|
|
292
|
+
* Also provides methods to apply format changes back to the document.
|
|
293
|
+
*/
|
|
294
|
+
|
|
295
|
+
interface CharFormat {
|
|
296
|
+
bold: boolean;
|
|
297
|
+
italic: boolean;
|
|
298
|
+
underline: boolean;
|
|
299
|
+
strikethrough: boolean;
|
|
300
|
+
fontFamily: string | null;
|
|
301
|
+
fontSize: number | null;
|
|
302
|
+
textColor: string | null;
|
|
303
|
+
highlightColor: string | null;
|
|
304
|
+
letterSpacing: number | null;
|
|
305
|
+
}
|
|
306
|
+
interface ParaFormat {
|
|
307
|
+
alignment: AlignmentType;
|
|
308
|
+
lineSpacing: number;
|
|
309
|
+
spacingBefore: number;
|
|
310
|
+
spacingAfter: number;
|
|
311
|
+
indentLeft: number;
|
|
312
|
+
indentRight: number;
|
|
313
|
+
firstLineIndent: number;
|
|
314
|
+
}
|
|
315
|
+
declare function readCharFormat(style: RunStyle | null): CharFormat;
|
|
316
|
+
declare function readParaFormat(doc: HwpxDocument, paragraph: HwpxOxmlParagraph): ParaFormat;
|
|
317
|
+
declare function readStyleInfo(doc: HwpxDocument, paragraph: HwpxOxmlParagraph): {
|
|
318
|
+
styleName: string | null;
|
|
319
|
+
styleId: string | null;
|
|
320
|
+
};
|
|
321
|
+
declare function getDocumentStyles(doc: HwpxDocument): Style[];
|
|
322
|
+
declare function readFormatFromSelection(doc: HwpxDocument, sectionIndex: number, paragraphIndex: number): {
|
|
323
|
+
char: CharFormat;
|
|
324
|
+
para: ParaFormat;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
interface SelectionState {
|
|
328
|
+
sectionIndex: number;
|
|
329
|
+
paragraphIndex: number;
|
|
330
|
+
type: "paragraph" | "cell";
|
|
331
|
+
tableIndex?: number;
|
|
332
|
+
row?: number;
|
|
333
|
+
col?: number;
|
|
334
|
+
}
|
|
335
|
+
interface ActiveFormat {
|
|
336
|
+
bold: boolean;
|
|
337
|
+
italic: boolean;
|
|
338
|
+
underline: boolean;
|
|
339
|
+
}
|
|
340
|
+
interface ExtendedFormat {
|
|
341
|
+
char: CharFormat;
|
|
342
|
+
para: ParaFormat;
|
|
343
|
+
}
|
|
344
|
+
interface UIState {
|
|
345
|
+
sidebarOpen: boolean;
|
|
346
|
+
sidebarTab: SidebarTab;
|
|
347
|
+
}
|
|
348
|
+
interface EditorStore {
|
|
349
|
+
doc: HwpxDocument | null;
|
|
350
|
+
viewModel: EditorViewModel | null;
|
|
351
|
+
revision: number;
|
|
352
|
+
selection: SelectionState | null;
|
|
353
|
+
activeFormat: ActiveFormat;
|
|
354
|
+
extendedFormat: ExtendedFormat;
|
|
355
|
+
uiState: UIState;
|
|
356
|
+
loading: boolean;
|
|
357
|
+
error: string | null;
|
|
358
|
+
setDocument: (doc: HwpxDocument) => void;
|
|
359
|
+
rebuild: () => void;
|
|
360
|
+
setSelection: (sel: SelectionState | null) => void;
|
|
361
|
+
setActiveFormat: (fmt: Partial<ActiveFormat>) => void;
|
|
362
|
+
refreshExtendedFormat: () => void;
|
|
363
|
+
toggleSidebar: () => void;
|
|
364
|
+
setSidebarTab: (tab: SidebarTab) => void;
|
|
365
|
+
updateParagraphText: (sectionIndex: number, paragraphIndex: number, text: string) => void;
|
|
366
|
+
updateCellText: (sectionIndex: number, paragraphIndex: number, tableIndex: number, row: number, col: number, text: string) => void;
|
|
367
|
+
toggleBold: () => void;
|
|
368
|
+
toggleItalic: () => void;
|
|
369
|
+
toggleUnderline: () => void;
|
|
370
|
+
addParagraph: (text?: string) => void;
|
|
371
|
+
addTable: (sectionIndex: number, paragraphIndex: number, rows: number, cols: number) => void;
|
|
372
|
+
insertImage: (data: Uint8Array, mediaType: string, widthMm: number, heightMm: number) => void;
|
|
373
|
+
saveDocument: () => Promise<void>;
|
|
374
|
+
setLoading: (loading: boolean) => void;
|
|
375
|
+
setError: (error: string | null) => void;
|
|
376
|
+
}
|
|
377
|
+
declare const useEditorStore: zustand.UseBoundStore<zustand.StoreApi<EditorStore>>;
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* HWPX unit conversion utilities.
|
|
381
|
+
*
|
|
382
|
+
* HWPX uses hwpUnit where 7200 hwpUnit = 1 inch = 25.4 mm.
|
|
383
|
+
* Screen rendering at 96 DPI: 1 hwpUnit = 96/7200 px ≈ 0.01333 px.
|
|
384
|
+
*/
|
|
385
|
+
/** Convert hwpUnit to pixels at 96 DPI. */
|
|
386
|
+
declare function hwpToPx(hwpUnit: number): number;
|
|
387
|
+
/** Convert pixels (96 DPI) to hwpUnit. */
|
|
388
|
+
declare function pxToHwp(px: number): number;
|
|
389
|
+
/** Convert hwpUnit to millimeters. */
|
|
390
|
+
declare function hwpToMm(hwpUnit: number): number;
|
|
391
|
+
/** Convert millimeters to hwpUnit. */
|
|
392
|
+
declare function mmToHwp(mm: number): number;
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Extract binary image data from an HwpxDocument package as data URLs.
|
|
396
|
+
*/
|
|
397
|
+
|
|
398
|
+
/** Map of binaryItemIdRef → data:... URL for all images in the package. */
|
|
399
|
+
declare function extractImages(pkg: HwpxPackage): Map<string, string>;
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Browser-side Skeleton.hwpx loader.
|
|
403
|
+
* Fetches from /Skeleton.hwpx and calls setSkeletonHwpx() to register it.
|
|
404
|
+
*/
|
|
405
|
+
|
|
406
|
+
/** Fetch Skeleton.hwpx from the public folder and register it with @ubermensch1218/hwpxcore. */
|
|
407
|
+
declare function ensureSkeletonLoaded(): Promise<void>;
|
|
408
|
+
/** Create a new empty HwpxDocument from the skeleton template. */
|
|
409
|
+
declare function createNewDocument(): Promise<HwpxDocument>;
|
|
410
|
+
|
|
411
|
+
export { ALIGNMENT_OPTIONS, type ActiveFormat, AlignmentButtons, type AlignmentOption, type AlignmentType, BackgroundSettings, BorderSettings, COLOR_PRESETS, type CharFormat, CharFormatButtons, CharFormatPanel, ClipboardGroup, ColorPicker, Editor, type EditorStore, type EditorViewModel, type ExtendedFormat, FONT_FAMILIES, FONT_SIZES, FileUpload, type FontFamily, FontSelector, FontSizeInput, FormatSidebar, HIGHLIGHT_COLORS, HorizontalRuler, ImageBlock, type ImageVM, InsertGroup, LINE_SPACING_OPTIONS, LineSpacingControl, type LineSpacingOption, NewDocumentButton, Page, PageView, type ParaFormat, ParaFormatPanel, ParagraphBlock, type ParagraphVM, RibbonGroup, RibbonToolbar, RunSpan, type RunVM, STYLE_PRESETS, SecondaryToolbar, type SectionVM, type SelectionState, SidebarField, SidebarSection, type SidebarTab, type StylePreset, StyleSelector, TableBlock, TableCell, type TableCellVM, type TableVM, ToolbarButton, ToolbarDivider, ToolbarDropdown, type UIState, UNDERLINE_TYPES, buildViewModel, createNewDocument, ensureSkeletonLoaded, extractImages, getDocumentStyles, hwpToMm, hwpToPx, mmToHwp, pxToHwp, readCharFormat, readFormatFromSelection, readParaFormat, readStyleInfo, useEditorStore };
|