dragon-editor 2.1.2 → 3.0.0-beta

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 (55) hide show
  1. package/README.md +40 -115
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +10 -12
  4. package/dist/runtime/components/DragonEditor.vue +441 -0
  5. package/dist/runtime/plugin.d.ts +2 -0
  6. package/dist/runtime/plugin.mjs +10 -0
  7. package/dist/runtime/scss/editor.css +262 -0
  8. package/dist/runtime/scss/viewer.css +129 -0
  9. package/dist/runtime/store.d.ts +7 -0
  10. package/dist/runtime/store.mjs +27 -0
  11. package/dist/runtime/type.d.ts +24 -0
  12. package/dist/runtime/utils/block.d.ts +9 -0
  13. package/dist/runtime/utils/block.mjs +70 -0
  14. package/dist/runtime/utils/cursor.d.ts +6 -0
  15. package/dist/runtime/utils/cursor.mjs +132 -0
  16. package/dist/runtime/utils/element.d.ts +3 -0
  17. package/dist/runtime/utils/element.mjs +39 -0
  18. package/dist/runtime/utils/keyboardEvent.d.ts +10 -0
  19. package/dist/runtime/utils/keyboardEvent.mjs +781 -0
  20. package/dist/runtime/utils/style.d.ts +1 -0
  21. package/dist/runtime/utils/style.mjs +330 -0
  22. package/dist/runtime/utils/ui.d.ts +1 -0
  23. package/dist/runtime/utils/ui.mjs +35 -0
  24. package/package.json +10 -4
  25. package/README_en.md +0 -30
  26. package/dist/runtime/core/components/SvgIcon.d.ts +0 -10
  27. package/dist/runtime/core/components/SvgIcon.mjs +0 -98
  28. package/dist/runtime/core/components/editor/ImageBlock.vue +0 -175
  29. package/dist/runtime/core/components/editor/OlBlock.vue +0 -162
  30. package/dist/runtime/core/components/editor/TextBlock.vue +0 -172
  31. package/dist/runtime/core/components/editor/UlBlock.vue +0 -162
  32. package/dist/runtime/core/style/common.css +0 -496
  33. package/dist/runtime/core/style/viewer.css +0 -205
  34. package/dist/runtime/core/utils/converter.d.ts +0 -2
  35. package/dist/runtime/core/utils/converter.mjs +0 -90
  36. package/dist/runtime/core/utils/cursor.d.ts +0 -4
  37. package/dist/runtime/core/utils/cursor.mjs +0 -84
  38. package/dist/runtime/core/utils/element.d.ts +0 -3
  39. package/dist/runtime/core/utils/element.mjs +0 -40
  40. package/dist/runtime/core/utils/global.d.ts +0 -3
  41. package/dist/runtime/core/utils/global.mjs +0 -81
  42. package/dist/runtime/core/utils/index.d.ts +0 -7
  43. package/dist/runtime/core/utils/index.mjs +0 -7
  44. package/dist/runtime/core/utils/keyboard.d.ts +0 -6
  45. package/dist/runtime/core/utils/keyboard.mjs +0 -565
  46. package/dist/runtime/core/utils/style.d.ts +0 -6
  47. package/dist/runtime/core/utils/style.mjs +0 -374
  48. package/dist/runtime/core/utils/ui.d.ts +0 -4
  49. package/dist/runtime/core/utils/ui.mjs +0 -13
  50. package/dist/runtime/shared/components/DragonEditor.vue +0 -695
  51. package/dist/runtime/shared/components/DragonEditorComment.vue +0 -172
  52. package/dist/runtime/shared/components/DragonEditorNew.d.ts +0 -16
  53. package/dist/runtime/shared/components/DragonEditorNew.mjs +0 -62
  54. package/dist/runtime/shared/components/DragonEditorViewer.d.ts +0 -14
  55. package/dist/runtime/shared/components/DragonEditorViewer.mjs +0 -15
package/README.md CHANGED
@@ -8,142 +8,67 @@
8
8
  [language-href]: https://github.com/lovefields/dragonEditor/
9
9
  [hits-src]: https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Flovefields%2FdragonEditor&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false
10
10
  [hits-href]: https://hits.seeyoufarm.com
11
- [npm-version-src]: https://img.shields.io/npm/v/my-module/latest.svg?style=flat&colorA=18181B&colorB=28CF8D
11
+ [npm-version-src]: https://img.shields.io/npm/v/dragon-editor/latest.svg?style=flat&colorA=18181B&colorB=28CF8D
12
12
  [npm-version-href]: https://www.npmjs.com/package/dragon-editor
13
- [npm-downloads-src]: https://img.shields.io/npm/dm/my-module.svg?style=flat&colorA=18181B&colorB=28CF8D
13
+ [npm-downloads-src]: https://img.shields.io/npm/dm/dragon-editor.svg?style=flat&colorA=18181B&colorB=28CF8D
14
14
  [npm-downloads-href]: https://www.npmjs.com/package/dragon-editor
15
- [license-src]: https://img.shields.io/npm/l/my-module.svg?style=flat&colorA=18181B&colorB=28CF8D
16
- [license-href]: https://www.npmjs.com/package/dragon-editor
17
- [nuxt-src]: https://img.shields.io/badge/Nuxt-18181B?logo=nuxt.js
18
- [nuxt-href]: https://nuxt.com
19
- [readme-ko]: https://github.com/lovefields/dragonEditor/blob/main/README.md
20
- [readme-en]: https://github.com/lovefields/dragonEditor/blob/main/README_en.md
21
-
22
- [![Github stars](stars-src)](stars-href)
23
- [![Github issues](issues-src)](issues-href)
24
- [![Github forks](forks-src)](forks-href)
25
- [![Github top language](language-src)](language-href)
26
- [![Hits](hits-src)](hits-href)
27
- [![npm version][npm-version-src]][npm-version-href]
28
- [![npm downloads][npm-downloads-src]][npm-downloads-href]
29
- [![License][license-src]][license-href]
30
- [![Nuxt][nuxt-src]][nuxt-href]
31
-
32
- [KO](readme-ko) / [EN](readme-en)
15
+ [license-src]: https://img.shields.io/npm/l/dragon-editor
33
16
 
34
- # DragonEditor
35
-
36
- 드래곤 에디터는 그냥 블로그에 쓸 이지윅 에디터가 필요해서 만들었습니다.<br>
37
- 커스터마이징이 가능하며 Nuxt.js만 지원합니다.
38
-
39
- ## 사용법
40
-
41
- ### 에디터
42
-
43
- ```vue
44
- <tempalte>
45
- <DragonEditor v-model="contentData" :option="option" ref="editor" />
46
- </tempalte>
47
-
48
- <script setup lang="ts">
49
- const editor = ref();
50
- const contentData = ref([]);
51
- const option = ref({}); // 선택사항
52
- </script>
53
- ```
54
-
55
- #### 컴포넌트 명령어
56
-
57
- 1. 이미지 삽입
58
-
59
- ```typescript
60
- editor.value.addImageBlock({
61
- src: string;
62
- width: number;
63
- height: number;
64
- webp: boolean;
65
- });
66
- ```
67
-
68
- 2. 저장
69
-
70
- ```typescript
71
- editor.value.updateBlockData();
72
- // do save
73
- ```
17
+ [![stars-src]](stars-href)
18
+ [![forks-src]](forks-href)
19
+ [![language-src]](language-href)
20
+ [![hits-src]](hits-href)
21
+ [![issues-src]](issues-href)
22
+ [![npm-version-src]][npm-version-href]
23
+ [![npm-downloads-src]][npm-downloads-href]
24
+ ![NPM][license-src]
74
25
 
75
- ### 코멘트
26
+ # DragonEditor
76
27
 
77
- ```vue
78
- <tempalte>
79
- <DragonEditorComment v-model="commentData" ref="editor" />
80
- </tempalte>
28
+ I just made the DragonEditor because I needed the WYSIWYG Editor to write on my [blog](https://dico.me).
81
29
 
82
- <script setup lang="ts">
83
- const editor = ref();
84
- const commentData = ref({
85
- classList: [],
86
- content: "",
87
- });
88
- </script>
89
- ```
30
+ This module support Nuxt3 only.
90
31
 
91
- #### 컴포넌트 명령어
32
+ # Dependencies
92
33
 
93
- 1. 스타일 설정
34
+ - @pinia/nuxt
94
35
 
95
- 스타일의 경우 컴포넌트에서 다음과 같이 명령어를 사용할 수 있습니다.<br>
96
- 해당되는 스타일이 존재하지 않을 경우 클레스에 값을 부여합니다.
36
+ ## Install
97
37
 
98
- ```typescript
99
- editor.value.setStyles("decorationBold");
38
+ ```shell
39
+ mpm i dragon-edtior
40
+ # or
41
+ yarn add dragon-editor
42
+ # or
43
+ bun add dragon-editor
100
44
  ```
101
45
 
102
- 2. 스타일 리스트
103
-
104
- - `alignLeft` : 왼쪽 정렬
105
- - `alignCenter` : 가운데 정렬
106
- - `alignRight` : 오른쪽 정렬
107
- - `decorationBold` : 볼드
108
- - `decorationItalic` : 이텔릭
109
- - `decorationUnderline` : 밑줄
110
- - `decorationStrikethrough` : 취소선
111
-
112
- 2. 저장
46
+ ## Using
113
47
 
114
- ```typescript
115
- editor.value.updateBlockData();
116
- // do save
117
- ```
118
-
119
- 3. 포커스
48
+ First. Set module
120
49
 
121
50
  ```typescript
122
- editor.value.focus();
51
+ export default defineNuxtConfig({
52
+ modules: ["dragon-editor"],
53
+ });
123
54
  ```
124
55
 
125
- ### Viewer
56
+ Second. Use Component
126
57
 
127
- ```vue
128
- <tempalte>
129
- <DragonEditorViewer :content="contentData"/>
130
- </tempalte>
58
+ ```html
59
+ <template>
60
+ <div class="editor-area">
61
+ <ClientOnly>
62
+ <DragonEditor ref="$editor" />
63
+ </ClientOnly>
64
+ </div>
65
+ </template>
131
66
 
132
67
  <script setup lang="ts">
133
- const contentData = ref([]); // Save Data for Editor
68
+ const $editor = ref<any>();
134
69
  </script>
135
70
  ```
136
71
 
137
- #### Props
138
-
139
- - content : This props is must be Array in Editor data.
140
- - mediaURL (Option) : This props is pre URL in Media.
141
-
142
-
143
- <!-- ## 데모 페이지
144
-
145
- [Demo page](https://lovefields.github.io/dragonEditor/examples)
146
-
147
- ## 문서
72
+ Done!
148
73
 
149
- - [DragonEditor Document](https://lovefields.github.io/dragonEditor-doc/) -->
74
+ <!-- More information is here [Document](123) -->
package/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "dragon-editor",
3
3
  "configKey": "dragon-editor",
4
- "version": "2.1.2"
4
+ "version": "3.0.0-beta"
5
5
  }
package/dist/module.mjs CHANGED
@@ -1,27 +1,25 @@
1
- import { defineNuxtModule, createResolver, addComponent } from '@nuxt/kit';
1
+ import { defineNuxtModule, createResolver, addComponent, addTypeTemplate, installModule } from '@nuxt/kit';
2
2
 
3
3
  const module = defineNuxtModule({
4
4
  meta: {
5
5
  name: "dragon-editor"
6
6
  },
7
- setup(options, nuxt) {
7
+ async setup(options, nuxt) {
8
8
  const resolver = createResolver(import.meta.url);
9
9
  addComponent({
10
10
  name: "DragonEditor",
11
- filePath: resolver.resolve("./runtime/shared/components/DragonEditor")
12
- });
13
- addComponent({
14
- name: "DragonEditorNew",
15
- filePath: resolver.resolve("./runtime/shared/components/DragonEditorNew")
16
- });
17
- addComponent({
18
- name: "DragonEditorComment",
19
- filePath: resolver.resolve("./runtime/shared/components/DragonEditorComment")
11
+ filePath: resolver.resolve("./runtime/components/DragonEditor")
20
12
  });
21
13
  addComponent({
22
14
  name: "DragonEditorViewer",
23
- filePath: resolver.resolve("./runtime/shared/components/DragonEditorViewer")
15
+ filePath: resolver.resolve("./runtime/components/DragonEditorViewer")
16
+ });
17
+ addTypeTemplate({
18
+ filename: "types/dragonEditor.d.ts",
19
+ src: resolver.resolve("./runtime/type.d.ts"),
20
+ write: true
24
21
  });
22
+ await installModule("@pinia/nuxt");
25
23
  }
26
24
  });
27
25
 
@@ -0,0 +1,441 @@
1
+ <template>
2
+ <div class="dragon-editor" :class="{ '--hasMenu': props.useMenuBar === true }" ref="$editor">
3
+ <div v-if="props.useMenuBar === true" class="de-control-bar">
4
+ <button class="de-menu de-menu-add" @click="isActiveAddBlockMenu = !isActiveAddBlockMenu">
5
+ <svg class="de-icon" viewBox="0 0 64 64">
6
+ <path class="de-path" d="M32 9C30.3431 9 29 10.3431 29 12V29H12C10.3431 29 9 30.3431 9 32C9 33.6569 10.3431 35 12 35H29V52C29 53.6569 30.3431 55 32 55C33.6569 55 35 53.6569 35 52V35H52C53.6569 35 55 33.6569 55 32C55 30.3431 53.6569 29 52 29H35V12C35 10.3431 33.6569 9 32 9Z"></path>
7
+ </svg>
8
+ </button>
9
+
10
+ <button class="de-menu" @click="setDecoration('bold')">
11
+ <svg class="de-icon" viewBox="0 0 64 64">
12
+ <path class="de-path" d="M15 50C15 52.7614 17.2386 55 20 55H32.9922C44.0389 55 49 49.3673 49 41.8571C49 35.1933 45.4069 31.9731 39.714 30.9461C39.6526 30.935 39.607 30.8816 39.607 30.8192C39.607 30.7636 39.6438 30.714 39.6966 30.6965C44.9893 28.9442 47.1479 25.5349 47.1479 20.6006C47.1479 13.1574 42.3191 9 32 9H20C17.2386 9 15 11.2386 15 14V50ZM29.3268 48.2274C26.5654 48.2274 24.3268 45.9888 24.3268 43.2274V39.3469C24.3268 36.5855 26.5654 34.3469 29.3268 34.3469H31.0078C36.3658 34.3469 39.3424 36.3586 39.3424 41.1195C39.3424 45.9475 36.4981 48.2274 31.3385 48.2274H29.3268ZM29.3268 28.4461C26.5654 28.4461 24.3268 26.2075 24.3268 23.4461V20.7055C24.3268 17.9441 26.5654 15.7055 29.3268 15.7055H30.4125C35.3074 15.7055 37.821 17.3149 37.821 22.0087C37.821 26.8367 34.5798 28.4461 30.1479 28.4461H29.3268Z"></path>
13
+ </svg>
14
+ </button>
15
+
16
+ <button class="de-menu" @click="setDecoration('italic')">
17
+ <svg class="de-icon" viewBox="0 0 64 64">
18
+ <path class="de-path" d="M25 11C25 9.89543 25.8954 9 27 9H34H40H46C47.1046 9 48 9.89543 48 11C48 12.1046 47.1046 13 46 13H39.0435L29.9565 51H36C37.1046 51 38 51.8954 38 53C38 54.1046 37.1046 55 36 55H29H23H17C15.8954 55 15 54.1046 15 53C15 51.8954 15.8954 51 17 51H23.9565L33.0435 13H27C25.8954 13 25 12.1046 25 11Z"></path>
19
+ </svg>
20
+ </button>
21
+
22
+ <button class="de-menu" @click="setDecoration('underline')">
23
+ <svg class="de-icon" viewBox="0 0 64 64">
24
+ <path class="de-path" d="M21 13C21 11.8954 20.1046 11 19 11C17.8954 11 17 11.8954 17 13V28C17 36.2843 23.7157 43 32 43C40.2843 43 47 36.2843 47 28V13C47 11.8954 46.1046 11 45 11C43.8954 11 43 11.8954 43 13V28C43 34.0751 38.0751 39 32 39C25.9249 39 21 34.0751 21 28V13ZM13 49C11.8954 49 11 49.8954 11 51C11 52.1046 11.8954 53 13 53H51C52.1046 53 53 52.1046 53 51C53 49.8954 52.1046 49 51 49H13Z"></path>
25
+ </svg>
26
+ </button>
27
+
28
+ <button class="de-menu" @click="setDecoration('strikethrough')">
29
+ <svg class="de-icon" viewBox="0 0 64 64">
30
+ <path
31
+ class="de-path"
32
+ d="M49 42.0827C49 46.213 47.3861 49.3985 44.1583 51.6391C40.9305 53.8797 36.4003 55 30.5676 55C25.2609 55 20.9589 54.3116 17.6613 52.9349C16.6952 52.5315 16.1274 51.5533 16.1274 50.5064C16.1274 48.407 18.3376 47.0078 20.3303 47.6687C21.2971 47.9893 22.2887 48.2735 23.305 48.5211C25.8816 49.142 28.3591 49.4525 30.7375 49.4525C34.4183 49.4525 37.2497 48.8991 39.2317 47.7923C41.2136 46.6585 42.2046 44.9442 42.2046 42.6496C42.2046 40.9219 41.4118 39.4507 39.8263 38.2359C38.9729 37.5555 37.669 36.8102 35.9145 36H47.1393C48.3798 37.7105 49 39.7381 49 42.0827ZM32.2534 28H19.0141C18.3351 27.3458 17.7693 26.6544 17.3166 25.9261C16.4389 24.4683 16 22.7271 16 20.7025C16 17.0851 17.5431 14.2371 20.6293 12.1585C23.7156 10.0528 27.9485 9 33.3282 9C37.3092 9 41.2187 9.61323 45.0567 10.8397C46.6953 11.3633 47.4248 13.2208 46.708 14.7845C46.04 16.2418 44.353 16.9113 42.8299 16.4114C39.2086 15.2228 35.8715 14.6285 32.8185 14.6285C29.4775 14.6285 26.9575 15.1279 25.2587 16.1268C23.5598 17.1256 22.7104 18.5023 22.7104 20.257C22.7104 21.4448 23.0219 22.4572 23.6448 23.294C24.296 24.1309 25.3295 24.9272 26.7452 25.6831C27.8244 26.2593 29.6605 27.0316 32.2534 28ZM11 30C9.89543 30 9 30.8954 9 32C9 33.1046 9.89543 34 11 34H53C54.1046 34 55 33.1046 55 32C55 30.8954 54.1046 30 53 30H11Z"
33
+ ></path>
34
+ </svg>
35
+ </button>
36
+
37
+ <button class="de-menu" @click="setDecoration('code')">
38
+ <svg class="de-icon" viewBox="0 0 64 64">
39
+ <path class="de-path" d="M35.2981 20C34.5175 20 33.8188 20.4842 33.5447 21.2151L25.9492 41.4698C25.4901 42.6941 26.3951 44 27.7026 44C28.4832 44 29.182 43.5158 29.4561 42.7849L37.0516 22.5302C37.5107 21.3059 36.6056 20 35.2981 20ZM11.013 35.0376C8.34071 33.499 8.34073 29.643 11.013 28.1045L18.8813 23.5745C19.8385 23.0234 21.0613 23.3526 21.6124 24.3098C22.1635 25.2671 21.8343 26.4899 20.8771 27.041L13.0088 31.571L20.8771 36.1011C21.8343 36.6522 22.1635 37.875 21.6124 38.8322C21.0613 39.7895 19.8385 40.1187 18.8813 39.5676L11.013 35.0376ZM53.1299 35.0376C55.8022 33.499 55.8022 29.643 53.1299 28.1045L45.2616 23.5745C44.3044 23.0234 43.0816 23.3526 42.5305 24.3098C41.9794 25.2671 42.3086 26.4899 43.2658 27.041L51.1341 31.571L43.2658 36.1011C42.3086 36.6522 41.9794 37.875 42.5305 38.8322C43.0816 39.7895 44.3044 40.1187 45.2616 39.5676L53.1299 35.0376Z"></path>
40
+ </svg>
41
+ </button>
42
+
43
+ <div class="de-block-menu-area" :class="{ '--active': isActiveAddBlockMenu }">
44
+ <div class="de-list">
45
+ <button class="de-add-block" @click="addBlock('text')">Text</button>
46
+ <button class="de-add-block" @click="addBlock('heading1')">Heading-1</button>
47
+ <button class="de-add-block" @click="addBlock('heading2')">Heading-2</button>
48
+ <button class="de-add-block" @click="addBlock('heading3')">Heading-3</button>
49
+ <button class="de-add-block" @click="addBlock('ul')">Unodered List</button>
50
+ <button class="de-add-block" @click="addBlock('ol')">Odered List</button>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="de-body" ref="$content" @keydown="contentKeyboardEvent" @mouseup="updateCursorData">
56
+ <p class="de-block de-text-block" contenteditable="true"></p>
57
+ </div>
58
+ </div>
59
+ </template>
60
+
61
+ <script setup lang="ts">
62
+ import { ref, onMounted, onUnmounted } from "vue";
63
+ import { useEditorStore } from "../store";
64
+ import { _findScrollingElement, _findContentEditableElement } from "../utils/element";
65
+ import { _elementKeyEvent, _hotKeyEvent } from "../utils/keyboardEvent";
66
+ import { _createTextBlock, _createHeadingBlock, _createListBlock } from "../utils/block";
67
+ import { _setNodeStyle } from "../utils/style";
68
+ import { _setCursorData, _clenupCursor } from "../utils/cursor";
69
+ import "../type.d.ts";
70
+
71
+ const props = defineProps({
72
+ useMenuBar: {
73
+ type: Boolean,
74
+ requiard: false,
75
+ default: () => true,
76
+ },
77
+ });
78
+ const editorStore = useEditorStore();
79
+ const isActiveAddBlockMenu = ref<boolean>(false);
80
+ const $editor = ref<HTMLDivElement>();
81
+ const $content = ref<HTMLDivElement>();
82
+
83
+ /**
84
+ * 이벤트 관련 영역 시작
85
+ */
86
+
87
+ function contentKeyboardEvent(e: KeyboardEvent) {
88
+ _elementKeyEvent(e, editorStore);
89
+ _hotKeyEvent(e, editorStore);
90
+ }
91
+
92
+ function updateCursorData(e: MouseEvent) {
93
+ const originalCursorData = editorStore.cursorData;
94
+
95
+ _setCursorData(editorStore);
96
+
97
+ if (editorStore.cursorData !== null && _findContentEditableElement(editorStore.cursorData.startNode) === null) {
98
+ // 비정상 커서 값일 경우 초기화
99
+ editorStore.cursorData = originalCursorData;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * 이벤트 관련 영역 종료
105
+ */
106
+
107
+ function addBlock(type: string) {
108
+ _clenupCursor(editorStore);
109
+ isActiveAddBlockMenu.value = false;
110
+
111
+ let blockStructure: HTMLElement | null = null;
112
+
113
+ switch (type) {
114
+ case "text":
115
+ blockStructure = _createTextBlock();
116
+ break;
117
+ case "heading1":
118
+ case "heading2":
119
+ case "heading3":
120
+ blockStructure = _createHeadingBlock(type);
121
+ break;
122
+ case "ul":
123
+ case "ol":
124
+ blockStructure = _createListBlock(type);
125
+ break;
126
+ }
127
+
128
+ if (blockStructure !== null) {
129
+ if (editorStore.cursorData === null) {
130
+ (editorStore.$content as HTMLDivElement).insertAdjacentElement("beforeend", blockStructure);
131
+ } else {
132
+ let $target = editorStore.cursorData.startNode;
133
+
134
+ if ($target.constructor.name === "Text") {
135
+ $target = $target.parentNode as Node;
136
+ }
137
+
138
+ const $block = ($target as HTMLElement).closest(".de-block") as Element;
139
+
140
+ $block.insertAdjacentElement("afterend", blockStructure);
141
+ }
142
+
143
+ switch (type) {
144
+ case "ul":
145
+ case "ol":
146
+ (blockStructure.childNodes[0] as HTMLElement).focus();
147
+ break;
148
+ default:
149
+ blockStructure.focus();
150
+ }
151
+ }
152
+ }
153
+
154
+ function setDecoration(type: string) {
155
+ _setNodeStyle(`de-${type}`, editorStore);
156
+ }
157
+
158
+ onMounted(() => {
159
+ if ($editor.value !== undefined) {
160
+ editorStore.setWrapElement($editor.value);
161
+ editorStore.setParentWrapElement(_findScrollingElement($editor.value));
162
+ }
163
+
164
+ if ($content.value !== undefined) {
165
+ editorStore.setContentElement($content.value);
166
+ }
167
+
168
+ // TODO : set scroll event
169
+ });
170
+
171
+ onUnmounted(() => {});
172
+
173
+ defineExpose({
174
+ addBlock,
175
+ });
176
+ </script>
177
+
178
+ <style>
179
+ @charset "UTF-8";
180
+ .dragon-editor,
181
+ .dragon-editor-viewer {
182
+ /**
183
+ * Reset style start
184
+ */
185
+ }
186
+ .dragon-editor h1,
187
+ .dragon-editor h2,
188
+ .dragon-editor h3,
189
+ .dragon-editor h4,
190
+ .dragon-editor h5,
191
+ .dragon-editor h6,
192
+ .dragon-editor p,
193
+ .dragon-editor blockquote,
194
+ .dragon-editor pre,
195
+ .dragon-editor dl,
196
+ .dragon-editor dd,
197
+ .dragon-editor ol,
198
+ .dragon-editor ul,
199
+ .dragon-editor fieldset,
200
+ .dragon-editor legend,
201
+ .dragon-editor figure,
202
+ .dragon-editor menu,
203
+ .dragon-editor-viewer h1,
204
+ .dragon-editor-viewer h2,
205
+ .dragon-editor-viewer h3,
206
+ .dragon-editor-viewer h4,
207
+ .dragon-editor-viewer h5,
208
+ .dragon-editor-viewer h6,
209
+ .dragon-editor-viewer p,
210
+ .dragon-editor-viewer blockquote,
211
+ .dragon-editor-viewer pre,
212
+ .dragon-editor-viewer dl,
213
+ .dragon-editor-viewer dd,
214
+ .dragon-editor-viewer ol,
215
+ .dragon-editor-viewer ul,
216
+ .dragon-editor-viewer fieldset,
217
+ .dragon-editor-viewer legend,
218
+ .dragon-editor-viewer figure,
219
+ .dragon-editor-viewer menu {
220
+ margin: 0;
221
+ padding: 0;
222
+ border: 0;
223
+ }
224
+ .dragon-editor table,
225
+ .dragon-editor th,
226
+ .dragon-editor td,
227
+ .dragon-editor-viewer table,
228
+ .dragon-editor-viewer th,
229
+ .dragon-editor-viewer td {
230
+ border-spacing: 0;
231
+ border-collapse: collapse;
232
+ }
233
+ .dragon-editor ol,
234
+ .dragon-editor ul,
235
+ .dragon-editor li,
236
+ .dragon-editor-viewer ol,
237
+ .dragon-editor-viewer ul,
238
+ .dragon-editor-viewer li {
239
+ list-style: none;
240
+ }
241
+ .dragon-editor h1,
242
+ .dragon-editor h2,
243
+ .dragon-editor h3,
244
+ .dragon-editor h4,
245
+ .dragon-editor h5,
246
+ .dragon-editor h6,
247
+ .dragon-editor-viewer h1,
248
+ .dragon-editor-viewer h2,
249
+ .dragon-editor-viewer h3,
250
+ .dragon-editor-viewer h4,
251
+ .dragon-editor-viewer h5,
252
+ .dragon-editor-viewer h6 {
253
+ font-size: 1em;
254
+ font-weight: normal;
255
+ }
256
+ .dragon-editor input,
257
+ .dragon-editor textarea,
258
+ .dragon-editor select,
259
+ .dragon-editor button,
260
+ .dragon-editor-viewer input,
261
+ .dragon-editor-viewer textarea,
262
+ .dragon-editor-viewer select,
263
+ .dragon-editor-viewer button {
264
+ margin: 0;
265
+ padding: 0;
266
+ border-radius: 0;
267
+ outline: 0;
268
+ vertical-align: middle;
269
+ }
270
+ .dragon-editor a,
271
+ .dragon-editor button,
272
+ .dragon-editor input[type=submit],
273
+ .dragon-editor input[type=button],
274
+ .dragon-editor input[type=reset],
275
+ .dragon-editor-viewer a,
276
+ .dragon-editor-viewer button,
277
+ .dragon-editor-viewer input[type=submit],
278
+ .dragon-editor-viewer input[type=button],
279
+ .dragon-editor-viewer input[type=reset] {
280
+ border: 0;
281
+ background: transparent;
282
+ cursor: pointer;
283
+ }
284
+ .dragon-editor img,
285
+ .dragon-editor-viewer img {
286
+ border: 0;
287
+ vertical-align: top;
288
+ }
289
+ .dragon-editor .de-block[data-depth="1"],
290
+ .dragon-editor-viewer .de-block[data-depth="1"] {
291
+ padding-left: 30px;
292
+ }
293
+ .dragon-editor .de-block[data-depth="2"],
294
+ .dragon-editor-viewer .de-block[data-depth="2"] {
295
+ padding-left: 60px;
296
+ }
297
+ .dragon-editor .de-block[data-depth="3"],
298
+ .dragon-editor-viewer .de-block[data-depth="3"] {
299
+ padding-left: 90px;
300
+ }
301
+ .dragon-editor .de-block[data-depth="4"],
302
+ .dragon-editor-viewer .de-block[data-depth="4"] {
303
+ padding-left: 120px;
304
+ }
305
+ .dragon-editor .de-block[data-depth="5"],
306
+ .dragon-editor-viewer .de-block[data-depth="5"] {
307
+ padding-left: 150px;
308
+ }
309
+
310
+ /**
311
+ * 노드 스타일
312
+ */
313
+ .dragon-editor {
314
+ position: relative;
315
+ border: 1px solid #ccc;
316
+ }
317
+ .dragon-editor.--hasMenu {
318
+ padding-top: 38px;
319
+ }
320
+ .dragon-editor .de-body {
321
+ display: grid;
322
+ gap: 4px;
323
+ padding: 20px;
324
+ }
325
+ .dragon-editor .de-control-bar {
326
+ position: absolute;
327
+ top: 0;
328
+ left: 0;
329
+ right: 0;
330
+ height: 38px;
331
+ border-bottom: 1px solid #ccc;
332
+ }
333
+ .dragon-editor .de-control-bar .de-menu {
334
+ min-width: 38px;
335
+ height: 38px;
336
+ padding: 0 8px;
337
+ border-right: 1px solid #ccc;
338
+ box-sizing: border-box;
339
+ }
340
+ .dragon-editor .de-control-bar .de-menu.--lastchild {
341
+ border-right: 0;
342
+ }
343
+ .dragon-editor .de-control-bar .de-block-menu-area {
344
+ display: none;
345
+ position: absolute;
346
+ top: 39px;
347
+ left: 0;
348
+ width: 120px;
349
+ background: #fff;
350
+ box-shadow: 0 2px 2px rgba(0, 0, 0, 0.25);
351
+ z-index: 1000;
352
+ }
353
+ .dragon-editor .de-control-bar .de-block-menu-area.--active {
354
+ display: block;
355
+ }
356
+ .dragon-editor .de-control-bar .de-block-menu-area .de-list {
357
+ display: flex;
358
+ flex-direction: column;
359
+ gap: 5px;
360
+ padding: 5px;
361
+ }
362
+ .dragon-editor .de-control-bar .de-block-menu-area .de-add-block {
363
+ line-height: 1.6;
364
+ }
365
+ .dragon-editor .de-text-block {
366
+ min-height: 1.6em;
367
+ outline: 0;
368
+ }
369
+ .dragon-editor .de-text-block:empty:hover::before, .dragon-editor .de-text-block:empty:focus::before {
370
+ display: inline;
371
+ content: "Type a paragraph";
372
+ color: #ccc;
373
+ cursor: text;
374
+ }
375
+ .dragon-editor .de-heading-block {
376
+ outline: 0;
377
+ }
378
+ .dragon-editor .de-heading-block[data-level="1"] {
379
+ font-size: 2em;
380
+ min-height: 2em;
381
+ }
382
+ .dragon-editor .de-heading-block[data-level="2"] {
383
+ font-size: 1.5em;
384
+ min-height: 1.5em;
385
+ }
386
+ .dragon-editor .de-heading-block[data-level="3"] {
387
+ font-size: 1.17em;
388
+ min-height: 1.17em;
389
+ }
390
+ .dragon-editor .de-heading-block:empty:hover::before, .dragon-editor .de-heading-block:empty:focus::before {
391
+ display: inline;
392
+ content: "Type a Heading";
393
+ color: #ccc;
394
+ cursor: text;
395
+ }
396
+ .dragon-editor .de-list-block {
397
+ display: flex;
398
+ flex-direction: column;
399
+ row-gap: 4px;
400
+ padding-left: 24px;
401
+ list-style: disc;
402
+ }
403
+ .dragon-editor .de-list-block .de-item {
404
+ min-height: 1.6em;
405
+ outline: 0;
406
+ list-style: inherit;
407
+ }
408
+ .dragon-editor .de-list-block .de-item:empty:hover::before, .dragon-editor .de-list-block .de-item:empty:focus::before {
409
+ display: inline;
410
+ content: "Type a list item";
411
+ color: #ccc;
412
+ cursor: text;
413
+ }
414
+ .dragon-editor ol.de-list-block {
415
+ list-style: decimal;
416
+ }
417
+ .dragon-editor .de-bold {
418
+ font-weight: 700;
419
+ }
420
+ .dragon-editor .de-italic {
421
+ font-style: italic;
422
+ }
423
+ .dragon-editor .de-underline {
424
+ text-decoration: underline;
425
+ }
426
+ .dragon-editor .de-underline.de-strikethrough {
427
+ text-decoration: underline line-through;
428
+ }
429
+ .dragon-editor .de-strikethrough {
430
+ text-decoration: line-through;
431
+ }
432
+ .dragon-editor .de-strikethrough.de-underline {
433
+ text-decoration: line-through underline;
434
+ }
435
+ .dragon-editor .de-code {
436
+ padding: 2px 4px;
437
+ background: #f1f1f1;
438
+ color: #ff0000;
439
+ border-radius: 5px;
440
+ }
441
+ </style>
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import { defineNuxtPlugin } from "#app";
2
+ export default defineNuxtPlugin((nuxtApp) => {
3
+ const test = "test";
4
+ console.log("Plugin injected by dragon-editor!");
5
+ return {
6
+ provide: {
7
+ test
8
+ }
9
+ };
10
+ });