tiptapify 0.1.4 → 0.1.6

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 (113) hide show
  1. package/dist/tiptapify.css +2 -1
  2. package/dist/tiptapify.mjs +68619 -55059
  3. package/dist/tiptapify.umd.js +90 -80
  4. package/index.d.ts +98 -40
  5. package/package.json +73 -67
  6. package/src/components/Footer.vue +4 -3
  7. package/src/components/MenuBubble.vue +16 -16
  8. package/src/components/MenuFloating.vue +13 -13
  9. package/src/components/Tiptapify.vue +19 -9
  10. package/src/components/Toolbar/Index.vue +21 -17
  11. package/src/components/Toolbar/Items.vue +2 -1
  12. package/src/components/Toolbar/actions.ts +3 -3
  13. package/src/components/Toolbar/alignment.ts +5 -5
  14. package/src/components/Toolbar/format.ts +5 -5
  15. package/src/components/Toolbar/formatExtra.ts +6 -6
  16. package/src/components/Toolbar/items.ts +8 -8
  17. package/src/components/Toolbar/list.ts +6 -6
  18. package/src/components/Toolbar/media.ts +8 -8
  19. package/src/components/Toolbar/misc.ts +8 -8
  20. package/src/components/Toolbar/style.ts +7 -7
  21. package/src/components/UI/TiptapifyDialog.vue +14 -13
  22. package/src/components/editorExtensions.ts +4 -2
  23. package/src/components/index.ts +6 -6
  24. package/src/constants/style.test.ts +49 -0
  25. package/src/constants/style.ts +4 -3
  26. package/src/extensions/PickerEventBus.test.ts +38 -0
  27. package/src/extensions/charmap/arrows.ts +700 -700
  28. package/src/extensions/charmap/box_drawing.ts +184 -184
  29. package/src/extensions/charmap/currency.ts +93 -93
  30. package/src/extensions/charmap/cyrillic.ts +368 -368
  31. package/src/extensions/charmap/diacritics.ts +60 -60
  32. package/src/extensions/charmap/extended_letters.ts +748 -748
  33. package/src/extensions/charmap/greek.ts +252 -252
  34. package/src/extensions/charmap/hebrew.ts +105 -105
  35. package/src/extensions/charmap/math.ts +1684 -1684
  36. package/src/extensions/charmap/punctuation.ts +68 -68
  37. package/src/extensions/charmap/symbols.ts +288 -288
  38. package/src/extensions/charmap/typography.ts +284 -284
  39. package/src/extensions/components/CodeBlockComponent.vue +2 -2
  40. package/src/extensions/components/actions/redo/Button.vue +12 -10
  41. package/src/extensions/components/actions/undo/Button.vue +12 -10
  42. package/src/extensions/components/alignment/center/Button.vue +11 -9
  43. package/src/extensions/components/alignment/justify/Button.vue +11 -9
  44. package/src/extensions/components/alignment/left/Button.vue +11 -9
  45. package/src/extensions/components/alignment/right/Button.vue +11 -9
  46. package/src/extensions/components/format/bold/Button.vue +12 -10
  47. package/src/extensions/components/format/italic/Button.vue +12 -10
  48. package/src/extensions/components/format/strike/Button.vue +12 -10
  49. package/src/extensions/components/format/underline/Button.vue +5 -3
  50. package/src/extensions/components/formatExtra/code/Button.vue +12 -10
  51. package/src/extensions/components/formatExtra/codeBlock/Button.vue +12 -10
  52. package/src/extensions/components/formatExtra/quote/Button.vue +12 -10
  53. package/src/extensions/components/formatExtra/sub/Button.vue +12 -10
  54. package/src/extensions/components/formatExtra/sup/Button.vue +12 -10
  55. package/src/extensions/components/list/bullet/Button.vue +21 -19
  56. package/src/extensions/components/list/bullet/index.ts +1 -1
  57. package/src/extensions/components/list/indent/Button.vue +13 -11
  58. package/src/extensions/components/list/numbered/Button.vue +12 -10
  59. package/src/extensions/components/list/outdent/Button.vue +13 -11
  60. package/src/extensions/components/list/task/Button.vue +12 -10
  61. package/src/extensions/components/media/charmap/Button.vue +8 -5
  62. package/src/extensions/components/media/charmap/Picker.vue +20 -18
  63. package/src/extensions/components/media/emoji/Button.vue +8 -6
  64. package/src/extensions/components/media/emoji/Picker.vue +20 -18
  65. package/src/extensions/components/media/iframe/Button.vue +13 -11
  66. package/src/extensions/components/media/iframe/IframeDialog.vue +27 -25
  67. package/src/extensions/components/media/image/Button.vue +12 -10
  68. package/src/extensions/components/media/image/ImageDialog.vue +46 -42
  69. package/src/extensions/components/media/link/Button.vue +12 -11
  70. package/src/extensions/components/media/link/LinkDialog.vue +39 -37
  71. package/src/extensions/components/media/link/index.ts +6 -7
  72. package/src/extensions/components/media/table/Button.vue +21 -19
  73. package/src/extensions/components/media/table/ColumnActions.vue +5 -4
  74. package/src/extensions/components/media/table/RowActions.vue +5 -4
  75. package/src/extensions/components/media/table/TableBuilder.vue +15 -13
  76. package/src/extensions/components/media/video/Button.vue +12 -10
  77. package/src/extensions/components/media/video/VideoDialog.vue +33 -15
  78. package/src/extensions/components/misc/break/Button.vue +8 -6
  79. package/src/extensions/components/misc/formatClear/Button.vue +12 -10
  80. package/src/extensions/components/misc/fullscreen/Button.vue +20 -18
  81. package/src/extensions/components/misc/invisibleChar/Button.vue +11 -9
  82. package/src/extensions/components/misc/line/Button.vue +11 -9
  83. package/src/extensions/components/misc/preview/Button.vue +11 -9
  84. package/src/extensions/components/misc/source/Button.vue +9 -7
  85. package/src/extensions/components/misc/source/ShowSourceDialog.vue +27 -25
  86. package/src/extensions/components/slashCommands/CommandsList.vue +3 -1
  87. package/src/extensions/components/style/StyleColor.vue +26 -22
  88. package/src/extensions/components/style/color/Button.vue +19 -17
  89. package/src/extensions/components/style/fontFamily/Button.vue +16 -14
  90. package/src/extensions/components/style/fontFamily/FontFamily.vue +3 -2
  91. package/src/extensions/components/style/fontSize/Button.vue +17 -15
  92. package/src/extensions/components/style/fontSize/FontSize.vue +4 -3
  93. package/src/extensions/components/style/heading/Button.vue +19 -16
  94. package/src/extensions/components/style/highlight/Button.vue +19 -17
  95. package/src/extensions/components/style/lineHeight/Button.vue +16 -14
  96. package/src/extensions/components/style/lineHeight/FontFamily.vue +3 -2
  97. package/src/extensions/components/style/lineHeight/LineHeight.vue +3 -2
  98. package/src/extensions/emoji/activities.ts +534 -534
  99. package/src/extensions/emoji/animals_and_nature.ts +978 -978
  100. package/src/extensions/emoji/component.ts +54 -54
  101. package/src/extensions/emoji/flags.ts +1644 -1644
  102. package/src/extensions/emoji/food_and_drink.ts +810 -810
  103. package/src/extensions/emoji/objects.ts +1608 -1608
  104. package/src/extensions/emoji/people_and_body.ts +2022 -2022
  105. package/src/extensions/emoji/smileys_and_emotion.ts +1038 -1038
  106. package/src/extensions/emoji/symbols.ts +1290 -1290
  107. package/src/extensions/emoji/travel_and_places.ts +1332 -1332
  108. package/src/index.ts +15 -5
  109. package/src/types/editor.ts +10 -0
  110. package/src/types/slashCommandsTypes.ts +1 -1
  111. package/src/types/toolbarTypes.ts +3 -1
  112. package/src/utils/helpers.test.ts +32 -0
  113. package/src/utils/helpers.ts +1 -1
@@ -1,6 +1,6 @@
1
- import { default as UndoButton } from "@tiptapify/extensions/components/actions/undo/Button.vue";
2
- import { default as RedoButton } from "@tiptapify/extensions/components/actions/redo/Button.vue";
3
- import { markRaw } from "vue";
1
+ import { default as UndoButton } from '@tiptapify/extensions/components/actions/undo/Button.vue'
2
+ import { default as RedoButton } from '@tiptapify/extensions/components/actions/redo/Button.vue'
3
+ import { markRaw } from 'vue'
4
4
 
5
5
  export default {
6
6
  section: 'actions',
@@ -1,8 +1,8 @@
1
- import { default as AlignmentLeftButton } from "@tiptapify/extensions/components/alignment/left/Button.vue";
2
- import { default as AlignmentCenterButton } from "@tiptapify/extensions/components/alignment/center/Button.vue";
3
- import { default as AlignmentRightButton } from "@tiptapify/extensions/components/alignment/right/Button.vue";
4
- import { default as AlignmentJustifyButton } from "@tiptapify/extensions/components/alignment/justify/Button.vue";
5
- import { markRaw } from "vue";
1
+ import { default as AlignmentLeftButton } from '@tiptapify/extensions/components/alignment/left/Button.vue'
2
+ import { default as AlignmentCenterButton } from '@tiptapify/extensions/components/alignment/center/Button.vue'
3
+ import { default as AlignmentRightButton } from '@tiptapify/extensions/components/alignment/right/Button.vue'
4
+ import { default as AlignmentJustifyButton } from '@tiptapify/extensions/components/alignment/justify/Button.vue'
5
+ import { markRaw } from 'vue'
6
6
 
7
7
  export default {
8
8
  section: 'alignment',
@@ -1,8 +1,8 @@
1
- import { default as BoldButton } from "@tiptapify/extensions/components/format/bold/Button.vue";
2
- import { default as ItalicButton } from "@tiptapify/extensions/components/format/italic/Button.vue";
3
- import { default as UnderlineButton } from "@tiptapify/extensions/components/format/underline/Button.vue";
4
- import { default as StrikeButton } from "@tiptapify/extensions/components/format/strike/Button.vue";
5
- import { markRaw } from "vue";
1
+ import { default as BoldButton } from '@tiptapify/extensions/components/format/bold/Button.vue'
2
+ import { default as ItalicButton } from '@tiptapify/extensions/components/format/italic/Button.vue'
3
+ import { default as UnderlineButton } from '@tiptapify/extensions/components/format/underline/Button.vue'
4
+ import { default as StrikeButton } from '@tiptapify/extensions/components/format/strike/Button.vue'
5
+ import { markRaw } from 'vue'
6
6
 
7
7
  export default {
8
8
  section: 'format',
@@ -1,9 +1,9 @@
1
- import { default as SupButton } from "@tiptapify/extensions/components/formatExtra/sup/Button.vue";
2
- import { default as SubButton } from "@tiptapify/extensions/components/formatExtra/sub/Button.vue";
3
- import { default as CodeButton } from "@tiptapify/extensions/components/formatExtra/code/Button.vue";
4
- import { default as CodeBlockButton } from "@tiptapify/extensions/components/formatExtra/codeBlock/Button.vue";
5
- import { default as BlockquoteButton } from "@tiptapify/extensions/components/formatExtra/quote/Button.vue";
6
- import { markRaw } from "vue";
1
+ import { default as SupButton } from '@tiptapify/extensions/components/formatExtra/sup/Button.vue'
2
+ import { default as SubButton } from '@tiptapify/extensions/components/formatExtra/sub/Button.vue'
3
+ import { default as CodeButton } from '@tiptapify/extensions/components/formatExtra/code/Button.vue'
4
+ import { default as CodeBlockButton } from '@tiptapify/extensions/components/formatExtra/codeBlock/Button.vue'
5
+ import { default as BlockquoteButton } from '@tiptapify/extensions/components/formatExtra/quote/Button.vue'
6
+ import { markRaw } from 'vue'
7
7
 
8
8
  export default {
9
9
  section: 'formatExtra',
@@ -1,11 +1,11 @@
1
- import actions from "@tiptapify/components/Toolbar/actions";
2
- import alignment from "@tiptapify/components/Toolbar/alignment";
3
- import format from "@tiptapify/components/Toolbar/format";
4
- import formatExtra from "@tiptapify/components/Toolbar/formatExtra";
5
- import style from "@tiptapify/components/Toolbar/style";
6
- import list from "@tiptapify/components/Toolbar/list";
7
- import media from "@tiptapify/components/Toolbar/media";
8
- import misc from "@tiptapify/components/Toolbar/misc";
1
+ import actions from '@tiptapify/components/Toolbar/actions'
2
+ import alignment from '@tiptapify/components/Toolbar/alignment'
3
+ import format from '@tiptapify/components/Toolbar/format'
4
+ import formatExtra from '@tiptapify/components/Toolbar/formatExtra'
5
+ import style from '@tiptapify/components/Toolbar/style'
6
+ import list from '@tiptapify/components/Toolbar/list'
7
+ import media from '@tiptapify/components/Toolbar/media'
8
+ import misc from '@tiptapify/components/Toolbar/misc'
9
9
 
10
10
  const items = {
11
11
  style,
@@ -1,9 +1,9 @@
1
- import { default as BulletListButton } from "@tiptapify/extensions/components/list/bullet/Button.vue";
2
- import { default as NumberedListButton } from "@tiptapify/extensions/components/list/numbered/Button.vue";
3
- import { default as TaskListButton } from "@tiptapify/extensions/components/list/task/Button.vue";
4
- import { default as IndentListButton } from "@tiptapify/extensions/components/list/indent/Button.vue";
5
- import { default as OutdentListButton } from "@tiptapify/extensions/components/list/outdent/Button.vue";
6
- import { markRaw } from "vue";
1
+ import { default as BulletListButton } from '@tiptapify/extensions/components/list/bullet/Button.vue'
2
+ import { default as NumberedListButton } from '@tiptapify/extensions/components/list/numbered/Button.vue'
3
+ import { default as TaskListButton } from '@tiptapify/extensions/components/list/task/Button.vue'
4
+ import { default as IndentListButton } from '@tiptapify/extensions/components/list/indent/Button.vue'
5
+ import { default as OutdentListButton } from '@tiptapify/extensions/components/list/outdent/Button.vue'
6
+ import { markRaw } from 'vue'
7
7
 
8
8
  export default {
9
9
  section: 'list',
@@ -1,11 +1,11 @@
1
- import { default as EmojiButton } from "@tiptapify/extensions/components/media/emoji/Button.vue";
2
- import { default as CharmapButton } from "@tiptapify/extensions/components/media/charmap/Button.vue";
3
- import { default as LinkButton } from "@tiptapify/extensions/components/media/link/Button.vue";
4
- import { default as ImageButton } from "@tiptapify/extensions/components/media/image/Button.vue";
5
- import { default as IframeButton } from "@tiptapify/extensions/components/media/iframe/Button.vue";
6
- import { default as TableButton } from "@tiptapify/extensions/components/media/table/Button.vue";
7
- import { default as VideoButton } from "@tiptapify/extensions/components/media/video/Button.vue";
8
- import { markRaw } from "vue";
1
+ import { default as EmojiButton } from '@tiptapify/extensions/components/media/emoji/Button.vue'
2
+ import { default as CharmapButton } from '@tiptapify/extensions/components/media/charmap/Button.vue'
3
+ import { default as LinkButton } from '@tiptapify/extensions/components/media/link/Button.vue'
4
+ import { default as ImageButton } from '@tiptapify/extensions/components/media/image/Button.vue'
5
+ import { default as IframeButton } from '@tiptapify/extensions/components/media/iframe/Button.vue'
6
+ import { default as TableButton } from '@tiptapify/extensions/components/media/table/Button.vue'
7
+ import { default as VideoButton } from '@tiptapify/extensions/components/media/video/Button.vue'
8
+ import { markRaw } from 'vue'
9
9
 
10
10
  export default {
11
11
  section: 'media',
@@ -1,11 +1,11 @@
1
- import { default as LineButton } from "@tiptapify/extensions/components/misc/line/Button.vue";
2
- import { default as BreakButton } from "@tiptapify/extensions/components/misc/break/Button.vue";
3
- import { default as PreviewButton } from "@tiptapify/extensions/components/misc/preview/Button.vue";
4
- import { default as FullscreenButton } from "@tiptapify/extensions/components/misc/fullscreen/Button.vue";
5
- import { default as SourceButton } from "@tiptapify/extensions/components/misc/source/Button.vue";
6
- import { default as InvisibleCharButton } from "@tiptapify/extensions/components/misc/invisibleChar/Button.vue";
7
- import { default as FormatClearButton } from "@tiptapify/extensions/components/misc/formatClear/Button.vue";
8
- import { markRaw } from "vue";
1
+ import { default as LineButton } from '@tiptapify/extensions/components/misc/line/Button.vue'
2
+ import { default as BreakButton } from '@tiptapify/extensions/components/misc/break/Button.vue'
3
+ import { default as PreviewButton } from '@tiptapify/extensions/components/misc/preview/Button.vue'
4
+ import { default as FullscreenButton } from '@tiptapify/extensions/components/misc/fullscreen/Button.vue'
5
+ import { default as SourceButton } from '@tiptapify/extensions/components/misc/source/Button.vue'
6
+ import { default as InvisibleCharButton } from '@tiptapify/extensions/components/misc/invisibleChar/Button.vue'
7
+ import { default as FormatClearButton } from '@tiptapify/extensions/components/misc/formatClear/Button.vue'
8
+ import { markRaw } from 'vue'
9
9
 
10
10
  export default {
11
11
  section: 'misc',
@@ -1,10 +1,10 @@
1
- import { default as HeadingButton } from "@tiptapify/extensions/components/style/heading/Button.vue";
2
- import { default as FontFamilyButton } from "@tiptapify/extensions/components/style/fontFamily/Button.vue";
3
- import { default as FontSizeButton } from "@tiptapify/extensions/components/style/fontSize/Button.vue";
4
- import { default as LineHeightButton } from "@tiptapify/extensions/components/style/lineHeight/Button.vue";
5
- import { default as ColorButton } from "@tiptapify/extensions/components/style/color/Button.vue";
6
- import { default as HighlightButton } from "@tiptapify/extensions/components/style/highlight/Button.vue";
7
- import { markRaw } from "vue";
1
+ import { default as HeadingButton } from '@tiptapify/extensions/components/style/heading/Button.vue'
2
+ import { default as FontFamilyButton } from '@tiptapify/extensions/components/style/fontFamily/Button.vue'
3
+ import { default as FontSizeButton } from '@tiptapify/extensions/components/style/fontSize/Button.vue'
4
+ import { default as LineHeightButton } from '@tiptapify/extensions/components/style/lineHeight/Button.vue'
5
+ import { default as ColorButton } from '@tiptapify/extensions/components/style/color/Button.vue'
6
+ import { default as HighlightButton } from '@tiptapify/extensions/components/style/highlight/Button.vue'
7
+ import { markRaw } from 'vue'
8
8
 
9
9
  export default {
10
10
  section: 'style',
@@ -1,7 +1,8 @@
1
1
  <script lang="ts" setup>
2
2
 
3
- import * as mdi from "@mdi/js";
4
- import { inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from "vue";
3
+ import * as mdi from '@mdi/js'
4
+ import { inject, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
5
+ import { ComposerTranslation } from 'vue-i18n'
5
6
 
6
7
  const props = defineProps({
7
8
  module: String,
@@ -10,20 +11,20 @@ const props = defineProps({
10
11
  maxWidth: { type: Number, default () { return 800 } },
11
12
  })
12
13
 
13
- const { t } = inject('tiptapifyI18n') as any
14
+ const { t } = inject('tiptapifyI18n') as { t: ComposerTranslation }
14
15
 
15
16
  defineExpose({ open, close })
16
17
  const emits = defineEmits(['closeDialog'])
17
18
 
18
- const dialog = ref<boolean>(false)
19
+ const showDialog = ref<boolean>(false)
19
20
  const movableHandler = ref(null)
20
21
 
21
22
  function open() {
22
- dialog.value = true
23
+ showDialog.value = true
23
24
  }
24
25
 
25
26
  function close() {
26
- dialog.value = false
27
+ showDialog.value = false
27
28
  }
28
29
 
29
30
  function emitClose() {
@@ -53,7 +54,7 @@ function dragElement(trigger: HTMLElement, container: HTMLElement) {
53
54
  }
54
55
 
55
56
  function elementDrag(e: MouseEvent) {
56
- e.preventDefault();
57
+ e.preventDefault()
57
58
 
58
59
  coordinates.moveX = coordinates.cursorX - e.clientX
59
60
  coordinates.moveY = coordinates.cursorY - e.clientY
@@ -89,26 +90,26 @@ function dragElement(trigger: HTMLElement, container: HTMLElement) {
89
90
  }
90
91
  }
91
92
 
92
- watch(() => dialog.value, async () => {
93
+ watch(() => showDialog.value, async () => {
93
94
  await nextTick()
94
95
 
95
96
  if (!movableHandler.value) {
96
97
  return
97
98
  }
98
99
 
99
- if (dialog.value && !props.fullscreen) {
100
+ if (showDialog.value && !props.fullscreen) {
100
101
  dragElement(movableHandler.value.$el as HTMLElement, movableHandler.value.$el.parentNode as HTMLElement)
101
102
  }
102
103
  })
103
104
 
104
105
  function resizeListener() {
105
- if (!dialog.value) {
106
+ if (!showDialog.value) {
106
107
  return
107
108
  }
108
109
 
109
- const dialogCoordinates = movableHandler.value.$el.parentNode.getBoundingClientRect();
110
+ const dialogCoordinates = movableHandler.value.$el.parentNode.getBoundingClientRect()
110
111
 
111
- function checkBoundLeftTop(type) {
112
+ function checkBoundLeftTop(type: string) {
112
113
  if (dialogCoordinates[type] < 0) {
113
114
  const dialogOffset = movableHandler.value.$el.parentNode.style[type]
114
115
  const newOffset = parseInt(dialogOffset) - dialogCoordinates[type]
@@ -139,7 +140,7 @@ onBeforeUnmount(() => {
139
140
  </script>
140
141
 
141
142
  <template>
142
- <VDialog v-model="dialog" :max-width="maxWidth" :fullscreen="fullscreen" @click:outside="emitClose">
143
+ <VDialog v-model="showDialog" :max-width="maxWidth" :fullscreen="fullscreen" @click:outside="emitClose">
143
144
  <VCard>
144
145
  <VCardTitle
145
146
  ref="movableHandler"
@@ -9,6 +9,7 @@ import { Heading } from '@tiptap/extension-heading'
9
9
  import { Bold } from '@tiptap/extension-bold'
10
10
  import { Italic } from '@tiptap/extension-italic'
11
11
  import { Strike } from '@tiptap/extension-strike'
12
+ import { Link } from '@tiptap/extension-link'
12
13
  import { Code } from '@tiptap/extension-code'
13
14
  import { Blockquote } from '@tiptap/extension-blockquote'
14
15
  import { HardBreak } from '@tiptap/extension-hard-break'
@@ -32,8 +33,8 @@ import { TiptapifyLink } from '@tiptapify/extensions/components/media/link'
32
33
  import { TiptapifyVideo } from '@tiptapify/extensions/components/media/video'
33
34
  import CodeBlockComponent from '@tiptapify/extensions/components/CodeBlockComponent.vue'
34
35
  import SlashCommands, { SlashCommandsExtensionOptions } from '@tiptapify/extensions/slash-commands'
35
- import { SlashCommandsConfig, SlashCommandId } from '@tiptapify/types/slashCommandsTypes'
36
- import { toolbarSections } from "@tiptapify/types/toolbarTypes";
36
+ import { SlashCommandsConfig } from '@tiptapify/types/slashCommandsTypes'
37
+ import { toolbarSections } from '@tiptapify/types/toolbarTypes'
37
38
 
38
39
  // load all languages with "all" or common languages with "common"
39
40
  import { common, createLowlight } from 'lowlight'
@@ -61,6 +62,7 @@ export function editorExtensions (placeholder: string, slashCommands: SlashComma
61
62
  Bold,
62
63
  Italic,
63
64
  Strike,
65
+ Link,
64
66
  Blockquote,
65
67
  OrderedList,
66
68
  BulletList,
@@ -1,11 +1,11 @@
1
- import { Editor, useEditor } from "@tiptap/vue-3";
2
- import { editorExtensions } from "@tiptapify/components/editorExtensions";
3
- import { toolbarSections } from "@tiptapify/types/toolbarTypes";
4
- import { SlashCommandsConfig } from "@tiptapify/types/slashCommandsTypes";
5
- import { ShallowRef } from "vue";
1
+ import { Editor, useEditor } from '@tiptap/vue-3'
2
+ import { editorExtensions } from '@tiptapify/components/editorExtensions'
3
+ import { toolbarSections } from '@tiptapify/types/toolbarTypes'
4
+ import { SlashCommandsConfig } from '@tiptapify/types/slashCommandsTypes'
5
+ import { ShallowRef } from 'vue'
6
6
 
7
7
  export function getTiptapEditor (
8
- content: any,
8
+ content: string|object,
9
9
  placeholder: string,
10
10
  slashCommands: SlashCommandsConfig = true,
11
11
  customExtensions: toolbarSections,
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest'
2
+ import { setHeadingLevels, headingLevels, fontSizes, defaultFontSize, lineHeights, defaultLineHeight } from './style'
3
+
4
+ describe('style constants', () => {
5
+ beforeEach(() => {
6
+ headingLevels.value = [1, 2, 3, 4, 5, 6]
7
+ })
8
+
9
+ it('sets custom heading levels', () => {
10
+ setHeadingLevels([2, 3, 4])
11
+ expect(headingLevels.value).toEqual([2, 3, 4])
12
+ })
13
+
14
+ it('does not change heading levels on empty array', () => {
15
+ setHeadingLevels([])
16
+ expect(headingLevels.value).toEqual([1, 2, 3, 4, 5, 6])
17
+ })
18
+
19
+ it('rejects levels below 1', () => {
20
+ expect(() => setHeadingLevels([0])).toThrow('customHeadingLevels must be between 1 and 6')
21
+ })
22
+
23
+ it('rejects levels above 6', () => {
24
+ expect(() => setHeadingLevels([7])).toThrow('customHeadingLevels must be between 1 and 6')
25
+ })
26
+
27
+ it('rejects any invalid level in a mixed array', () => {
28
+ expect(() => setHeadingLevels([1, 2, 7])).toThrow('customHeadingLevels must be between 1 and 6')
29
+ })
30
+
31
+ it('has valid fontSizes constant', () => {
32
+ expect(fontSizes).toContain(12)
33
+ expect(fontSizes).toContain(6)
34
+ expect(fontSizes).toContain(96)
35
+ })
36
+
37
+ it('has valid defaultFontSize', () => {
38
+ expect(defaultFontSize).toBe(12)
39
+ })
40
+
41
+ it('has valid lineHeights constant', () => {
42
+ expect(lineHeights).toContain(1)
43
+ expect(lineHeights).toContain(4)
44
+ })
45
+
46
+ it('has valid defaultLineHeight', () => {
47
+ expect(defaultLineHeight).toBe(1)
48
+ })
49
+ })
@@ -1,4 +1,5 @@
1
- import { ref } from "vue";
1
+ import { Level } from '@tiptap/extension-heading'
2
+ import { Ref, ref } from 'vue'
2
3
 
3
4
  export const defaultFontSize = 12
4
5
  export const fontSizes = [6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 32, 48, 64, 96]
@@ -6,8 +7,8 @@ export const fontSizes = [6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 32, 48, 64, 96]
6
7
  export const defaultLineHeight = 1
7
8
  export const lineHeights = [1, 1.5, 2, 3, 4]
8
9
 
9
- export const headingLevels = ref([1, 2, 3, 4, 5, 6])
10
- export function setHeadingLevels(customHeadingLevels: number[]) {
10
+ export const headingLevels: Ref<Level[]> = ref([1, 2, 3, 4, 5, 6])
11
+ export function setHeadingLevels(customHeadingLevels: Level[]) {
11
12
  if (customHeadingLevels.length) {
12
13
  customHeadingLevels.forEach(level => {
13
14
  if (level < 1 || level > 6) {
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+ import { PickerEventBus } from './PickerEventBus'
3
+
4
+ describe('PickerEventBus', () => {
5
+ it('calls registered callback on emit', () => {
6
+ const callback = vi.fn()
7
+ PickerEventBus.on('close', callback)
8
+ PickerEventBus.emit('close', { type: 'emoji' })
9
+ expect(callback).toHaveBeenCalledWith({ type: 'emoji' })
10
+ })
11
+
12
+ it('does not call callback after off', () => {
13
+ const callback = vi.fn()
14
+ PickerEventBus.on('close', callback)
15
+ PickerEventBus.off('close', callback)
16
+ PickerEventBus.emit('close', { type: 'charmap' })
17
+ expect(callback).not.toHaveBeenCalled()
18
+ })
19
+
20
+ it('supports multiple listeners', () => {
21
+ const callback1 = vi.fn()
22
+ const callback2 = vi.fn()
23
+ PickerEventBus.on('close', callback1)
24
+ PickerEventBus.on('close', callback2)
25
+ PickerEventBus.emit('close', { type: 'emoji' })
26
+ expect(callback1).toHaveBeenCalledTimes(1)
27
+ expect(callback2).toHaveBeenCalledTimes(1)
28
+ })
29
+
30
+ it('does not throw when emitting with no listeners', () => {
31
+ expect(() => PickerEventBus.emit('close', { type: 'emoji' })).not.toThrow()
32
+ })
33
+
34
+ it('does not throw when removing unregistered listener', () => {
35
+ const callback = vi.fn()
36
+ expect(() => PickerEventBus.off('close', callback)).not.toThrow()
37
+ })
38
+ })