@bagelink/vue 0.0.992 → 0.0.998
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/common-C_IH8b5S.cjs +12580 -0
- package/dist/common-DoeNgx31.js +12579 -0
- package/dist/components/Image.vue.d.ts.map +1 -1
- 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/heic2any-8wMqMfB_.js +933 -0
- package/dist/heic2any-k9wDCKka.cjs +932 -0
- package/dist/index-DiG-xM9T.cjs +35016 -0
- package/dist/index-nGuSAiY2.js +35017 -0
- package/dist/index.cjs +99 -48325
- package/dist/index.mjs +99 -48325
- package/dist/style.css +106 -104
- package/package.json +2 -1
- package/src/components/Image.vue +1 -1
- package/src/components/form/inputs/CodeEditor/Index.vue +34 -12
- 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
|
@@ -683,99 +683,12 @@ data[data-v-6c27f163] {
|
|
|
683
683
|
.bagel-input:focus-within.bgl-checkbox:not(:checked) label[data-v-03ed2982] {
|
|
684
684
|
color: var(--label-color) !important;
|
|
685
685
|
}
|
|
686
|
-
pre code.hljs {
|
|
687
|
-
display: block;
|
|
688
|
-
overflow-x: auto;
|
|
689
|
-
padding: 1em
|
|
690
|
-
}
|
|
691
|
-
code.hljs {
|
|
692
|
-
padding: 3px 5px
|
|
693
|
-
}
|
|
694
|
-
/*
|
|
695
|
-
|
|
696
|
-
Atom One Dark by Daniel Gamage
|
|
697
|
-
Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
|
|
698
686
|
|
|
699
|
-
base: #282c34
|
|
700
|
-
mono-1: #abb2bf
|
|
701
|
-
mono-2: #818896
|
|
702
|
-
mono-3: #5c6370
|
|
703
|
-
hue-1: #56b6c2
|
|
704
|
-
hue-2: #61aeee
|
|
705
|
-
hue-3: #c678dd
|
|
706
|
-
hue-4: #98c379
|
|
707
|
-
hue-5: #e06c75
|
|
708
|
-
hue-5-2: #be5046
|
|
709
|
-
hue-6: #d19a66
|
|
710
|
-
hue-6-2: #e6c07b
|
|
711
|
-
|
|
712
|
-
*/
|
|
713
|
-
.hljs {
|
|
714
|
-
color: #abb2bf;
|
|
715
|
-
background: #282c34
|
|
716
|
-
}
|
|
717
|
-
.hljs-comment,
|
|
718
|
-
.hljs-quote {
|
|
719
|
-
color: #5c6370;
|
|
720
|
-
font-style: italic
|
|
721
|
-
}
|
|
722
|
-
.hljs-doctag,
|
|
723
|
-
.hljs-keyword,
|
|
724
|
-
.hljs-formula {
|
|
725
|
-
color: #c678dd
|
|
726
|
-
}
|
|
727
|
-
.hljs-section,
|
|
728
|
-
.hljs-name,
|
|
729
|
-
.hljs-selector-tag,
|
|
730
|
-
.hljs-deletion,
|
|
731
|
-
.hljs-subst {
|
|
732
|
-
color: #e06c75
|
|
733
|
-
}
|
|
734
|
-
.hljs-literal {
|
|
735
|
-
color: #56b6c2
|
|
736
|
-
}
|
|
737
|
-
.hljs-string,
|
|
738
|
-
.hljs-regexp,
|
|
739
|
-
.hljs-addition,
|
|
740
|
-
.hljs-attribute,
|
|
741
|
-
.hljs-meta .hljs-string {
|
|
742
|
-
color: #98c379
|
|
743
|
-
}
|
|
744
|
-
.hljs-attr,
|
|
745
|
-
.hljs-variable,
|
|
746
|
-
.hljs-template-variable,
|
|
747
|
-
.hljs-type,
|
|
748
|
-
.hljs-selector-class,
|
|
749
|
-
.hljs-selector-attr,
|
|
750
|
-
.hljs-selector-pseudo,
|
|
751
|
-
.hljs-number {
|
|
752
|
-
color: #d19a66
|
|
753
|
-
}
|
|
754
|
-
.hljs-symbol,
|
|
755
|
-
.hljs-bullet,
|
|
756
|
-
.hljs-link,
|
|
757
|
-
.hljs-meta,
|
|
758
|
-
.hljs-selector-id,
|
|
759
|
-
.hljs-title {
|
|
760
|
-
color: #61aeee
|
|
761
|
-
}
|
|
762
|
-
.hljs-built_in,
|
|
763
|
-
.hljs-title.class_,
|
|
764
|
-
.hljs-class .hljs-title {
|
|
765
|
-
color: #e6c07b
|
|
766
|
-
}
|
|
767
|
-
.hljs-emphasis {
|
|
768
|
-
font-style: italic
|
|
769
|
-
}
|
|
770
|
-
.hljs-strong {
|
|
771
|
-
font-weight: bold
|
|
772
|
-
}
|
|
773
|
-
.hljs-link {
|
|
774
|
-
text-decoration: underline
|
|
775
|
-
}
|
|
776
687
|
.code-editor-wrap{
|
|
777
688
|
background: #282c34;
|
|
778
689
|
overflow: scroll;
|
|
690
|
+
display: grid;
|
|
691
|
+
max-height: 300px;
|
|
779
692
|
}
|
|
780
693
|
.numbers {
|
|
781
694
|
font-family: monospace;
|
|
@@ -940,7 +853,7 @@ hue-6-2: #e6c07b
|
|
|
940
853
|
}
|
|
941
854
|
}
|
|
942
855
|
|
|
943
|
-
.img-web-kit[data-v-
|
|
856
|
+
.img-web-kit[data-v-3f8cf457] {
|
|
944
857
|
max-width: 100%;
|
|
945
858
|
vertical-align: middle;
|
|
946
859
|
border: 0;
|
|
@@ -1288,31 +1201,31 @@ hue-6-2: #e6c07b
|
|
|
1288
1201
|
background: var(--bgl-primary-light);
|
|
1289
1202
|
}
|
|
1290
1203
|
|
|
1291
|
-
.toolbar[data-v-
|
|
1204
|
+
.toolbar[data-v-9688758a] .active {
|
|
1292
1205
|
background: var(--bgl-primary);
|
|
1293
1206
|
color: white;
|
|
1294
1207
|
}
|
|
1295
1208
|
|
|
1296
|
-
.rich-text-editor[data-v-
|
|
1209
|
+
.rich-text-editor[data-v-e274dd3b] {
|
|
1297
1210
|
background: var(--input-bg);
|
|
1298
1211
|
border: 1px solid var(--border-color);
|
|
1299
1212
|
transition: all 0.3s ease;
|
|
1300
1213
|
}
|
|
1301
|
-
.editor-container[data-v-
|
|
1214
|
+
.editor-container[data-v-e274dd3b] {
|
|
1302
1215
|
display: flex;
|
|
1303
1216
|
gap: 1rem;
|
|
1304
1217
|
}
|
|
1305
|
-
.content-area[data-v-
|
|
1306
|
-
.preview-area[data-v-
|
|
1218
|
+
.content-area[data-v-e274dd3b],
|
|
1219
|
+
.preview-area[data-v-e274dd3b] {
|
|
1307
1220
|
flex: 1;
|
|
1308
1221
|
min-height: 200px;
|
|
1309
1222
|
background: var(--bgl-richtext-color);
|
|
1310
1223
|
}
|
|
1311
|
-
.split-view[data-v-
|
|
1224
|
+
.split-view[data-v-e274dd3b] {
|
|
1312
1225
|
display: grid;
|
|
1313
1226
|
grid-template-columns: 1fr 1fr;
|
|
1314
1227
|
}
|
|
1315
|
-
.editableContent[data-v-
|
|
1228
|
+
.editableContent[data-v-e274dd3b] {
|
|
1316
1229
|
width: 100%;
|
|
1317
1230
|
min-height: 240px;
|
|
1318
1231
|
height: 100%;
|
|
@@ -1320,7 +1233,7 @@ hue-6-2: #e6c07b
|
|
|
1320
1233
|
outline: none;
|
|
1321
1234
|
background: transparent;
|
|
1322
1235
|
}
|
|
1323
|
-
.html-editor[data-v-
|
|
1236
|
+
.html-editor[data-v-e274dd3b] {
|
|
1324
1237
|
width: 100%;
|
|
1325
1238
|
height: 100%;
|
|
1326
1239
|
min-height: 200px;
|
|
@@ -1331,12 +1244,12 @@ hue-6-2: #e6c07b
|
|
|
1331
1244
|
color: white;
|
|
1332
1245
|
background-color: var(--bgl-black);
|
|
1333
1246
|
}
|
|
1334
|
-
.preview-area[data-v-
|
|
1247
|
+
.preview-area[data-v-e274dd3b] {
|
|
1335
1248
|
font-family: monospace;
|
|
1336
1249
|
white-space: pre-wrap;
|
|
1337
1250
|
overflow-x: auto;
|
|
1338
1251
|
}
|
|
1339
|
-
.fullscreen-mode[data-v-
|
|
1252
|
+
.fullscreen-mode[data-v-e274dd3b] {
|
|
1340
1253
|
position: fixed;
|
|
1341
1254
|
top: 0;
|
|
1342
1255
|
left: 0;
|
|
@@ -1345,15 +1258,15 @@ hue-6-2: #e6c07b
|
|
|
1345
1258
|
z-index: 9999;
|
|
1346
1259
|
padding: 2rem;
|
|
1347
1260
|
}
|
|
1348
|
-
.fullscreen-mode .editor-container[data-v-
|
|
1261
|
+
.fullscreen-mode .editor-container[data-v-e274dd3b] {
|
|
1349
1262
|
height: calc(100vh - 4rem);
|
|
1350
1263
|
}
|
|
1351
|
-
.fullscreen-mode .content-area[data-v-
|
|
1352
|
-
.fullscreen-mode .preview-area[data-v-
|
|
1264
|
+
.fullscreen-mode .content-area[data-v-e274dd3b],
|
|
1265
|
+
.fullscreen-mode .preview-area[data-v-e274dd3b] {
|
|
1353
1266
|
height: 100%;
|
|
1354
1267
|
overflow-y: auto;
|
|
1355
1268
|
}
|
|
1356
|
-
.fullscreen-mode .code-editor[data-v-
|
|
1269
|
+
.fullscreen-mode .code-editor[data-v-e274dd3b]{
|
|
1357
1270
|
height: 100% !important;
|
|
1358
1271
|
}
|
|
1359
1272
|
.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}
|
|
@@ -14145,4 +14058,93 @@ input::-moz-focus-inner {
|
|
|
14145
14058
|
height: -webkit-fill-available;
|
|
14146
14059
|
|
|
14147
14060
|
}
|
|
14061
|
+
}pre code.hljs {
|
|
14062
|
+
display: block;
|
|
14063
|
+
overflow-x: auto;
|
|
14064
|
+
padding: 1em
|
|
14065
|
+
}
|
|
14066
|
+
code.hljs {
|
|
14067
|
+
padding: 3px 5px
|
|
14068
|
+
}
|
|
14069
|
+
/*
|
|
14070
|
+
|
|
14071
|
+
Atom One Dark by Daniel Gamage
|
|
14072
|
+
Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
|
|
14073
|
+
|
|
14074
|
+
base: #282c34
|
|
14075
|
+
mono-1: #abb2bf
|
|
14076
|
+
mono-2: #818896
|
|
14077
|
+
mono-3: #5c6370
|
|
14078
|
+
hue-1: #56b6c2
|
|
14079
|
+
hue-2: #61aeee
|
|
14080
|
+
hue-3: #c678dd
|
|
14081
|
+
hue-4: #98c379
|
|
14082
|
+
hue-5: #e06c75
|
|
14083
|
+
hue-5-2: #be5046
|
|
14084
|
+
hue-6: #d19a66
|
|
14085
|
+
hue-6-2: #e6c07b
|
|
14086
|
+
|
|
14087
|
+
*/
|
|
14088
|
+
.hljs {
|
|
14089
|
+
color: #abb2bf;
|
|
14090
|
+
background: #282c34
|
|
14091
|
+
}
|
|
14092
|
+
.hljs-comment,
|
|
14093
|
+
.hljs-quote {
|
|
14094
|
+
color: #5c6370;
|
|
14095
|
+
font-style: italic
|
|
14096
|
+
}
|
|
14097
|
+
.hljs-doctag,
|
|
14098
|
+
.hljs-keyword,
|
|
14099
|
+
.hljs-formula {
|
|
14100
|
+
color: #c678dd
|
|
14101
|
+
}
|
|
14102
|
+
.hljs-section,
|
|
14103
|
+
.hljs-name,
|
|
14104
|
+
.hljs-selector-tag,
|
|
14105
|
+
.hljs-deletion,
|
|
14106
|
+
.hljs-subst {
|
|
14107
|
+
color: #e06c75
|
|
14108
|
+
}
|
|
14109
|
+
.hljs-literal {
|
|
14110
|
+
color: #56b6c2
|
|
14111
|
+
}
|
|
14112
|
+
.hljs-string,
|
|
14113
|
+
.hljs-regexp,
|
|
14114
|
+
.hljs-addition,
|
|
14115
|
+
.hljs-attribute,
|
|
14116
|
+
.hljs-meta .hljs-string {
|
|
14117
|
+
color: #98c379
|
|
14118
|
+
}
|
|
14119
|
+
.hljs-attr,
|
|
14120
|
+
.hljs-variable,
|
|
14121
|
+
.hljs-template-variable,
|
|
14122
|
+
.hljs-type,
|
|
14123
|
+
.hljs-selector-class,
|
|
14124
|
+
.hljs-selector-attr,
|
|
14125
|
+
.hljs-selector-pseudo,
|
|
14126
|
+
.hljs-number {
|
|
14127
|
+
color: #d19a66
|
|
14128
|
+
}
|
|
14129
|
+
.hljs-symbol,
|
|
14130
|
+
.hljs-bullet,
|
|
14131
|
+
.hljs-link,
|
|
14132
|
+
.hljs-meta,
|
|
14133
|
+
.hljs-selector-id,
|
|
14134
|
+
.hljs-title {
|
|
14135
|
+
color: #61aeee
|
|
14136
|
+
}
|
|
14137
|
+
.hljs-built_in,
|
|
14138
|
+
.hljs-title.class_,
|
|
14139
|
+
.hljs-class .hljs-title {
|
|
14140
|
+
color: #e6c07b
|
|
14141
|
+
}
|
|
14142
|
+
.hljs-emphasis {
|
|
14143
|
+
font-style: italic
|
|
14144
|
+
}
|
|
14145
|
+
.hljs-strong {
|
|
14146
|
+
font-weight: bold
|
|
14147
|
+
}
|
|
14148
|
+
.hljs-link {
|
|
14149
|
+
text-decoration: underline
|
|
14148
14150
|
}
|
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.998",
|
|
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",
|
package/src/components/Image.vue
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { Skeleton, normalizeURL, normalizeDimension } from '@bagelink/vue'
|
|
3
|
-
import heic2any from 'heic2any'
|
|
4
3
|
import { watch } from 'vue'
|
|
5
4
|
|
|
6
5
|
const { height, width, alt = '', src } = defineProps<{
|
|
@@ -38,6 +37,7 @@ async function loadImage(src: string) {
|
|
|
38
37
|
try {
|
|
39
38
|
const response = await fetch(src)
|
|
40
39
|
const blob = await response.blob()
|
|
40
|
+
const { default: heic2any } = await import('heic2any')
|
|
41
41
|
const convertedBlob = await heic2any({ blob }) as Blob
|
|
42
42
|
imageSrc = URL.createObjectURL(convertedBlob)
|
|
43
43
|
// Only attempt to cache if the cache API is available
|
|
@@ -1,37 +1,54 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import hljsVuePlugin from '@highlightjs/vue-plugin'
|
|
3
|
-
import { nextTick } from 'vue'
|
|
4
|
-
import 'highlight.js/lib/common'
|
|
5
|
-
import 'highlight.js/styles/atom-one-dark.css'
|
|
3
|
+
import { nextTick, onMounted, watch } from 'vue'
|
|
6
4
|
|
|
7
|
-
const { readonly = false, language } = defineProps<{
|
|
5
|
+
const { readonly = false, language, modelValue = '' } = defineProps<{
|
|
8
6
|
language?: string
|
|
9
7
|
readonly?: boolean
|
|
8
|
+
modelValue?: string
|
|
10
9
|
}>()
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
type: String,
|
|
14
|
-
default: ''
|
|
15
|
-
})
|
|
11
|
+
let code = $ref('')
|
|
16
12
|
|
|
17
13
|
function tabKeyDown(event: KeyboardEvent) {
|
|
18
14
|
const target = event.target as HTMLTextAreaElement
|
|
19
15
|
const start = target.selectionStart
|
|
20
16
|
const end = target.selectionEnd
|
|
21
17
|
const tab = ' '
|
|
22
|
-
code
|
|
18
|
+
code = code.slice(0, start) + tab + code.slice(end)
|
|
23
19
|
nextTick(() => {
|
|
24
20
|
target.selectionStart = target.selectionEnd = start + 2
|
|
25
21
|
})
|
|
26
22
|
}
|
|
27
23
|
|
|
24
|
+
const textarea = $ref<HTMLInputElement>()
|
|
25
|
+
let height = $ref('300px')
|
|
26
|
+
|
|
27
|
+
function setHeight() {
|
|
28
|
+
if (!textarea) return
|
|
29
|
+
const { scrollHeight } = textarea
|
|
30
|
+
height = `${scrollHeight}px`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let loaded = $ref(false)
|
|
34
|
+
|
|
35
|
+
onMounted(async () => {
|
|
36
|
+
await import('highlight.js/lib/common')
|
|
37
|
+
await import('highlight.js/styles/atom-one-dark.css')
|
|
38
|
+
loaded = true
|
|
39
|
+
})
|
|
40
|
+
|
|
28
41
|
const Highlightjs = hljsVuePlugin.component
|
|
42
|
+
watch(() => code, setHeight, { immediate: true })
|
|
43
|
+
watch(() => modelValue, (value) => {
|
|
44
|
+
if (value !== code) code = value
|
|
45
|
+
}, { immediate: true })
|
|
29
46
|
</script>
|
|
30
47
|
|
|
31
48
|
<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-
|
|
49
|
+
<div v-if="loaded" class="code-editor-wrap ltr radius-1">
|
|
50
|
+
<div class="relative block h-100" :style="{ height }">
|
|
51
|
+
<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
52
|
<div
|
|
36
53
|
v-for="(_, index) in code.split('\n')"
|
|
37
54
|
:key="index"
|
|
@@ -49,12 +66,14 @@ const Highlightjs = hljsVuePlugin.component
|
|
|
49
66
|
/>
|
|
50
67
|
<textarea
|
|
51
68
|
v-if="!readonly"
|
|
69
|
+
ref="textarea"
|
|
52
70
|
v-model="code"
|
|
53
71
|
:spellcheck="false"
|
|
54
72
|
class="code-editor absolute inset-0 overflow-hidden bg-transparent line-height-15 border-none m-0"
|
|
55
73
|
placeholder="Write your code here"
|
|
56
74
|
aria-label="Code Editor"
|
|
57
75
|
data-gramm="false"
|
|
76
|
+
@input="$emit('update:modelValue', code)"
|
|
58
77
|
@keydown.tab.prevent="tabKeyDown"
|
|
59
78
|
/>
|
|
60
79
|
</div>
|
|
@@ -65,7 +84,10 @@ const Highlightjs = hljsVuePlugin.component
|
|
|
65
84
|
.code-editor-wrap{
|
|
66
85
|
background: #282c34;
|
|
67
86
|
overflow: scroll;
|
|
87
|
+
display: grid;
|
|
88
|
+
max-height: 300px;
|
|
68
89
|
}
|
|
90
|
+
|
|
69
91
|
.numbers {
|
|
70
92
|
font-family: monospace;
|
|
71
93
|
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' },
|