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.
- package/README.md +9 -15
- package/dist/module.d.mts +5 -0
- package/dist/module.json +8 -1
- package/dist/module.mjs +5 -3
- package/dist/runtime/components/DragonEditor.vue +252 -720
- package/dist/runtime/components/DragonEditorViewer.vue +59 -45
- package/dist/runtime/scss/editor.css +83 -34
- package/dist/runtime/scss/viewer.css +31 -4
- package/dist/runtime/type.d.ts +78 -23
- package/dist/runtime/utils/event/block.d.ts +0 -0
- package/dist/runtime/utils/event/block.js +78 -0
- package/dist/runtime/utils/event/cursor.d.ts +0 -0
- package/dist/runtime/utils/{cursor.mjs → event/cursor.js} +4 -16
- package/dist/runtime/utils/event/data.d.ts +0 -0
- package/dist/runtime/utils/event/data.js +342 -0
- package/dist/runtime/utils/event/index.d.ts +8 -0
- package/dist/runtime/utils/event/index.js +8 -0
- package/dist/runtime/utils/event/keyboard.d.ts +0 -0
- package/dist/runtime/utils/event/keyboard.js +1368 -0
- package/dist/runtime/utils/event/mouse.d.ts +0 -0
- package/dist/runtime/utils/event/mouse.js +70 -0
- package/dist/runtime/utils/event/scroll.d.ts +0 -0
- package/dist/runtime/utils/event/scroll.js +29 -0
- package/dist/runtime/utils/event/touch.d.ts +0 -0
- package/dist/runtime/utils/event/touch.js +10 -0
- package/dist/runtime/utils/event/window.d.ts +0 -0
- package/dist/runtime/utils/event/window.js +32 -0
- package/dist/runtime/utils/layout/block.d.ts +0 -0
- package/dist/runtime/utils/layout/block.js +105 -0
- package/dist/runtime/utils/layout/body.d.ts +0 -0
- package/dist/runtime/utils/layout/body.js +22 -0
- package/dist/runtime/utils/layout/controlbar.d.ts +0 -0
- package/dist/runtime/utils/layout/controlbar.js +99 -0
- package/dist/runtime/utils/layout/icon.d.ts +0 -0
- package/dist/runtime/utils/layout/icon.js +156 -0
- package/dist/runtime/utils/layout/index.d.ts +5 -0
- package/dist/runtime/utils/layout/index.js +5 -0
- package/dist/runtime/utils/layout/menuBar.d.ts +0 -0
- package/dist/runtime/utils/layout/menuBar.js +358 -0
- package/dist/runtime/utils/node/block.d.ts +0 -0
- package/dist/runtime/utils/node/block.js +235 -0
- package/dist/runtime/utils/{element.d.ts → node/element.d.ts} +1 -0
- package/dist/runtime/utils/{element.mjs → node/element.js} +19 -4
- package/dist/runtime/utils/node/index.d.ts +2 -0
- package/dist/runtime/utils/node/index.js +2 -0
- package/dist/runtime/utils/style/anchor.d.ts +0 -0
- package/dist/runtime/utils/style/anchor.js +240 -0
- package/dist/runtime/utils/style/decoration.d.ts +0 -0
- package/dist/runtime/utils/style/decoration.js +378 -0
- package/dist/runtime/utils/style/index.d.ts +2 -0
- package/dist/runtime/utils/style/index.js +2 -0
- package/dist/types.d.mts +7 -0
- package/dist/types.d.ts +3 -3
- package/package.json +15 -16
- package/dist/runtime/store.d.ts +0 -11
- package/dist/runtime/store.mjs +0 -51
- package/dist/runtime/utils/block.d.ts +0 -13
- package/dist/runtime/utils/block.mjs +0 -144
- package/dist/runtime/utils/content.d.ts +0 -2
- package/dist/runtime/utils/content.mjs +0 -19
- package/dist/runtime/utils/controlBar.d.ts +0 -9
- package/dist/runtime/utils/controlBar.mjs +0 -172
- package/dist/runtime/utils/convertor.d.ts +0 -3
- package/dist/runtime/utils/convertor.mjs +0 -138
- package/dist/runtime/utils/cursor.d.ts +0 -6
- package/dist/runtime/utils/keyboardEvent.d.ts +0 -10
- package/dist/runtime/utils/keyboardEvent.mjs +0 -978
- package/dist/runtime/utils/style.d.ts +0 -5
- package/dist/runtime/utils/style.mjs +0 -617
- /package/dist/runtime/{plugin.mjs → plugin.js} +0 -0
|
@@ -1,54 +1,42 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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:
|
|
504
|
-
background: #
|
|
505
|
-
border: 1px solid #
|
|
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.--
|
|
140
|
-
padding-top:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
168
|
-
height:
|
|
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:
|
|
175
|
-
height:
|
|
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:
|
|
226
|
+
top: 35px;
|
|
187
227
|
left: 0;
|
|
188
228
|
width: 120px;
|
|
189
229
|
background: #fff;
|
|
190
|
-
|
|
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:
|
|
209
|
-
left:
|
|
251
|
+
top: calc(100% + 1px);
|
|
252
|
+
left: 50%;
|
|
210
253
|
width: 200px;
|
|
211
254
|
background: #fff;
|
|
212
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
265
|
-
display:
|
|
312
|
+
.dragon-editor .de-controlbar {
|
|
313
|
+
display: flex;
|
|
266
314
|
position: fixed;
|
|
267
|
-
height:
|
|
315
|
+
height: 34px;
|
|
268
316
|
background: #fff;
|
|
269
317
|
border: 1px solid #ccc;
|
|
270
|
-
border-
|
|
318
|
+
border-radius: var(--radius-default);
|
|
271
319
|
transform: translateX(-50%);
|
|
272
320
|
z-index: 20;
|
|
273
321
|
}
|
|
274
|
-
.dragon-editor .de-
|
|
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
|
-
|
|
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-
|
|
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:
|
|
621
|
-
background: #
|
|
622
|
-
border: 1px solid #
|
|
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:
|
|
456
|
-
background: #
|
|
457
|
-
border: 1px solid #
|
|
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;
|
package/dist/runtime/type.d.ts
CHANGED
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
|
|
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
|
-
$
|
|
12
|
-
$
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
109
|
-
theme:
|
|
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
|