@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,56 +1,56 @@
1
1
  <script setup>
2
- import SlideOverRightParent from '@/Components/PageBuilder/Slidebars/SlideOverRightParent.vue';
3
- import AdvancedPageBuilderSettings from '@/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue';
4
- import { ref, computed } from 'vue';
5
- import fullHTMLContent from '@/utils/builder/html-doc-declaration-with-components';
6
- import { usePageBuilderStateStore } from '@/stores/page-builder-state';
2
+ import SlideOverRightParent from '@/Components/PageBuilder/Slidebars/SlideOverRightParent.vue'
3
+ import AdvancedPageBuilderSettings from '@/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue'
4
+ import { ref, computed, onMounted, inject } from 'vue'
5
+ import fullHTMLContent from '@/utils/builder/html-doc-declaration-with-components'
7
6
 
8
- const pageBuilderStateStore = usePageBuilderStateStore();
7
+ // Get stores from parent PageBuilder component
8
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
9
9
 
10
- const showAdvancedSettingsSlideOverRight = ref(false);
11
- const titleSettingsSlideOverRight = ref('');
12
- const downloadedComponents = ref(null);
10
+ const showAdvancedSettingsSlideOverRight = ref(false)
11
+ const titleSettingsSlideOverRight = ref('')
12
+ const downloadedComponents = ref(null)
13
13
 
14
14
  // handle slideover window
15
15
  const handleAdvancedSettingsSlideOver = function () {
16
- titleSettingsSlideOverRight.value = 'Advanced Settings';
17
- showAdvancedSettingsSlideOverRight.value = true;
18
- };
16
+ titleSettingsSlideOverRight.value = 'Advanced Settings'
17
+ showAdvancedSettingsSlideOverRight.value = true
18
+ }
19
19
 
20
20
  // handle slideover window
21
21
  const settingsAdvancedSlideOverButton = function () {
22
- showAdvancedSettingsSlideOverRight.value = false;
23
- };
22
+ showAdvancedSettingsSlideOverRight.value = false
23
+ }
24
24
 
25
25
  const getComponents = computed(() => {
26
- return pageBuilderStateStore.getComponents;
27
- });
26
+ return pageBuilderStateStore.getComponents
27
+ })
28
28
 
29
29
  // generate HTML
30
30
  const generateHTML = function (filename, HTML) {
31
- const element = document.createElement('a');
31
+ const element = document.createElement('a')
32
32
  element.setAttribute(
33
33
  'href',
34
- 'data:text/html;charset=utf-8,' + encodeURIComponent(fullHTMLContent(HTML))
35
- );
36
- element.setAttribute('download', filename);
34
+ 'data:text/html;charset=utf-8,' + encodeURIComponent(fullHTMLContent(HTML)),
35
+ )
36
+ element.setAttribute('download', filename)
37
37
 
38
- element.style.display = 'none';
39
- document.body.appendChild(element);
38
+ element.style.display = 'none'
39
+ document.body.appendChild(element)
40
40
 
41
- element.click();
41
+ element.click()
42
42
 
43
- document.body.removeChild(element);
44
- };
43
+ document.body.removeChild(element)
44
+ }
45
45
 
46
46
  // handle download HTML
47
47
  const handleDownloadHTML = function () {
48
48
  downloadedComponents.value = getComponents.value.map((component) => {
49
- return component.html_code;
50
- });
49
+ return component.html_code
50
+ })
51
51
 
52
- generateHTML('downloaded_html.html', downloadedComponents.value.join(''));
53
- };
52
+ generateHTML('downloaded_html.html', downloadedComponents.value.join(''))
53
+ }
54
54
  </script>
55
55
 
56
56
  <template>
@@ -66,8 +66,8 @@ const handleDownloadHTML = function () {
66
66
  <div class="flex items-left flex-col gap-1">
67
67
  <h3 class="myQuaternaryHeader">Advanced Settings</h3>
68
68
  <p class="myPrimaryParagraph text-xs">
69
- Manage advanced settings here. Like an overview of Selected Element,
70
- Component, and Components in real-time.
69
+ Manage advanced settings here. Like an overview of Selected Element, Component, and
70
+ Components in real-time.
71
71
  </p>
72
72
  </div>
73
73
  <div class="mt-4">
@@ -88,11 +88,7 @@ const handleDownloadHTML = function () {
88
88
  <p class="myPrimaryParagraph text-xs">Download current page layout.</p>
89
89
  </div>
90
90
  <div class="mt-4">
91
- <button
92
- @click="handleDownloadHTML"
93
- type="button"
94
- class="myPrimaryButton text-xs"
95
- >
91
+ <button @click="handleDownloadHTML" type="button" class="myPrimaryButton text-xs">
96
92
  Download HTML file
97
93
  </button>
98
94
  </div>
@@ -1,14 +1,7 @@
1
1
  <script setup>
2
2
  import Modal from '@/Components/Modals/Modal.vue'
3
- import { ref, computed, onMounted, onBeforeMount, nextTick } from 'vue'
4
- import componentHelpers from '@/utils/builder/html-elements/componentHelpers'
5
- import PageBuilder from '@/composables/PageBuilder.ts'
6
- import SmallUniversalSpinner from '@/Components/Loaders/SmallUniversalSpinner.vue'
7
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
8
- import { useMediaLibraryStore } from '@/stores/media-library'
3
+ import NoneCustomSearchComponent from '@/Components/PageBuilder/NoneCustomSearchComponent.vue'
9
4
 
10
- const mediaLibraryStore = useMediaLibraryStore()
11
- const pageBuilderStateStore = usePageBuilderStateStore()
12
5
  const props = defineProps({
13
6
  firstButtonText: {
14
7
  required: true,
@@ -21,6 +14,10 @@ const props = defineProps({
21
14
  default: false,
22
15
  required: true,
23
16
  },
17
+ CustomSearchComponent: {
18
+ type: Object,
19
+ default: null,
20
+ },
24
21
  })
25
22
  const emit = defineEmits(['firstModalButtonSearchComponentsFunction'])
26
23
 
@@ -28,81 +25,6 @@ const emit = defineEmits(['firstModalButtonSearchComponentsFunction'])
28
25
  const firstButton = function () {
29
26
  emit('firstModalButtonSearchComponentsFunction')
30
27
  }
31
-
32
- const search_query = ref('')
33
- const categorySelected = ref({ name: 'Components', id: null })
34
-
35
- const handlecategorySelected = function (category) {
36
- categorySelected.value = category
37
- }
38
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
39
-
40
- const getFetchedComponents = computed(() => {
41
- return pageBuilderStateStore.getFetchedComponents
42
- })
43
-
44
- const getComponentArrayAddMethod = computed(() => {
45
- return pageBuilderStateStore.getComponentArrayAddMethod
46
- })
47
-
48
- const handleDropComponent = async function (componentObject) {
49
- await nextTick()
50
- const clonedComponent = pageBuilder.cloneCompObjForDOMInsertion({
51
- html_code: componentObject.html_code,
52
- id: componentObject.id,
53
- })
54
-
55
- await nextTick()
56
-
57
- pageBuilderStateStore.setPushComponents({
58
- component: clonedComponent,
59
- componentArrayAddMethod: getComponentArrayAddMethod.value,
60
- })
61
-
62
- await nextTick()
63
- pageBuilder.setEventListenersForElements()
64
-
65
- // Close modal
66
- firstButton()
67
- }
68
-
69
- const handleAddHelperComponent = async function (helperComponentObject) {
70
- await nextTick()
71
- const clonedComponent = pageBuilder.cloneCompObjForDOMInsertion({
72
- html_code: helperComponentObject.html_code,
73
- id: helperComponentObject.id,
74
- })
75
-
76
- await nextTick()
77
-
78
- pageBuilderStateStore.setPushComponents({
79
- component: clonedComponent,
80
- componentArrayAddMethod: getComponentArrayAddMethod.value,
81
- })
82
-
83
- await nextTick()
84
- pageBuilder.setEventListenersForElements()
85
-
86
- // Close modal
87
- firstButton()
88
- }
89
-
90
- const fetchComponents = function (page) {
91
- //remember old search value while paginating
92
- if (getFetchedComponents.value?.fetchedData?.oldInput?.search_query) {
93
- search_query.value = getFetchedComponents.value?.fetchedData?.oldInput?.search_query
94
- }
95
- //
96
- pageBuilderStateStore.setLoadComponents({
97
- page: page,
98
- search_query: search_query.value,
99
- })
100
- }
101
-
102
- //
103
- onMounted(async () => {
104
- fetchComponents(1)
105
- })
106
28
  </script>
107
29
 
108
30
  <template>
@@ -125,124 +47,14 @@ onMounted(async () => {
125
47
  </div>
126
48
 
127
49
  <div class="p-4">
128
- <!-- content start -->
129
- <template v-if="!getFetchedComponents.isLoading && getFetchedComponents.isError">
130
- <p class="myPrimaryInputError">
131
- {{ getFetchedComponents.error }}
132
- </p>
133
- </template>
134
-
135
- <!-- -->
136
-
137
- <!-- Loading # start -->
138
- <template v-if="getFetchedComponents && getFetchedComponents.isLoading">
139
- <SmallUniversalSpinner
140
- class="h-40"
141
- width="w-6"
142
- height="h-6"
143
- border="border-4"
144
- ></SmallUniversalSpinner>
145
- </template>
146
-
147
- <!-- Actual data # start -->
148
- <template v-if="!getFetchedComponents.isError && !getFetchedComponents.isLoading">
149
- <div class="flex gap-2 flex-wrap">
150
- <button
151
- @click="handlecategorySelected({ name: 'Components', id: null })"
152
- class="myPrimaryTag font-medium"
153
- >
154
- Components
155
- </button>
156
- <button
157
- @click="handlecategorySelected({ name: 'HTML Elements', id: null })"
158
- class="myPrimaryTag font-medium"
159
- >
160
- HTML Elements
161
- </button>
162
- </div>
163
-
164
- <div class="h-full flex md:flex-row flex-col myPrimaryGap mt-2 p-2 overflow-y-scroll">
165
- <section class="md:w-4/6">
166
- <template v-if="categorySelected && categorySelected.name === 'Components'">
167
- <div
168
- class="overflow-scroll min-h-[25rem] max-h-[25rem] grid myPrimaryGap md:grid-cols-2 grid-cols-2 w-full myPrimaryGap px-2 p-4 border border-myPrimaryLightGrayColor rounded-lg"
169
- >
170
- <div
171
- class="overflow-hidden whitespace-pre-line flex-1 h-auto rounded-lg border border-gray-200 lg:py-10 py-8 px-2"
172
- v-for="component in getFetchedComponents &&
173
- getFetchedComponents.fetchedData &&
174
- getFetchedComponents.fetchedData.components &&
175
- Array.isArray(getFetchedComponents.fetchedData.components.data) &&
176
- getFetchedComponents.fetchedData.components.data"
177
- :key="component.id"
178
- >
179
- <div class="relative">
180
- <template v-if="component && component.cover_image">
181
- <img
182
- :src="component.cover_image"
183
- alt="placeholder"
184
- class="max-h-72 cursor-pointer object-contain bg-white mx-auto"
185
- @click="handleDropComponent(component)"
186
- />
187
- </template>
188
- </div>
189
- </div>
190
- </div>
191
- </template>
192
- <template v-if="categorySelected && categorySelected.name === 'HTML Elements'">
193
- <div
194
- class="overflow-scroll min-h-[25rem] max-h-[25rem] px-2 p-4 border border-myPrimaryLightGrayColor rounded-lg"
195
- >
196
- <div class="flex gap-4 flex-wrap w-full">
197
- <!-- Unique HTML Component # start -->
198
- <div v-for="helperComponent in componentHelpers" :key="helperComponent.title">
199
- <div class="flex justify-left items-center gap-4 text-xs font-medium">
200
- <button
201
- @click="handleAddHelperComponent(helperComponent)"
202
- type="button"
203
- class="mySecondaryButton"
204
- >
205
- <span class="material-symbols-outlined text-sm"> add </span>
206
- <span>
207
- {{ helperComponent.title }}
208
- </span>
209
- </button>
210
- </div>
211
- </div>
212
- </div>
213
- </div>
214
- </template>
215
- </section>
216
- <aside
217
- class="md:w-2/6 overflow-scroll min-h-[30rem] max-h-[30rem] w-full border rounded-lg py-4 px-2"
218
- >
219
- <div class="flex gap-4 flex-wrap w-full">
220
- <!-- Unique HTML Component # start -->
221
- <div v-for="helperComponent in componentHelpers" :key="helperComponent.title">
222
- <div class="flex justify-left items-center gap-4 text-xs font-medium">
223
- <button
224
- @click="handleAddHelperComponent(helperComponent)"
225
- type="button"
226
- class="mySecondaryButton"
227
- >
228
- <span class="material-symbols-outlined text-sm"> add </span>
229
- <span>
230
- {{ helperComponent.title }}
231
- </span>
232
- </button>
233
- </div>
234
- </div>
235
- </div>
236
- </aside>
237
- </div>
238
- </template>
239
- <!-- Actual data # start -->
50
+ <!-- Only show custom search component if provided -->
51
+ <div v-if="CustomSearchComponent" class="border border-gray-200 rounded-lg p-4">
52
+ <component :is="CustomSearchComponent" />
53
+ </div>
54
+ <div v-else><NoneCustomSearchComponent /></div>
240
55
  </div>
241
56
  </div>
242
- <div
243
- v-if="!getFetchedComponents.isError"
244
- class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center"
245
- >
57
+ <div class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center">
246
58
  <div class="sm:w-3/6 w-full px-2 my-2 flex gap-2 justify-end">
247
59
  <button
248
60
  v-if="firstButtonText"
@@ -1,17 +1,18 @@
1
1
  <script setup>
2
- import PageBuilder from '@/composables/PageBuilder.ts'
3
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
4
- import { useMediaLibraryStore } from '@/stores/media-library'
2
+ import { inject } from 'vue'
3
+ import PageBuilderClass from '@/composables/PageBuilderClass.ts'
5
4
 
6
- const mediaLibraryStore = useMediaLibraryStore()
7
- const pageBuilderStateStore = usePageBuilderStateStore()
8
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
5
+ // Get stores from parent PageBuilder component
6
+ const pageBuilderStateStore = inject('pageBuilderStateStore')
7
+ const mediaLibraryStore = inject('mediaLibraryStore')
8
+
9
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore, mediaLibraryStore)
9
10
  </script>
10
11
 
11
12
  <template>
12
13
  <div>
13
14
  <div class="blockease-linear duration-200 block ease-linear">
14
- <template v-if="pageBuilder.selectedElementIsValidText()">
15
+ <template v-if="pageBuilderClass.selectedElementIsValidText()">
15
16
  <div
16
17
  class="border-t border-myPrimaryLightGrayColor flex flex-row justify-between items-center pl-3 pr-3 py-5 duration-200 hover:bg-myPrimaryLightGrayColor"
17
18
  >