@myissue/vue-website-page-builder 3.0.18 → 3.0.19

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 (54) hide show
  1. package/README.md +79 -76
  2. package/dist/page-builder/2-images-text.png +0 -0
  3. package/dist/page-builder/3-images-text.png +0 -0
  4. package/dist/page-builder/3-vertical-images.png +0 -0
  5. package/dist/page-builder/4-images-text.png +0 -0
  6. package/dist/vue-website-page-builder.css +1 -1
  7. package/dist/vue-website-page-builder.js +7168 -7261
  8. package/dist/vue-website-page-builder.umd.cjs +146 -81
  9. package/package.json +4 -3
  10. package/src/App.vue +4 -115
  11. package/src/Components/Homepage/HomeSection.vue +70 -162
  12. package/src/Components/MediaLibrary/SidebarUnsplash.vue +9 -16
  13. package/src/Components/MediaLibrary/Unsplash.vue +51 -91
  14. package/src/Components/Modals/MediaLibraryModal.vue +56 -318
  15. package/src/Components/Modals/PageBuilderPreviewModal.vue +22 -40
  16. package/src/Components/PageBuilder/AdvancedPageBuilderSettings.vue +7 -0
  17. package/src/Components/PageBuilder/DropdownsPlusToggles/OptionsDropdown.vue +165 -110
  18. package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +9 -16
  19. package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +18 -18
  20. package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +16 -21
  21. package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +12 -12
  22. package/src/Components/PageBuilder/EditorMenu/Editables/ComponentTopMenu.vue +10 -9
  23. package/src/Components/PageBuilder/EditorMenu/Editables/DeleteElement.vue +9 -9
  24. package/src/Components/PageBuilder/EditorMenu/Editables/EditGetElement.vue +144 -136
  25. package/src/Components/PageBuilder/EditorMenu/Editables/ElementEditor.vue +9 -10
  26. package/src/Components/PageBuilder/EditorMenu/Editables/ImageEditor.vue +31 -27
  27. package/src/Components/PageBuilder/EditorMenu/Editables/LinkEditor.vue +20 -14
  28. package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +9 -10
  29. package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +9 -10
  30. package/src/Components/PageBuilder/EditorMenu/Editables/PaddingPlusMargin.vue +16 -16
  31. package/src/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue +9 -16
  32. package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +22 -20
  33. package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +25 -27
  34. package/src/Components/PageBuilder/NoneCustomMediaLibraryComponent.vue +3 -0
  35. package/src/Components/PageBuilder/NoneCustomSearchComponent.vue +91 -0
  36. package/src/Components/PageBuilder/PageBuilderSettings.vue +8 -0
  37. package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +31 -72
  38. package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +32 -36
  39. package/src/Components/Search/SearchComponents.vue +11 -199
  40. package/src/Components/TipTap/TipTap.vue +8 -7
  41. package/src/Components/TipTap/TipTapInput.vue +136 -134
  42. package/src/PageBuilder/PageBuilder.vue +220 -32
  43. package/src/composables/{PageBuilder.ts → PageBuilderClass.ts} +223 -142
  44. package/src/composables/usePageBuilderModal.ts +25 -0
  45. package/src/index.ts +8 -2
  46. package/src/stores/media-library.ts +1 -5
  47. package/src/stores/page-builder-state.ts +52 -36
  48. package/src/stores/user.ts +8 -6
  49. package/src/types/global.d.ts +6 -44
  50. package/src/types/index.ts +169 -0
  51. package/src/utils/html-elements/component.ts +88 -0
  52. package/src/utils/html-elements/componentHelpers.ts +101 -0
  53. package/src/Components/Modals/PageBuilderModal.vue +0 -233
  54. package/src/utils/builder/html-elements/componentHelpers.ts +0 -101
@@ -1,21 +1,16 @@
1
1
  <script setup>
2
+ import { ref, computed, inject, watch } from 'vue'
3
+ import EditorAccordion from '../EditorAccordion.vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
2
5
  import tailwindBorderStyleWidthPlusColor from '@/utils/builder/tailwind-border-style-width-color'
3
- import PageBuilder from '@/composables/PageBuilder.ts'
4
- import EditorAccordion from '@/Components/PageBuilder/EditorMenu/EditorAccordion.vue'
5
- import { computed, ref, watch } from 'vue'
6
- import {
7
- Listbox,
8
- ListboxButton,
9
- ListboxLabel,
10
- ListboxOption,
11
- ListboxOptions,
12
- } from '@headlessui/vue'
13
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
14
- import { useMediaLibraryStore } from '@/stores/media-library'
6
+ import tailwindColors from '@/utils/builder/tailwaind-colors'
7
+ import { Listbox, ListboxButton, ListboxOption, ListboxOptions } from '@headlessui/vue'
15
8
 
16
- const mediaLibraryStore = useMediaLibraryStore()
17
- const pageBuilderStateStore = usePageBuilderStateStore()
18
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
9
+ // Get stores from parent PageBuilder component
10
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
11
+ const mediaLibraryStore = inject('mediaLibraryStore')
12
+
13
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
19
14
  const borderStyle = ref(null)
20
15
  const borderWidth = ref(null)
21
16
  const borderColor = ref(null)
@@ -33,7 +28,7 @@ watch(
33
28
  getBorderStyle,
34
29
  (newValue) => {
35
30
  borderStyle.value = newValue
36
- pageBuilder.handlePageBuilderMethods()
31
+ pageBuilderClass.handlePageBuilderMethods()
37
32
  },
38
33
  { immediate: true },
39
34
  )
@@ -41,7 +36,7 @@ watch(
41
36
  getBorderWidth,
42
37
  (newValue) => {
43
38
  borderWidth.value = newValue
44
- pageBuilder.handlePageBuilderMethods()
39
+ pageBuilderClass.handlePageBuilderMethods()
45
40
  },
46
41
  { immediate: true },
47
42
  )
@@ -49,7 +44,7 @@ watch(
49
44
  getBorderColor,
50
45
  (newValue) => {
51
46
  borderColor.value = newValue
52
- pageBuilder.handlePageBuilderMethods()
47
+ pageBuilderClass.handlePageBuilderMethods()
53
48
  },
54
49
  { immediate: true },
55
50
  )
@@ -64,7 +59,7 @@ watch(
64
59
  <select
65
60
  v-model="borderStyle"
66
61
  class="myPrimarySelect"
67
- @change="pageBuilder.handleBorderStyle(borderStyle)"
62
+ @change="pageBuilderClass.handleBorderStyle(borderStyle)"
68
63
  >
69
64
  <option disabled value="">Select</option>
70
65
  <option
@@ -80,7 +75,7 @@ watch(
80
75
  <select
81
76
  v-model="borderWidth"
82
77
  class="myPrimarySelect"
83
- @change="pageBuilder.handleBorderWidth(borderWidth)"
78
+ @change="pageBuilderClass.handleBorderWidth(borderWidth)"
84
79
  >
85
80
  <option disabled value="">Select</option>
86
81
  <option
@@ -127,7 +122,7 @@ watch(
127
122
  <ListboxOption
128
123
  as="template"
129
124
  v-for="color in tailwindBorderStyleWidthPlusColor.borderColor"
130
- @click="pageBuilder.handleBorderColor(borderColor)"
125
+ @click="pageBuilderClass.handleBorderColor(borderColor)"
131
126
  :key="color"
132
127
  :value="color"
133
128
  v-slot="{ active, borderColor }"
@@ -1,13 +1,13 @@
1
1
  <script setup>
2
- import { computed, ref, watch } from 'vue'
3
- import EditorAccordion from '@/Components/PageBuilder/EditorMenu/EditorAccordion.vue'
4
- import PageBuilder from '@/composables/PageBuilder.ts'
5
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
6
- import { useMediaLibraryStore } from '@/stores/media-library'
2
+ import { ref, computed, inject, watch } from 'vue'
3
+ import EditorAccordion from '../EditorAccordion.vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
7
5
 
8
- const mediaLibraryStore = useMediaLibraryStore()
9
- const pageBuilderStateStore = usePageBuilderStateStore()
10
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
6
+ // Get stores from parent PageBuilder component
7
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
8
+ const mediaLibraryStore = inject('mediaLibraryStore')
9
+
10
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
11
11
  const currentClasses = ref(null)
12
12
  const getCurrentClasses = computed(() => {
13
13
  return pageBuilderStateStore.getCurrentClasses
@@ -24,8 +24,8 @@ watch(
24
24
  const inputClass = ref('')
25
25
 
26
26
  const handleAddClasses = function () {
27
- pageBuilder.handleAddClasses(inputClass.value)
28
- pageBuilder.handlePageBuilderMethods()
27
+ pageBuilderClass.handleAddClasses(inputClass.value)
28
+ pageBuilderClass.handlePageBuilderMethods()
29
29
 
30
30
  inputClass.value = ''
31
31
  }
@@ -42,8 +42,8 @@ const handleAddClasses = function () {
42
42
  class="myPrimaryTag cursor-pointer hover:bg-myPrimaryErrorColor hover:text-white text-xs py-2 font-medium"
43
43
  @click="
44
44
  () => {
45
- pageBuilder.handleRemoveClasses(className)
46
- pageBuilder.handlePageBuilderMethods()
45
+ pageBuilderClass.handleRemoveClasses(className)
46
+ pageBuilderClass.handlePageBuilderMethods()
47
47
  }
48
48
  "
49
49
  >
@@ -1,12 +1,13 @@
1
1
  <script setup>
2
2
  import DynamicModal from '@/Components/Modals/DynamicModal.vue'
3
- import PageBuilder from '@/composables/PageBuilder.ts'
3
+ import { computed, inject } from 'vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
4
5
  import { ref } from 'vue'
5
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
6
- import { useMediaLibraryStore } from '@/stores/media-library'
7
6
 
8
- const mediaLibraryStore = useMediaLibraryStore()
9
- const pageBuilderStateStore = usePageBuilderStateStore()
7
+ // Get stores from parent PageBuilder component
8
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
9
+ const mediaLibraryStore = inject('mediaLibraryStore')
10
+
10
11
  const showModalDeleteComponent = ref(false)
11
12
  // use dynamic model
12
13
  const typeModal = ref('')
@@ -20,7 +21,7 @@ const thirdButtonModal = ref(null)
20
21
  const firstModalButtonFunction = ref(null)
21
22
  const secondModalButtonFunction = ref(null)
22
23
  const thirdModalButtonFunction = ref(null)
23
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
24
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
24
25
 
25
26
  // remove component
26
27
  const deleteComponent = function (e) {
@@ -40,7 +41,7 @@ const deleteComponent = function (e) {
40
41
  //
41
42
  // handle click
42
43
  thirdModalButtonFunction.value = function () {
43
- pageBuilder.deleteComponent()
44
+ pageBuilderClass.deleteComponent()
44
45
 
45
46
  showModalDeleteComponent.value = false
46
47
  }
@@ -77,14 +78,14 @@ const deleteComponent = function (e) {
77
78
 
78
79
  <button
79
80
  type="button"
80
- @click="pageBuilder.moveComponent(-1)"
81
+ @click="pageBuilderClass.moveComponent(-1)"
81
82
  class="h-10 w-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 aspect-square hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
82
83
  >
83
84
  <span class="material-symbols-outlined"> move_up </span>
84
85
  </button>
85
86
  <button
86
87
  type="button"
87
- @click="pageBuilder.moveComponent(1)"
88
+ @click="pageBuilderClass.moveComponent(1)"
88
89
  class="h-10 w-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 aspect-square hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
89
90
  >
90
91
  <span class="material-symbols-outlined"> move_down </span>
@@ -1,13 +1,13 @@
1
1
  <script setup>
2
2
  import EditorAccordion from '../EditorAccordion.vue'
3
- import { computed, ref } from 'vue'
4
- import PageBuilder from '@/composables/PageBuilder.ts'
5
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
6
- import { useMediaLibraryStore } from '@/stores/media-library'
3
+ import { computed, inject } from 'vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
7
5
 
8
- const mediaLibraryStore = useMediaLibraryStore()
9
- const pageBuilderStateStore = usePageBuilderStateStore()
10
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
6
+ // Get stores from parent PageBuilder component
7
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
8
+ const mediaLibraryStore = inject('mediaLibraryStore')
9
+
10
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
11
11
  const getRestoredElement = computed(() => {
12
12
  return pageBuilderStateStore.getRestoredElement
13
13
  })
@@ -20,7 +20,7 @@ const getRestoredElement = computed(() => {
20
20
  <div class="my-2">
21
21
  <button
22
22
  v-if="getRestoredElement !== null"
23
- @click="pageBuilder.handleRestoreElement"
23
+ @click="pageBuilderClass.handleRestoreElement"
24
24
  type="button"
25
25
  class="myPrimaryButton gap-2 items-center w-full"
26
26
  >
@@ -29,7 +29,7 @@ const getRestoredElement = computed(() => {
29
29
  </button>
30
30
  <button
31
31
  v-if="getRestoredElement === null"
32
- @click="pageBuilder.handleDeleteElement"
32
+ @click="pageBuilderClass.handleDeleteElement"
33
33
  type="button"
34
34
  class="myPrimaryDeleteButton gap-2 items-center w-full"
35
35
  >
@@ -1,17 +1,19 @@
1
1
  <script setup>
2
- import { computed, ref } from 'vue'
2
+ import { ref, computed, inject } from 'vue'
3
3
  import DynamicModal from '@/Components/Modals/DynamicModal.vue'
4
4
  import TipTapInput from '@/Components/TipTap/TipTapInput.vue'
5
- import PageBuilder from '@/composables/PageBuilder.ts'
5
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
6
6
  import MediaLibraryModal from '@/Components/Modals/MediaLibraryModal.vue'
7
7
  import TextColorEditor from '@/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue'
8
8
  import BackgroundColorEditor from '@/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue'
9
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
10
- import { useMediaLibraryStore } from '@/stores/media-library'
11
9
 
12
- const mediaLibraryStore = useMediaLibraryStore()
13
- const pageBuilderStateStore = usePageBuilderStateStore()
14
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
10
+ // Get stores from parent PageBuilder component
11
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
12
+ const mediaLibraryStore = inject('mediaLibraryStore')
13
+ const customMediaComponent = inject('CustomMediaComponent')
14
+
15
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
16
+
15
17
  const getElement = computed(() => {
16
18
  return pageBuilderStateStore.getElement
17
19
  })
@@ -107,7 +109,7 @@ const handleAddImage = function () {
107
109
  // handle click
108
110
  secondMediaButtonFunction.value = function () {
109
111
  isLoading.value = true
110
- pageBuilder.updateBasePrimaryImage({ type: 'unsplash' })
112
+ pageBuilderClass.updateBasePrimaryImage({ type: 'unsplash' })
111
113
 
112
114
  // close media library modal
113
115
  showMediaLibraryModal.value = false
@@ -201,138 +203,144 @@ const handleModalIframeSrc = function () {
201
203
  }
202
204
  </script>
203
205
  <template>
204
- <DynamicModal
205
- :show="showModalIframeSrc"
206
- maxWidth="2xl"
207
- :type="typeModal"
208
- :gridColumnAmount="gridColumnModal"
209
- :title="titleModal"
210
- :description="descriptionModal"
211
- :firstButtonText="firstButtonModal"
212
- :secondButtonText="secondButtonModal"
213
- :thirdButtonText="thirdButtonModal"
214
- @firstModalButtonFunction="firstModalButtonFunction"
215
- @secondModalButtonFunction="secondModalButtonFunction"
216
- @thirdModalButtonFunction="thirdModalButtonFunction"
217
- >
218
- <header></header>
219
- <main>
220
- <div class="myInputGroup">
221
- <div class="myPrimaryFormOrganizationHeaderDescriptionSection">
222
- <div class="myPrimaryFormOrganizationHeader">
223
- <label for="video" class="myPrimaryInputLabel">Video url:</label>
224
- <input v-model="iframeSrc" type="text" class="myPrimaryInput" name="video" />
225
- <div v-if="urlError" class="min-h-[2.5rem] flex items-center justify-start">
226
- <p class="myPrimaryInputError mt-2 mb-0 py-0 self-start">
227
- {{ urlError }}
228
- </p>
206
+ <div>
207
+ <DynamicModal
208
+ :show="showModalIframeSrc"
209
+ maxWidth="2xl"
210
+ :type="typeModal"
211
+ :gridColumnAmount="gridColumnModal"
212
+ :title="titleModal"
213
+ :description="descriptionModal"
214
+ :firstButtonText="firstButtonModal"
215
+ :secondButtonText="secondButtonModal"
216
+ :thirdButtonText="thirdButtonModal"
217
+ @firstModalButtonFunction="firstModalButtonFunction"
218
+ @secondModalButtonFunction="secondModalButtonFunction"
219
+ @thirdModalButtonFunction="thirdModalButtonFunction"
220
+ >
221
+ <header></header>
222
+ <main>
223
+ <div class="myInputGroup">
224
+ <div class="myPrimaryFormOrganizationHeaderDescriptionSection">
225
+ <div class="myPrimaryFormOrganizationHeader">
226
+ <label for="video" class="myPrimaryInputLabel">Video url:</label>
227
+ <input v-model="iframeSrc" type="text" class="myPrimaryInput" name="video" />
228
+ <div v-if="urlError" class="min-h-[2.5rem] flex items-center justify-start">
229
+ <p class="myPrimaryInputError mt-2 mb-0 py-0 self-start">
230
+ {{ urlError }}
231
+ </p>
232
+ </div>
229
233
  </div>
230
234
  </div>
231
235
  </div>
236
+ </main>
237
+ </DynamicModal>
238
+ <DynamicModal
239
+ :simpleModal="true"
240
+ :show="getShowModalTipTap"
241
+ maxWidth="5xl"
242
+ :type="typeModal"
243
+ :gridColumnAmount="gridColumnModal"
244
+ :title="titleModal"
245
+ :description="descriptionModal"
246
+ :firstButtonText="firstButtonModal"
247
+ :secondButtonText="secondButtonModal"
248
+ :thirdButtonText="thirdButtonModal"
249
+ @firstModalButtonFunction="firstModalButtonFunction"
250
+ @secondModalButtonFunction="secondModalButtonFunction"
251
+ @thirdModalButtonFunction="thirdModalButtonFunction"
252
+ >
253
+ <header></header>
254
+ <main class="overflow-y-auto">
255
+ <TipTapInput></TipTapInput>
256
+ </main>
257
+ </DynamicModal>
258
+
259
+ <MediaLibraryModal
260
+ :open="showMediaLibraryModal"
261
+ :title="titleMedia"
262
+ :description="descriptionMedia"
263
+ :firstButtonText="firstButtonMedia"
264
+ :secondButtonText="secondButtonMedia"
265
+ :thirdButtonText="thirdButtonMedia"
266
+ :customMediaComponent="customMediaComponent"
267
+ @firstMediaButtonFunction="firstMediaButtonFunction"
268
+ @secondMediaButtonFunction="secondMediaButtonFunction"
269
+ @thirdMediaButtonFunction="thirdMediaButtonFunction"
270
+ >
271
+ </MediaLibraryModal>
272
+
273
+ <div
274
+ class="z-20 py-1 px-2 h-20 flex items-center justify-center mt-2 mx-2 border-b border-myPrimaryLightGrayColor"
275
+ >
276
+ <div class="flex items-center justify-center divide-x divide-gray-200 py-1">
277
+ <template v-if="pageBuilderClass.ElOrFirstChildIsIframe()">
278
+ <div class="px-2 flex items-center justify-start gap-2">
279
+ <button
280
+ @click="handleModalIframeSrc"
281
+ type="button"
282
+ class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
283
+ >
284
+ <span class="material-symbols-outlined"> play_circle </span>
285
+ <span>Add YouTube</span>
286
+ </button>
287
+ </div>
288
+ </template>
289
+
290
+ <template
291
+ v-if="
292
+ pageBuilderClass.selectedElementIsValidText() &&
293
+ !pageBuilderClass.ElOrFirstChildIsIframe()
294
+ "
295
+ >
296
+ <div class="px-2 flex items-center justify-start gap-2">
297
+ <button
298
+ @click="handleModalPreviewTiptap"
299
+ type="button"
300
+ class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
301
+ >
302
+ <span class="material-symbols-outlined"> edit </span>
303
+ <span>Edit text</span>
304
+ </button>
305
+ </div>
306
+ <div class="px-2">
307
+ <TextColorEditor></TextColorEditor>
308
+ </div>
309
+ </template>
310
+
311
+ <template
312
+ v-if="
313
+ getElement &&
314
+ getComponent &&
315
+ getBasePrimaryImage !== null &&
316
+ !pageBuilderClass.ElOrFirstChildIsIframe()
317
+ "
318
+ >
319
+ <div class="px-2 flex items-center justify-start gap-2">
320
+ <button
321
+ @click="handleAddImage"
322
+ type="button"
323
+ class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
324
+ >
325
+ <span class="material-symbols-outlined"> add_photo_alternate </span>
326
+ <span>Update image</span>
327
+ </button>
328
+ </div>
329
+ </template>
330
+
331
+ <template
332
+ v-if="
333
+ getElement &&
334
+ Object.keys(getElement).length !== 0 &&
335
+ !getBasePrimaryImage &&
336
+ !pageBuilderClass.ElOrFirstChildIsIframe()
337
+ "
338
+ >
339
+ <div class="px-2">
340
+ <BackgroundColorEditor></BackgroundColorEditor>
341
+ </div>
342
+ </template>
232
343
  </div>
233
- </main>
234
- </DynamicModal>
235
- <DynamicModal
236
- :simpleModal="true"
237
- :show="getShowModalTipTap"
238
- maxWidth="5xl"
239
- :type="typeModal"
240
- :gridColumnAmount="gridColumnModal"
241
- :title="titleModal"
242
- :description="descriptionModal"
243
- :firstButtonText="firstButtonModal"
244
- :secondButtonText="secondButtonModal"
245
- :thirdButtonText="thirdButtonModal"
246
- @firstModalButtonFunction="firstModalButtonFunction"
247
- @secondModalButtonFunction="secondModalButtonFunction"
248
- @thirdModalButtonFunction="thirdModalButtonFunction"
249
- >
250
- <header></header>
251
- <main class="overflow-y-auto">
252
- <TipTapInput></TipTapInput>
253
- </main>
254
- </DynamicModal>
255
-
256
- <MediaLibraryModal
257
- :open="showMediaLibraryModal"
258
- :title="titleMedia"
259
- :description="descriptionMedia"
260
- :firstButtonText="firstButtonMedia"
261
- :secondButtonText="secondButtonMedia"
262
- :thirdButtonText="thirdButtonMedia"
263
- @firstMediaButtonFunction="firstMediaButtonFunction"
264
- @secondMediaButtonFunction="secondMediaButtonFunction"
265
- @thirdMediaButtonFunction="thirdMediaButtonFunction"
266
- >
267
- </MediaLibraryModal>
268
-
269
- <div
270
- class="z-20 py-1 px-2 h-20 flex items-center justify-center mt-2 mx-2 border-b border-myPrimaryLightGrayColor"
271
- >
272
- <div class="flex items-center justify-center divide-x divide-gray-200 py-1">
273
- <template v-if="pageBuilder.ElOrFirstChildIsIframe()">
274
- <div class="px-2 flex items-center justify-start gap-2">
275
- <button
276
- @click="handleModalIframeSrc"
277
- type="button"
278
- class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
279
- >
280
- <span class="material-symbols-outlined"> play_circle </span>
281
- <span>Add YouTube</span>
282
- </button>
283
- </div>
284
- </template>
285
-
286
- <template
287
- v-if="pageBuilder.selectedElementIsValidText() && !pageBuilder.ElOrFirstChildIsIframe()"
288
- >
289
- <div class="px-2 flex items-center justify-start gap-2">
290
- <button
291
- @click="handleModalPreviewTiptap"
292
- type="button"
293
- class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
294
- >
295
- <span class="material-symbols-outlined"> edit </span>
296
- <span>Edit text</span>
297
- </button>
298
- </div>
299
- <div class="px-2">
300
- <TextColorEditor></TextColorEditor>
301
- </div>
302
- </template>
303
-
304
- <template
305
- v-if="
306
- getElement &&
307
- getComponent &&
308
- getBasePrimaryImage !== null &&
309
- !pageBuilder.ElOrFirstChildIsIframe()
310
- "
311
- >
312
- <div class="px-2 flex items-center justify-start gap-2">
313
- <button
314
- @click="handleAddImage"
315
- type="button"
316
- class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
317
- >
318
- <span class="material-symbols-outlined"> add_photo_alternate </span>
319
- <span>Update image</span>
320
- </button>
321
- </div>
322
- </template>
323
-
324
- <template
325
- v-if="
326
- getElement &&
327
- Object.keys(getElement).length !== 0 &&
328
- !getBasePrimaryImage &&
329
- !pageBuilder.ElOrFirstChildIsIframe()
330
- "
331
- >
332
- <div class="px-2">
333
- <BackgroundColorEditor></BackgroundColorEditor>
334
- </div>
335
- </template>
336
344
  </div>
337
345
  </div>
338
346
  </template>
@@ -1,14 +1,13 @@
1
1
  <script setup>
2
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
3
- import PageBuilder from '@/composables/PageBuilder.ts'
4
-
5
- const pageBuilderStateStore = usePageBuilderStateStore()
6
-
7
- import { computed } from 'vue'
2
+ import { computed, inject } from 'vue'
3
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
4
+ import EditorAccordion from '@/Components/PageBuilder/EditorMenu/EditorAccordion.vue'
8
5
 
9
- const pageBuilder = new PageBuilder(pageBuilderStateStore)
6
+ // Get stores from parent PageBuilder component
7
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
8
+ const mediaLibraryStore = inject('mediaLibraryStore')
10
9
 
11
- import EditorAccordion from '@/Components/PageBuilder/EditorMenu/EditorAccordion.vue'
10
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
12
11
 
13
12
  const getElement = computed(() => {
14
13
  return pageBuilderStateStore.getElement
@@ -29,7 +28,7 @@ const getRestoredElement = computed(() => {
29
28
  <template v-if="getRestoredElement">
30
29
  <div class="px-2 flex items-center justify-start gap-2">
31
30
  <button
32
- @click="pageBuilder.handleRestoreElement"
31
+ @click="pageBuilderClass.handleRestoreElement"
33
32
  type="button"
34
33
  class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:bg-myPrimaryLinkColor hover:text-white focus-visible:ring-0"
35
34
  >
@@ -42,7 +41,7 @@ const getRestoredElement = computed(() => {
42
41
  <template v-if="getElement && !getRestoredElement">
43
42
  <div class="px-2 flex items-center justify-start gap-2">
44
43
  <button
45
- @click="pageBuilder.handleDeleteElement"
44
+ @click="pageBuilderClass.handleDeleteElement"
46
45
  type="button"
47
46
  class="text-[12.5px] gap-2 text-nowrap pl-2 pr-3 w-full h-10 cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 hover:text-white focus-visible:ring-0 hover:bg-myPrimaryErrorColor"
48
47
  >
@@ -1,14 +1,15 @@
1
1
  <script setup>
2
- import { computed, watch, ref } from 'vue'
2
+ import { computed, watch, ref, inject } from 'vue'
3
3
  import EditorAccordion from '@/Components/PageBuilder/EditorMenu/EditorAccordion.vue'
4
4
  import MediaLibraryModal from '@/Components/Modals/MediaLibraryModal.vue'
5
- import PageBuilder from '@/composables/PageBuilder.ts'
6
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
7
- import { useMediaLibraryStore } from '@/stores/media-library'
5
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
8
6
 
9
- const mediaLibraryStore = useMediaLibraryStore()
10
- const pageBuilderStateStore = usePageBuilderStateStore()
11
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
7
+ // Get stores from parent PageBuilder component
8
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
9
+ const mediaLibraryStore = inject('mediaLibraryStore')
10
+ const customMediaComponent = inject('CustomMediaComponent')
11
+
12
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
12
13
  const isLoading = ref(false)
13
14
 
14
15
  // use media library
@@ -48,7 +49,7 @@ const handleAddImage = function () {
48
49
  // handle click
49
50
  secondMediaButtonFunction.value = function () {
50
51
  isLoading.value = true
51
- pageBuilder.updateBasePrimaryImage({ type: 'unsplash' })
52
+ pageBuilderClass.updateBasePrimaryImage({ type: 'unsplash' })
52
53
 
53
54
  // close media library modal
54
55
  showMediaLibraryModal.value = false
@@ -59,24 +60,27 @@ const handleAddImage = function () {
59
60
  }
60
61
  </script>
61
62
  <template>
62
- <div v-if="getBasePrimaryImage !== null">
63
- <img
64
- class="object-cover object-center w-full cursor-pointer"
65
- :src="getBasePrimaryImage"
66
- @click="handleAddImage"
67
- alt="image"
68
- />
63
+ <div>
64
+ <div v-if="getBasePrimaryImage !== null">
65
+ <img
66
+ class="object-cover object-center w-full cursor-pointer"
67
+ :src="getBasePrimaryImage"
68
+ @click="handleAddImage"
69
+ alt="image"
70
+ />
71
+ </div>
72
+ <MediaLibraryModal
73
+ :open="showMediaLibraryModal"
74
+ :title="titleMedia"
75
+ :description="descriptionMedia"
76
+ :firstButtonText="firstButtonMedia"
77
+ :secondButtonText="secondButtonMedia"
78
+ :thirdButtonText="thirdButtonMedia"
79
+ :customMediaComponent="customMediaComponent"
80
+ @firstMediaButtonFunction="firstMediaButtonFunction"
81
+ @secondMediaButtonFunction="secondMediaButtonFunction"
82
+ @thirdMediaButtonFunction="thirdMediaButtonFunction"
83
+ >
84
+ </MediaLibraryModal>
69
85
  </div>
70
- <MediaLibraryModal
71
- :open="showMediaLibraryModal"
72
- :title="titleMedia"
73
- :description="descriptionMedia"
74
- :firstButtonText="firstButtonMedia"
75
- :secondButtonText="secondButtonMedia"
76
- :thirdButtonText="thirdButtonMedia"
77
- @firstMediaButtonFunction="firstMediaButtonFunction"
78
- @secondMediaButtonFunction="secondMediaButtonFunction"
79
- @thirdMediaButtonFunction="thirdMediaButtonFunction"
80
- >
81
- </MediaLibraryModal>
82
86
  </template>