@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.
Files changed (24) hide show
  1. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts +7 -11
  2. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
  3. package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts.map +1 -1
  4. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -1
  5. package/dist/components/form/inputs/RichText/config.d.ts.map +1 -1
  6. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  7. package/dist/components/form/inputs/RichText/utils/formatting.d.ts +1 -0
  8. package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +1 -1
  9. package/dist/components/form/inputs/RichText/utils/media.d.ts +3 -3
  10. package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -1
  11. package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -1
  12. package/dist/index.cjs +285 -102
  13. package/dist/index.mjs +285 -102
  14. package/dist/style.css +16 -14
  15. package/package.json +2 -1
  16. package/src/components/form/inputs/CodeEditor/Index.vue +26 -10
  17. package/src/components/form/inputs/RichText/components/Toolbar.vue +1 -1
  18. package/src/components/form/inputs/RichText/composables/useEditor.ts +17 -4
  19. package/src/components/form/inputs/RichText/config.ts +5 -1
  20. package/src/components/form/inputs/RichText/index.vue +1 -0
  21. package/src/components/form/inputs/RichText/richTextTypes.d.ts +2 -0
  22. package/src/components/form/inputs/RichText/utils/formatting.ts +281 -34
  23. package/src/components/form/inputs/RichText/utils/media.ts +9 -6
  24. 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-df400bb5] .active {
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-faf0065a] {
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-faf0065a] {
1303
+ .editor-container[data-v-e274dd3b] {
1302
1304
  display: flex;
1303
1305
  gap: 1rem;
1304
1306
  }
1305
- .content-area[data-v-faf0065a],
1306
- .preview-area[data-v-faf0065a] {
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-faf0065a] {
1313
+ .split-view[data-v-e274dd3b] {
1312
1314
  display: grid;
1313
1315
  grid-template-columns: 1fr 1fr;
1314
1316
  }
1315
- .editableContent[data-v-faf0065a] {
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-faf0065a] {
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-faf0065a] {
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-faf0065a] {
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-faf0065a] {
1350
+ .fullscreen-mode .editor-container[data-v-e274dd3b] {
1349
1351
  height: calc(100vh - 4rem);
1350
1352
  }
1351
- .fullscreen-mode .content-area[data-v-faf0065a],
1352
- .fullscreen-mode .preview-area[data-v-faf0065a] {
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-faf0065a]{
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.992",
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
- const code = defineModel('modelValue', {
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.value = code.value.slice(0, start) + tab + code.value.slice(end)
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 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">
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.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'