@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.
- 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 +4 -3
- 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,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
|
|
4
|
-
import
|
|
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
|
-
|
|
17
|
-
const pageBuilderStateStore =
|
|
18
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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="
|
|
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="
|
|
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="
|
|
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,
|
|
3
|
-
import EditorAccordion from '
|
|
4
|
-
import
|
|
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
|
-
|
|
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 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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
46
|
-
|
|
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
|
|
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
|
-
|
|
9
|
-
const pageBuilderStateStore =
|
|
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
|
|
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
|
-
|
|
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="
|
|
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="
|
|
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,
|
|
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>
|