@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.
Files changed (36) hide show
  1. package/LICENSE +201 -0
  2. package/dist/aeriz-wysiwyg.css +1471 -0
  3. package/dist/aeriz-wysiwyg.esm.js +5602 -0
  4. package/dist/aeriz-wysiwyg.esm.min.js +4227 -0
  5. package/dist/aeriz-wysiwyg.js +5605 -0
  6. package/dist/aeriz-wysiwyg.min.css +1 -0
  7. package/dist/aeriz-wysiwyg.min.js +23 -0
  8. package/dist-types/core/AerizEditor.d.ts +337 -0
  9. package/dist-types/core/AerizEditor.d.ts.map +1 -0
  10. package/dist-types/core/AerizViewer.d.ts +49 -0
  11. package/dist-types/core/AerizViewer.d.ts.map +1 -0
  12. package/dist-types/core/blocks.d.ts +303 -0
  13. package/dist-types/core/blocks.d.ts.map +1 -0
  14. package/dist-types/core/fonts.d.ts +49 -0
  15. package/dist-types/core/fonts.d.ts.map +1 -0
  16. package/dist-types/core/highlight.d.ts +44 -0
  17. package/dist-types/core/highlight.d.ts.map +1 -0
  18. package/dist-types/core/i18n.d.ts +209 -0
  19. package/dist-types/core/i18n.d.ts.map +1 -0
  20. package/dist-types/core/import-html.d.ts +28 -0
  21. package/dist-types/core/import-html.d.ts.map +1 -0
  22. package/dist-types/core/import-markdown.d.ts +37 -0
  23. package/dist-types/core/import-markdown.d.ts.map +1 -0
  24. package/dist-types/index.d.ts +11 -0
  25. package/dist-types/index.d.ts.map +1 -0
  26. package/dist-types/types/index.d.ts +40 -0
  27. package/dist-types/types/index.d.ts.map +1 -0
  28. package/dist-types/ui/Toolbar.d.ts +21 -0
  29. package/dist-types/ui/Toolbar.d.ts.map +1 -0
  30. package/dist-types/ui/dialogs.d.ts +74 -0
  31. package/dist-types/ui/dialogs.d.ts.map +1 -0
  32. package/dist-types/ui/icons.d.ts +2 -0
  33. package/dist-types/ui/icons.d.ts.map +1 -0
  34. package/dist-types/ui/popovers.d.ts +70 -0
  35. package/dist-types/ui/popovers.d.ts.map +1 -0
  36. package/package.json +57 -0
@@ -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
+ * - 이미지: `![alt](url)`
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
+ //# sourceMappingURL=import-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-markdown.d.ts","sourceRoot":"","sources":["../../src/core/import-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,EAAE,CAS1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CA8GjD"}
@@ -0,0 +1,11 @@
1
+ import './styles/index.css';
2
+ export { AerizEditor } from './core/AerizEditor';
3
+ export type { EditorState, EditorStateListener, InlineState, } from './core/AerizEditor';
4
+ export { AerizViewer } from './core/AerizViewer';
5
+ export type { ViewerOptions } from './core/AerizViewer';
6
+ export { ALL_INLINE_MARKS, BLOCK_ID_ATTR, BLOCK_TYPES, BLOCK_TYPE_BY_KIND, BlockIdRegistry, applyBlockInlineStyles, assignMissingIds, classifyBlockElement, extractInlineContent, fillInlineContent, findBlockFrom, getBlockLabel, isElementBlank, listBlocks, normalizeContent, placeCaretAtStart, readBlockStyleTheme, renderBlock, renderBlocks, serializeBlock, serializeBlocks, stripEditorOnlyAttrs, } from './core/blocks';
7
+ export type { BlockStyleTheme } from './core/blocks';
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';
9
+ export type { EditorOptions, ToolbarConfig, ToolbarItem, ToolbarItemName, } from './types';
10
+ export { DEFAULT_TOOLBAR } from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,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,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;AAEvB,YAAY,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,eAAe,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,40 @@
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
+ export interface EditorOptions {
8
+ element: HTMLElement;
9
+ initialHTML?: string;
10
+ placeholder?: string;
11
+ toolbar?: ToolbarConfig | false;
12
+ theme?: 'light' | 'dark';
13
+ /** UI 언어. 'en' / 'ko' / 'ja' / 'zh'. 기본 'ko'. */
14
+ locale?: 'en' | 'ko' | 'ja' | 'zh';
15
+ onChange?: (html: string) => void;
16
+ /**
17
+ * 직접 업로드 핸들러. 우선 적용된다. 미설정 + `imageUploadUrl` 만 있을 때는
18
+ * 에디터가 multipart/form-data 로 그 URL 에 POST 한 응답 JSON 의
19
+ * `url` 필드를 사용한다.
20
+ */
21
+ onImageUpload?: (file: File) => Promise<string>;
22
+ /**
23
+ * 서버 이미지 업로드 API URL. 설정 시 이미지 다이얼로그의 "업로드" 탭이
24
+ * 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
25
+ */
26
+ imageUploadUrl?: string;
27
+ /**
28
+ * 파일 첨부 직접 업로드 핸들러. 첨부 다이얼로그의 "업로드" 탭에서 사용.
29
+ * 미설정 + `fileUploadUrl` 만 있을 때는 에디터가 multipart/form-data 로
30
+ * POST 한 응답 JSON 의 `url` 필드를 사용한다.
31
+ */
32
+ onFileUpload?: (file: File) => Promise<string>;
33
+ /**
34
+ * 서버 파일 업로드 API URL. 설정 시 파일 첨부 다이얼로그의 "업로드" 탭이
35
+ * 활성화된다. 미설정 시 업로드 탭은 비활성 + 툴팁 안내.
36
+ */
37
+ fileUploadUrl?: string;
38
+ }
39
+ export declare const DEFAULT_TOOLBAR: ToolbarConfig;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,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,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"}
@@ -0,0 +1,21 @@
1
+ import type { ToolbarConfig, ToolbarItemName } from '../types';
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
+ //# sourceMappingURL=Toolbar.d.ts.map
@@ -0,0 +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;AAG5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAChE;AAqCD,qBAAa,OAAO;IAClB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,OAAO,CAAiD;gBAEpD,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe;IA0B5D,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"}
@@ -0,0 +1,74 @@
1
+ export interface DialogResult {
2
+ confirmed: boolean;
3
+ }
4
+ export interface LinkDialogResult extends DialogResult {
5
+ text?: string;
6
+ href?: string;
7
+ newWindow?: boolean;
8
+ }
9
+ export interface ImageDialogResult extends DialogResult {
10
+ src?: string;
11
+ }
12
+ export interface YouTubeDialogResult extends DialogResult {
13
+ url?: string;
14
+ }
15
+ export interface ImportHtmlDialogResult extends DialogResult {
16
+ /** 사용자가 선택했거나 붙여넣은 원본 HTML 문서 텍스트. */
17
+ html?: string;
18
+ }
19
+ export interface ImportMarkdownDialogResult extends DialogResult {
20
+ /** 사용자가 선택했거나 붙여넣은 원본 Markdown 텍스트. */
21
+ markdown?: string;
22
+ }
23
+ export interface FileAttachmentDialogResult extends DialogResult {
24
+ /** 다운로드 URL — 외부 URL 또는 업로드 API 응답에서 받은 URL. */
25
+ src?: string;
26
+ /** 원본 파일명. download attr 와 표시 라벨에 사용. */
27
+ name?: string;
28
+ /** 바이트 크기 (선택). 파일 업로드/메타에서 알 수 있을 때만. */
29
+ size?: number;
30
+ /** MIME 타입 (선택). 파일 업로드 시에만 알 수 있다. */
31
+ type?: string;
32
+ }
33
+ export interface TableDialogResult extends DialogResult {
34
+ rows?: number;
35
+ cols?: number;
36
+ }
37
+ export declare function openLinkDialog(initial?: {
38
+ text?: string;
39
+ href?: string;
40
+ newWindow?: boolean;
41
+ }, theme?: 'light' | 'dark'): Promise<LinkDialogResult>;
42
+ export declare function openImageDialog(options?: {
43
+ onUpload?: (file: File) => Promise<string>;
44
+ }, theme?: 'light' | 'dark'): Promise<ImageDialogResult>;
45
+ export declare function openTableDialog(theme?: 'light' | 'dark'): Promise<TableDialogResult>;
46
+ /**
47
+ * HTML 파일을 골라 본문에 임포트하기 위한 다이얼로그.
48
+ * 파일 선택(.html / .htm) 또는 textarea 직접 붙여넣기를 모두 지원한다.
49
+ * 확인 시 원본 HTML 문자열을 resolve.
50
+ *
51
+ * 다이얼로그 안에서는 가져오기 동작 자체는 수행하지 않는다 — 호출자가
52
+ * 받은 html 을 importHtmlWithComputedStyles 로 처리한다.
53
+ */
54
+ export declare function openImportHtmlDialog(theme?: 'light' | 'dark'): Promise<ImportHtmlDialogResult>;
55
+ /**
56
+ * Markdown 파일을 골라 본문에 임포트하기 위한 다이얼로그.
57
+ * 파일 선택(.md / .markdown) 또는 textarea 직접 붙여넣기 모두 지원. 확인 시
58
+ * 원본 markdown 문자열을 resolve. 호출자가 받은 markdown 을 markdownToBlocks
59
+ * 으로 처리해 본문에 삽입한다.
60
+ */
61
+ export declare function openMarkdownImportDialog(theme?: 'light' | 'dark'): Promise<ImportMarkdownDialogResult>;
62
+ /**
63
+ * 파일 첨부 다이얼로그. 두 가지 입력 방식:
64
+ * 1) 링크 — 외부 URL + 표시 이름(선택) 입력
65
+ * 2) 업로드 — 사용자가 등록한 onUpload(file) 로 서버 업로드 후 응답 URL 사용
66
+ *
67
+ * 이미지 다이얼로그와 달리 base64 임베드 모드는 의도적으로 제외 — 첨부
68
+ * 파일은 보통 크기가 커서 직렬화 snapshot 비대화의 부작용이 크다.
69
+ */
70
+ export declare function openFileAttachmentDialog(options?: {
71
+ onUpload?: (file: File) => Promise<string>;
72
+ }, theme?: 'light' | 'dark'): Promise<FileAttachmentDialogResult>;
73
+ export declare function openYouTubeDialog(theme?: 'light' | 'dark'): Promise<YouTubeDialogResult>;
74
+ //# sourceMappingURL=dialogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogs.d.ts","sourceRoot":"","sources":["../../src/ui/dialogs.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA2ED,wBAAgB,cAAc,CAC5B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACnE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA4D3B;AAED,wBAAgB,eAAe,CAC7B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAO,EAC5D,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA+J5B;AAoBD,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkEpF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GACvB,OAAO,CAAC,sBAAsB,CAAC,CAoGjC;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAgGrC;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAAO,EAC5D,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAqKrC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwCxF"}
@@ -0,0 +1,2 @@
1
+ export declare const icons: Record<string, string>;
2
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +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,CAoCxC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { BlockAttrs, BlockKind } from '../core/blocks';
2
+ export declare const COLOR_PALETTE: string[];
3
+ export declare function openColorPicker(anchor: HTMLElement, onPick: (color: string | null) => void, recents?: ReadonlyArray<string>): void;
4
+ /**
5
+ * 블록 드롭다운에서 사용자가 고른 항목.
6
+ * - `kind` 가 BlockKind 인 경우 일반 블록 추가/변환
7
+ * - `kind` 가 'importHtml' / 'importMarkdown' 인 경우 외부 가져오기 액션(특수 처리)
8
+ */
9
+ export interface BlockTypeChoice {
10
+ kind: BlockKind | 'importHtml' | 'importMarkdown';
11
+ attrs: BlockAttrs;
12
+ }
13
+ export declare function openBlockTypeDropdown(anchor: HTMLElement, onPick: (choice: BlockTypeChoice) => void): void;
14
+ 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
+ /**
21
+ * 글꼴 선택 드롭다운. 첫 호출 시 모든 글꼴 CSS 를 lazy 로드(Google Fonts +
22
+ * Pretendard CDN), 항목 라벨은 각 글꼴 자신으로 미리보기 렌더한다.
23
+ *
24
+ * - `currentId` 가 지정되면 해당 글꼴 항목에 `aw-popover-item-active` 적용
25
+ * - 선택 시 `onPick(choice)` 호출 + 팝오버 닫힘
26
+ */
27
+ export declare function openFontFamilyDropdown(anchor: HTMLElement, onPick: (choice: FontFamilyChoice) => void, currentId?: string): void;
28
+ export interface CodeLanguageChoice {
29
+ id: string;
30
+ label: string;
31
+ }
32
+ /**
33
+ * 코드 블록의 언어 선택 드롭다운. highlight.ts 의 LANGUAGES 를 그대로 노출.
34
+ *
35
+ * - `currentId` 가 일치하는 항목에 active(✓) 표시
36
+ * - 선택 시 onPick(choice) 호출 + 팝오버 닫힘
37
+ */
38
+ export declare function openCodeLanguageDropdown(anchor: HTMLElement, onPick: (choice: CodeLanguageChoice) => void, currentId?: string): void;
39
+ export type TableMenuAction = 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'deleteRow' | 'deleteCol';
40
+ /**
41
+ * 표 편집 드롭다운 — 행/열 추가·삭제. 활성 블록이 table 일 때만 의미가 있어
42
+ * AerizEditor 가 toolbar 'tableMenu' 항목 클릭 시점에 호출.
43
+ */
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;
55
+ /**
56
+ * 기능 미구현 메뉴 항목용 placeholder 드롭다운.
57
+ * 항목명만 노출하고 "준비 중" 메시지를 보여준다.
58
+ */
59
+ export declare function openComingSoonDropdown(anchor: HTMLElement, label: string): void;
60
+ /**
61
+ * 표 삽입 드롭다운. 모달 대신 anchor 아래에 떠 호버 위치에 따라 2x2 부터
62
+ * 12x12 까지 그리드가 동적으로 늘어난다. 셀을 클릭하면 onPick 호출 + 닫힘,
63
+ * 외부 클릭 / Esc → 취소.
64
+ */
65
+ export interface TableSizeChoice {
66
+ rows: number;
67
+ cols: number;
68
+ }
69
+ export declare function openTableDropdown(anchor: HTMLElement, onPick: (choice: TableSizeChoice) => void): void;
70
+ //# sourceMappingURL=popovers.d.ts.map
@@ -0,0 +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;AAc5D,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;AAiHD,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,CA+BN;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,CAuCN;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;AAiBhB;;;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,CAoGN"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@aeriz/wysiwyg",
3
+ "version": "1.0.0",
4
+ "description": "Korean-friendly WYSIWYG rich text editor",
5
+ "author": "code-repositories",
6
+ "homepage": "https://aeriz.dev",
7
+ "license": "Apache-2.0",
8
+ "type": "module",
9
+ "main": "./dist/aeriz-wysiwyg.esm.js",
10
+ "module": "./dist/aeriz-wysiwyg.esm.js",
11
+ "browser": "./dist/aeriz-wysiwyg.min.js",
12
+ "types": "./dist-types/index.d.ts",
13
+ "unpkg": "./dist/aeriz-wysiwyg.min.js",
14
+ "jsdelivr": "./dist/aeriz-wysiwyg.min.js",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist-types/index.d.ts",
18
+ "import": "./dist/aeriz-wysiwyg.esm.js",
19
+ "default": "./dist/aeriz-wysiwyg.min.js"
20
+ },
21
+ "./dist/aeriz-wysiwyg.min.js": "./dist/aeriz-wysiwyg.min.js",
22
+ "./dist/aeriz-wysiwyg.min.css": "./dist/aeriz-wysiwyg.min.css",
23
+ "./style.css": "./dist/aeriz-wysiwyg.min.css"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "dist-types",
28
+ "LICENSE"
29
+ ],
30
+ "sideEffects": [
31
+ "**/*.css"
32
+ ],
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "keywords": [
37
+ "wysiwyg",
38
+ "editor",
39
+ "rich-text",
40
+ "korean",
41
+ "contenteditable"
42
+ ],
43
+ "scripts": {
44
+ "build:dev": "vite build --mode dev",
45
+ "build:prod": "vite build --mode prod",
46
+ "build:types": "tsc -p tsconfig.build.json",
47
+ "build": "npm run build:dev && npm run build:prod && npm run build:types",
48
+ "dev": "npm run build && vite --config vite.demo.config.ts",
49
+ "preview": "npm run build && vite build --config vite.demo.config.ts && vite preview --config vite.demo.config.ts",
50
+ "typecheck": "tsc --noEmit",
51
+ "prepublishOnly": "npm run build"
52
+ },
53
+ "devDependencies": {
54
+ "typescript": "^5.6.0",
55
+ "vite": "^5.4.0"
56
+ }
57
+ }