@myissue/vue-website-page-builder 3.0.17 → 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 +5 -4
  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,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>
@@ -1,14 +1,14 @@
1
1
  <script setup>
2
- import PageBuilder from '@/composables/PageBuilder.ts'
2
+ import { ref, computed, inject, watch, nextTick } from 'vue'
3
3
  import EditorAccordion from '../EditorAccordion.vue'
4
- import { computed, nextTick, ref, watch } from 'vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
5
5
  import { Switch } from '@headlessui/vue'
6
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
7
- import { useMediaLibraryStore } from '@/stores/media-library'
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
+
11
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
12
12
  const hyperlinkEnable = ref(false)
13
13
  const urlInput = ref(null)
14
14
  const openHyperlinkInNewTab = ref(false)
@@ -59,18 +59,26 @@ const handleToggleHyperlinkEnable = async function (data) {
59
59
 
60
60
  // remove hyperlink
61
61
  if (hyperlinkEnable.value === false) {
62
- pageBuilder.handleHyperlink(hyperlinkEnable.value, data)
62
+ pageBuilderClass.handleHyperlink(hyperlinkEnable.value, data)
63
63
  }
64
64
  }
65
65
  // add hyperlink
66
66
  const handleHyperlink = function () {
67
- pageBuilder.handleHyperlink(hyperlinkEnable.value, urlInput.value, openHyperlinkInNewTab.value)
67
+ pageBuilderClass.handleHyperlink(
68
+ hyperlinkEnable.value,
69
+ urlInput.value,
70
+ openHyperlinkInNewTab.value,
71
+ )
68
72
  }
69
73
 
70
74
  const handleToggleOpenHyperlinkInNewTab = async function () {
71
75
  await nextTick()
72
76
 
73
- pageBuilder.handleHyperlink(hyperlinkEnable.value, urlInput.value, openHyperlinkInNewTab.value)
77
+ pageBuilderClass.handleHyperlink(
78
+ hyperlinkEnable.value,
79
+ urlInput.value,
80
+ openHyperlinkInNewTab.value,
81
+ )
74
82
  }
75
83
  </script>
76
84
 
@@ -82,7 +90,7 @@ const handleToggleOpenHyperlinkInNewTab = async function () {
82
90
  <div v-if="getHyperlinkAbility === false" class="rounded-md bg-red-50 p-2">
83
91
  <div class="flex items-center">
84
92
  <div class="flex-shrink-0">
85
- <ExclamationCircleIcon class="w-4 h-4 text-myPrimaryErrorColor"></ExclamationCircleIcon>
93
+ <span class="myMediumIcon material-symbols-outlined"> warning </span>
86
94
  </div>
87
95
  <div class="ml-2">
88
96
  <p class="text-sm font-medium text-green-800">
@@ -187,9 +195,7 @@ const handleToggleOpenHyperlinkInNewTab = async function () {
187
195
  <div v-if="getElementContainsHyperlink === false" class="rounded-md bg-red-50 p-2">
188
196
  <div class="flex items-center">
189
197
  <div class="flex-shrink-0">
190
- <ExclamationCircleIcon
191
- class="w-4 h-4 text-myPrimaryErrorColor"
192
- ></ExclamationCircleIcon>
198
+ <span class="myMediumIcon material-symbols-outlined"> warning </span>
193
199
  </div>
194
200
  <div class="ml-2">
195
201
  <p class="text-sm font-medium text-green-800">No hyperlink added</p>
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
- import { computed, onMounted, watch } from 'vue'
3
- import PageBuilder from '@/composables/PageBuilder.ts'
4
- import { ref } from 'vue'
2
+ import { ref, computed, inject, watch } from 'vue'
3
+ import EditorAccordion from '../EditorAccordion.vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
5
5
  import tailwindOpacities from '@/utils/builder/tailwind-opacities'
6
6
  import {
7
7
  Listbox,
@@ -10,12 +10,11 @@ import {
10
10
  ListboxOption,
11
11
  ListboxOptions,
12
12
  } from '@headlessui/vue'
13
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
14
- import { useMediaLibraryStore } from '@/stores/media-library'
15
13
 
16
- const mediaLibraryStore = useMediaLibraryStore()
17
- const pageBuilderStateStore = usePageBuilderStateStore()
18
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
14
+ // Get stores from parent PageBuilder component
15
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
16
+ const mediaLibraryStore = inject('mediaLibraryStore')
17
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
19
18
  const opacityVueModel = ref(null)
20
19
  const getBackgroundOpacity = computed(() => {
21
20
  return pageBuilderStateStore.getBackgroundOpacity
@@ -25,7 +24,7 @@ watch(
25
24
  getBackgroundOpacity,
26
25
  (newValue) => {
27
26
  opacityVueModel.value = newValue
28
- pageBuilder.handlePageBuilderMethods()
27
+ pageBuilderClass.handlePageBuilderMethods()
29
28
  },
30
29
  { immediate: true },
31
30
  )
@@ -71,7 +70,7 @@ watch(
71
70
  <ListboxOption
72
71
  as="template"
73
72
  v-for="backgroundOpacity in tailwindOpacities.backgroundOpacities"
74
- @click="pageBuilder.handleBackgroundOpacity(backgroundOpacity)"
73
+ @click="pageBuilderClass.handleBackgroundOpacity(backgroundOpacity)"
75
74
  :key="backgroundOpacity"
76
75
  :value="backgroundOpacity"
77
76
  v-slot="{ active }"
@@ -1,7 +1,7 @@
1
1
  <script setup>
2
- import { computed, onMounted, watch } from 'vue'
3
- import PageBuilder from '@/composables/PageBuilder.ts'
4
- import { ref } from 'vue'
2
+ import { ref, computed, inject, watch } from 'vue'
3
+ import EditorAccordion from '../EditorAccordion.vue'
4
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
5
5
  import tailwindOpacities from '@/utils/builder/tailwind-opacities'
6
6
  import {
7
7
  Listbox,
@@ -10,12 +10,11 @@ import {
10
10
  ListboxOption,
11
11
  ListboxOptions,
12
12
  } from '@headlessui/vue'
13
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
14
- import { useMediaLibraryStore } from '@/stores/media-library'
15
13
 
16
- const mediaLibraryStore = useMediaLibraryStore()
17
- const pageBuilderStateStore = usePageBuilderStateStore()
18
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
14
+ // Get stores from parent PageBuilder component
15
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
16
+ const mediaLibraryStore = inject('mediaLibraryStore')
17
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
19
18
  const opacityVueModel = ref(null)
20
19
  const getOpacity = computed(() => {
21
20
  return pageBuilderStateStore.getOpacity
@@ -25,7 +24,7 @@ watch(
25
24
  getOpacity,
26
25
  (newValue) => {
27
26
  opacityVueModel.value = newValue
28
- pageBuilder.handlePageBuilderMethods()
27
+ pageBuilderClass.handlePageBuilderMethods()
29
28
  },
30
29
  { immediate: true },
31
30
  )
@@ -71,7 +70,7 @@ watch(
71
70
  <ListboxOption
72
71
  as="template"
73
72
  v-for="elementOpacity in tailwindOpacities.opacities"
74
- @click="pageBuilder.handleOpacity(elementOpacity)"
73
+ @click="pageBuilderClass.handleOpacity(elementOpacity)"
75
74
  :key="elementOpacity"
76
75
  :value="elementOpacity"
77
76
  v-slot="{ active }"