@bagelink/vue 0.0.992 → 0.0.996
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/dist/components/form/inputs/CodeEditor/Index.vue.d.ts +7 -11
- package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/config.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/utils/formatting.d.ts +1 -0
- package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/utils/media.d.ts +3 -3
- package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -1
- package/dist/index.cjs +285 -102
- package/dist/index.mjs +285 -102
- package/dist/style.css +16 -14
- package/package.json +2 -1
- package/src/components/form/inputs/CodeEditor/Index.vue +26 -10
- package/src/components/form/inputs/RichText/components/Toolbar.vue +1 -1
- package/src/components/form/inputs/RichText/composables/useEditor.ts +17 -4
- package/src/components/form/inputs/RichText/config.ts +5 -1
- package/src/components/form/inputs/RichText/index.vue +1 -0
- package/src/components/form/inputs/RichText/richTextTypes.d.ts +2 -0
- package/src/components/form/inputs/RichText/utils/formatting.ts +281 -34
- package/src/components/form/inputs/RichText/utils/media.ts +9 -6
- package/src/components/form/inputs/RichText/utils/selection.ts +6 -22
package/dist/style.css
CHANGED
|
@@ -776,6 +776,8 @@ hue-6-2: #e6c07b
|
|
|
776
776
|
.code-editor-wrap{
|
|
777
777
|
background: #282c34;
|
|
778
778
|
overflow: scroll;
|
|
779
|
+
display: grid;
|
|
780
|
+
max-height: 300px;
|
|
779
781
|
}
|
|
780
782
|
.numbers {
|
|
781
783
|
font-family: monospace;
|
|
@@ -1288,31 +1290,31 @@ hue-6-2: #e6c07b
|
|
|
1288
1290
|
background: var(--bgl-primary-light);
|
|
1289
1291
|
}
|
|
1290
1292
|
|
|
1291
|
-
.toolbar[data-v-
|
|
1293
|
+
.toolbar[data-v-9688758a] .active {
|
|
1292
1294
|
background: var(--bgl-primary);
|
|
1293
1295
|
color: white;
|
|
1294
1296
|
}
|
|
1295
1297
|
|
|
1296
|
-
.rich-text-editor[data-v-
|
|
1298
|
+
.rich-text-editor[data-v-e274dd3b] {
|
|
1297
1299
|
background: var(--input-bg);
|
|
1298
1300
|
border: 1px solid var(--border-color);
|
|
1299
1301
|
transition: all 0.3s ease;
|
|
1300
1302
|
}
|
|
1301
|
-
.editor-container[data-v-
|
|
1303
|
+
.editor-container[data-v-e274dd3b] {
|
|
1302
1304
|
display: flex;
|
|
1303
1305
|
gap: 1rem;
|
|
1304
1306
|
}
|
|
1305
|
-
.content-area[data-v-
|
|
1306
|
-
.preview-area[data-v-
|
|
1307
|
+
.content-area[data-v-e274dd3b],
|
|
1308
|
+
.preview-area[data-v-e274dd3b] {
|
|
1307
1309
|
flex: 1;
|
|
1308
1310
|
min-height: 200px;
|
|
1309
1311
|
background: var(--bgl-richtext-color);
|
|
1310
1312
|
}
|
|
1311
|
-
.split-view[data-v-
|
|
1313
|
+
.split-view[data-v-e274dd3b] {
|
|
1312
1314
|
display: grid;
|
|
1313
1315
|
grid-template-columns: 1fr 1fr;
|
|
1314
1316
|
}
|
|
1315
|
-
.editableContent[data-v-
|
|
1317
|
+
.editableContent[data-v-e274dd3b] {
|
|
1316
1318
|
width: 100%;
|
|
1317
1319
|
min-height: 240px;
|
|
1318
1320
|
height: 100%;
|
|
@@ -1320,7 +1322,7 @@ hue-6-2: #e6c07b
|
|
|
1320
1322
|
outline: none;
|
|
1321
1323
|
background: transparent;
|
|
1322
1324
|
}
|
|
1323
|
-
.html-editor[data-v-
|
|
1325
|
+
.html-editor[data-v-e274dd3b] {
|
|
1324
1326
|
width: 100%;
|
|
1325
1327
|
height: 100%;
|
|
1326
1328
|
min-height: 200px;
|
|
@@ -1331,12 +1333,12 @@ hue-6-2: #e6c07b
|
|
|
1331
1333
|
color: white;
|
|
1332
1334
|
background-color: var(--bgl-black);
|
|
1333
1335
|
}
|
|
1334
|
-
.preview-area[data-v-
|
|
1336
|
+
.preview-area[data-v-e274dd3b] {
|
|
1335
1337
|
font-family: monospace;
|
|
1336
1338
|
white-space: pre-wrap;
|
|
1337
1339
|
overflow-x: auto;
|
|
1338
1340
|
}
|
|
1339
|
-
.fullscreen-mode[data-v-
|
|
1341
|
+
.fullscreen-mode[data-v-e274dd3b] {
|
|
1340
1342
|
position: fixed;
|
|
1341
1343
|
top: 0;
|
|
1342
1344
|
left: 0;
|
|
@@ -1345,15 +1347,15 @@ hue-6-2: #e6c07b
|
|
|
1345
1347
|
z-index: 9999;
|
|
1346
1348
|
padding: 2rem;
|
|
1347
1349
|
}
|
|
1348
|
-
.fullscreen-mode .editor-container[data-v-
|
|
1350
|
+
.fullscreen-mode .editor-container[data-v-e274dd3b] {
|
|
1349
1351
|
height: calc(100vh - 4rem);
|
|
1350
1352
|
}
|
|
1351
|
-
.fullscreen-mode .content-area[data-v-
|
|
1352
|
-
.fullscreen-mode .preview-area[data-v-
|
|
1353
|
+
.fullscreen-mode .content-area[data-v-e274dd3b],
|
|
1354
|
+
.fullscreen-mode .preview-area[data-v-e274dd3b] {
|
|
1353
1355
|
height: 100%;
|
|
1354
1356
|
overflow-y: auto;
|
|
1355
1357
|
}
|
|
1356
|
-
.fullscreen-mode .code-editor[data-v-
|
|
1358
|
+
.fullscreen-mode .code-editor[data-v-e274dd3b]{
|
|
1357
1359
|
height: 100% !important;
|
|
1358
1360
|
}
|
|
1359
1361
|
.resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.v-popper__popper{z-index:10000;top:0;left:0;outline:none}.v-popper__popper.v-popper__popper--hidden{visibility:hidden;opacity:0;transition:opacity .15s,visibility .15s;pointer-events:none}.v-popper__popper.v-popper__popper--shown{visibility:visible;opacity:1;transition:opacity .15s}.v-popper__popper.v-popper__popper--skip-transition,.v-popper__popper.v-popper__popper--skip-transition>.v-popper__wrapper{transition:none!important}.v-popper__backdrop{position:absolute;top:0;left:0;width:100%;height:100%;display:none}.v-popper__inner{position:relative;box-sizing:border-box;overflow-y:auto}.v-popper__inner>div{position:relative;z-index:1;max-width:inherit;max-height:inherit}.v-popper__arrow-container{position:absolute;width:10px;height:10px}.v-popper__popper--arrow-overflow .v-popper__arrow-container,.v-popper__popper--no-positioning .v-popper__arrow-container{display:none}.v-popper__arrow-inner,.v-popper__arrow-outer{border-style:solid;position:absolute;top:0;left:0;width:0;height:0}.v-popper__arrow-inner{visibility:hidden;border-width:7px}.v-popper__arrow-outer{border-width:6px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{left:-2px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{left:-1px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer{border-bottom-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-container{top:0}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{border-top-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-top-color:transparent!important}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{top:-4px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{top:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{top:-1px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{border-left-width:0;border-left-color:transparent!important;border-top-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{left:-4px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{left:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-container{right:-10px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer{border-right-width:0;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner{left:-2px}.v-popper--theme-tooltip .v-popper__inner{background:rgba(0,0,0,.8);color:#fff;border-radius:6px;padding:7px 12px 6px}.v-popper--theme-tooltip .v-popper__arrow-outer{border-color:#000c}.v-popper--theme-dropdown .v-popper__inner{background:#fff;color:#000;border-radius:6px;border:1px solid #ddd;box-shadow:0 6px 30px #0000001a}.v-popper--theme-dropdown .v-popper__arrow-inner{visibility:visible;border-color:#fff}.v-popper--theme-dropdown .v-popper__arrow-outer{border-color:#ddd}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bagelink/vue",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.996",
|
|
5
5
|
"description": "Bagel core sdk packages",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Neveh Allon",
|
|
@@ -80,6 +80,7 @@
|
|
|
80
80
|
"access": "public"
|
|
81
81
|
},
|
|
82
82
|
"dependencies": {
|
|
83
|
+
"highlight.js": "^11.11.0",
|
|
83
84
|
"@highlightjs/vue-plugin": "^2.1.0",
|
|
84
85
|
"heic2any": "^0.0.4",
|
|
85
86
|
"@vueuse/core": "^12.0.0",
|
|
@@ -1,37 +1,48 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import hljsVuePlugin from '@highlightjs/vue-plugin'
|
|
3
|
-
import { nextTick } from 'vue'
|
|
3
|
+
import { nextTick, watch } from 'vue'
|
|
4
4
|
import 'highlight.js/lib/common'
|
|
5
5
|
import 'highlight.js/styles/atom-one-dark.css'
|
|
6
6
|
|
|
7
|
-
const { readonly = false, language } = defineProps<{
|
|
7
|
+
const { readonly = false, language, modelValue = '' } = defineProps<{
|
|
8
8
|
language?: string
|
|
9
9
|
readonly?: boolean
|
|
10
|
+
modelValue?: string
|
|
10
11
|
}>()
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
type: String,
|
|
14
|
-
default: ''
|
|
15
|
-
})
|
|
13
|
+
let code = $ref('')
|
|
16
14
|
|
|
17
15
|
function tabKeyDown(event: KeyboardEvent) {
|
|
18
16
|
const target = event.target as HTMLTextAreaElement
|
|
19
17
|
const start = target.selectionStart
|
|
20
18
|
const end = target.selectionEnd
|
|
21
19
|
const tab = ' '
|
|
22
|
-
code
|
|
20
|
+
code = code.slice(0, start) + tab + code.slice(end)
|
|
23
21
|
nextTick(() => {
|
|
24
22
|
target.selectionStart = target.selectionEnd = start + 2
|
|
25
23
|
})
|
|
26
24
|
}
|
|
27
25
|
|
|
26
|
+
const textarea = $ref<HTMLInputElement>()
|
|
27
|
+
let height = $ref('300px')
|
|
28
|
+
|
|
29
|
+
function setHeight() {
|
|
30
|
+
if (!textarea) return
|
|
31
|
+
const { scrollHeight } = textarea
|
|
32
|
+
height = `${scrollHeight}px`
|
|
33
|
+
}
|
|
34
|
+
|
|
28
35
|
const Highlightjs = hljsVuePlugin.component
|
|
36
|
+
watch(() => code, setHeight, { immediate: true })
|
|
37
|
+
watch(() => modelValue, (value) => {
|
|
38
|
+
if (value !== code) code = value
|
|
39
|
+
}, { immediate: true })
|
|
29
40
|
</script>
|
|
30
41
|
|
|
31
42
|
<template>
|
|
32
|
-
<div
|
|
33
|
-
<div class="relative block h-100
|
|
34
|
-
<div class="numbers absolute inset-0 py-1 px-05 txt16 line-height-15 overflow-hidden z-
|
|
43
|
+
<div class="code-editor-wrap ltr radius-1">
|
|
44
|
+
<div class="relative block h-100" :style="{ height }">
|
|
45
|
+
<div class="numbers absolute inset-0 py-1 px-05 txt16 line-height-15 overflow-hidden z-1 w50px txt-start opacity-3 color-gray">
|
|
35
46
|
<div
|
|
36
47
|
v-for="(_, index) in code.split('\n')"
|
|
37
48
|
:key="index"
|
|
@@ -49,12 +60,14 @@ const Highlightjs = hljsVuePlugin.component
|
|
|
49
60
|
/>
|
|
50
61
|
<textarea
|
|
51
62
|
v-if="!readonly"
|
|
63
|
+
ref="textarea"
|
|
52
64
|
v-model="code"
|
|
53
65
|
:spellcheck="false"
|
|
54
66
|
class="code-editor absolute inset-0 overflow-hidden bg-transparent line-height-15 border-none m-0"
|
|
55
67
|
placeholder="Write your code here"
|
|
56
68
|
aria-label="Code Editor"
|
|
57
69
|
data-gramm="false"
|
|
70
|
+
@input="$emit('update:modelValue', code)"
|
|
58
71
|
@keydown.tab.prevent="tabKeyDown"
|
|
59
72
|
/>
|
|
60
73
|
</div>
|
|
@@ -65,7 +78,10 @@ const Highlightjs = hljsVuePlugin.component
|
|
|
65
78
|
.code-editor-wrap{
|
|
66
79
|
background: #282c34;
|
|
67
80
|
overflow: scroll;
|
|
81
|
+
display: grid;
|
|
82
|
+
max-height: 300px;
|
|
68
83
|
}
|
|
84
|
+
|
|
69
85
|
.numbers {
|
|
70
86
|
font-family: monospace;
|
|
71
87
|
border-inline-end: 1px solid var(--bgl-gray);
|
|
@@ -32,7 +32,7 @@ function runAction(name: ToolbarConfigOption, value?: string) {
|
|
|
32
32
|
</template>
|
|
33
33
|
</Dropdown>
|
|
34
34
|
<Btn
|
|
35
|
-
v-if="action.name !== 'separator'" v-tooltip="action.label" :icon="action.icon" thin flat
|
|
35
|
+
v-else-if="action.name !== 'separator'" v-tooltip="action.label" :icon="action.icon" thin flat
|
|
36
36
|
:aria-label="action.name" :class="[action.class, { active: selectedStyles.has(action.name) }]"
|
|
37
37
|
@click="runAction(action.name)"
|
|
38
38
|
/>
|
|
@@ -48,6 +48,11 @@ export function useEditor() {
|
|
|
48
48
|
'h4',
|
|
49
49
|
'h5',
|
|
50
50
|
'h6',
|
|
51
|
+
'blockquote',
|
|
52
|
+
'table',
|
|
53
|
+
'p',
|
|
54
|
+
'ol',
|
|
55
|
+
'li'
|
|
51
56
|
]
|
|
52
57
|
|
|
53
58
|
styleTypes.forEach((style) => {
|
|
@@ -70,7 +75,6 @@ export function useEditor() {
|
|
|
70
75
|
state.doc.body.focus()
|
|
71
76
|
return
|
|
72
77
|
}
|
|
73
|
-
|
|
74
78
|
state.rangeCount = state.selection.rangeCount
|
|
75
79
|
if (!state.rangeCount) {
|
|
76
80
|
const range = state.doc.createRange()
|
|
@@ -127,7 +131,7 @@ export function useEditor() {
|
|
|
127
131
|
if (!state.doc.body.contains(selection.anchorNode)) {
|
|
128
132
|
state.doc.body.focus()
|
|
129
133
|
}
|
|
130
|
-
console.log(command)
|
|
134
|
+
console.log('command', command, value)
|
|
131
135
|
switch (command) {
|
|
132
136
|
case 'insertTable': {
|
|
133
137
|
const [rows, cols] = value?.split('x').map(Number) || [3, 3]
|
|
@@ -160,12 +164,16 @@ export function useEditor() {
|
|
|
160
164
|
case 'underline':
|
|
161
165
|
format().text(command)
|
|
162
166
|
break
|
|
167
|
+
case 'clear':{
|
|
168
|
+
format().clear()
|
|
169
|
+
break
|
|
170
|
+
}
|
|
163
171
|
case 'orderedList':
|
|
164
172
|
case 'unorderedList':
|
|
165
173
|
format().list(command)
|
|
166
174
|
break
|
|
167
175
|
case 'image':
|
|
168
|
-
insertImage(state.modal, state
|
|
176
|
+
insertImage(state.modal, state)
|
|
169
177
|
break
|
|
170
178
|
// case 'youtube':
|
|
171
179
|
// if (isCaret) return
|
|
@@ -173,7 +181,12 @@ export function useEditor() {
|
|
|
173
181
|
// break
|
|
174
182
|
case 'link':
|
|
175
183
|
if (isCaret) return
|
|
176
|
-
insertLink(state.modal, state
|
|
184
|
+
insertLink(state.modal, state)
|
|
185
|
+
break
|
|
186
|
+
|
|
187
|
+
case 'blockquote':
|
|
188
|
+
case 'p':
|
|
189
|
+
format().block(command, value || command)
|
|
177
190
|
break
|
|
178
191
|
default:
|
|
179
192
|
if (/^h[1-6]$/.test(command)) {
|
|
@@ -19,12 +19,14 @@ export const defaultToolbarConfig: ToolbarConfig = [
|
|
|
19
19
|
'italic',
|
|
20
20
|
'underline',
|
|
21
21
|
'separator',
|
|
22
|
+
'p',
|
|
23
|
+
'blockquote',
|
|
22
24
|
'orderedList',
|
|
23
25
|
'unorderedList',
|
|
24
26
|
'separator',
|
|
25
27
|
'link',
|
|
26
28
|
'image',
|
|
27
|
-
'youtube',
|
|
29
|
+
// 'youtube',
|
|
28
30
|
'separator',
|
|
29
31
|
'splitView',
|
|
30
32
|
'clear',
|
|
@@ -39,6 +41,8 @@ export const toolbarOptions: ToolbarOption[] = [
|
|
|
39
41
|
{ name: 'h4', label: 'h4', icon: 'format_h4' },
|
|
40
42
|
{ name: 'h5', label: 'h5', icon: 'format_h5' },
|
|
41
43
|
{ name: 'h6', label: 'h6', icon: 'format_h6' },
|
|
44
|
+
{ name: 'p', label: 'Paragraph', icon: 'format_paragraph' },
|
|
45
|
+
{ name: 'blockquote', label: 'Blockquote', icon: 'format_quote' },
|
|
42
46
|
{ name: 'bold', label: 'Bold', icon: 'format_bold' },
|
|
43
47
|
{ name: 'italic', label: 'Italic', icon: 'format_italic' },
|
|
44
48
|
{ name: 'underline', label: 'Underline', icon: 'format_underlined' },
|