@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.
Files changed (32) hide show
  1. package/dist/common-C_IH8b5S.cjs +12580 -0
  2. package/dist/common-DoeNgx31.js +12579 -0
  3. package/dist/components/Image.vue.d.ts.map +1 -1
  4. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts +7 -11
  5. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
  6. package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts.map +1 -1
  7. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -1
  8. package/dist/components/form/inputs/RichText/config.d.ts.map +1 -1
  9. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  10. package/dist/components/form/inputs/RichText/utils/formatting.d.ts +1 -0
  11. package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +1 -1
  12. package/dist/components/form/inputs/RichText/utils/media.d.ts +3 -3
  13. package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -1
  14. package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -1
  15. package/dist/heic2any-8wMqMfB_.js +933 -0
  16. package/dist/heic2any-k9wDCKka.cjs +932 -0
  17. package/dist/index-DiG-xM9T.cjs +35016 -0
  18. package/dist/index-nGuSAiY2.js +35017 -0
  19. package/dist/index.cjs +99 -48325
  20. package/dist/index.mjs +99 -48325
  21. package/dist/style.css +106 -104
  22. package/package.json +2 -1
  23. package/src/components/Image.vue +1 -1
  24. package/src/components/form/inputs/CodeEditor/Index.vue +34 -12
  25. package/src/components/form/inputs/RichText/components/Toolbar.vue +1 -1
  26. package/src/components/form/inputs/RichText/composables/useEditor.ts +17 -4
  27. package/src/components/form/inputs/RichText/config.ts +5 -1
  28. package/src/components/form/inputs/RichText/index.vue +1 -0
  29. package/src/components/form/inputs/RichText/richTextTypes.d.ts +2 -0
  30. package/src/components/form/inputs/RichText/utils/formatting.ts +281 -34
  31. package/src/components/form/inputs/RichText/utils/media.ts +9 -6
  32. 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-e1f932a8] {
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-df400bb5] .active {
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-faf0065a] {
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-faf0065a] {
1214
+ .editor-container[data-v-e274dd3b] {
1302
1215
  display: flex;
1303
1216
  gap: 1rem;
1304
1217
  }
1305
- .content-area[data-v-faf0065a],
1306
- .preview-area[data-v-faf0065a] {
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-faf0065a] {
1224
+ .split-view[data-v-e274dd3b] {
1312
1225
  display: grid;
1313
1226
  grid-template-columns: 1fr 1fr;
1314
1227
  }
1315
- .editableContent[data-v-faf0065a] {
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-faf0065a] {
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-faf0065a] {
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-faf0065a] {
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-faf0065a] {
1261
+ .fullscreen-mode .editor-container[data-v-e274dd3b] {
1349
1262
  height: calc(100vh - 4rem);
1350
1263
  }
1351
- .fullscreen-mode .content-area[data-v-faf0065a],
1352
- .fullscreen-mode .preview-area[data-v-faf0065a] {
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-faf0065a]{
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.992",
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",
@@ -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
- const code = defineModel('modelValue', {
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.value = code.value.slice(0, start) + tab + code.value.slice(end)
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 style="max-height: 900px; height: 100vh; overflow: scroll;">
33
- <div class="relative block h-100 ltr code-editor-wrap" style="height: 800px;">
34
- <div class="numbers absolute inset-0 py-1 px-05 txt16 line-height-15 overflow-hidden z-999 w50px txt-start opacity-3 color-gray">
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.doc, range)
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.doc, range)
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' },
@@ -40,6 +40,7 @@ async function initEditor() {
40
40
  watch(() => props.modelValue, (newValue) => {
41
41
  if (newValue !== editor.state.content) {
42
42
  editor.state.content = newValue
43
+ editor.updateContent('html')
43
44
  }
44
45
  })
45
46
 
@@ -41,6 +41,8 @@ export type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
41
41
  export type ToolbarConfigOption =
42
42
  | FormattingCommand
43
43
  | HeadingLevel
44
+ | 'p'
45
+ | 'blockquote'
44
46
  | 'separator'
45
47
  | 'fullScreen'
46
48
  | 'clear'