@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.
- package/README.md +79 -76
- package/dist/page-builder/2-images-text.png +0 -0
- package/dist/page-builder/3-images-text.png +0 -0
- package/dist/page-builder/3-vertical-images.png +0 -0
- package/dist/page-builder/4-images-text.png +0 -0
- package/dist/vue-website-page-builder.css +1 -1
- package/dist/vue-website-page-builder.js +7168 -7261
- package/dist/vue-website-page-builder.umd.cjs +146 -81
- package/package.json +5 -4
- package/src/App.vue +4 -115
- package/src/Components/Homepage/HomeSection.vue +70 -162
- package/src/Components/MediaLibrary/SidebarUnsplash.vue +9 -16
- package/src/Components/MediaLibrary/Unsplash.vue +51 -91
- package/src/Components/Modals/MediaLibraryModal.vue +56 -318
- package/src/Components/Modals/PageBuilderPreviewModal.vue +22 -40
- package/src/Components/PageBuilder/AdvancedPageBuilderSettings.vue +7 -0
- package/src/Components/PageBuilder/DropdownsPlusToggles/OptionsDropdown.vue +165 -110
- package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +9 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +18 -18
- package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +16 -21
- package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +12 -12
- package/src/Components/PageBuilder/EditorMenu/Editables/ComponentTopMenu.vue +10 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/DeleteElement.vue +9 -9
- package/src/Components/PageBuilder/EditorMenu/Editables/EditGetElement.vue +144 -136
- package/src/Components/PageBuilder/EditorMenu/Editables/ElementEditor.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/ImageEditor.vue +31 -27
- package/src/Components/PageBuilder/EditorMenu/Editables/LinkEditor.vue +20 -14
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +9 -10
- package/src/Components/PageBuilder/EditorMenu/Editables/PaddingPlusMargin.vue +16 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue +9 -16
- package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +22 -20
- package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +25 -27
- package/src/Components/PageBuilder/NoneCustomMediaLibraryComponent.vue +3 -0
- package/src/Components/PageBuilder/NoneCustomSearchComponent.vue +91 -0
- package/src/Components/PageBuilder/PageBuilderSettings.vue +8 -0
- package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +31 -72
- package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +32 -36
- package/src/Components/Search/SearchComponents.vue +11 -199
- package/src/Components/TipTap/TipTap.vue +8 -7
- package/src/Components/TipTap/TipTapInput.vue +136 -134
- package/src/PageBuilder/PageBuilder.vue +220 -32
- package/src/composables/{PageBuilder.ts → PageBuilderClass.ts} +223 -142
- package/src/composables/usePageBuilderModal.ts +25 -0
- package/src/index.ts +8 -2
- package/src/stores/media-library.ts +1 -5
- package/src/stores/page-builder-state.ts +52 -36
- package/src/stores/user.ts +8 -6
- package/src/types/global.d.ts +6 -44
- package/src/types/index.ts +169 -0
- package/src/utils/html-elements/component.ts +88 -0
- package/src/utils/html-elements/componentHelpers.ts +101 -0
- package/src/Components/Modals/PageBuilderModal.vue +0 -233
- 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,
|
|
4
|
-
import
|
|
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
|
-
|
|
9
|
-
const pageBuilderStateStore =
|
|
10
|
-
const
|
|
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="
|
|
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="
|
|
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,
|
|
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
|
|
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
|
-
|
|
13
|
-
const pageBuilderStateStore =
|
|
14
|
-
const
|
|
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
|
-
|
|
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
|
-
<
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
<
|
|
221
|
-
<div class="
|
|
222
|
-
<div class="
|
|
223
|
-
<
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
<
|
|
227
|
-
|
|
228
|
-
|
|
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 {
|
|
3
|
-
import
|
|
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
|
-
|
|
6
|
+
// Get stores from parent PageBuilder component
|
|
7
|
+
const pageBuilderStateStore = inject('pageBuilderStateStore')
|
|
8
|
+
const mediaLibraryStore = inject('mediaLibraryStore')
|
|
10
9
|
|
|
11
|
-
|
|
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="
|
|
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="
|
|
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
|
|
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
|
-
|
|
10
|
-
const pageBuilderStateStore =
|
|
11
|
-
const
|
|
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
|
-
|
|
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
|
|
63
|
-
<
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
2
|
+
import { ref, computed, inject, watch, nextTick } from 'vue'
|
|
3
3
|
import EditorAccordion from '../EditorAccordion.vue'
|
|
4
|
-
import
|
|
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
|
-
|
|
10
|
-
const pageBuilderStateStore =
|
|
11
|
-
const
|
|
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
|
-
|
|
62
|
+
pageBuilderClass.handleHyperlink(hyperlinkEnable.value, data)
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
// add hyperlink
|
|
66
66
|
const handleHyperlink = function () {
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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,
|
|
3
|
-
import
|
|
4
|
-
import
|
|
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
|
-
|
|
17
|
-
const pageBuilderStateStore =
|
|
18
|
-
const
|
|
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
|
-
|
|
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="
|
|
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,
|
|
3
|
-
import
|
|
4
|
-
import
|
|
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
|
-
|
|
17
|
-
const pageBuilderStateStore =
|
|
18
|
-
const
|
|
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
|
-
|
|
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="
|
|
73
|
+
@click="pageBuilderClass.handleOpacity(elementOpacity)"
|
|
75
74
|
:key="elementOpacity"
|
|
76
75
|
:value="elementOpacity"
|
|
77
76
|
v-slot="{ active }"
|