dragon-editor 3.4.4 → 3.5.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 (70) hide show
  1. package/README.md +9 -15
  2. package/dist/module.d.mts +5 -0
  3. package/dist/module.json +8 -1
  4. package/dist/module.mjs +5 -3
  5. package/dist/runtime/components/DragonEditor.vue +252 -720
  6. package/dist/runtime/components/DragonEditorViewer.vue +59 -45
  7. package/dist/runtime/scss/editor.css +83 -34
  8. package/dist/runtime/scss/viewer.css +31 -4
  9. package/dist/runtime/type.d.ts +78 -23
  10. package/dist/runtime/utils/event/block.d.ts +0 -0
  11. package/dist/runtime/utils/event/block.js +78 -0
  12. package/dist/runtime/utils/event/cursor.d.ts +0 -0
  13. package/dist/runtime/utils/{cursor.mjs → event/cursor.js} +4 -16
  14. package/dist/runtime/utils/event/data.d.ts +0 -0
  15. package/dist/runtime/utils/event/data.js +342 -0
  16. package/dist/runtime/utils/event/index.d.ts +8 -0
  17. package/dist/runtime/utils/event/index.js +8 -0
  18. package/dist/runtime/utils/event/keyboard.d.ts +0 -0
  19. package/dist/runtime/utils/event/keyboard.js +1368 -0
  20. package/dist/runtime/utils/event/mouse.d.ts +0 -0
  21. package/dist/runtime/utils/event/mouse.js +70 -0
  22. package/dist/runtime/utils/event/scroll.d.ts +0 -0
  23. package/dist/runtime/utils/event/scroll.js +29 -0
  24. package/dist/runtime/utils/event/touch.d.ts +0 -0
  25. package/dist/runtime/utils/event/touch.js +10 -0
  26. package/dist/runtime/utils/event/window.d.ts +0 -0
  27. package/dist/runtime/utils/event/window.js +32 -0
  28. package/dist/runtime/utils/layout/block.d.ts +0 -0
  29. package/dist/runtime/utils/layout/block.js +105 -0
  30. package/dist/runtime/utils/layout/body.d.ts +0 -0
  31. package/dist/runtime/utils/layout/body.js +22 -0
  32. package/dist/runtime/utils/layout/controlbar.d.ts +0 -0
  33. package/dist/runtime/utils/layout/controlbar.js +99 -0
  34. package/dist/runtime/utils/layout/icon.d.ts +0 -0
  35. package/dist/runtime/utils/layout/icon.js +156 -0
  36. package/dist/runtime/utils/layout/index.d.ts +5 -0
  37. package/dist/runtime/utils/layout/index.js +5 -0
  38. package/dist/runtime/utils/layout/menuBar.d.ts +0 -0
  39. package/dist/runtime/utils/layout/menuBar.js +358 -0
  40. package/dist/runtime/utils/node/block.d.ts +0 -0
  41. package/dist/runtime/utils/node/block.js +235 -0
  42. package/dist/runtime/utils/{element.d.ts → node/element.d.ts} +1 -0
  43. package/dist/runtime/utils/{element.mjs → node/element.js} +19 -4
  44. package/dist/runtime/utils/node/index.d.ts +2 -0
  45. package/dist/runtime/utils/node/index.js +2 -0
  46. package/dist/runtime/utils/style/anchor.d.ts +0 -0
  47. package/dist/runtime/utils/style/anchor.js +240 -0
  48. package/dist/runtime/utils/style/decoration.d.ts +0 -0
  49. package/dist/runtime/utils/style/decoration.js +378 -0
  50. package/dist/runtime/utils/style/index.d.ts +2 -0
  51. package/dist/runtime/utils/style/index.js +2 -0
  52. package/dist/types.d.mts +7 -0
  53. package/dist/types.d.ts +3 -3
  54. package/package.json +15 -16
  55. package/dist/runtime/store.d.ts +0 -11
  56. package/dist/runtime/store.mjs +0 -51
  57. package/dist/runtime/utils/block.d.ts +0 -13
  58. package/dist/runtime/utils/block.mjs +0 -144
  59. package/dist/runtime/utils/content.d.ts +0 -2
  60. package/dist/runtime/utils/content.mjs +0 -19
  61. package/dist/runtime/utils/controlBar.d.ts +0 -9
  62. package/dist/runtime/utils/controlBar.mjs +0 -172
  63. package/dist/runtime/utils/convertor.d.ts +0 -3
  64. package/dist/runtime/utils/convertor.mjs +0 -138
  65. package/dist/runtime/utils/cursor.d.ts +0 -6
  66. package/dist/runtime/utils/keyboardEvent.d.ts +0 -10
  67. package/dist/runtime/utils/keyboardEvent.mjs +0 -978
  68. package/dist/runtime/utils/style.d.ts +0 -5
  69. package/dist/runtime/utils/style.mjs +0 -617
  70. /package/dist/runtime/{plugin.mjs → plugin.js} +0 -0
@@ -1,54 +1,42 @@
1
1
  <template>
2
- <div class="dragon-editor-viewer">
3
- <template v-for="item in props.content">
4
- <p v-if="item.type === 'text'" class="de-block de-text-block" :class="item.classList" v-html="item.textContent"></p>
5
-
6
- <template v-if="item.type === 'heading'">
7
- <h1 v-if="item.level === 1" class="de-block de-heading-block" :class="item.classList" :data-level="item.level" v-html="item.textContent"></h1>
8
- <h2 v-if="item.level === 2" class="de-block de-heading-block" :class="item.classList" :data-level="item.level" v-html="item.textContent"></h2>
9
- <h3 v-if="item.level === 3" class="de-block de-heading-block" :class="item.classList" :data-level="item.level" v-html="item.textContent"></h3>
10
- </template>
11
-
12
- <template v-if="item.type === 'list'">
13
- <ul v-if="item.element === 'ul'" class="de-block de-list-block" :data-style="item.style">
14
- <li v-for="li in item.child" class="de-item" :class="li.classList" v-html="li.textContent"></li>
15
- </ul>
16
-
17
- <ol v-if="item.element === 'ol'" class="de-block de-list-block" :data-style="item.style">
18
- <li v-for="li in item.child" class="de-item" :class="li.classList" v-html="li.textContent"></li>
19
- </ol>
20
- </template>
21
-
22
- <div v-if="item.type === 'image'" class="de-block de-image-block" :class="item.classList">
23
- <div class="de-image-area" :data-maxwidth="item.maxWidth">
24
- <img :src="props.imageHostURL === undefined ? item.src : props.imageHostURL + item.src" alt="" class="de-img" :width="item.width" :height="item.height" loading="lazy" />
25
- </div>
26
-
27
- <p v-if="item.caption" class="de-caption">{{ item.caption }}</p>
28
- </div>
29
-
30
- <div v-if="item.type === 'code'" class="de-block de-code-block" :data-theme="item.theme">
31
- <p class="de-filename">{{ item.filename }}</p>
32
- <p class="de-language">{{ item.language }}</p>
33
- <pre class="de-pre"><code class="de-code-content" v-html="item.textContent"></code></pre>
34
- </div>
35
-
36
- <div v-if="item.type === 'custom'" class="de-block de-custom-block" :class="item.classList" v-html="item.textContent"></div>
37
- </template>
38
- </div>
2
+ <component :is="structure()"></component>
39
3
  </template>
40
4
 
41
5
  <script setup lang="ts">
42
- const props = defineProps<{
43
- content: DEContentData;
44
- imageHostURL?: string;
45
- }>();
6
+ import { h } from "vue";
7
+ import type { VNode } from "vue";
8
+ import { _createBlockList } from "../utils/layout";
9
+
10
+ const props = withDefaults(
11
+ defineProps<{
12
+ content: DEContentData;
13
+ imageHostURL?: string;
14
+ }>(),
15
+ {
16
+ imageHostURL: "",
17
+ }
18
+ );
19
+
20
+ function structure(): VNode {
21
+ return h(
22
+ "div",
23
+ {
24
+ class: ["dragon-editor-viewer"],
25
+ },
26
+ _createBlockList({
27
+ blockList: props.content,
28
+ isEditable: false,
29
+ imageHostURL: props.imageHostURL,
30
+ })
31
+ );
32
+ }
46
33
  </script>
47
34
 
48
35
  <style>
49
36
  @charset "UTF-8";
50
37
  .dragon-editor,
51
38
  .dragon-editor-viewer {
39
+ --radius-default: 4px;
52
40
  /**
53
41
  * Reset style start
54
42
  */
@@ -135,6 +123,7 @@ const props = defineProps<{
135
123
  padding: 0;
136
124
  border-radius: 0;
137
125
  outline: 0;
126
+ font-size: inherit;
138
127
  vertical-align: middle;
139
128
  }
140
129
  .dragon-editor a,
@@ -149,6 +138,7 @@ const props = defineProps<{
149
138
  .dragon-editor-viewer input[type=reset] {
150
139
  border: 0;
151
140
  background: transparent;
141
+ font-size: inherit;
152
142
  cursor: pointer;
153
143
  }
154
144
  .dragon-editor img,
@@ -176,6 +166,26 @@ const props = defineProps<{
176
166
  .dragon-editor-viewer .de-block[data-depth="5"] {
177
167
  padding-left: 150px;
178
168
  }
169
+ .dragon-editor .de-block.de-list-block[data-depth="1"],
170
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="1"] {
171
+ padding-left: 54px;
172
+ }
173
+ .dragon-editor .de-block.de-list-block[data-depth="2"],
174
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="2"] {
175
+ padding-left: 84px;
176
+ }
177
+ .dragon-editor .de-block.de-list-block[data-depth="3"],
178
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="3"] {
179
+ padding-left: 114px;
180
+ }
181
+ .dragon-editor .de-block.de-list-block[data-depth="4"],
182
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="4"] {
183
+ padding-left: 144px;
184
+ }
185
+ .dragon-editor .de-block.de-list-block[data-depth="5"],
186
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="5"] {
187
+ padding-left: 174px;
188
+ }
179
189
 
180
190
  /**
181
191
  * 노드 스타일
@@ -186,12 +196,12 @@ const props = defineProps<{
186
196
  gap: 4px;
187
197
  width: 100%;
188
198
  height: 100%;
189
- padding: 20px;
190
199
  line-height: 1.6;
191
200
  box-sizing: border-box;
192
201
  }
193
202
  .dragon-editor-viewer .de-block {
194
203
  width: 100%;
204
+ box-sizing: border-box;
195
205
  }
196
206
  .dragon-editor-viewer .de-text-block {
197
207
  min-height: 1.6em;
@@ -495,14 +505,16 @@ const props = defineProps<{
495
505
  .dragon-editor-viewer .de-image-block .de-image-area .de-img {
496
506
  width: 100%;
497
507
  height: auto;
508
+ border-radius: var(--radius-default);
498
509
  }
499
510
  .dragon-editor-viewer .de-image-block .de-image-area .de-btn {
500
511
  position: absolute;
501
512
  top: 50%;
502
513
  width: 8px;
503
- height: 100px;
504
- background: #ccc;
505
- border: 1px solid #333;
514
+ height: 15%;
515
+ background: #f1f1f1;
516
+ border: 1px solid #ccc;
517
+ border-radius: var(--radius-default);
506
518
  transform: translate(-50%, -50%);
507
519
  cursor: col-resize;
508
520
  user-select: none;
@@ -524,6 +536,8 @@ const props = defineProps<{
524
536
  .dragon-editor-viewer .de-code-block {
525
537
  display: flex;
526
538
  flex-wrap: wrap;
539
+ border-radius: var(--radius-default);
540
+ overflow: hidden;
527
541
  }
528
542
  .dragon-editor-viewer .de-code-block .de-filename {
529
543
  flex: 1;
@@ -1,6 +1,7 @@
1
1
  @charset "UTF-8";
2
2
  .dragon-editor,
3
3
  .dragon-editor-viewer {
4
+ --radius-default: 4px;
4
5
  /**
5
6
  * Reset style start
6
7
  */
@@ -87,6 +88,7 @@
87
88
  padding: 0;
88
89
  border-radius: 0;
89
90
  outline: 0;
91
+ font-size: inherit;
90
92
  vertical-align: middle;
91
93
  }
92
94
  .dragon-editor a,
@@ -101,6 +103,7 @@
101
103
  .dragon-editor-viewer input[type=reset] {
102
104
  border: 0;
103
105
  background: transparent;
106
+ font-size: inherit;
104
107
  cursor: pointer;
105
108
  }
106
109
  .dragon-editor img,
@@ -128,6 +131,26 @@
128
131
  .dragon-editor-viewer .de-block[data-depth="5"] {
129
132
  padding-left: 150px;
130
133
  }
134
+ .dragon-editor .de-block.de-list-block[data-depth="1"],
135
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="1"] {
136
+ padding-left: 54px;
137
+ }
138
+ .dragon-editor .de-block.de-list-block[data-depth="2"],
139
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="2"] {
140
+ padding-left: 84px;
141
+ }
142
+ .dragon-editor .de-block.de-list-block[data-depth="3"],
143
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="3"] {
144
+ padding-left: 114px;
145
+ }
146
+ .dragon-editor .de-block.de-list-block[data-depth="4"],
147
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="4"] {
148
+ padding-left: 144px;
149
+ }
150
+ .dragon-editor .de-block.de-list-block[data-depth="5"],
151
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="5"] {
152
+ padding-left: 174px;
153
+ }
131
154
 
132
155
  /**
133
156
  * 노드 스타일
@@ -135,14 +158,19 @@
135
158
  .dragon-editor {
136
159
  position: relative;
137
160
  border: 1px solid #ccc;
161
+ border-radius: var(--radius-default);
138
162
  }
139
- .dragon-editor.--hasMenu {
140
- padding-top: 38px;
163
+ .dragon-editor.--has-menu {
164
+ padding-top: 35px;
165
+ }
166
+ .dragon-editor.--mobile .de-menu-bar .de-menu-wrap {
167
+ overflow-x: auto;
141
168
  }
142
169
  .dragon-editor .de-body {
143
170
  display: flex;
144
171
  flex-direction: column;
145
172
  gap: 4px;
173
+ min-height: 500px;
146
174
  padding: 20px;
147
175
  line-height: 1.6;
148
176
  }
@@ -151,43 +179,58 @@
151
179
  top: 0;
152
180
  left: 0;
153
181
  right: 0;
154
- height: 38px;
182
+ height: 34px;
155
183
  background: #fff;
156
184
  border-bottom: 1px solid #ccc;
185
+ border-radius: var(--radius-default) var(--radius-default) 0 0;
157
186
  z-index: 10;
158
187
  }
159
188
  .dragon-editor .de-menu-bar .de-menu-wrap {
160
189
  display: flex;
161
- overflow-x: auto;
190
+ }
191
+ .dragon-editor .de-menu-bar .de-col {
192
+ display: flex;
193
+ position: relative;
194
+ border-right: 1px solid #ccc;
195
+ }
196
+ .dragon-editor .de-menu-bar .de-col:last-child {
197
+ border-right: 0;
162
198
  }
163
199
  .dragon-editor .de-menu-bar .de-menu {
164
200
  display: flex;
165
201
  justify-content: center;
166
202
  align-items: center;
167
- min-width: 38px;
168
- height: 38px;
169
- border-right: 1px solid #ccc;
170
- box-sizing: border-box;
203
+ min-width: 34px;
204
+ height: 34px;
171
205
  cursor: pointer;
172
206
  }
207
+ .dragon-editor .de-menu-bar .de-menu.--disabled .de-path {
208
+ fill: #ccc;
209
+ }
173
210
  .dragon-editor .de-menu-bar .de-menu .de-icon {
174
- width: 24px;
175
- height: 24px;
211
+ width: 16px;
212
+ height: 16px;
176
213
  }
177
214
  .dragon-editor .de-menu-bar .de-menu.--lastchild {
178
215
  border-right: 0;
179
216
  }
217
+ .dragon-editor .de-menu-bar .de-menu .de-path {
218
+ fill: #333;
219
+ }
180
220
  .dragon-editor .de-menu-bar .de-menu .de-path.--red {
181
221
  fill: #dd0000;
182
222
  }
183
223
  .dragon-editor .de-menu-bar .de-block-menu-area {
184
224
  display: none;
185
225
  position: absolute;
186
- top: 39px;
226
+ top: 35px;
187
227
  left: 0;
188
228
  width: 120px;
189
229
  background: #fff;
190
- box-shadow: 0 2px 2px rgba(0, 0, 0, 0.25);
230
+ border-width: 0 1px 1px 0;
231
+ border-style: solid;
232
+ border-color: #ccc;
233
+ border-bottom-right-radius: var(--radius-default);
191
234
  z-index: 1000;
192
235
  }
193
236
  .dragon-editor .de-menu-bar .de-block-menu-area.--active {
@@ -205,12 +248,15 @@
205
248
  .dragon-editor .de-menu-bar .de-link-exit-area {
206
249
  display: none;
207
250
  position: absolute;
208
- top: 39px;
209
- left: 228px;
251
+ top: calc(100% + 1px);
252
+ left: 50%;
210
253
  width: 200px;
211
254
  background: #fff;
212
- box-shadow: 0 2px 2px rgba(0, 0, 0, 0.25);
255
+ border: 1px solid #ccc;
256
+ border-top: 0;
257
+ border-radius: 0 0 var(--radius-default) var(--radius-default);
213
258
  z-index: 1000;
259
+ transform: translateX(-50%);
214
260
  }
215
261
  .dragon-editor .de-menu-bar .de-link-exit-area.--active {
216
262
  display: block;
@@ -222,9 +268,10 @@
222
268
  .dragon-editor .de-menu-bar .de-link-exit-area .de-btn-area .de-btn {
223
269
  flex: 1;
224
270
  height: 24px;
271
+ color: #999;
225
272
  }
226
273
  .dragon-editor .de-menu-bar .de-link-exit-area .de-btn-area .de-btn.--active {
227
- background: #f1f1f1;
274
+ color: #333;
228
275
  }
229
276
  .dragon-editor .de-menu-bar .de-link-exit-area .de-link-text-area {
230
277
  display: flex;
@@ -255,42 +302,40 @@
255
302
  overflow-y: auto;
256
303
  }
257
304
  .dragon-editor .de-menu-bar .de-link-exit-area .de-link-heading-area .de-btn {
258
- min-height: 20px;
305
+ padding: 2px 4px;
259
306
  text-align: left;
307
+ border-radius: var(--radius-default);
260
308
  }
261
309
  .dragon-editor .de-menu-bar .de-link-exit-area .de-link-heading-area .de-btn:hover {
262
310
  background: #f1f1f1;
263
311
  }
264
- .dragon-editor .de-control-bar {
265
- display: none;
312
+ .dragon-editor .de-controlbar {
313
+ display: flex;
266
314
  position: fixed;
267
- height: 38px;
315
+ height: 34px;
268
316
  background: #fff;
269
317
  border: 1px solid #ccc;
270
- border-width: 1px 0 0 1px;
318
+ border-radius: var(--radius-default);
271
319
  transform: translateX(-50%);
272
320
  z-index: 20;
273
321
  }
274
- .dragon-editor .de-control-bar.--active {
275
- display: flex;
276
- }
277
- .dragon-editor .de-control-bar:empty {
278
- display: none;
279
- }
280
- .dragon-editor .de-control-bar .de-col {
322
+ .dragon-editor .de-controlbar .de-col {
281
323
  display: flex;
282
324
  align-items: center;
283
325
  column-gap: 6px;
284
326
  padding: 0 10px;
285
- border: 1px solid #ccc;
286
- border-width: 0 1px 1px 0;
327
+ border-right: 1px solid #ccc;
328
+ }
329
+ .dragon-editor .de-controlbar .de-col:last-child {
330
+ border-right: 0;
287
331
  }
288
- .dragon-editor .de-control-bar .de-col .de-selector {
332
+ .dragon-editor .de-controlbar .de-col .de-selector {
289
333
  height: 100%;
290
334
  border: 0;
291
335
  }
292
336
  .dragon-editor .de-block {
293
337
  width: 100%;
338
+ box-sizing: border-box;
294
339
  }
295
340
  .dragon-editor .de-text-block {
296
341
  min-height: 1.6em;
@@ -612,14 +657,16 @@
612
657
  .dragon-editor .de-image-block .de-image-area .de-img {
613
658
  width: 100%;
614
659
  height: auto;
660
+ border-radius: var(--radius-default);
615
661
  }
616
662
  .dragon-editor .de-image-block .de-image-area .de-btn {
617
663
  position: absolute;
618
664
  top: 50%;
619
665
  width: 8px;
620
- height: 100px;
621
- background: #ccc;
622
- border: 1px solid #333;
666
+ height: 15%;
667
+ background: #f1f1f1;
668
+ border: 1px solid #ccc;
669
+ border-radius: var(--radius-default);
623
670
  transform: translate(-50%, -50%);
624
671
  cursor: col-resize;
625
672
  user-select: none;
@@ -647,6 +694,8 @@
647
694
  .dragon-editor .de-code-block {
648
695
  display: flex;
649
696
  flex-wrap: wrap;
697
+ border-radius: var(--radius-default);
698
+ overflow: hidden;
650
699
  }
651
700
  .dragon-editor .de-code-block .de-filename {
652
701
  flex: 1;
@@ -1,6 +1,7 @@
1
1
  @charset "UTF-8";
2
2
  .dragon-editor,
3
3
  .dragon-editor-viewer {
4
+ --radius-default: 4px;
4
5
  /**
5
6
  * Reset style start
6
7
  */
@@ -87,6 +88,7 @@
87
88
  padding: 0;
88
89
  border-radius: 0;
89
90
  outline: 0;
91
+ font-size: inherit;
90
92
  vertical-align: middle;
91
93
  }
92
94
  .dragon-editor a,
@@ -101,6 +103,7 @@
101
103
  .dragon-editor-viewer input[type=reset] {
102
104
  border: 0;
103
105
  background: transparent;
106
+ font-size: inherit;
104
107
  cursor: pointer;
105
108
  }
106
109
  .dragon-editor img,
@@ -128,6 +131,26 @@
128
131
  .dragon-editor-viewer .de-block[data-depth="5"] {
129
132
  padding-left: 150px;
130
133
  }
134
+ .dragon-editor .de-block.de-list-block[data-depth="1"],
135
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="1"] {
136
+ padding-left: 54px;
137
+ }
138
+ .dragon-editor .de-block.de-list-block[data-depth="2"],
139
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="2"] {
140
+ padding-left: 84px;
141
+ }
142
+ .dragon-editor .de-block.de-list-block[data-depth="3"],
143
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="3"] {
144
+ padding-left: 114px;
145
+ }
146
+ .dragon-editor .de-block.de-list-block[data-depth="4"],
147
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="4"] {
148
+ padding-left: 144px;
149
+ }
150
+ .dragon-editor .de-block.de-list-block[data-depth="5"],
151
+ .dragon-editor-viewer .de-block.de-list-block[data-depth="5"] {
152
+ padding-left: 174px;
153
+ }
131
154
 
132
155
  /**
133
156
  * 노드 스타일
@@ -138,12 +161,12 @@
138
161
  gap: 4px;
139
162
  width: 100%;
140
163
  height: 100%;
141
- padding: 20px;
142
164
  line-height: 1.6;
143
165
  box-sizing: border-box;
144
166
  }
145
167
  .dragon-editor-viewer .de-block {
146
168
  width: 100%;
169
+ box-sizing: border-box;
147
170
  }
148
171
  .dragon-editor-viewer .de-text-block {
149
172
  min-height: 1.6em;
@@ -447,14 +470,16 @@
447
470
  .dragon-editor-viewer .de-image-block .de-image-area .de-img {
448
471
  width: 100%;
449
472
  height: auto;
473
+ border-radius: var(--radius-default);
450
474
  }
451
475
  .dragon-editor-viewer .de-image-block .de-image-area .de-btn {
452
476
  position: absolute;
453
477
  top: 50%;
454
478
  width: 8px;
455
- height: 100px;
456
- background: #ccc;
457
- border: 1px solid #333;
479
+ height: 15%;
480
+ background: #f1f1f1;
481
+ border: 1px solid #ccc;
482
+ border-radius: var(--radius-default);
458
483
  transform: translate(-50%, -50%);
459
484
  cursor: col-resize;
460
485
  user-select: none;
@@ -476,6 +501,8 @@
476
501
  .dragon-editor-viewer .de-code-block {
477
502
  display: flex;
478
503
  flex-wrap: wrap;
504
+ border-radius: var(--radius-default);
505
+ overflow: hidden;
479
506
  }
480
507
  .dragon-editor-viewer .de-code-block .de-filename {
481
508
  flex: 1;
@@ -1,4 +1,28 @@
1
- interface EditorStore {
1
+ type DEContentData = DEBlockData[];
2
+
3
+ type DEBlockData = DETextBlock | DEHeadingBlock | DEListBlock | DEImageBlock | DECodeBlock | DECustomBlock;
4
+
5
+ type DEIconKind = "plus" | "bold" | "italic" | "underline" | "strikethrough" | "codeblock" | "add-link" | "remove-link" | "image" | "align-center" | "align-left" | "align-right" | "align-justify" | "move-up" | "move-down" | "indent-decrease" | "indent-increase";
6
+
7
+ type DEDecoration = "bold" | "italic" | "underline" | "strikethrough" | "code";
8
+
9
+ type DETextalign = "left" | "right" | "center" | "justify";
10
+
11
+ type DEBlock = "text" | "heading" | "ul" | "ol" | "image" | "code" | "custom";
12
+
13
+ type DEBlockMenutype = "text" | "heading1" | "heading2" | "heading3" | "ul" | "ol" | "image" | "code" | "custom";
14
+
15
+ type DEListStyle = "disc" | "square" | "decimal" | "lower-alpha" | "upper-alpha" | "lower-roman" | "upper-roman";
16
+
17
+ type DECodeblockTheme = "github" | "github-dark-dimmed";
18
+
19
+ type DECodeblockLang = "text" | "bash" | "csharp" | "c" | "cpp" | "css" | "django" | "dockerfile" | "go" | "html" | "json" | "java" | "js" | "ts" | "kotlin" | "lua" | "md" | "nginx" | "php" | "python" | "ruby" | "scss" | "sql" | "shell" | "swift" | "yml";
20
+
21
+ type DEBlockElement = HTMLParagraphElement | HTMLHeadingElement | HTMLElement | HTMLDivElement;
22
+
23
+ type DEListElementName = "ul" | "ol";
24
+
25
+ interface DragonEditorStore {
2
26
  cursorData: DEditorCursor | null;
3
27
  message: { [key: string]: string };
4
28
  controlBar: {
@@ -7,10 +31,52 @@ interface EditorStore {
7
31
  y: number;
8
32
  $element: HTMLDivElement | null;
9
33
  };
34
+ useMenuBar: boolean;
35
+ imageHostURL: string;
36
+ firstData: DEContentData;
37
+ menuBarTop: number;
38
+ activeStatus: {
39
+ addBlockMenu: boolean;
40
+ anchorInputArea: boolean;
41
+ imageResizeEvent: boolean;
42
+ };
43
+ eventStatus: {
44
+ preComposing: boolean;
45
+ imageResizeEventStartX: number;
46
+ imageResizeEventType: "right" | "left";
47
+ imageResizeEventEndX: number;
48
+ imageResizeCurrentWidth: number;
49
+ keyboardEnterCount: number;
50
+ };
51
+ controlStatus: {
52
+ isMobile: boolean;
53
+ anchorValidation: boolean;
54
+ currentBlockType: DEBlock;
55
+ codeBlockTheme: DECodeblockTheme;
56
+ codeBlockLang: DECodeblockLang;
57
+ listBlockStyle: DEListStyle;
58
+ anchorTabType: "url" | "heading";
59
+ anchorHeadingList: DEHeadingItem[];
60
+ anchorHref: string;
61
+ previousCorsorData: DEditorCursor | null;
62
+ $anchorInput: HTMLInputElement | null;
63
+ $currentBlock: HTMLDivElement | null;
64
+ };
65
+ codeBlockTheme: DECodeItem<DECodeblockTheme>[];
66
+ listUlType: DECodeItem<DEListStyle>[];
67
+ listOlType: DECodeItem<DEListStyle>[];
10
68
  $editor: HTMLDivElement | null;
11
- $content: HTMLDivElement | null;
12
- $currentBlock: HTMLElement | null;
69
+ $body: HTMLDivElement | null;
70
+ $controlBar: HTMLDivElement | null;
13
71
  $parentWrap: HTMLElement | Window | null;
72
+ windowClickEvent(event: MouseEvent): void;
73
+ windowResizeEvent(event: Event): void;
74
+ windowMouseUpEvent(event: MouseEvent): void;
75
+ parentWrapScollEvent(event: Event): void;
76
+ emit: {
77
+ (e: "update:modelValue", data: DEContentData): void;
78
+ (e: "uploadImageEvent", file: File): void;
79
+ };
14
80
  }
15
81
 
16
82
  interface DEditorCursor {
@@ -38,9 +104,9 @@ interface DEImage {
38
104
  caption?: string;
39
105
  }
40
106
 
41
- interface DECodeItem {
107
+ interface DECodeItem<T = string> {
42
108
  text: string;
43
- code: string;
109
+ code: T;
44
110
  }
45
111
 
46
112
  interface DEHeadingItem {
@@ -48,26 +114,17 @@ interface DEHeadingItem {
48
114
  id: string;
49
115
  }
50
116
 
51
- type DEDecoration = "bold" | "italic" | "underline" | "strikethrough" | "code";
52
-
53
- type DETextalign = "left" | "right" | "center" | "justify";
54
-
55
- type DEBlock = "text" | "heading" | "ul" | "ol" | "image" | "code";
56
-
57
117
  // 컴포넌트 메서드용 타입
58
118
  interface DragonEditor {
59
- addBlock: (type: DEBlock) => void;
60
- addImageBlock: (data: DEImage) => void;
119
+ addBlock: (type: DEBlockData) => void;
61
120
  setDecoration: (data: DEDecoration) => void;
62
121
  setTextAlign: (type: DETextalign) => void;
63
- getContentData: () => DEContentData;
64
- setContentData: (data: DEContentData) => void;
65
- addCustomBlock: (HTML: string, classList: string[]) => void;
66
122
  }
67
123
 
68
124
  interface DETextBlock {
69
125
  type: "text";
70
126
  classList: string[];
127
+ depth?: number;
71
128
  textContent: string;
72
129
  }
73
130
 
@@ -75,6 +132,7 @@ interface DEHeadingBlock {
75
132
  type: "heading";
76
133
  level: number;
77
134
  id: string;
135
+ depth?: number;
78
136
  classList: string[];
79
137
  textContent: string;
80
138
  }
@@ -84,11 +142,10 @@ interface DEListItem {
84
142
  textContent: string;
85
143
  }
86
144
 
87
- type DEListStyle = "disc" | "square" | "decimal" | "lower-alpha" | "upper-alpha" | "lower-roman" | "upper-roman";
88
-
89
145
  interface DEListBlock {
90
146
  type: "list";
91
- element: "ul" | "ol";
147
+ element: DEListElementName;
148
+ depth?: number;
92
149
  style: DEListStyle;
93
150
  child: DEListItem[];
94
151
  }
@@ -105,8 +162,8 @@ interface DEImageBlock {
105
162
 
106
163
  interface DECodeBlock {
107
164
  type: "code";
108
- language: string;
109
- theme: string;
165
+ language: DECodeblockLang;
166
+ theme: DECodeblockTheme;
110
167
  filename: string;
111
168
  textContent: string;
112
169
  }
@@ -116,5 +173,3 @@ interface DECustomBlock {
116
173
  classList: string[];
117
174
  textContent: string;
118
175
  }
119
-
120
- type DEContentData = (DETextBlock | DEHeadingBlock | DEListBlock | DEImageBlock | DECustomBlock | DECodeBlock)[];
File without changes