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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +79 -76
  2. package/dist/page-builder/2-images-text.png +0 -0
  3. package/dist/page-builder/3-images-text.png +0 -0
  4. package/dist/page-builder/3-vertical-images.png +0 -0
  5. package/dist/page-builder/4-images-text.png +0 -0
  6. package/dist/vue-website-page-builder.css +1 -1
  7. package/dist/vue-website-page-builder.js +7168 -7261
  8. package/dist/vue-website-page-builder.umd.cjs +146 -81
  9. package/package.json +4 -3
  10. package/src/App.vue +4 -115
  11. package/src/Components/Homepage/HomeSection.vue +70 -162
  12. package/src/Components/MediaLibrary/SidebarUnsplash.vue +9 -16
  13. package/src/Components/MediaLibrary/Unsplash.vue +51 -91
  14. package/src/Components/Modals/MediaLibraryModal.vue +56 -318
  15. package/src/Components/Modals/PageBuilderPreviewModal.vue +22 -40
  16. package/src/Components/PageBuilder/AdvancedPageBuilderSettings.vue +7 -0
  17. package/src/Components/PageBuilder/DropdownsPlusToggles/OptionsDropdown.vue +165 -110
  18. package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +9 -16
  19. package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +18 -18
  20. package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +16 -21
  21. package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +12 -12
  22. package/src/Components/PageBuilder/EditorMenu/Editables/ComponentTopMenu.vue +10 -9
  23. package/src/Components/PageBuilder/EditorMenu/Editables/DeleteElement.vue +9 -9
  24. package/src/Components/PageBuilder/EditorMenu/Editables/EditGetElement.vue +144 -136
  25. package/src/Components/PageBuilder/EditorMenu/Editables/ElementEditor.vue +9 -10
  26. package/src/Components/PageBuilder/EditorMenu/Editables/ImageEditor.vue +31 -27
  27. package/src/Components/PageBuilder/EditorMenu/Editables/LinkEditor.vue +20 -14
  28. package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +9 -10
  29. package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +9 -10
  30. package/src/Components/PageBuilder/EditorMenu/Editables/PaddingPlusMargin.vue +16 -16
  31. package/src/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue +9 -16
  32. package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +22 -20
  33. package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +25 -27
  34. package/src/Components/PageBuilder/NoneCustomMediaLibraryComponent.vue +3 -0
  35. package/src/Components/PageBuilder/NoneCustomSearchComponent.vue +91 -0
  36. package/src/Components/PageBuilder/PageBuilderSettings.vue +8 -0
  37. package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +31 -72
  38. package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +32 -36
  39. package/src/Components/Search/SearchComponents.vue +11 -199
  40. package/src/Components/TipTap/TipTap.vue +8 -7
  41. package/src/Components/TipTap/TipTapInput.vue +136 -134
  42. package/src/PageBuilder/PageBuilder.vue +220 -32
  43. package/src/composables/{PageBuilder.ts → PageBuilderClass.ts} +223 -142
  44. package/src/composables/usePageBuilderModal.ts +25 -0
  45. package/src/index.ts +8 -2
  46. package/src/stores/media-library.ts +1 -5
  47. package/src/stores/page-builder-state.ts +52 -36
  48. package/src/stores/user.ts +8 -6
  49. package/src/types/global.d.ts +6 -44
  50. package/src/types/index.ts +169 -0
  51. package/src/utils/html-elements/component.ts +88 -0
  52. package/src/utils/html-elements/componentHelpers.ts +101 -0
  53. package/src/Components/Modals/PageBuilderModal.vue +0 -233
  54. package/src/utils/builder/html-elements/componentHelpers.ts +0 -101
@@ -0,0 +1,101 @@
1
+ interface ComponentHelper {
2
+ html_code: string
3
+ id: string | null
4
+ title: string
5
+ icon: string
6
+ }
7
+
8
+ const componentHelpers: ComponentHelper[] = [
9
+ {
10
+ html_code: `
11
+ <section>
12
+ <div class="relative py-4">
13
+ <div class="mx-auto max-w-7xl lg:px-4 px-2">
14
+ <div>
15
+ <p><strong>Text</strong></p><p>Tempus imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Erat nam at lectus urna duis convallis convallis. Congue mauris rhoncus aenean vel elit scelerisque.
16
+ Turpis tincidunt id aliquet risus feugiat in ante. Tincidunt dui ut ornare lectus sit. Ipsum dolor sit amet consectetur. Viverra ipsum nunc aliquet bibendum enim facilisis gravida neque convallis.<br><br>Dignissim sodales ut eu sem integer vitae justo eget magna.
17
+ Ac turpis egestas maecenas pharetra convallis. Mauris sit amet massa vitae. Ut tellus elementum sagittis vitae et. Sed risus ultricies tristique nulla aliquet enim tortor. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Quis vel eros donec ac odio tempor.
18
+ Faucibus scelerisque eleifend donec pretium. <br><br>Adipiscing bibendum est ultricies integer quis auctor elit. Vestibulum morbi blandit cursus risus at ultrices mi tempus imperdiet. Id porta nibh venenatis cras sed felis eget. Gravida dictum fusce ut placerat orci nulla.
19
+ Consequat mauris nunc congue nisi vitae suscipit tellus mauris. <br><br></p><p><strong>List</strong></p><ul><li><p>Integer enim neque volutpat ac tincidunt vitae semper quis. Sit amet consectetur adipiscing elit pellentesque.</p></li><li><p>Urna cursus eget nunc scelerisque viverra.
20
+ Cursus metus aliquam eleifend mi in nulla posuere. Lobortis elementum nibh tellus molestie nunc non blandit massa.</p></li><li><p>Sodales ut eu sem integer vitae justo eget magna. Scelerisque felis imperdiet proin fermentum leo vel orci. Nunc id cursus metus aliquam eleifend.</p></li></ul>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </section>`,
25
+ id: null,
26
+ title: 'Text',
27
+ icon: `
28
+ <span class="material-symbols-outlined">
29
+ text_fields
30
+ </span>
31
+ `,
32
+ },
33
+ {
34
+ html_code: `<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words"><h2>Consequat mauris nunc congue</h2></div></div></div></section>`,
35
+ id: null,
36
+ title: 'Header H2',
37
+ icon: `
38
+ <span class="material-symbols-outlined">
39
+ format_h2
40
+ </span>
41
+ `,
42
+ },
43
+ {
44
+ html_code: `<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words"><h3>Consequat mauris nunc congue</h3></div></div></div></section>`,
45
+ id: null,
46
+ title: 'Header H3',
47
+ icon: `
48
+ <span class="material-symbols-outlined">
49
+ format_h3
50
+ </span>
51
+ `,
52
+ },
53
+ {
54
+ html_code: `
55
+ <section>
56
+ <div class="py-4">
57
+ <div class="mx-auto max-w-7xl lg:px-4 px-2">
58
+ <div id="youtube-video" class="w-full aspect-video bg-slate-100 border border-slate-200 rounded-xl lg:p-8 md:p-6 p-4">
59
+
60
+ <iframe
61
+ frameborder="0"
62
+ allowfullscreen
63
+ class="w-full aspect-video bg-gray-600 border border-slate-800 rounded-xl"
64
+ src=""
65
+ allow="accelerometer; autoplay; clipboard-write;" allowfullscreen>
66
+ </iframe>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </section>`,
71
+ id: null,
72
+ title: 'YouTube Video',
73
+ icon: `
74
+ <span class="material-symbols-outlined">
75
+ play_circle
76
+ </span>
77
+ `,
78
+ },
79
+ {
80
+ html_code: `<section><div class="relative py-8"><div class="absolute inset-0 flex items-center" aria-hidden="true"><div class="w-full border-4 border-gray-800 leading-none"></div></div><div class="relative flex justify-start"></div></div></section>`,
81
+ id: null,
82
+ title: 'Break Divider',
83
+ icon: `
84
+ <span class="material-symbols-outlined">
85
+ horizontal_rule
86
+ </span>
87
+ `,
88
+ },
89
+ {
90
+ html_code: `<section>\n<div class=\"w-full md:pt-2 md:pb-2 pt-4 pb-4 lg:px-4 px-2\">\n<div class=\"mx-auto max-w-7xl\">\n<div id=\"linktree\"\nclass=\"border-2 border-gray-600 flex items-centre justify-start rounded-md font-medium text-black\">\n<p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://www.google.com\">Link to landing page</a>\n</p>\n</div>\n</div>\n</div>\n</section>`,
91
+ id: null,
92
+ title: 'Link',
93
+ icon: `
94
+ <span class="material-symbols-outlined">
95
+ horizontal_rule
96
+ </span>
97
+ `,
98
+ },
99
+ ]
100
+
101
+ export default componentHelpers
@@ -1,233 +0,0 @@
1
- <script setup>
2
- import Modal from '@/Components/Modals/Modal.vue'
3
- import DynamicModal from '@/Components/Modals/DynamicModal.vue'
4
- import PageBuilder from '@/composables/PageBuilder.ts'
5
- import { delay } from '@/composables/delay'
6
-
7
- import {
8
- Dialog,
9
- DialogOverlay,
10
- DialogTitle,
11
- TransitionChild,
12
- TransitionRoot,
13
- } from '@headlessui/vue'
14
- import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/vue'
15
- import { computed, onMounted, ref } from 'vue'
16
- import { usePageBuilderStateStore } from '@/stores/page-builder-state'
17
- import { useUserStore } from '@/stores/user'
18
- import { useMediaLibraryStore } from '@/stores/media-library'
19
-
20
- const mediaLibraryStore = useMediaLibraryStore()
21
- const userStore = useUserStore()
22
- const pageBuilderStateStore = usePageBuilderStateStore()
23
-
24
- defineProps({
25
- show: {
26
- type: Boolean,
27
- default: false,
28
- required: true,
29
- },
30
- updateOrCreate: {
31
- required: true,
32
- },
33
- })
34
-
35
- const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
36
-
37
- const hideDraftButton = ref(true)
38
-
39
- const showModalConfirmClosePageBuilder = ref(false)
40
- //
41
- // use dynamic model
42
- const typeModal = ref('')
43
- const gridColumnModal = ref(Number(1))
44
- const titleModal = ref('')
45
- const descriptionModal = ref('')
46
- const firstButtonModal = ref('')
47
- const secondButtonModal = ref(null)
48
- const thirdButtonModal = ref(null)
49
- // set dynamic modal handle functions
50
- const firstModalButtonFunction = ref(null)
51
- const secondModalButtonFunction = ref(null)
52
- const thirdModalButtonFunction = ref(null)
53
-
54
- const emit = defineEmits([
55
- 'pageBuilderPrimaryHandler',
56
- 'pageBuilderSecondaryHandler',
57
- 'handleDraftForUpdate',
58
- ])
59
-
60
- const firstButton = function () {
61
- showModalConfirmClosePageBuilder.value = true
62
- typeModal.value = 'danger'
63
- gridColumnModal.value = 3
64
- titleModal.value = 'Close page builder without save?'
65
- descriptionModal.value =
66
- 'Are you sure you want to close the page builder without saving? Any changes will be lost.'
67
- firstButtonModal.value = 'Close'
68
- secondButtonModal.value = null
69
- thirdButtonModal.value = 'Exit Page Builder'
70
-
71
- // handle click
72
- firstModalButtonFunction.value = function () {
73
- showModalConfirmClosePageBuilder.value = false
74
- }
75
- // handle click
76
- secondModalButtonFunction.value = function () {
77
- secondButton()
78
- }
79
-
80
- // handle click
81
- thirdModalButtonFunction.value = async function () {
82
- showModalConfirmClosePageBuilder.value = false
83
- emit('pageBuilderPrimaryHandler')
84
-
85
- pageBuilder.removeHoveredAndSelected()
86
- userStore.setIsLoading(true)
87
- await delay()
88
- userStore.setIsLoading(false)
89
- }
90
- //
91
- // end modal
92
- }
93
-
94
- const handleEscapeKey = function () {
95
- firstButton()
96
- }
97
-
98
- // first button function
99
- const secondButton = function () {
100
- emit('pageBuilderSecondaryHandler')
101
- pageBuilder.removeHoveredAndSelected()
102
- }
103
-
104
- //
105
- //
106
- const getLocalStorageItemNameUpdate = computed(() => {
107
- return pageBuilderStateStore.getLocalStorageItemNameUpdate
108
- })
109
- //
110
- const handleDraftForUpdate = function () {
111
- hideDraftButton.value = false
112
- emit('handleDraftForUpdate')
113
- }
114
-
115
- onMounted(() => {
116
- const item = localStorage.getItem(getLocalStorageItemNameUpdate.value)
117
- if (item) {
118
- const parsedValue = JSON.parse(item)
119
-
120
- if (Array.isArray(parsedValue) && parsedValue.length === 0) {
121
- hideDraftButton.value = false
122
- }
123
- }
124
- if (!item) {
125
- hideDraftButton.value = false
126
- }
127
- })
128
- </script>
129
-
130
- <template>
131
- <teleport to="body">
132
- <TransitionRoot :show="show" as="template">
133
- <Dialog
134
- @close="firstButton"
135
- @keydown.escape.prevent="handleEscapeKey"
136
- as="div"
137
- class="fixed z-30 inset-0 overflow-y-auto focus:outline-none"
138
- tabindex="0"
139
- >
140
- <div class="flex items-end justify-center pb-20 text-center sm:block sm:p-0 bg-white">
141
- <TransitionChild
142
- as="template"
143
- enter="ease-out duration-100"
144
- enter-from="opacity-0"
145
- enter-to="opacity-100"
146
- leave="ease-in duration-200"
147
- leave-from="opacity-100"
148
- leave-to="opacity-0"
149
- >
150
- <DialogOverlay class="fixed inset-0 bg-white bg-opacity-75 transition-opacity" />
151
- </TransitionChild>
152
-
153
- <!-- This element is to trick the browser into centering the modal contents. -->
154
- <span aria-hidden="true" class="hidden sm:inline-block sm:align-middle sm:h-screen"
155
- >&#8203;</span
156
- >
157
- <TransitionChild
158
- as="template"
159
- enter="ease-out duration-100"
160
- enter-from="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
161
- enter-to="opacity-100 translate-y-0 sm:scale-100"
162
- leave="ease-in duration-200"
163
- leave-from="opacity-100 translate-y-0 sm:scale-100"
164
- leave-to="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
165
- >
166
- <div
167
- class="bg-red-100 inline-block align-bottom text-left transform transition-all sm:align-middle w-full overflow-hidden h-[100vh] top-0 left-0 right-0 absolute"
168
- >
169
- <DynamicModal
170
- :show="showModalConfirmClosePageBuilder"
171
- :type="typeModal"
172
- :gridColumnAmount="gridColumnModal"
173
- :title="titleModal"
174
- :description="descriptionModal"
175
- :firstButtonText="firstButtonModal"
176
- :secondButtonText="secondButtonModal"
177
- :thirdButtonText="thirdButtonModal"
178
- @firstModalButtonFunction="firstModalButtonFunction"
179
- @secondModalButtonFunction="secondModalButtonFunction"
180
- @thirdModalButtonFunction="thirdModalButtonFunction"
181
- >
182
- <header></header>
183
- <main></main>
184
- </DynamicModal>
185
- <div
186
- @click="pageBuilderStateStore.setComponent(null)"
187
- class="px-4 px-4 lg:h-[10vh] h-[16vh] flex items-center justify-between border-b border-gray-200 bg-white"
188
- >
189
- <div class="flex items-center justify-start divide-x divide-gray-200">
190
- <button type="button" @click="firstButton" class="border-r border-gray-200 pr-6">
191
- <img class="h-6" src="/logo/logo.svg" alt="Logo" />
192
- </button>
193
- <button
194
- class="myPrimaryButton lg:text-sm text-[10px] lg:py-2 py-2 min-h-2 ml-4"
195
- @click="secondButton"
196
- type="button"
197
- >
198
- <span class="material-symbols-outlined text-[18px]"> save </span>
199
- Save & Close
200
- </button>
201
- <button
202
- v-if="updateOrCreate === 'update' && hideDraftButton"
203
- class="mySecondaryButton lg:text-sm text-[10px] lg:py-2 py-2 min-h-2 ml-2"
204
- @click="handleDraftForUpdate"
205
- type="button"
206
- >
207
- <span class="material-symbols-outlined text-[18px]">
208
- settings_backup_restore
209
- </span>
210
- Use Draft
211
- </button>
212
- </div>
213
- <button
214
- type="button"
215
- @click="firstButton"
216
- class="flex items-center justify-center gap-1 cursor-pointer"
217
- >
218
- <span class="myPrimaryParagraph font-medium"> Close Builder </span>
219
- <div
220
- 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"
221
- >
222
- <span class="material-symbols-outlined"> close </span>
223
- </div>
224
- </button>
225
- </div>
226
- <slot></slot>
227
- </div>
228
- </TransitionChild>
229
- </div>
230
- </Dialog>
231
- </TransitionRoot>
232
- </teleport>
233
- </template>
@@ -1,101 +0,0 @@
1
- interface ComponentHelper {
2
- html_code: string
3
- id: string | null
4
- title: string
5
- icon: string
6
- }
7
-
8
- const componentHelpers: ComponentHelper[] = [
9
- {
10
- html_code: `
11
- <section>
12
- <div class="relative py-4">
13
- <div class="mx-auto max-w-7xl lg:px-4 px-2">
14
- <div>
15
- <p><strong>Text</strong></p><p>Tempus imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Erat nam at lectus urna duis convallis convallis. Congue mauris rhoncus aenean vel elit scelerisque.
16
- Turpis tincidunt id aliquet risus feugiat in ante. Tincidunt dui ut ornare lectus sit. Ipsum dolor sit amet consectetur. Viverra ipsum nunc aliquet bibendum enim facilisis gravida neque convallis.<br><br>Dignissim sodales ut eu sem integer vitae justo eget magna.
17
- Ac turpis egestas maecenas pharetra convallis. Mauris sit amet massa vitae. Ut tellus elementum sagittis vitae et. Sed risus ultricies tristique nulla aliquet enim tortor. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Quis vel eros donec ac odio tempor.
18
- Faucibus scelerisque eleifend donec pretium. <br><br>Adipiscing bibendum est ultricies integer quis auctor elit. Vestibulum morbi blandit cursus risus at ultrices mi tempus imperdiet. Id porta nibh venenatis cras sed felis eget. Gravida dictum fusce ut placerat orci nulla.
19
- Consequat mauris nunc congue nisi vitae suscipit tellus mauris. <br><br></p><p><strong>List</strong></p><ul><li><p>Integer enim neque volutpat ac tincidunt vitae semper quis. Sit amet consectetur adipiscing elit pellentesque.</p></li><li><p>Urna cursus eget nunc scelerisque viverra.
20
- Cursus metus aliquam eleifend mi in nulla posuere. Lobortis elementum nibh tellus molestie nunc non blandit massa.</p></li><li><p>Sodales ut eu sem integer vitae justo eget magna. Scelerisque felis imperdiet proin fermentum leo vel orci. Nunc id cursus metus aliquam eleifend.</p></li></ul>
21
- </div>
22
- </div>
23
- </div>
24
- </section>`,
25
- id: null,
26
- title: 'Text',
27
- icon: `
28
- <span class="material-symbols-outlined">
29
- text_fields
30
- </span>
31
- `,
32
- },
33
- {
34
- html_code: `<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words"><h2>Consequat mauris nunc congue</h2></div></div></div></section>`,
35
- id: null,
36
- title: 'Header H2',
37
- icon: `
38
- <span class="material-symbols-outlined">
39
- format_h2
40
- </span>
41
- `,
42
- },
43
- {
44
- html_code: `<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words"><h3>Consequat mauris nunc congue</h3></div></div></div></section>`,
45
- id: null,
46
- title: 'Header H3',
47
- icon: `
48
- <span class="material-symbols-outlined">
49
- format_h3
50
- </span>
51
- `,
52
- },
53
- {
54
- html_code: `
55
- <section>
56
- <div class="py-4">
57
- <div class="mx-auto max-w-7xl lg:px-4 px-2">
58
- <div id="youtube-video" class="w-full aspect-video bg-slate-100 border border-slate-200 rounded-xl lg:p-8 md:p-6 p-4">
59
-
60
- <iframe
61
- frameborder="0"
62
- allowfullscreen
63
- class="w-full aspect-video bg-gray-600 border border-slate-800 rounded-xl"
64
- src=""
65
- allow="accelerometer; autoplay; clipboard-write;" allowfullscreen>
66
- </iframe>
67
- </div>
68
- </div>
69
- </div>
70
- </section>`,
71
- id: null,
72
- title: 'YouTube Video',
73
- icon: `
74
- <span class="material-symbols-outlined">
75
- play_circle
76
- </span>
77
- `,
78
- },
79
- {
80
- html_code: `<section><div class="relative py-8"><div class="absolute inset-0 flex items-center" aria-hidden="true"><div class="w-full border-4 border-gray-800 leading-none"></div></div><div class="relative flex justify-start"></div></div></section>`,
81
- id: null,
82
- title: 'Break Divider',
83
- icon: `
84
- <span class="material-symbols-outlined">
85
- horizontal_rule
86
- </span>
87
- `,
88
- },
89
- {
90
- html_code: `<section>\n<div class=\"w-full md:pt-2 md:pb-2 pt-4 pb-4 lg:px-4 px-2\">\n<div class=\"mx-auto max-w-7xl\">\n<div id=\"linktree\"\nclass=\"border-2 border-gray-600 flex items-centre justify-start rounded-md font-medium text-black\">\n<p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://www.google.com\">Link to landing page</a>\n</p>\n</div>\n</div>\n</div>\n</section>`,
91
- id: null,
92
- title: 'Link',
93
- icon: `
94
- <span class="material-symbols-outlined">
95
- horizontal_rule
96
- </span>
97
- `,
98
- },
99
- ]
100
-
101
- export default componentHelpers