@myissue/vue-website-page-builder 3.2.16 → 3.2.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myissue/vue-website-page-builder",
3
- "version": "v3.2.16",
3
+ "version": "v3.2.21",
4
4
  "description": "🚧 DEVELOPMENT VERSION - Vue.js page builder component with drag & drop functionality. Not ready for production use.",
5
5
  "type": "module",
6
6
  "main": "./dist/vue-website-page-builder.umd.cjs",
package/src/App.vue CHANGED
@@ -1,6 +1,6 @@
1
1
  <script setup>
2
2
  import Navbar from './Components/Homepage/Navbar.vue'
3
- import HomeSection from './Components/Homepage/HomeSection.vue'
3
+ import HomeSection from './DemoComponents/HomeSection.vue'
4
4
  import Footer from './Components/Homepage/Footer.vue'
5
5
  </script>
6
6
 
@@ -1,6 +1,6 @@
1
1
  <script setup>
2
2
  import ModalBuilder from '../Modals/ModalBuilder.vue'
3
- import NoneCustomBuilderComponents from '../PageBuilder/DemoContent/NoneCustomBuilderComponents.vue'
3
+ import DefaultBuilderComponents from '../PageBuilder/DefaultComponents/DefaultBuilderComponents.vue'
4
4
 
5
5
  defineProps({
6
6
  firstButtonText: {
@@ -54,10 +54,10 @@ const firstButtonBuilder = function () {
54
54
 
55
55
  <div class="p-4">
56
56
  <!-- Only show custom search component if provided -->
57
- <div v-if="CustomBuilderComponents" class="border border-gray-200 rounded-lg p-4">
57
+ <div v-if="CustomBuilderComponents">
58
58
  <component :is="CustomBuilderComponents" />
59
59
  </div>
60
- <div v-else><NoneCustomBuilderComponents /></div>
60
+ <div v-else><DefaultBuilderComponents /></div>
61
61
  </div>
62
62
  </div>
63
63
  <div class="bg-slate-50 px-2 py-4 flex sm:justify-end justify-center">
@@ -7,7 +7,7 @@ import {
7
7
  TransitionRoot,
8
8
  } from '@headlessui/vue'
9
9
  import { provide } from 'vue'
10
- import NoneCustomMediaLibraryComponent from '../PageBuilder/DemoContent/NoneCustomMediaLibraryComponent.vue'
10
+ import DefaultMediaLibraryComponent from '../PageBuilder/DefaultComponents/DefaultMediaLibraryComponent.vue'
11
11
 
12
12
  const props = defineProps({
13
13
  title: {
@@ -94,7 +94,7 @@ provide('closeMediaLibraryModal', closeMediaLibraryModal)
94
94
  leave-to="opacity-0 scale-95"
95
95
  >
96
96
  <div
97
- class="font-sans relative max-h-[65rem] my-2 inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:align-middle sm:max-w-7xl sm:w-full w-[96%]"
97
+ class="font-sans relative min-h-[55rem] max-h-[55rem] my-2 inline-block align-bottom bg-white rounded-2xl text-left overflow-hidden shadow-xl transform transition-all sm:align-middle sm:max-w-7xl sm:w-full"
98
98
  >
99
99
  <div
100
100
  class="flex gap-2 justify-between items-center border-b border-gray-200 p-4 mb-2"
@@ -121,32 +121,9 @@ provide('closeMediaLibraryModal', closeMediaLibraryModal)
121
121
  <component :is="customMediaComponent" />
122
122
  </div>
123
123
  <div v-else>
124
- <NoneCustomMediaLibraryComponent />
124
+ <DefaultMediaLibraryComponent />
125
125
  </div>
126
126
  </div>
127
-
128
- <!-- Actions footer to ensure focusable elements -->
129
- <div
130
- v-if="firstButtonText || secondButtonText"
131
- class="bg-slate-50 px-4 py-3 flex justify-end gap-2"
132
- >
133
- <button
134
- v-if="firstButtonText"
135
- @click="firstButton"
136
- class="mySecondaryButton focus:ring-2 focus:ring-blue-500"
137
- type="button"
138
- >
139
- {{ firstButtonText }}
140
- </button>
141
- <button
142
- v-if="secondButtonText"
143
- @click="secondButton"
144
- class="myPrimaryButton focus:ring-2 focus:ring-blue-500"
145
- type="button"
146
- >
147
- {{ secondButtonText }}
148
- </button>
149
- </div>
150
127
  </div>
151
128
  </TransitionChild>
152
129
  </div>
@@ -0,0 +1,10 @@
1
+ <template>
2
+ <div>
3
+ <p class="myPrimaryParagraph">
4
+ Provide your own Media Library Component to integrate a custom media picker into the Page
5
+ Builder.
6
+ <br />
7
+ This allows full control over how media is selected and inserted.
8
+ </p>
9
+ </div>
10
+ </template>
@@ -174,7 +174,7 @@ const updateCurrentTab = function (tab) {
174
174
 
175
175
  <p class="whitespace-pre-line leading-5 mt-4">
176
176
  Component Title:
177
- {{ getComponent?.title }}
177
+ {{ component?.title }}
178
178
  </p>
179
179
  <p class="whitespace-pre-line leading-5 mt-4">
180
180
  Component HTML:<br />
@@ -90,7 +90,7 @@ const handleDownloadHTML = function () {
90
90
  type="button"
91
91
  class="myPrimaryButton text"
92
92
  >
93
- Open Overview
93
+ Advanced Settings
94
94
  </button>
95
95
  </div>
96
96
  </div>
@@ -593,6 +593,32 @@ const handleDownloadHTML = function () {
593
593
  </button>
594
594
  </div>
595
595
  </div>
596
+ <!-- Download Layout HTML - end -->
597
+
598
+ <!-- Congig - start -->
599
+ <div class="mt-4 mb-4 py-8 border-b border-myPrimbryLightGrayColor">
600
+ <div class="flex items-left flex-col gap-1">
601
+ <h3 class="myQuaternaryHeader">Complete Configuration Overview</h3>
602
+ <p class="myPrimaryParagraph text-xs">
603
+ omplete configuration object currently used by the Page Builder. It includes information
604
+ about the user, form behavior, branding settings, and other context-specific data needed
605
+ for rendering and managing the builder environment.
606
+ </p>
607
+ </div>
608
+
609
+ <div class="mt-4 whitespace-pre-wrap text-white overflow-hidden bg-gray-900 max-w-2xl">
610
+ <div class="flex bg-gray-800/40 ring-1 ring-white/5">
611
+ <div class="-mb-px flex text-xs font-medium text-myPrimaryMediumGrayColor">
612
+ <div class="px-4 py-4 text-white">Configuration</div>
613
+ </div>
614
+ </div>
615
+ <div class="px-4 pb-8 pt-4 text-white text-xs break-all">
616
+ <p class="myPrimaryParagraph text-xs text-white">
617
+ config: {{ JSON.stringify(getConfigPageBuilder, null, 4) }}
618
+ </p>
619
+ </div>
620
+ </div>
621
+ </div>
622
+ <!-- Config - end -->
596
623
  </div>
597
- <!-- Download Layout HTML - end -->
598
624
  </template>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <div>
3
+ <p class="myPrimaryParagraph">Demo builder components here</p>
4
+ </div>
5
+ </template>
@@ -0,0 +1,8 @@
1
+ <script setup>
2
+ import Unsplash from './DemoUnsplash.vue'
3
+ </script>
4
+ <template>
5
+ <div>
6
+ <Unsplash />
7
+ </div>
8
+ </template>
@@ -0,0 +1,351 @@
1
+ <script setup>
2
+ import { ref, onMounted } from 'vue'
3
+ const unsplashKey = import.meta.env.VITE_UNSPLASH_KEY
4
+ import { usePageBuilderModal } from '../composables/usePageBuilderModal'
5
+ import PageBuilderClass from '../composables/PageBuilderClass.ts'
6
+ import { sharedPageBuilderStore } from '../stores/shared-store'
7
+
8
+ const { closeMediaLibraryModal } = usePageBuilderModal()
9
+
10
+ const pageBuilderStateStore = sharedPageBuilderStore
11
+
12
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
13
+
14
+ const getIsLoading = ref(false)
15
+ const getSearchTerm = ref('')
16
+ const getCurrentPageNumber = ref(1)
17
+ const getOrientationValue = ref('')
18
+ const getCurrentImage = ref('')
19
+ const getCurrentUser = ref('')
20
+
21
+ const getUnsplashImages = ref([])
22
+
23
+ const fetchUnsplash = async function () {
24
+ getIsLoading.value = true
25
+
26
+ localStorage.setItem('unsplash-query', getSearchTerm.value)
27
+ localStorage.setItem('unsplash-page', getCurrentPageNumber.value)
28
+
29
+ if (
30
+ getUnsplashImages.value &&
31
+ Array.isArray(getUnsplashImages.value.results) &&
32
+ getUnsplashImages.value.results.length === 0
33
+ ) {
34
+ getCurrentPageNumber.value = 1
35
+ }
36
+
37
+ const orientationParam = getOrientationValue.value
38
+ ? `&orientation=${getOrientationValue.value}`
39
+ : ''
40
+
41
+ try {
42
+ const response = await fetch(
43
+ `https://api.unsplash.com/search/photos?page=${getCurrentPageNumber.value}&per_page=24&query=${getSearchTerm.value || 'magazine'}${orientationParam}`,
44
+ {
45
+ headers: {
46
+ 'Accept-Version': 'v1',
47
+ Authorization: `Client-ID ${unsplashKey}`,
48
+ },
49
+ },
50
+ )
51
+
52
+ if (!response.ok) {
53
+ throw new Error(`HTTP error! status: ${response.status}`)
54
+ }
55
+
56
+ const images = await response.json()
57
+ getUnsplashImages.value = images
58
+ getIsLoading.value = false
59
+ } catch (error) {
60
+ console.error('Error fetching Unsplash images:', error)
61
+ } finally {
62
+ getIsLoading.value = false
63
+ }
64
+ }
65
+ const handleImageClick = function (data) {
66
+ getCurrentImage.value = data.url ? data.url : ''
67
+ getCurrentUser.value = data.user ? data.user : ''
68
+ }
69
+
70
+ const searchByOrientation = function (orientationParameter) {
71
+ // check if search term length is more than 0
72
+ if (getSearchTerm.value.length > 0 && getOrientationValue.value !== orientationParameter) {
73
+ getOrientationValue.value = orientationParameter
74
+ getCurrentPageNumber.value = 1
75
+ fetchUnsplash()
76
+ }
77
+ }
78
+ //
79
+ // load images for previous page
80
+ const previousPage = function () {
81
+ fetchUnsplash()
82
+ }
83
+
84
+ // load images for next page
85
+ const nextPage = async function () {
86
+ fetchUnsplash()
87
+ }
88
+
89
+ const applySelectedImage = async function (imageURL) {
90
+ // Ensure the current image is set in the store with proper structure
91
+ pageBuilderClass.pageBuilderStateStore.setCurrentImage({
92
+ src: `${imageURL}`,
93
+ })
94
+
95
+ await pageBuilderClass.updateBasePrimaryImage()
96
+
97
+ closeMediaLibraryModal()
98
+ }
99
+
100
+ // on mounted
101
+ onMounted(async () => {
102
+ let term = ''
103
+ let page = 1
104
+ if (localStorage.getItem('unsplash-query') && localStorage.getItem('unsplash-query').length > 0) {
105
+ term = getSearchTerm.value = localStorage.getItem('unsplash-query')
106
+ page = getCurrentPageNumber.value = localStorage.getItem('unsplash-page')
107
+ fetchUnsplash()
108
+ }
109
+
110
+ term ? getSearchTerm.value : 'Magazine'
111
+ page ? getCurrentPageNumber.value : 1
112
+ fetchUnsplash()
113
+
114
+ await fetchUnsplash()
115
+ })
116
+ </script>
117
+
118
+ <template>
119
+ <div>
120
+ <div v-if="!getIsLoading">
121
+ <form
122
+ @submit.prevent="
123
+ () => {
124
+ getCurrentPageNumber = 1
125
+ fetchUnsplash()
126
+ }
127
+ "
128
+ >
129
+ <label
130
+ for="default-search"
131
+ class="mb-2 text-sm font-normal text-gray-900 sr-only dark:text-gray-300"
132
+ >Search</label
133
+ >
134
+
135
+ <div class="mysearchBarWithOptions">
136
+ <div class="relative w-full">
137
+ <div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none">
138
+ <span class="material-symbols-outlined"> search </span>
139
+ </div>
140
+ <input
141
+ type="search"
142
+ id="search_query"
143
+ v-model="getSearchTerm"
144
+ class="myPrimarySearchInput"
145
+ autocomplete="off"
146
+ placeholder="Search..."
147
+ />
148
+ </div>
149
+
150
+ <button
151
+ @click="
152
+ () => {
153
+ getCurrentPageNumber = 1
154
+ fetchUnsplash()
155
+ }
156
+ "
157
+ type="submit"
158
+ class="myPrimaryButton"
159
+ >
160
+ Search
161
+ </button>
162
+ </div>
163
+ </form>
164
+ <div v-if="getUnsplashImages && getUnsplashImages.results" class="mt-2">
165
+ <div class="flex lg:justify-between justify-end items-center gap-2 py-2 mb-1">
166
+ <div class="lg:flex hidden justify-left items-center gap-2">
167
+ <button
168
+ @click="searchByOrientation('landscape')"
169
+ type="button"
170
+ class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
171
+ :class="{
172
+ 'bg-myPrimaryBrandColor text-white': getOrientationValue === 'landscape',
173
+ '': getOrientationValue !== 'landscape',
174
+ }"
175
+ >
176
+ Landscape
177
+ </button>
178
+ <button
179
+ @click="searchByOrientation('portrait')"
180
+ type="button"
181
+ class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
182
+ :class="{
183
+ 'bg-myPrimaryBrandColor text-white': getOrientationValue === 'portrait',
184
+ '': getOrientationValue !== 'portrait',
185
+ }"
186
+ >
187
+ Portrait
188
+ </button>
189
+ <button
190
+ @click="searchByOrientation('squarish')"
191
+ type="button"
192
+ class="myPrimaryButton hover:bg-myPrimaryBrandColor focus:outline-none focus:ring-0"
193
+ :class="{
194
+ 'bg-myPrimaryBrandColor text-white': getOrientationValue === 'squarish',
195
+ '': getOrientationValue !== 'squarish',
196
+ }"
197
+ >
198
+ Squarish
199
+ </button>
200
+
201
+ <svg
202
+ @click="searchByOrientation(null)"
203
+ xmlns="http://www.w3.org/2000/svg"
204
+ fill="none"
205
+ viewBox="0 0 24 24"
206
+ stroke-width="2"
207
+ stroke="currentColor"
208
+ class="w-4 h-4 cursor-pointer"
209
+ >
210
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
211
+ </svg>
212
+ </div>
213
+
214
+ <nav class="flex items-center gap-2 justify-start" aria-label="Pagination">
215
+ <p class="myPrimaryParagraph text-xs italic">
216
+ Total pages {{ getUnsplashImages.total_pages }}
217
+ </p>
218
+ <p class="myPrimaryParagraph text-xs italic">Images {{ getUnsplashImages.total }}</p>
219
+ <div class="flex flex-1 justify-between sm:justify-end items-center gap-2">
220
+ <span
221
+ v-if="Number(getCurrentPageNumber) !== 1"
222
+ class="myPrimaryParagraph text-xs italic pr-2 pl-1 cursor-pointer underline"
223
+ @click="nextPage(Number((getCurrentPageNumber = 1)))"
224
+ >
225
+ First page
226
+ </span>
227
+ </div>
228
+ <button
229
+ v-if="Number(getCurrentPageNumber) > 1"
230
+ :disabled="Number(getCurrentPageNumber) < 1"
231
+ class="myPrimaryButton"
232
+ @click="previousPage(Number(getCurrentPageNumber--))"
233
+ >
234
+ {{
235
+ `Prev ${Number(getCurrentPageNumber) > 0 ? Number(getCurrentPageNumber) - 1 : Number(getCurrentPageNumber) - 1}`
236
+ }}
237
+ </button>
238
+
239
+ <span class="myPrimaryTag p-2.5">
240
+ {{ Number(getCurrentPageNumber) }}
241
+ </span>
242
+ <button
243
+ :disabled="Number(getCurrentPageNumber) >= getUnsplashImages.total_pages"
244
+ class="myPrimaryButton"
245
+ :class="{
246
+ 'opacity-50': Number(getCurrentPageNumber) >= getUnsplashImages.total_pages,
247
+ }"
248
+ @click="nextPage(Number(getCurrentPageNumber++))"
249
+ >
250
+ {{
251
+ `Next ${Number(getCurrentPageNumber) > 0 ? Number(getCurrentPageNumber) + 1 : Number(getCurrentPageNumber) + 1}`
252
+ }}
253
+ </button>
254
+ </nav>
255
+ </div>
256
+
257
+ <div class="min-h-[34rem] max-h-[34rem] flex gap-6">
258
+ <div class="w-9/12 pr-1 rounded-lg overflow-y-auto">
259
+ <div class="grid md:grid-cols-4 sm:grid-cols-4 grid-cols-2 gap-2">
260
+ <div
261
+ v-for="image in getUnsplashImages.results"
262
+ :key="image.id"
263
+ @click="handleImageClick({ url: image.urls.regular, user: image.user.name })"
264
+ class="border border-gray-200 my-2 px-2 p-2 cursor-pointer"
265
+ >
266
+ <img
267
+ :alt="image.user.name"
268
+ class="group block w-full overflow-hidden cursor-pointer"
269
+ :src="image.urls.thumb"
270
+ />
271
+ <p class="myPrimaryParagraph text-xs font-normal mt-2">By: {{ image.user.name }}</p>
272
+ </div>
273
+ </div>
274
+
275
+ <div v-if="getUnsplashImages.results.length < 1">
276
+ <p class="myPrimaryParagraph py-4 px-4">
277
+ <span v-if="getCurrentPageNumber === 1">
278
+ We did not find any images. Make a new search.
279
+ </span>
280
+ <span v-if="getCurrentPageNumber > 1" @click="nextPage(1)" class="myPrimaryLink">
281
+ No results on current page. Navigate to First Page.
282
+ </span>
283
+ </p>
284
+ </div>
285
+ </div>
286
+ <!-- Sidebar # start -->
287
+ <div class="w-3/12 overflow-y-auto">
288
+ <template v-if="getCurrentImage">
289
+ <img
290
+ class="mx-auto block w-full object-cover object-center cursor-pointer"
291
+ :src="`${getCurrentImage}`"
292
+ alt="file"
293
+ />
294
+ <div class="md:px-3 px-2">
295
+ <div>
296
+ <h3 class="font-normal text-gray-900">Information</h3>
297
+ <dl class="mt-2 border-t border-b border-gray-200 divide-y divide-gray-200">
298
+ <div class="py-3 flex justify-between text-sm font-normal items-center">
299
+ <dt class="text-gray-500">From:</dt>
300
+ <dd class="text-gray-900">Unsplash</dd>
301
+ </div>
302
+ <div class="py-3 flex justify-between text-sm font-normal items-center">
303
+ <dt class="text-gray-500">By:</dt>
304
+ <dd class="text-gray-900">{{ getCurrentUser }}</dd>
305
+ </div>
306
+ </dl>
307
+ </div>
308
+ </div>
309
+ </template>
310
+ </div>
311
+ </div>
312
+ <!-- Sidebar # end -->
313
+
314
+ <!-- Actions footer # start -->
315
+ <div class="px-4 py-3 flex gap-2 border-t border-gray-200 mt-4 justify-end">
316
+ <button
317
+ @click="closeMediaLibraryModal"
318
+ class="mySecondaryButton focus:ring-2 focus:ring-blue-500"
319
+ type="button"
320
+ >
321
+ Close
322
+ </button>
323
+ <button
324
+ v-if="getCurrentImage && typeof getCurrentImage === 'string'"
325
+ @click="applySelectedImage(getCurrentImage)"
326
+ class="myPrimaryButton focus:ring-2 focus:ring-blue-500"
327
+ type="button"
328
+ >
329
+ Select image
330
+ </button>
331
+ </div>
332
+ <!-- Actions footer # end -->
333
+ </div>
334
+ </div>
335
+ <div v-else>
336
+ <button class="sr-only">Focusable fallback</button>
337
+ </div>
338
+ <template v-if="getIsLoading">
339
+ <div class="flex items-center justify-center mt-4">
340
+ <div
341
+ class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]"
342
+ >
343
+ <span
344
+ class="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
345
+ >Loading...</span
346
+ >
347
+ </div>
348
+ </div>
349
+ </template>
350
+ </div>
351
+ </template>
@@ -1,8 +1,24 @@
1
1
  <script setup>
2
- import FullWidthElement from '../../Components/Layouts/FullWidthElement.vue'
3
- import PageBuilder from '../../PageBuilder/PageBuilder.vue'
4
- import PageBuilderClass from '../../composables/PageBuilderClass.ts'
5
- import { sharedPageBuilderStore } from '../../stores/shared-store'
2
+ import FullWidthElement from '../Components/Layouts/FullWidthElement.vue'
3
+ import PageBuilder from '../PageBuilder/PageBuilder.vue'
4
+ import PageBuilderClass from '../composables/PageBuilderClass.ts'
5
+
6
+ import DemoMediaLibraryComponent from './DemoMediaLibraryComponent.vue'
7
+ import DemoBuilderComponents from './DemoBuilderComponents.vue'
8
+ import { computed, onMounted } from 'vue'
9
+ import { sharedPageBuilderStore } from '../stores/shared-store'
10
+ import html from './html.json'
11
+
12
+ const pageBuilderStateStore = sharedPageBuilderStore
13
+ const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
14
+
15
+ const getLocalStorageItemName = computed(() => {
16
+ return pageBuilderStateStore.getLocalStorageItemName
17
+ })
18
+
19
+ const getComponents = computed(() => {
20
+ return pageBuilderStateStore.getComponents
21
+ })
6
22
 
7
23
  // first button function
8
24
  const handleButton = function () {
@@ -53,33 +69,38 @@ const features = [
53
69
  ]
54
70
 
55
71
  const configPageBuilder = {
56
- // userForPageBuilder: {
57
- // name: 'John Doe',
58
- // },
72
+ userForPageBuilder: {
73
+ name: 'John Doe',
74
+ },
59
75
  updateOrCreate: {
60
- formType: 'update',
76
+ formType: 'create',
61
77
  formName: 'news',
62
78
  },
63
79
  pageBuilderLogo: {
64
80
  src: '/logo/logo.svg',
65
81
  },
66
- // resourceData: {
67
- // title: 'Demo Article',
68
- // id: 1,
69
- // },
70
- // userSettings: {
71
- // // theme: 'light',
72
- // // language: 'en',
73
- // // autoSave: true,
74
- // },
82
+ resourceData: {
83
+ title: 'Demo Article',
84
+ id: 1,
85
+ },
86
+ userSettings: {
87
+ // theme: 'light',
88
+ // language: 'en',
89
+ // autoSave: true,
90
+ },
75
91
  settings: {
76
92
  brandColor: '#DB93B0',
77
93
  },
78
94
  }
79
95
 
80
- const pageBuilderStateStore = sharedPageBuilderStore
81
- const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
82
96
  pageBuilderClass.setConfigPageBuilder(configPageBuilder)
97
+
98
+ onMounted(async () => {
99
+ if (localStorage.getItem(getLocalStorageItemName.value)) {
100
+ } else {
101
+ pageBuilderClass.loadExistingContent(JSON.stringify(html), true)
102
+ }
103
+ })
83
104
  </script>
84
105
 
85
106
  <template>
@@ -109,7 +130,8 @@ pageBuilderClass.setConfigPageBuilder(configPageBuilder)
109
130
  </p>
110
131
  </div>
111
132
  <div>
112
- <PageBuilder></PageBuilder>
133
+ <!-- :CustomBuilderComponents="DemoBuilderComponents" -->
134
+ <PageBuilder :CustomMediaLibraryComponent="DemoMediaLibraryComponent"></PageBuilder>
113
135
  </div>
114
136
  </div>
115
137