@myissue/vue-website-page-builder 3.0.1

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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +470 -0
  3. package/dist/android-chrome-192x192.png +0 -0
  4. package/dist/android-chrome-512x512.png +0 -0
  5. package/dist/apple-touch-icon.png +0 -0
  6. package/dist/browserconfig.xml +9 -0
  7. package/dist/components.json +36 -0
  8. package/dist/favicon-16x16.png +0 -0
  9. package/dist/favicon-32x32.png +0 -0
  10. package/dist/favicon.ico +0 -0
  11. package/dist/home/features.jpg +0 -0
  12. package/dist/home/page-builder-example.jpg +0 -0
  13. package/dist/logo/logo.svg +49 -0
  14. package/dist/mstile-310x150.png +0 -0
  15. package/dist/mstile-310x310.png +0 -0
  16. package/dist/page-builder/2-images-text-top.png +0 -0
  17. package/dist/page-builder/2-images.png +0 -0
  18. package/dist/page-builder/3-images.png +0 -0
  19. package/dist/page-builder/6-images.png +0 -0
  20. package/dist/page-builder/image.png +0 -0
  21. package/dist/page-builder/placeholder.jpg +0 -0
  22. package/dist/page-builder/two-vertical-images.png +0 -0
  23. package/dist/placeholder_image.jpg +0 -0
  24. package/dist/robots.txt +2 -0
  25. package/dist/vue-website-page-builder.css +1 -0
  26. package/dist/vue-website-page-builder.js +24794 -0
  27. package/dist/vue-website-page-builder.umd.cjs +195 -0
  28. package/package.json +99 -0
  29. package/src/App.vue +122 -0
  30. package/src/Components/Homepage/Footer.vue +42 -0
  31. package/src/Components/Homepage/HomeSection.vue +540 -0
  32. package/src/Components/Homepage/Navbar.vue +30 -0
  33. package/src/Components/Layouts/FullWidthElement.vue +34 -0
  34. package/src/Components/Loaders/FullScreenSpinner.vue +13 -0
  35. package/src/Components/Loaders/SmallUniversalSpinner.vue +26 -0
  36. package/src/Components/MediaLibrary/SidebarUnsplash.vue +40 -0
  37. package/src/Components/MediaLibrary/Unsplash.vue +306 -0
  38. package/src/Components/Modals/DynamicModal.vue +476 -0
  39. package/src/Components/Modals/MediaLibraryModal.vue +418 -0
  40. package/src/Components/Modals/Modal.vue +102 -0
  41. package/src/Components/Modals/PageBuilderModal.vue +233 -0
  42. package/src/Components/Modals/PageBuilderPreviewModal.vue +123 -0
  43. package/src/Components/PageBuilder/DropdownsPlusToggles/OptionsDropdown.vue +202 -0
  44. package/src/Components/PageBuilder/DropdownsPlusToggles/SaveDesign.vue +7 -0
  45. package/src/Components/PageBuilder/EditorMenu/Editables/BackgroundColorEditor.vue +91 -0
  46. package/src/Components/PageBuilder/EditorMenu/Editables/BorderRadius.vue +163 -0
  47. package/src/Components/PageBuilder/EditorMenu/Editables/Borders.vue +164 -0
  48. package/src/Components/PageBuilder/EditorMenu/Editables/ClassEditor.vue +80 -0
  49. package/src/Components/PageBuilder/EditorMenu/Editables/ComponentTopMenu.vue +93 -0
  50. package/src/Components/PageBuilder/EditorMenu/Editables/DeleteElement.vue +42 -0
  51. package/src/Components/PageBuilder/EditorMenu/Editables/EditGetElement.vue +338 -0
  52. package/src/Components/PageBuilder/EditorMenu/Editables/ElementEditor.vue +58 -0
  53. package/src/Components/PageBuilder/EditorMenu/Editables/ImageEditor.vue +82 -0
  54. package/src/Components/PageBuilder/EditorMenu/Editables/LinkEditor.vue +301 -0
  55. package/src/Components/PageBuilder/EditorMenu/Editables/ManageBackgroundOpacity.vue +109 -0
  56. package/src/Components/PageBuilder/EditorMenu/Editables/ManageOpacity.vue +107 -0
  57. package/src/Components/PageBuilder/EditorMenu/Editables/OpacityEditor.vue +16 -0
  58. package/src/Components/PageBuilder/EditorMenu/Editables/PaddingPlusMargin.vue +134 -0
  59. package/src/Components/PageBuilder/EditorMenu/Editables/TextColorEditor.vue +91 -0
  60. package/src/Components/PageBuilder/EditorMenu/Editables/Typography.vue +199 -0
  61. package/src/Components/PageBuilder/EditorMenu/EditorAccordion.vue +42 -0
  62. package/src/Components/PageBuilder/EditorMenu/RightSidebarEditor.vue +113 -0
  63. package/src/Components/PageBuilder/Settings/AdvancedPageBuilderSettings.vue +229 -0
  64. package/src/Components/PageBuilder/Settings/PageBuilderSettings.vue +101 -0
  65. package/src/Components/PageBuilder/Slidebars/SlideOverRight.vue +91 -0
  66. package/src/Components/PageBuilder/Slidebars/SlideOverRightParent.vue +91 -0
  67. package/src/Components/Search/SearchComponents.vue +259 -0
  68. package/src/Components/TipTap/TipTap.vue +32 -0
  69. package/src/Components/TipTap/TipTapInput.vue +325 -0
  70. package/src/PageBuilder/PageBuilder.vue +347 -0
  71. package/src/PageBuilder/Preview.vue +24 -0
  72. package/src/composables/PageBuilder.ts +1483 -0
  73. package/src/composables/delay.ts +5 -0
  74. package/src/composables/extract-text-content-html.ts +34 -0
  75. package/src/composables/isObject.ts +6 -0
  76. package/src/composables/usePromise.ts +10 -0
  77. package/src/composables/vueFetch.ts +278 -0
  78. package/src/css/app.css +614 -0
  79. package/src/index.ts +16 -0
  80. package/src/main.ts +11 -0
  81. package/src/stores/media-library.ts +34 -0
  82. package/src/stores/page-builder-state.ts +461 -0
  83. package/src/stores/unsplash.ts +107 -0
  84. package/src/stores/user.ts +30 -0
  85. package/src/types/global.d.ts +49 -0
  86. package/src/utils/builder/compiledCSS.ts +2205 -0
  87. package/src/utils/builder/html-doc-declaration-with-components.ts +7 -0
  88. package/src/utils/builder/html-elements/componentHelpers.ts +101 -0
  89. package/src/utils/builder/tailwaind-colors.ts +503 -0
  90. package/src/utils/builder/tailwind-border-radius.ts +67 -0
  91. package/src/utils/builder/tailwind-border-style-width-color.ts +272 -0
  92. package/src/utils/builder/tailwind-font-sizes.ts +76 -0
  93. package/src/utils/builder/tailwind-font-styles.ts +24 -0
  94. package/src/utils/builder/tailwind-opacities.ts +45 -0
  95. package/src/utils/builder/tailwind-padding-margin.ts +159 -0
@@ -0,0 +1,101 @@
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';
7
+
8
+ const pageBuilderStateStore = usePageBuilderStateStore();
9
+
10
+ const showAdvancedSettingsSlideOverRight = ref(false);
11
+ const titleSettingsSlideOverRight = ref('');
12
+ const downloadedComponents = ref(null);
13
+
14
+ // handle slideover window
15
+ const handleAdvancedSettingsSlideOver = function () {
16
+ titleSettingsSlideOverRight.value = 'Advanced Settings';
17
+ showAdvancedSettingsSlideOverRight.value = true;
18
+ };
19
+
20
+ // handle slideover window
21
+ const settingsAdvancedSlideOverButton = function () {
22
+ showAdvancedSettingsSlideOverRight.value = false;
23
+ };
24
+
25
+ const getComponents = computed(() => {
26
+ return pageBuilderStateStore.getComponents;
27
+ });
28
+
29
+ // generate HTML
30
+ const generateHTML = function (filename, HTML) {
31
+ const element = document.createElement('a');
32
+ element.setAttribute(
33
+ 'href',
34
+ 'data:text/html;charset=utf-8,' + encodeURIComponent(fullHTMLContent(HTML))
35
+ );
36
+ element.setAttribute('download', filename);
37
+
38
+ element.style.display = 'none';
39
+ document.body.appendChild(element);
40
+
41
+ element.click();
42
+
43
+ document.body.removeChild(element);
44
+ };
45
+
46
+ // handle download HTML
47
+ const handleDownloadHTML = function () {
48
+ downloadedComponents.value = getComponents.value.map((component) => {
49
+ return component.html_code;
50
+ });
51
+
52
+ generateHTML('downloaded_html.html', downloadedComponents.value.join(''));
53
+ };
54
+ </script>
55
+
56
+ <template>
57
+ <SlideOverRightParent
58
+ :open="showAdvancedSettingsSlideOverRight"
59
+ :title="titleSettingsSlideOverRight"
60
+ @slideOverButton="settingsAdvancedSlideOverButton"
61
+ >
62
+ <AdvancedPageBuilderSettings></AdvancedPageBuilderSettings>
63
+ </SlideOverRightParent>
64
+ <!-- Advanced Settings - start -->
65
+ <div class="mt-4 mb-4 py-8 border-b border-myPrimbryLightGrayColor">
66
+ <div class="flex items-left flex-col gap-1">
67
+ <h3 class="myQuaternaryHeader">Advanced Settings</h3>
68
+ <p class="myPrimaryParagraph text-xs">
69
+ Manage advanced settings here. Like an overview of Selected Element,
70
+ Component, and Components in real-time.
71
+ </p>
72
+ </div>
73
+ <div class="mt-4">
74
+ <button
75
+ @click="handleAdvancedSettingsSlideOver"
76
+ type="button"
77
+ class="myPrimaryButton text-xs"
78
+ >
79
+ Advanced Settings
80
+ </button>
81
+ </div>
82
+ </div>
83
+ <!-- Advanced Settings - end -->
84
+ <!-- Download Layout HTML - start -->
85
+ <div class="mt-4 mb-4 py-8 border-b border-myPrimbryLightGrayColor">
86
+ <div class="flex items-left flex-col gap-1">
87
+ <h3 class="myQuaternaryHeader">Download Page as HTML</h3>
88
+ <p class="myPrimaryParagraph text-xs">Download current page layout.</p>
89
+ </div>
90
+ <div class="mt-4">
91
+ <button
92
+ @click="handleDownloadHTML"
93
+ type="button"
94
+ class="myPrimaryButton text-xs"
95
+ >
96
+ Download HTML file
97
+ </button>
98
+ </div>
99
+ </div>
100
+ <!-- Download Layout HTML - end -->
101
+ </template>
@@ -0,0 +1,91 @@
1
+ <script setup>
2
+ import {
3
+ Dialog,
4
+ DialogPanel,
5
+ DialogTitle,
6
+ TransitionChild,
7
+ TransitionRoot,
8
+ } from '@headlessui/vue';
9
+
10
+ // props
11
+ const props = defineProps({
12
+ open: {
13
+ required: true,
14
+ },
15
+ title: {
16
+ required: true,
17
+ },
18
+ });
19
+
20
+ // emit
21
+ const emit = defineEmits(['slideOverButton']);
22
+
23
+ // button
24
+ const slideOverButton = function () {
25
+ emit('slideOverButton');
26
+ };
27
+ </script>
28
+
29
+ <template>
30
+ <teleport to="body">
31
+ <TransitionRoot
32
+ as="template"
33
+ :show="open"
34
+ >
35
+ <Dialog
36
+ as="div"
37
+ class="relative z-40"
38
+ @click="$emit('slideOverButton')"
39
+ >
40
+ <div class="fixed inset-0" />
41
+
42
+ <div class="fixed inset-0 overflow-hidden">
43
+ <div class="absolute inset-0 overflow-hidden">
44
+ <div
45
+ class="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 justify-end"
46
+ >
47
+ <TransitionChild
48
+ as="template"
49
+ enter="transform transition ease-in-out duration-200 sm:duration-200"
50
+ enter-from="translate-x-full"
51
+ enter-to="translate-x-0"
52
+ leave="transform transition ease-in-out duration-200 sm:duration-200"
53
+ leave-from="translate-x-0"
54
+ leave-to="translate-x-full"
55
+ >
56
+ <DialogPanel class="pointer-events-auto w-96 max-w-md">
57
+ <div
58
+ class="flex h-full flex-col overflow-y-scroll bg-white pt-8 pb-6 shadow-xl"
59
+ >
60
+ <div class="pl-4 pr-2">
61
+ <div class="flex items-center justify-between">
62
+ <DialogTitle class="myTertiaryHeader my-0">
63
+ {{ title }}
64
+ </DialogTitle>
65
+ <div class="ml-3 flex h-7 items-center">
66
+ <button
67
+ @click="$emit('slideOverButton')"
68
+ 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"
69
+ >
70
+ <span class="material-symbols-outlined">
71
+ close
72
+ </span>
73
+ </button>
74
+ </div>
75
+ </div>
76
+ <div class="md:mt-6 mt-4">
77
+ <!-- Replace with your content -->
78
+ <slot></slot>
79
+ <!-- /End replace -->
80
+ </div>
81
+ </div>
82
+ </div>
83
+ </DialogPanel>
84
+ </TransitionChild>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </Dialog>
89
+ </TransitionRoot>
90
+ </teleport>
91
+ </template>
@@ -0,0 +1,91 @@
1
+ <script setup>
2
+ import {
3
+ Dialog,
4
+ DialogPanel,
5
+ DialogTitle,
6
+ TransitionChild,
7
+ TransitionRoot,
8
+ } from '@headlessui/vue';
9
+
10
+ // props
11
+ const props = defineProps({
12
+ open: {
13
+ required: true,
14
+ },
15
+ title: {
16
+ required: true,
17
+ },
18
+ });
19
+
20
+ // emit
21
+ const emit = defineEmits(['slideOverButton']);
22
+
23
+ // button
24
+ const slideOverButton = function () {
25
+ emit('slideOverButton');
26
+ };
27
+ </script>
28
+
29
+ <template>
30
+ <teleport to="body">
31
+ <TransitionRoot
32
+ as="template"
33
+ :show="open"
34
+ >
35
+ <Dialog
36
+ as="div"
37
+ class="relative z-40"
38
+ @click="$emit('slideOverButton')"
39
+ >
40
+ <div class="fixed inset-0" />
41
+
42
+ <div class="fixed inset-0 overflow-hidden">
43
+ <div class="absolute inset-0 overflow-hidden">
44
+ <div
45
+ class="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10 justify-end"
46
+ >
47
+ <TransitionChild
48
+ as="template"
49
+ enter="transform transition ease-in-out duration-200 sm:duration-200"
50
+ enter-from="translate-x-full"
51
+ enter-to="translate-x-0"
52
+ leave="transform transition ease-in-out duration-200 sm:duration-200"
53
+ leave-from="translate-x-0"
54
+ leave-to="translate-x-full"
55
+ >
56
+ <DialogPanel class="pointer-events-auto w-96 max-w-md">
57
+ <div
58
+ class="flex h-full flex-col overflow-y-scroll bg-white pt-8 pb-6 shadow-xl"
59
+ >
60
+ <div class="pl-4 pr-2">
61
+ <div class="flex items-center justify-between">
62
+ <DialogTitle class="myTertiaryHeader my-0">
63
+ {{ title }}
64
+ </DialogTitle>
65
+ <div class="ml-3 flex h-7 items-center">
66
+ <button
67
+ @click="$emit('slideOverButton')"
68
+ 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"
69
+ >
70
+ <span class="material-symbols-outlined">
71
+ close
72
+ </span>
73
+ </button>
74
+ </div>
75
+ </div>
76
+ <div class="md:mt-6 mt-4">
77
+ <!-- Replace with your content -->
78
+ <slot></slot>
79
+ <!-- /End replace -->
80
+ </div>
81
+ </div>
82
+ </div>
83
+ </DialogPanel>
84
+ </TransitionChild>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </Dialog>
89
+ </TransitionRoot>
90
+ </teleport>
91
+ </template>
@@ -0,0 +1,259 @@
1
+ <script setup>
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'
9
+
10
+ const mediaLibraryStore = useMediaLibraryStore()
11
+ const pageBuilderStateStore = usePageBuilderStateStore()
12
+ const props = defineProps({
13
+ firstButtonText: {
14
+ required: true,
15
+ },
16
+ title: {
17
+ required: true,
18
+ },
19
+ show: {
20
+ type: Boolean,
21
+ default: false,
22
+ required: true,
23
+ },
24
+ })
25
+ const emit = defineEmits(['firstModalButtonSearchComponentsFunction'])
26
+
27
+ // first button function
28
+ const firstButton = function () {
29
+ emit('firstModalButtonSearchComponentsFunction')
30
+ }
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
+ </script>
107
+
108
+ <template>
109
+ <Modal maxWidth="5xl" :show="show" @close="firstButton" minHeight="" maxHeight="">
110
+ <div
111
+ class="w-full relative inline-block align-bottom text-left overflow-hidden transform transition-all sm:align-middle"
112
+ >
113
+ <div class="flex items-center border-b border-gray-200 p-4 mb-2">
114
+ <div class="flex-1">
115
+ <h3 class="tertiaryHeader my-0 py-0">
116
+ {{ title }}
117
+ </h3>
118
+ </div>
119
+ <div
120
+ class="h-10 w-10 flex-start cursor-pointer rounded-full flex items-center border-none justify-center bg-gray-50 aspect-square hover:bg-myPrimaryLinkColor hover:text-white hover:fill-white focus-visible:ring-0"
121
+ @click="firstButton"
122
+ >
123
+ <span class="material-symbols-outlined"> close </span>
124
+ </div>
125
+ </div>
126
+
127
+ <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 -->
240
+ </div>
241
+ </div>
242
+ <div
243
+ v-if="!getFetchedComponents.isError"
244
+ class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center"
245
+ >
246
+ <div class="sm:w-3/6 w-full px-2 my-2 flex gap-2 justify-end">
247
+ <button
248
+ v-if="firstButtonText"
249
+ ref="firstButtonRef"
250
+ class="mySecondaryButton"
251
+ type="button"
252
+ @click="firstButton"
253
+ >
254
+ {{ firstButtonText }}
255
+ </button>
256
+ </div>
257
+ </div>
258
+ </Modal>
259
+ </template>
@@ -0,0 +1,32 @@
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'
5
+
6
+ const mediaLibraryStore = useMediaLibraryStore()
7
+ const pageBuilderStateStore = usePageBuilderStateStore()
8
+ const pageBuilder = new PageBuilder(pageBuilderStateStore, mediaLibraryStore)
9
+ </script>
10
+
11
+ <template>
12
+ <div>
13
+ <div class="blockease-linear duration-200 block ease-linear">
14
+ <template v-if="pageBuilder.selectedElementIsValidText()">
15
+ <div
16
+ 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
+ <div class="px-2 flex items-center justify-start gap-2">
19
+ <button
20
+ @click="pageBuilderStateStore.setShowModalTipTap(true)"
21
+ type="button"
22
+ 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"
23
+ >
24
+ <span class="material-symbols-outlined"> edit </span>
25
+ <span>Edit text</span>
26
+ </button>
27
+ </div>
28
+ </div>
29
+ </template>
30
+ </div>
31
+ </div>
32
+ </template>