@aeriz/wysiwyg 1.0.2 → 1.0.4

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 (131) hide show
  1. package/README.md +634 -96
  2. package/angular/README.md +112 -0
  3. package/angular/aeriz-editor.directive.ts +243 -0
  4. package/angular/aeriz-wysiwyg.module.ts +14 -0
  5. package/angular/index.ts +5 -0
  6. package/dist/adapters/jquery.cjs +1 -0
  7. package/dist/adapters/jquery.js +91 -0
  8. package/dist/adapters/react.cjs +1 -0
  9. package/dist/adapters/react.js +66 -0
  10. package/dist/adapters/shared.cjs +1 -0
  11. package/dist/adapters/shared.js +87 -0
  12. package/dist/adapters/svelte.cjs +1 -0
  13. package/dist/adapters/svelte.js +29 -0
  14. package/dist/adapters/vue.cjs +1 -0
  15. package/dist/adapters/vue.js +110 -0
  16. package/dist/adapters/vue2.cjs +1 -0
  17. package/dist/adapters/vue2.js +117 -0
  18. package/dist/adapters/wc.cjs +1 -0
  19. package/dist/adapters/wc.js +207 -0
  20. package/dist/aeriz-wysiwyg-adapter.js +169 -0
  21. package/dist/aeriz-wysiwyg-adapter.min.js +1 -0
  22. package/dist/aeriz-wysiwyg-jquery.js +275 -0
  23. package/dist/aeriz-wysiwyg-jquery.min.js +1 -0
  24. package/dist/aeriz-wysiwyg-wc.js +401 -0
  25. package/dist/aeriz-wysiwyg-wc.min.js +1 -0
  26. package/dist/aeriz-wysiwyg.cjs +8759 -0
  27. package/dist/aeriz-wysiwyg.css +587 -163
  28. package/dist/aeriz-wysiwyg.esm.js +4249 -1381
  29. package/dist/aeriz-wysiwyg.esm.min.js +4456 -1995
  30. package/dist/aeriz-wysiwyg.js +4249 -1381
  31. package/dist/aeriz-wysiwyg.min.cjs +56 -0
  32. package/dist/aeriz-wysiwyg.min.css +1 -1
  33. package/dist/aeriz-wysiwyg.min.js +54 -21
  34. package/dist/server.cjs +34 -0
  35. package/dist/server.js +798 -0
  36. package/dist-types/adapters/jquery.d.ts +34 -0
  37. package/dist-types/adapters/jquery.d.ts.map +1 -0
  38. package/dist-types/adapters/react.d.ts +28 -0
  39. package/dist-types/adapters/react.d.ts.map +1 -0
  40. package/dist-types/adapters/shared.d.ts +83 -0
  41. package/dist-types/adapters/shared.d.ts.map +1 -0
  42. package/dist-types/adapters/svelte.d.ts +38 -0
  43. package/dist-types/adapters/svelte.d.ts.map +1 -0
  44. package/dist-types/adapters/vue.d.ts +189 -0
  45. package/dist-types/adapters/vue.d.ts.map +1 -0
  46. package/dist-types/adapters/vue2.d.ts +175 -0
  47. package/dist-types/adapters/vue2.d.ts.map +1 -0
  48. package/dist-types/adapters/wc.d.ts +96 -0
  49. package/dist-types/adapters/wc.d.ts.map +1 -0
  50. package/dist-types/cjs/adapters/jquery.d.cts +34 -0
  51. package/dist-types/cjs/adapters/react.d.cts +28 -0
  52. package/dist-types/cjs/adapters/shared.d.cts +83 -0
  53. package/dist-types/cjs/adapters/svelte.d.cts +38 -0
  54. package/dist-types/cjs/adapters/vue.d.cts +189 -0
  55. package/dist-types/cjs/adapters/vue2.d.cts +175 -0
  56. package/dist-types/cjs/adapters/wc.d.cts +96 -0
  57. package/dist-types/cjs/core/AerizEditor.d.cts +530 -0
  58. package/dist-types/cjs/core/AerizViewer.d.cts +61 -0
  59. package/dist-types/cjs/core/block-meta.d.cts +98 -0
  60. package/dist-types/cjs/core/block-policy.d.cts +43 -0
  61. package/dist-types/cjs/core/blocks.d.cts +411 -0
  62. package/dist-types/cjs/core/fonts.d.cts +60 -0
  63. package/dist-types/cjs/core/highlight.d.cts +44 -0
  64. package/dist-types/cjs/core/history.d.cts +86 -0
  65. package/dist-types/cjs/core/html-mini.d.cts +65 -0
  66. package/dist-types/cjs/core/i18n.d.cts +221 -0
  67. package/dist-types/cjs/core/import-html.d.cts +40 -0
  68. package/dist-types/cjs/core/import-markdown.d.cts +33 -0
  69. package/dist-types/cjs/core/input-rules.d.cts +46 -0
  70. package/dist-types/cjs/core/markdown-export.d.cts +30 -0
  71. package/dist-types/cjs/core/plain-text.d.cts +17 -0
  72. package/dist-types/cjs/core/render-string.d.cts +68 -0
  73. package/dist-types/cjs/core/selection.d.cts +46 -0
  74. package/dist-types/cjs/core/snapshot.d.cts +51 -0
  75. package/dist-types/cjs/core/table-ops.d.cts +30 -0
  76. package/dist-types/cjs/index.d.cts +22 -0
  77. package/dist-types/cjs/server/index.d.cts +37 -0
  78. package/dist-types/cjs/types/index.d.cts +61 -0
  79. package/dist-types/cjs/ui/Toolbar.d.cts +21 -0
  80. package/dist-types/cjs/ui/dialogs.d.cts +74 -0
  81. package/dist-types/cjs/ui/icons.d.cts +2 -0
  82. package/dist-types/cjs/ui/popovers.d.cts +70 -0
  83. package/dist-types/core/AerizEditor.d.ts +210 -17
  84. package/dist-types/core/AerizEditor.d.ts.map +1 -1
  85. package/dist-types/core/AerizViewer.d.ts +16 -4
  86. package/dist-types/core/AerizViewer.d.ts.map +1 -1
  87. package/dist-types/core/block-meta.d.ts +98 -0
  88. package/dist-types/core/block-meta.d.ts.map +1 -0
  89. package/dist-types/core/block-policy.d.ts +43 -0
  90. package/dist-types/core/block-policy.d.ts.map +1 -0
  91. package/dist-types/core/blocks.d.ts +109 -11
  92. package/dist-types/core/blocks.d.ts.map +1 -1
  93. package/dist-types/core/fonts.d.ts +11 -0
  94. package/dist-types/core/fonts.d.ts.map +1 -1
  95. package/dist-types/core/history.d.ts +86 -0
  96. package/dist-types/core/history.d.ts.map +1 -0
  97. package/dist-types/core/html-mini.d.ts +65 -0
  98. package/dist-types/core/html-mini.d.ts.map +1 -0
  99. package/dist-types/core/i18n.d.ts +12 -0
  100. package/dist-types/core/i18n.d.ts.map +1 -1
  101. package/dist-types/core/import-html.d.ts +1 -0
  102. package/dist-types/core/import-html.d.ts.map +1 -1
  103. package/dist-types/core/import-markdown.d.ts +0 -4
  104. package/dist-types/core/import-markdown.d.ts.map +1 -1
  105. package/dist-types/core/input-rules.d.ts +46 -0
  106. package/dist-types/core/input-rules.d.ts.map +1 -0
  107. package/dist-types/core/markdown-export.d.ts +30 -0
  108. package/dist-types/core/markdown-export.d.ts.map +1 -0
  109. package/dist-types/core/plain-text.d.ts +17 -0
  110. package/dist-types/core/plain-text.d.ts.map +1 -0
  111. package/dist-types/core/render-string.d.ts +68 -0
  112. package/dist-types/core/render-string.d.ts.map +1 -0
  113. package/dist-types/core/selection.d.ts +46 -0
  114. package/dist-types/core/selection.d.ts.map +1 -0
  115. package/dist-types/core/snapshot.d.ts +51 -0
  116. package/dist-types/core/snapshot.d.ts.map +1 -0
  117. package/dist-types/core/table-ops.d.ts +30 -0
  118. package/dist-types/core/table-ops.d.ts.map +1 -0
  119. package/dist-types/index.d.ts +21 -10
  120. package/dist-types/index.d.ts.map +1 -1
  121. package/dist-types/server/index.d.ts +37 -0
  122. package/dist-types/server/index.d.ts.map +1 -0
  123. package/dist-types/types/index.d.ts +21 -0
  124. package/dist-types/types/index.d.ts.map +1 -1
  125. package/dist-types/ui/Toolbar.d.ts +1 -1
  126. package/dist-types/ui/Toolbar.d.ts.map +1 -1
  127. package/dist-types/ui/dialogs.d.ts.map +1 -1
  128. package/dist-types/ui/icons.d.ts.map +1 -1
  129. package/dist-types/ui/popovers.d.ts +1 -1
  130. package/dist-types/ui/popovers.d.ts.map +1 -1
  131. package/package.json +213 -58
@@ -0,0 +1,34 @@
1
+ /**
2
+ * jQuery 플러그인 어댑터.
3
+ *
4
+ * `jquery` 를 import 하지 않는다. 전역 `jQuery` 가 있으면 로드 시점에 자동
5
+ * 등록하고, 모듈 번들 환경에서는 `registerAerizJQuery($)` 로 명시 등록한다.
6
+ * 덕분에 jQuery 타입 패키지(`@types/jquery`) 없이도 타입이 성립한다.
7
+ *
8
+ * @example
9
+ * <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
10
+ * <script src="/aeriz-wysiwyg.min.js"></script>
11
+ * <script src="/adapters/jquery.js"></script>
12
+ * <script>
13
+ * $('#editor').aerizEditor({ value: '<p>안녕하세요</p>',
14
+ * onChange: (html) => console.log(html) });
15
+ * const html = $('#editor').aerizEditor('getHTML');
16
+ * $('#editor').aerizEditor('destroy');
17
+ * </script>
18
+ */
19
+ import type { AerizEditor, AerizViewer } from '@aeriz/wysiwyg';
20
+ import type { AerizEditorProps, AerizViewerProps } from './shared.js';
21
+ /** `$.fn` 을 가진 jQuery 정적 객체의 최소 형태. */
22
+ export interface JQueryLike {
23
+ fn: Record<string, unknown>;
24
+ }
25
+ /** 문자열 명령 없이 호출했을 때 초기화에 쓰이는 옵션. */
26
+ export type AerizEditorPluginOptions = AerizEditorProps;
27
+ export type AerizViewerPluginOptions = AerizViewerProps;
28
+ /**
29
+ * `$.fn.aerizEditor` / `$.fn.aerizViewer` 를 등록한다.
30
+ * 이미 등록돼 있으면 아무것도 하지 않으므로 여러 번 불러도 안전하다.
31
+ */
32
+ export declare function registerAerizJQuery($: JQueryLike): void;
33
+ export type { AerizEditor, AerizViewer, AerizEditorProps, AerizViewerProps };
34
+ //# sourceMappingURL=jquery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jquery.d.ts","sourceRoot":"","sources":["../../src/adapters/jquery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAEV,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAUlB,uCAAuC;AACvC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED,oCAAoC;AACpC,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AACxD,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AA+HxD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAMvD;AAQD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CSSProperties } from 'react';
2
+ import type { AerizEditor as AerizEditorCore, AerizViewer as AerizViewerCore } from '@aeriz/wysiwyg';
3
+ import type { AerizEditorProps, AerizViewerProps } from './shared.js';
4
+ /** 컨테이너 `<div>` 에 직접 전달되는 표현용 prop. */
5
+ interface HostProps {
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ id?: string;
9
+ }
10
+ export interface AerizEditorReactProps extends AerizEditorProps, HostProps {
11
+ }
12
+ export interface AerizViewerReactProps extends AerizViewerProps, HostProps {
13
+ }
14
+ /** `ref` 로 노출되는 명령형 핸들. */
15
+ export interface AerizEditorHandle {
16
+ /** 코어 인스턴스. `getHTML()` / `setBlockType()` 등 전체 API 접근용. */
17
+ readonly editor: AerizEditorCore | null;
18
+ getHTML(): string;
19
+ setHTML(html: string): void;
20
+ focus(): void;
21
+ }
22
+ export interface AerizViewerHandle {
23
+ readonly viewer: AerizViewerCore | null;
24
+ }
25
+ export declare const AerizEditor: import("react").ForwardRefExoticComponent<AerizEditorReactProps & import("react").RefAttributes<AerizEditorHandle>>;
26
+ export declare const AerizViewer: import("react").ForwardRefExoticComponent<AerizViewerReactProps & import("react").RefAttributes<AerizViewerHandle>>;
27
+ export type { AerizEditorProps, AerizViewerProps } from './shared.js';
28
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/adapters/react.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,OAAO,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,KAAK,EAEV,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAGlB,uCAAuC;AACvC,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB,EAAE,SAAS;CAAG;AAC7E,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB,EAAE,SAAS;CAAG;AAE7E,2BAA2B;AAC3B,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC;AA+FD,eAAO,MAAM,WAAW,qHAA8B,CAAC;AAGvD,eAAO,MAAM,WAAW,qHAA8B,CAAC;AAGvD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * 프레임워크 어댑터 공통 코어.
3
+ *
4
+ * React / Vue / Svelte / Angular / jQuery / Web Component 어댑터는 모두 이
5
+ * 모듈의 컨트롤러 위에 얇게 올라간다. 각 프레임워크가 다르게 처리해야 하는
6
+ * 것은 "언제 update() 를 부르고 언제 destroy() 를 부르는가" 뿐이고,
7
+ * 값 바인딩 · 캐럿 보존 · 재생성 판단 같은 실제 로직은 여기 한 곳에만 있다.
8
+ *
9
+ * 핵심 규칙 두 가지:
10
+ *
11
+ * 1. **캐럿 보존** — 외부에서 들어온 `value` 가 에디터의 현재 출력과 같으면
12
+ * `setHTML()` 을 부르지 않는다. 부르면 DOM 이 통째로 교체되어 캐럿이 문서
13
+ * 맨 앞으로 튀고, 한국어 조합 중 입력이 끊긴다.
14
+ * 2. **되울림 차단** — 프로그램적 `setHTML()` 이 만든 변경은 `onChange` 로
15
+ * 다시 내보내지 않는다. 부모의 상태 갱신이 다시 prop 으로 내려와 무한 왕복이
16
+ * 되는 경로를 원천 차단한다.
17
+ */
18
+ import { AerizEditor, AerizViewer } from '@aeriz/wysiwyg';
19
+ import type { BlockSnapshot, EditorOptions, EditorState, ViewerOptions } from '@aeriz/wysiwyg';
20
+ /**
21
+ * 모든 어댑터가 공유하는 에디터 prop 집합.
22
+ *
23
+ * `EditorOptions` 에서 프레임워크가 스스로 관리하는 두 항목만 뺀 것이다.
24
+ * - `element` — 어댑터가 마운트 노드를 직접 만든다.
25
+ * - `onChange` — 컨트롤러가 감싼 뒤 최신 콜백으로 위임한다.
26
+ */
27
+ export interface AerizEditorProps extends Omit<EditorOptions, 'element' | 'onChange'> {
28
+ /**
29
+ * 양방향 바인딩용 HTML. 지정하면 `initialHTML` 보다 우선한다.
30
+ * 값이 에디터의 현재 출력과 다를 때만 본문이 교체된다.
31
+ */
32
+ value?: string;
33
+ /** 사용자 편집으로 본문이 바뀔 때 호출. 프로그램적 설정에서는 호출되지 않는다. */
34
+ onChange?: (html: string) => void;
35
+ /** 블록/선택 상태가 바뀔 때 호출. 커스텀 툴바를 만들 때 쓴다. */
36
+ onStateChange?: (state: EditorState) => void;
37
+ /** 인스턴스가 만들어진 직후 1회 호출. 명령형 API 접근 경로. */
38
+ onReady?: (editor: AerizEditor) => void;
39
+ /** 인스턴스가 파괴되기 직전 1회 호출. */
40
+ onDestroy?: (editor: AerizEditor) => void;
41
+ }
42
+ /** 뷰어 어댑터 공통 prop. */
43
+ export interface AerizViewerProps extends Omit<ViewerOptions, 'element'> {
44
+ /** 표시할 블록 상태. `html` 보다 우선한다. */
45
+ blocks?: BlockSnapshot[];
46
+ /** 블록 대신 HTML 문자열로 넣을 때 사용. 내부에서 블록으로 변환된다. */
47
+ html?: string;
48
+ onReady?: (viewer: AerizViewer) => void;
49
+ onDestroy?: (viewer: AerizViewer) => void;
50
+ }
51
+ export interface AerizEditorController {
52
+ /**
53
+ * 현재 에디터 인스턴스. 재생성(`toolbar`/`locale` 변경) 시 교체되므로
54
+ * 장기 보관하지 말고 매번 읽어야 한다.
55
+ */
56
+ readonly editor: AerizEditor;
57
+ /** 새 prop 을 반영한다. 바뀐 항목만 최소 비용으로 적용된다. */
58
+ update(next: AerizEditorProps): void;
59
+ destroy(): void;
60
+ }
61
+ export interface AerizViewerController {
62
+ readonly viewer: AerizViewer;
63
+ update(next: AerizViewerProps): void;
64
+ destroy(): void;
65
+ }
66
+ /**
67
+ * HTML 문자열을 `BlockSnapshot[]` 로 변환한다.
68
+ *
69
+ * `AerizViewer` 는 상태 모델만 받으므로, HTML 을 들고 있는 호출자를 위한
70
+ * 다리 역할을 한다. 에디터 본문과 같은 정규화 경로(`normalizeContent` →
71
+ * `listBlocks` → `serializeBlocks`) 를 타므로 결과 트리도 동일하다.
72
+ */
73
+ export declare function htmlToBlocks(html: string): BlockSnapshot[];
74
+ /**
75
+ * 프레임워크 중립 에디터 컨트롤러를 만든다.
76
+ *
77
+ * `host` 안에 에디터를 마운트한다. `host` 의 기존 자식은
78
+ * `AerizEditor` 생성자가 비운다.
79
+ */
80
+ export declare function createEditorController(host: HTMLElement, initialProps: AerizEditorProps): AerizEditorController;
81
+ /** 프레임워크 중립 뷰어 컨트롤러를 만든다. */
82
+ export declare function createViewerController(host: HTMLElement, initialProps: AerizViewerProps): AerizViewerController;
83
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,WAAW,EACX,WAAW,EAMZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,UAAU,CAAC;IACnD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED,sBAAsB;AACtB,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IACtE,iCAAiC;IACjC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,0CAA0C;IAC1C,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAS1D;AA4CD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,gBAAgB,GAC7B,qBAAqB,CA2HvB;AAgBD,6BAA6B;AAC7B,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,gBAAgB,GAC7B,qBAAqB,CAwCvB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Svelte 어댑터. Svelte 3 / 4 / 5 에서 동일하게 동작한다.
3
+ *
4
+ * `.svelte` 컴포넌트가 아니라 **액션**(`use:`) 으로 제공한다. 컴파일된 Svelte
5
+ * 컴포넌트는 메이저 버전 간 런타임 계약이 달라(특히 4 → 5) 배포본 하나로 세
6
+ * 버전을 만족시킬 수 없지만, 액션은 순수 함수 계약이라 전부 통과한다.
7
+ *
8
+ * @example
9
+ * <script>
10
+ * import { aerizEditor } from '@aeriz/wysiwyg/svelte';
11
+ * import '@aeriz/wysiwyg/style.css';
12
+ * let html = '<p>안녕하세요</p>';
13
+ * </script>
14
+ *
15
+ * <div use:aerizEditor={{ value: html, onChange: (v) => (html = v), theme: 'dark' }} />
16
+ */
17
+ import type { AerizEditorProps, AerizViewerProps } from './shared.js';
18
+ /**
19
+ * Svelte 액션의 반환 계약. `svelte/action` 의 `ActionReturn` 과 구조적으로
20
+ * 같지만, `svelte` 를 import 하지 않기 위해 여기서 직접 선언한다.
21
+ */
22
+ export interface AerizAction<P> {
23
+ update(next: P): void;
24
+ destroy(): void;
25
+ }
26
+ /**
27
+ * 에디터를 노드에 마운트하는 액션.
28
+ *
29
+ * 파라미터가 바뀌면 Svelte 가 `update` 를 호출하고, 컨트롤러가 바뀐 항목만
30
+ * 반영한다. `value` 가 에디터 현재 출력과 같으면 본문을 건드리지 않으므로
31
+ * `onChange` 로 받은 값을 그대로 되돌려줘도 캐럿이 튀지 않는다.
32
+ */
33
+ export declare function aerizEditor(node: HTMLElement, props?: AerizEditorProps): AerizAction<AerizEditorProps>;
34
+ /** 읽기 전용 뷰어를 노드에 마운트하는 액션. */
35
+ export declare function aerizViewer(node: HTMLElement, props?: AerizViewerProps): AerizAction<AerizViewerProps>;
36
+ export type { AerizEditorProps, AerizViewerProps } from './shared.js';
37
+ export { createEditorController, createViewerController } from './shared.js';
38
+ //# sourceMappingURL=svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.d.ts","sourceRoot":"","sources":["../../src/adapters/svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGnE;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,KAAK,GAAE,gBAAqB,GAC3B,WAAW,CAAC,gBAAgB,CAAC,CAU/B;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,KAAK,GAAE,gBAAqB,GAC3B,WAAW,CAAC,gBAAgB,CAAC,CAU/B;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,189 @@
1
+ import type { PropType } from 'vue';
2
+ import type { AerizEditor as AerizEditorCore, AerizViewer as AerizViewerCore, BlockSnapshot, EditorState, ToolbarConfig } from '@aeriz/wysiwyg';
3
+ type Theme = 'light' | 'dark';
4
+ type Locale = 'en' | 'ko' | 'ja' | 'zh';
5
+ type HtmlStyles = 'inline' | 'class';
6
+ type UploadFn = (file: File) => Promise<string>;
7
+ export declare const AerizEditor: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ /** `v-model` 바인딩 값 (HTML). */
9
+ modelValue: {
10
+ type: StringConstructor;
11
+ default: undefined;
12
+ };
13
+ /** `v-model` 없이 초기값만 줄 때 사용. */
14
+ initialHTML: {
15
+ type: StringConstructor;
16
+ default: undefined;
17
+ };
18
+ placeholder: {
19
+ type: StringConstructor;
20
+ default: undefined;
21
+ };
22
+ /** `false` 면 툴바를 렌더하지 않는다. */
23
+ toolbar: {
24
+ type: PropType<ToolbarConfig | false>;
25
+ default: undefined;
26
+ };
27
+ theme: {
28
+ type: PropType<Theme>;
29
+ default: undefined;
30
+ };
31
+ locale: {
32
+ type: PropType<Locale>;
33
+ default: undefined;
34
+ };
35
+ /** `getHTML()` · `onChange` 출력 전략. 기본 `'inline'`. */
36
+ htmlStyles: {
37
+ type: PropType<HtmlStyles>;
38
+ default: undefined;
39
+ };
40
+ onImageUpload: {
41
+ type: PropType<UploadFn>;
42
+ default: undefined;
43
+ };
44
+ imageUploadUrl: {
45
+ type: StringConstructor;
46
+ default: undefined;
47
+ };
48
+ onFileUpload: {
49
+ type: PropType<UploadFn>;
50
+ default: undefined;
51
+ };
52
+ fileUploadUrl: {
53
+ type: StringConstructor;
54
+ default: undefined;
55
+ };
56
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
57
+ [key: string]: any;
58
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
59
+ 'update:modelValue': (html: string) => boolean;
60
+ change: (html: string) => boolean;
61
+ 'state-change': (_state: EditorState) => true;
62
+ ready: (_editor: AerizEditorCore) => true;
63
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
64
+ /** `v-model` 바인딩 값 (HTML). */
65
+ modelValue: {
66
+ type: StringConstructor;
67
+ default: undefined;
68
+ };
69
+ /** `v-model` 없이 초기값만 줄 때 사용. */
70
+ initialHTML: {
71
+ type: StringConstructor;
72
+ default: undefined;
73
+ };
74
+ placeholder: {
75
+ type: StringConstructor;
76
+ default: undefined;
77
+ };
78
+ /** `false` 면 툴바를 렌더하지 않는다. */
79
+ toolbar: {
80
+ type: PropType<ToolbarConfig | false>;
81
+ default: undefined;
82
+ };
83
+ theme: {
84
+ type: PropType<Theme>;
85
+ default: undefined;
86
+ };
87
+ locale: {
88
+ type: PropType<Locale>;
89
+ default: undefined;
90
+ };
91
+ /** `getHTML()` · `onChange` 출력 전략. 기본 `'inline'`. */
92
+ htmlStyles: {
93
+ type: PropType<HtmlStyles>;
94
+ default: undefined;
95
+ };
96
+ onImageUpload: {
97
+ type: PropType<UploadFn>;
98
+ default: undefined;
99
+ };
100
+ imageUploadUrl: {
101
+ type: StringConstructor;
102
+ default: undefined;
103
+ };
104
+ onFileUpload: {
105
+ type: PropType<UploadFn>;
106
+ default: undefined;
107
+ };
108
+ fileUploadUrl: {
109
+ type: StringConstructor;
110
+ default: undefined;
111
+ };
112
+ }>> & Readonly<{
113
+ onChange?: (html: string) => any;
114
+ "onUpdate:modelValue"?: (html: string) => any;
115
+ "onState-change"?: (_state: EditorState) => any;
116
+ onReady?: (_editor: AerizEditorCore) => any;
117
+ }>, {
118
+ toolbar: false | ToolbarConfig;
119
+ theme: Theme;
120
+ placeholder: string;
121
+ initialHTML: string;
122
+ locale: Locale;
123
+ htmlStyles: HtmlStyles;
124
+ onImageUpload: UploadFn;
125
+ imageUploadUrl: string;
126
+ onFileUpload: UploadFn;
127
+ fileUploadUrl: string;
128
+ modelValue: string;
129
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
130
+ export declare const AerizViewer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
131
+ /** 표시할 블록 상태. `html` 보다 우선한다. */
132
+ blocks: {
133
+ type: PropType<BlockSnapshot[]>;
134
+ default: undefined;
135
+ };
136
+ /** 블록 대신 HTML 문자열을 넣을 때 사용. */
137
+ html: {
138
+ type: StringConstructor;
139
+ default: undefined;
140
+ };
141
+ theme: {
142
+ type: PropType<Theme>;
143
+ default: undefined;
144
+ };
145
+ /** `getHTML()` 출력 전략. 기본 `'inline'`. */
146
+ htmlStyles: {
147
+ type: PropType<HtmlStyles>;
148
+ default: undefined;
149
+ };
150
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
151
+ [key: string]: any;
152
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
153
+ ready: (_viewer: AerizViewerCore) => true;
154
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
155
+ /** 표시할 블록 상태. `html` 보다 우선한다. */
156
+ blocks: {
157
+ type: PropType<BlockSnapshot[]>;
158
+ default: undefined;
159
+ };
160
+ /** 블록 대신 HTML 문자열을 넣을 때 사용. */
161
+ html: {
162
+ type: StringConstructor;
163
+ default: undefined;
164
+ };
165
+ theme: {
166
+ type: PropType<Theme>;
167
+ default: undefined;
168
+ };
169
+ /** `getHTML()` 출력 전략. 기본 `'inline'`. */
170
+ htmlStyles: {
171
+ type: PropType<HtmlStyles>;
172
+ default: undefined;
173
+ };
174
+ }>> & Readonly<{
175
+ onReady?: (_viewer: AerizViewerCore) => any;
176
+ }>, {
177
+ html: string;
178
+ theme: Theme;
179
+ htmlStyles: HtmlStyles;
180
+ blocks: BlockSnapshot[];
181
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
182
+ /** `app.use(AerizWysiwygPlugin)` 로 두 컴포넌트를 전역 등록한다. */
183
+ export declare const AerizWysiwygPlugin: {
184
+ install(app: {
185
+ component(name: string, def: unknown): unknown;
186
+ }): void;
187
+ };
188
+ export type { AerizEditorProps, AerizViewerProps } from './shared.js';
189
+ //# sourceMappingURL=vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../../src/adapters/vue.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,WAAW,IAAI,eAAe,EAC9B,aAAa,EACb,WAAW,EACX,aAAa,EACd,MAAM,gBAAgB,CAAC;AASxB,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACxC,KAAK,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AACrC,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhD,eAAO,MAAM,WAAW;IAIpB,8BAA8B;;;;;IAE9B,gCAAgC;;;;;;;;;IAGhC,8BAA8B;;cAED,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;;;;cAGnC,QAAQ,CAAC,KAAK,CAAC;;;;cACd,QAAQ,CAAC,MAAM,CAAC;;;IAC1C,qDAAqD;;cACvB,QAAQ,CAAC,UAAU,CAAC;;;;cACf,QAAQ,CAAC,QAAQ,CAAC;;;;;;;;cAEnB,QAAQ,CAAC,QAAQ,CAAC;;;;;;;;;;gCAKxB,MAAM;mBACnB,MAAM;6BACI,WAAW;qBACnB,eAAe;;IAxBhC,8BAA8B;;;;;IAE9B,gCAAgC;;;;;;;;;IAGhC,8BAA8B;;cAED,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC;;;;cAGnC,QAAQ,CAAC,KAAK,CAAC;;;;cACd,QAAQ,CAAC,MAAM,CAAC;;;IAC1C,qDAAqD;;cACvB,QAAQ,CAAC,UAAU,CAAC;;;;cACf,QAAQ,CAAC,QAAQ,CAAC;;;;;;;;cAEnB,QAAQ,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;4EAuEtD,CAAC;AAEH,eAAO,MAAM,WAAW;IAIpB,iCAAiC;;cAEhB,QAAQ,CAAC,aAAa,EAAE,CAAC;;;IAG1C,+BAA+B;;;;;;cAEN,QAAQ,CAAC,KAAK,CAAC;;;IACxC,wCAAwC;;cACV,QAAQ,CAAC,UAAU,CAAC;;;;;;qBAIjC,eAAe;;IAbhC,iCAAiC;;cAEhB,QAAQ,CAAC,aAAa,EAAE,CAAC;;;IAG1C,+BAA+B;;;;;;cAEN,QAAQ,CAAC,KAAK,CAAC;;;IACxC,wCAAwC;;cACV,QAAQ,CAAC,UAAU,CAAC;;;;;;;;;;4EA8CpD,CAAC;AAEH,uDAAuD;AACvD,eAAO,MAAM,kBAAkB;iBAChB;QAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI;CAIvE,CAAC;AAEF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Vue 2 어댑터 (2.6 / 2.7). `v-model` 을 그대로 지원한다.
3
+ *
4
+ * Vue 2 컴포넌트는 순수 옵션 객체이므로 이 모듈은 `vue` 를 import 하지
5
+ * **않는다**. 따라서 Vue 3 를 devDependency 로 가진 이 저장소에서도 Vue 2 용
6
+ * 산출물을 정확히 만들 수 있고, 소비자 쪽 Vue 2 버전과의 이중 인스턴스 문제도
7
+ * 생기지 않는다.
8
+ *
9
+ * Vue 2 관례에 따라 `v-model` 은 `value` prop + `input` 이벤트를 쓴다.
10
+ *
11
+ * @example
12
+ * import { AerizEditor } from '@aeriz/wysiwyg/vue2';
13
+ * import '@aeriz/wysiwyg/style.css';
14
+ *
15
+ * export default {
16
+ * components: { AerizEditor },
17
+ * data: () => ({ html: '<p>안녕하세요</p>' }),
18
+ * template: '<AerizEditor v-model="html" theme="dark" />',
19
+ * };
20
+ */
21
+ import type { AerizEditor as AerizEditorCore, AerizViewer as AerizViewerCore, BlockSnapshot, ToolbarConfig } from '@aeriz/wysiwyg';
22
+ import type { AerizEditorController, AerizEditorProps, AerizViewerController, AerizViewerProps } from './shared.js';
23
+ type Theme = 'light' | 'dark';
24
+ type Locale = 'en' | 'ko' | 'ja' | 'zh';
25
+ type HtmlStyles = 'inline' | 'class';
26
+ type UploadFn = (file: File) => Promise<string>;
27
+ /**
28
+ * Vue 2 런타임이 컴포넌트 메서드에 주입하는 `this` 의 최소 형태.
29
+ *
30
+ * `vue` 패키지를 참조하지 않기 위해 필요한 멤버만 구조적으로 선언한다.
31
+ * Vue 2 인스턴스는 이 멤버들을 모두 갖고 있으므로 호환된다.
32
+ */
33
+ interface Vue2Host<P> {
34
+ $el: HTMLElement;
35
+ $props: P;
36
+ $emit(event: string, ...args: unknown[]): void;
37
+ $watch(getter: () => unknown, cb: () => void, options?: {
38
+ deep?: boolean;
39
+ immediate?: boolean;
40
+ }): () => void;
41
+ }
42
+ /** Vue 2 의 `createElement` (render 함수 인자 `h`) 최소 형태. */
43
+ type CreateElement = (tag: string) => unknown;
44
+ interface EditorProps {
45
+ value?: string;
46
+ initialHTML?: string;
47
+ placeholder?: string;
48
+ toolbar?: ToolbarConfig | false;
49
+ theme?: Theme;
50
+ locale?: Locale;
51
+ htmlStyles?: HtmlStyles;
52
+ onImageUpload?: UploadFn;
53
+ imageUploadUrl?: string;
54
+ onFileUpload?: UploadFn;
55
+ fileUploadUrl?: string;
56
+ }
57
+ interface EditorHost extends Vue2Host<EditorProps> {
58
+ aerizController: AerizEditorController | null;
59
+ aerizProps(): AerizEditorProps;
60
+ }
61
+ interface ViewerProps {
62
+ blocks?: BlockSnapshot[];
63
+ html?: string;
64
+ theme?: Theme;
65
+ htmlStyles?: HtmlStyles;
66
+ }
67
+ interface ViewerHost extends Vue2Host<ViewerProps> {
68
+ aerizController: AerizViewerController | null;
69
+ aerizProps(): AerizViewerProps;
70
+ }
71
+ export declare const AerizEditor: {
72
+ name: string;
73
+ props: {
74
+ /** `v-model` 바인딩 값 (HTML). */
75
+ value: {
76
+ type: StringConstructor;
77
+ default: undefined;
78
+ };
79
+ initialHTML: {
80
+ type: StringConstructor;
81
+ default: undefined;
82
+ };
83
+ placeholder: {
84
+ type: StringConstructor;
85
+ default: undefined;
86
+ };
87
+ toolbar: {
88
+ type: (ObjectConstructor | BooleanConstructor)[];
89
+ default: undefined;
90
+ };
91
+ theme: {
92
+ type: StringConstructor;
93
+ default: undefined;
94
+ };
95
+ locale: {
96
+ type: StringConstructor;
97
+ default: undefined;
98
+ };
99
+ /** `getHTML()` · `onChange` 출력 전략. 기본 `'inline'`. */
100
+ htmlStyles: {
101
+ type: StringConstructor;
102
+ default: undefined;
103
+ };
104
+ onImageUpload: {
105
+ type: FunctionConstructor;
106
+ default: undefined;
107
+ };
108
+ imageUploadUrl: {
109
+ type: StringConstructor;
110
+ default: undefined;
111
+ };
112
+ onFileUpload: {
113
+ type: FunctionConstructor;
114
+ default: undefined;
115
+ };
116
+ fileUploadUrl: {
117
+ type: StringConstructor;
118
+ default: undefined;
119
+ };
120
+ };
121
+ data(): {
122
+ aerizController: AerizEditorController | null;
123
+ };
124
+ methods: {
125
+ aerizProps(this: EditorHost): AerizEditorProps;
126
+ /** 코어 인스턴스. `this.$refs.editor.getEditor()` 로 접근한다. */
127
+ getEditor(this: EditorHost): AerizEditorCore | null;
128
+ getHTML(this: EditorHost): string;
129
+ setHTML(this: EditorHost, html: string): void;
130
+ focus(this: EditorHost): void;
131
+ };
132
+ mounted(this: EditorHost): void;
133
+ beforeDestroy(this: EditorHost): void;
134
+ render(this: EditorHost, h: CreateElement): unknown;
135
+ };
136
+ export declare const AerizViewer: {
137
+ name: string;
138
+ props: {
139
+ blocks: {
140
+ type: ArrayConstructor;
141
+ default: undefined;
142
+ };
143
+ html: {
144
+ type: StringConstructor;
145
+ default: undefined;
146
+ };
147
+ theme: {
148
+ type: StringConstructor;
149
+ default: undefined;
150
+ };
151
+ /** `getHTML()` 출력 전략. 기본 `'inline'`. */
152
+ htmlStyles: {
153
+ type: StringConstructor;
154
+ default: undefined;
155
+ };
156
+ };
157
+ data(): {
158
+ aerizController: AerizViewerController | null;
159
+ };
160
+ methods: {
161
+ aerizProps(this: ViewerHost): AerizViewerProps;
162
+ getViewer(this: ViewerHost): AerizViewerCore | null;
163
+ };
164
+ mounted(this: ViewerHost): void;
165
+ beforeDestroy(this: ViewerHost): void;
166
+ render(this: ViewerHost, h: CreateElement): unknown;
167
+ };
168
+ /** `Vue.use(AerizWysiwygPlugin)` 로 두 컴포넌트를 전역 등록한다. */
169
+ export declare const AerizWysiwygPlugin: {
170
+ install(Vue: {
171
+ component(name: string, def: unknown): unknown;
172
+ }): void;
173
+ };
174
+ export type { AerizEditorProps, AerizViewerProps } from './shared.js';
175
+ //# sourceMappingURL=vue2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue2.d.ts","sourceRoot":"","sources":["../../src/adapters/vue2.ts"],"names":[],"mappings":"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"}