@myissue/vue-website-page-builder 3.4.11 → 3.4.13

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": "3.4.11",
3
+ "version": "3.4.13",
4
4
  "description": "Vue 3 page builder component with drag & drop functionality.",
5
5
  "type": "module",
6
6
  "main": "./dist/vue-website-page-builder.umd.cjs",
package/src/App.vue CHANGED
@@ -22,8 +22,7 @@ onMounted(async () => {
22
22
 
23
23
  <template>
24
24
  <div>
25
- <Navbar></Navbar>
26
- <PageBuilderTest></PageBuilderTest>
27
25
  <Footer></Footer>
26
+ <PageBuilderTest></PageBuilderTest>
28
27
  </div>
29
28
  </template>
@@ -4,30 +4,29 @@ const version = __APP_VERSION__
4
4
 
5
5
  <template>
6
6
  <div
7
- class="pbx-flex pbx-justify-between pbx-gap-2 pbx-bg-red-100 pbx-py-10 lg:pbx-px-12 pbx-px-4"
7
+ class="pbx-flex pbx-justify-between pbx-gap-2 lg:pbx-px-12 pbx-mx-2 pbx-py-3 pbx-border-t pbx-border-t-gray-900"
8
8
  >
9
- <div>
10
- <p class="pbx-myPrimaryParagraph">
11
- <a
12
- href="https://www.npmjs.com/package/@myissue/vue-website-page-builder"
13
- target="_blank"
14
- class="pbx-myPrimaryLink pbx-text-myPrimaryDarkGrayColor"
15
- >
16
- Install via npm
17
- </a>
18
- </p>
19
- <p class="pbx-myPrimaryParagraph pbx-mt-3">
20
- <a
21
- href="https://github.com/myissue-org/vue-website-page-builder"
22
- target="_blank"
23
- class="pbx-myPrimaryLink pbx-text-myPrimaryDarkGrayColor"
24
- >
25
- View on GitHub
26
- </a>
27
- </p>
28
- </div>
29
- <p class="pbx-myPrimaryParagraph pbx-mt-3">
30
- <span class="pbx-text-myPrimaryDarkGrayColor pbx-text-sm">{{ version }}</span>
9
+ <p class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-medium pbx-underline">
10
+ <a
11
+ href="https://www.npmjs.com/package/@myissue/vue-website-page-builder"
12
+ target="_blank"
13
+ class="pbx-myPrimaryLink pbx-text-myPrimaryDarkGrayColor"
14
+ >
15
+ Install via npm
16
+ </a>
17
+ </p>
18
+
19
+ <p class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-medium pbx-underline">
20
+ <a
21
+ href="https://github.com/myissue-org/vue-website-page-builder"
22
+ target="_blank"
23
+ class="pbx-myPrimaryLink pbx-text-myPrimaryDarkGrayColor"
24
+ >
25
+ View on GitHub
26
+ </a>
27
+ </p>
28
+ <p class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-medium pbx-underline">
29
+ <span class="pbx-text-myPrimaryDarkGrayColor">{{ version }}</span>
31
30
  </p>
32
31
  </div>
33
32
  </template>
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { ref, computed } from 'vue'
2
+ import { ref, computed, nextTick } from 'vue'
3
3
  import { sharedPageBuilderStore } from '../../../../stores/shared-store'
4
4
  import ModalBuilder from '../../../../Components/Modals/ModalBuilder.vue'
5
5
  import EditorAccordion from '../EditorAccordion.vue'
@@ -18,7 +18,6 @@ const props = defineProps({
18
18
  })
19
19
 
20
20
  const getElement = computed(() => pageBuilderStateStore.getElement)
21
- const getComponents = computed(() => pageBuilderStateStore.getComponents)
22
21
 
23
22
  const elementHTML = computed(() => {
24
23
  if (!getElement.value || !(getElement.value instanceof HTMLElement)) {
@@ -32,26 +31,15 @@ const showModalHTMLEditor = ref(false)
32
31
  const editableHtml = ref('')
33
32
  const editableComponents = ref('')
34
33
 
35
- const handleShowHTMLEditor = () => {
34
+ const handleShowHTMLEditor = async () => {
36
35
  showModalHTMLEditor.value = true
37
36
 
38
37
  if (!props.globalPage) {
39
38
  editableHtml.value = elementHTML.value
39
+ return
40
40
  }
41
41
 
42
- if (props.globalPage) {
43
- const compsHTMLString =
44
- Array.isArray(getComponents.value) &&
45
- getComponents.value
46
- .map((comp) => {
47
- return comp.html_code
48
- .replace(/data-componentid="[^"]*"/g, '') // remove data-componentid
49
- .replace(/\s{2,}/g, ' ') // optional: clean up excess spaces
50
- })
51
- .join('\n')
52
-
53
- editableComponents.value = compsHTMLString
54
- }
42
+ editableComponents.value = await pageBuilderService.generateHtmlFromComponents()
55
43
  }
56
44
 
57
45
  const handleCloseHTMLEditor = () => {
@@ -82,11 +82,12 @@ const openMainSettings = function () {
82
82
  const showHTMLSettings = ref(false)
83
83
 
84
84
  // handle slideover window
85
- const handleHTMLSettings = function () {
85
+ const closeHTMLSettings = function () {
86
86
  showHTMLSettings.value = false
87
87
  }
88
88
 
89
- const openHTMLSettings = function () {
89
+ const openHTMLSettings = async function () {
90
+ await pageBuilderService.generateHtmlFromComponents()
90
91
  showHTMLSettings.value = true
91
92
  }
92
93
  </script>
@@ -219,7 +220,7 @@ const openHTMLSettings = function () {
219
220
  maxWidth="5xl"
220
221
  :showModalBuilder="showHTMLSettings"
221
222
  :title="translate('Selected HTML')"
222
- @closeMainModalBuilder="handleHTMLSettings"
223
+ @closeMainModalBuilder="closeHTMLSettings"
223
224
  minHeight=""
224
225
  maxHeight=""
225
226
  >
@@ -1599,6 +1599,29 @@ export class PageBuilderService {
1599
1599
  }
1600
1600
  }
1601
1601
  }
1602
+ } else if (parentSection) {
1603
+ // If the section is not empty, update its HTML content in the store
1604
+ const componentId = parentSection.getAttribute('data-componentid')
1605
+ if (componentId) {
1606
+ const components = this.pageBuilderStateStore.getComponents
1607
+ if (components) {
1608
+ const componentIndex = components.findIndex(
1609
+ (c: ComponentObject) => c.id === componentId,
1610
+ )
1611
+ if (componentIndex !== -1) {
1612
+ const updatedComponent = {
1613
+ ...components[componentIndex],
1614
+ html_code: parentSection.outerHTML,
1615
+ }
1616
+ const newComponents = [
1617
+ ...components.slice(0, componentIndex),
1618
+ updatedComponent,
1619
+ ...components.slice(componentIndex + 1),
1620
+ ]
1621
+ this.pageBuilderStateStore.setComponents(newComponents)
1622
+ }
1623
+ }
1624
+ }
1602
1625
  }
1603
1626
  }
1604
1627
 
@@ -1888,7 +1911,7 @@ export class PageBuilderService {
1888
1911
  * Syncs the current DOM state of components to the in-memory store.
1889
1912
  * @private
1890
1913
  */
1891
- private syncDomToStoreOnly() {
1914
+ public syncDomToStoreOnly() {
1892
1915
  const pagebuilder = document.querySelector('#pagebuilder')
1893
1916
  if (!pagebuilder) return
1894
1917
 
@@ -1906,6 +1929,30 @@ export class PageBuilderService {
1906
1929
  this.pageBuilderStateStore.setComponents(componentsToSave)
1907
1930
  }
1908
1931
 
1932
+ public async generateHtmlFromComponents(): Promise<string> {
1933
+ this.syncDomToStoreOnly()
1934
+ await nextTick()
1935
+
1936
+ const components = this.pageBuilderStateStore.getComponents
1937
+
1938
+ if (!Array.isArray(components)) {
1939
+ return ''
1940
+ }
1941
+
1942
+ // Wait for Vue to finish DOM updates before attaching event listeners. This ensure elements exist in the DOM.
1943
+ await nextTick()
1944
+ // Attach event listeners to all editable elements in the Builder
1945
+ await this.addListenersToEditableElements()
1946
+
1947
+ return components
1948
+ .map((comp) => {
1949
+ return comp.html_code
1950
+ .replace(/data-componentid="[^"]*"/g, '') // remove data-componentid
1951
+ .replace(/\s{2,}/g, ' ') // optional: clean up excess spaces
1952
+ })
1953
+ .join('\n')
1954
+ }
1955
+
1909
1956
  /**
1910
1957
  * Saves the current DOM state of components to local storage.
1911
1958
  * @private
@@ -2166,6 +2213,15 @@ export class PageBuilderService {
2166
2213
  this.pageBuilderStateStore.setIsRestoring(false)
2167
2214
  }
2168
2215
 
2216
+ public async returnLatestComponents() {
2217
+ this.syncDomToStoreOnly()
2218
+ // Wait for Vue to finish DOM updates before attaching event listeners. This ensure elements exist in the DOM.
2219
+ await nextTick()
2220
+ // Attach event listeners to all editable elements in the Builder
2221
+ await this.addListenersToEditableElements()
2222
+
2223
+ return this.pageBuilderStateStore.getComponents
2224
+ }
2169
2225
  /**
2170
2226
  * Gets the local storage key for the current resource.
2171
2227
  * @returns {string | null} The local storage key.
@@ -2445,14 +2501,11 @@ export class PageBuilderService {
2445
2501
  }
2446
2502
 
2447
2503
  public async addTheme(components: string): Promise<void> {
2448
- try {
2449
- if (components) {
2450
- await this.mountComponentsToDOM(components)
2451
- }
2452
- await this.handleAutoSave()
2453
- } catch (error) {
2454
- console.error('Error adding component:', error)
2504
+ if (components) {
2505
+ this.validateMountingHTML(components)
2506
+ await this.mountComponentsToDOM(components)
2455
2507
  }
2508
+ await this.handleAutoSave()
2456
2509
  }
2457
2510
 
2458
2511
  /**
@@ -168,12 +168,12 @@ const convertToComponentObject = function (comp: any): ComponentObject {
168
168
  </div>
169
169
 
170
170
  <div
171
- class="pbx-px-2 pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 lg:pbx-grid-cols-4 pbx-gap-4"
171
+ class="pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 pbx-gap-4 pbx-pb-4 pbx-min-h-[96rem]"
172
172
  >
173
173
  <div
174
174
  v-for="theme in filteredThemes"
175
175
  :key="theme.title"
176
- class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer"
176
+ class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer pbx-max-h-96"
177
177
  @click="handleDropTheme(theme.html_code)"
178
178
  >
179
179
  <div
@@ -209,7 +209,7 @@ const convertToComponentObject = function (comp: any): ComponentObject {
209
209
  <div
210
210
  v-for="helper in componentHelpers"
211
211
  :key="helper.title"
212
- class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer pbx-p-4"
212
+ class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer pbx-max-h-96 pbx-p-4"
213
213
  @click="handleDropComponent(helper)"
214
214
  >
215
215
  <div
@@ -247,12 +247,12 @@ const convertToComponentObject = function (comp: any): ComponentObject {
247
247
  </button>
248
248
  </div>
249
249
  <div
250
- class="pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 pbx-gap-4 pbx-pb-4"
250
+ class="pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 pbx-gap-4 pbx-pb-4 pbx-min-h-[96rem]"
251
251
  >
252
252
  <div
253
253
  v-for="comp in filteredComponents"
254
254
  :key="comp.title"
255
- class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer"
255
+ class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer pbx-max-h-96"
256
256
  @click="handleDropComponent(convertToComponentObject(comp))"
257
257
  >
258
258
  <div
@@ -69,75 +69,14 @@ watch(currentTranslations, async () => {
69
69
  </script>
70
70
 
71
71
  <template>
72
- <div>
73
- <div class="pbx-myPrimaryWidthScreenModule pbx-bg-red-50 lg:pbx-block">
74
- <div class="pbx-myPrimaryContentSection">
75
- <h2 class="pbx-mySecondaryHeader">
76
- {{
77
- translate(
78
- 'Bring your vision to life and create impressive pages using a click & drop Page Builder',
79
- )
80
- }}
81
- </h2>
82
- <p class="pbx-myPrimaryParagraph pbx-font-normal">
83
- {{
84
- translate(
85
- 'The web builder for stunning pages. Enable users to design and publish modern pages at any scale. Build responsive pages like listings, jobs or blog posts and manage content easily using the free click & drop Page Builder. Developed with TypeScript, Vue 3, Composition API, Pinia, CSS, Tailwind CSS and HTML.',
86
- )
87
- }}
88
- <br />
89
- </p>
90
- <div class="pbx-mt-4">
91
- <p class="pbx-myPrimaryParagraph pbx-font-normal">
92
- {{
93
- translate(
94
- 'Download or install our powerful, flexible, and easy-to-use free Vue 3 Page Builder via',
95
- )
96
- }}
97
- <br />
98
- <strong> npm:</strong>
99
- <a
100
- class="pbx-text-myPrimaryLinkColor"
101
- href="https://www.npmjs.com/package/@myissue/vue-website-page-builder"
102
- target="_blank"
103
- >
104
- @myissue/vue-website-page-builder
105
- </a>
106
- </p>
107
- </div>
108
- </div>
109
- <div class="lg:pbx-m-2 pbx-m-1">
110
- <!-- :CustomBuilderComponents="DemoBuilderComponentsTest" -->
111
- <PageBuilder
112
- :CustomMediaLibraryComponent="DemoMediaLibraryComponentTest"
113
- :showPublishButton="true"
114
- @handlePublishPageBuilder="publishPageBuilder"
115
- ></PageBuilder>
116
- </div>
72
+ <div class="pbx-bg-white">
73
+ <div class="lg:pbx-p-2">
74
+ <!-- :CustomBuilderComponents="DemoBuilderComponentsTest" -->
75
+ <PageBuilder
76
+ :CustomMediaLibraryComponent="DemoMediaLibraryComponentTest"
77
+ :showPublishButton="true"
78
+ @handlePublishPageBuilder="publishPageBuilder"
79
+ ></PageBuilder>
117
80
  </div>
118
-
119
- <FullWidthElement :descriptionArea="true" class="pbx-bg-gray-50">
120
- <template #title>
121
- {{ translate('Everything you need. Break free from design limitations') }}
122
- </template>
123
- <template #description>
124
- <p class="pbx-myPrimaryParagraph pbx-font-normal">
125
- {{
126
- translate(
127
- 'A Page Builder designed for growth. Build your website pages with ready-made components that are fully customizable and always responsive, designed to fit every need. A powerful Page Builder for growing merchants, brands, and agencies.',
128
- )
129
- }}
130
- </p>
131
- </template>
132
- <template #content>
133
- <p class="pbx-myPrimaryParagraph pbx-font-normal">
134
- {{
135
- translate(
136
- "Try the powerful Click & Drop Page Builder—designed for developers and creators who want full control without the hassle. Customize layouts, fonts, and colors. Edit content visually in real time. Add media, embed YouTube videos, or export everything as clean HTML. With responsive editing, local auto-save, Tailwind support, and even Unsplash integration, it's everything you need—wrapped in one seamless builder. Build Stunning Pages in Minutes.",
137
- )
138
- }}
139
- </p>
140
- </template>
141
- </FullWidthElement>
142
81
  </div>
143
82
  </template>
@@ -349,10 +349,86 @@ const component: Components[] = [
349
349
  </svg>
350
350
  `,
351
351
  },
352
+ {
353
+ title: 'Stats Split with image',
354
+ html_code: `<section> <div class="md:pbx-pt-12 md:pbx-pb-12 pbx-pt-4 pbx-pb-4 lg:pbx-px-4 pbx-px-2"><div class="pbx-mx-auto pbx-max-w-7xl"><div class="pbx-myPrimaryGap pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 lg:pbx-grid-cols-2"> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> </div> <div> <div class=""> <p class="pbx-font-semibold">Our track record</p> </div> <div class="pbx-font-medium pbx-text-2xl lg:pbx-text-4xl"><p>Trusted by thousands of creators worldwide</p></div> <div><p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.</p></div> <div class="pbx-mt-16 pbx-grid pbx-max-w-xl pbx-grid-cols-1 pbx-gap-8 sm:pbx-mt-20 sm:pbx-grid-cols-2 xl:pbx-mt-16"> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div><p>Creators on the platform</p></div> <div class="pbx-font-medium pbx-text-lg lg:pbx-text-2xl"><p>8,000+</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Flat platform fee</p> </div> <div class="pbx-font-medium pbx-text-lg lg:pbx-text-2xl"><p>3%</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Uptime guarantee</p> </div> <div class="pbx-text-lg lg:pbx-text-2xl pbx-font-medium"><p>99.9%</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Paid out to creators</p> </div> <div class="pbx-text-lg lg:pbx-text-2xl pbx-font-medium"><p>$70M</p></div> </div> </div> </div></div> </div></div> </section>`,
355
+ category: 'Marketing',
356
+ cover_image: `
357
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="103.953 200.017 225.995 103.408" width="225.995px" height="103.408px">
358
+ <rect class="bg" x="103.953" width="103.408" height="103.408" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
359
+ <polygon class="fg" points="119.698 267.14 145.377 236.302 171.076 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
360
+ <polygon class="fg" points="165.937 267.14 178.786 251.721 191.636 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
361
+ <circle class="fg" cx="178.786" cy="240.579" r="4.277" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
362
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
363
+ <rect class="bg" x="226.54" y="207.688" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
364
+ <rect class="bg" x="226.54" y="223.011" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
365
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="230.62"/>
366
+ <rect class="bg" x="226.54" y="238.291" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
367
+ <rect class="bg" x="226.54" y="215.499" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
368
+ </svg>
369
+ `,
370
+ },
371
+ {
372
+ title: 'Stats Stepped',
373
+ html_code: `<section><div class="pbx-relative pbx-py-4 pbx-bg-slate-200"><div class="pbx-mx-auto pbx-max-w-7xl pbx-px-6 lg:pbx-px-8 pbx-pt-12"> <div class="pbx-mx-auto pbx-max-w-2xl lg:pbx-mx-0"><div class="pbx-text-2xl lg:pbx-text-4xl pbx-font-medium"><h2>We approach work as a place to make the world better</h2></div><div><p>Diam nunc lacus lacus aliquam turpis enim. Eget hac velit est euismod lacus. Est non placerat nam arcu. Cras purus nibh cursus sit eu in id. Integer vel nibh.</p></div> </div> <div class="pbx-mx-auto pbx-mt-16 pbx-flex pbx-max-w-2xl pbx-flex-col pbx-gap-8 lg:pbx-mx-0 lg:pbx-mt-20 lg:pbx-max-w-none lg:pbx-flex-row lg:pbx-items-end pbx-pb-20"> <div class="pbx-flex pbx-flex-col-reverse pbx-justify-between pbx-gap-x-16 pbx-gap-y-8 pbx-rounded-2xl pbx-bg-gray-50 pbx-p-8 sm:pbx-w-3/4 sm:pbx-max-w-md sm:pbx-flex-row-reverse sm:pbx-items-end lg:pbx-w-72 lg:pbx-max-w-none lg:pbx-flex-none lg:pbx-flex-col lg:pbx-items-start"><div class="pbx-text-lg lg:pbx-text-2xl"><p>250k</p></div><div><p>Users on the platform</p><p>Vel labore deleniti veniam consequuntur sunt nobis.</p></div> </div> <div class="pbx-flex pbx-flex-col-reverse pbx-justify-between pbx-gap-x-16 pbx-gap-y-8 pbx-rounded-2xl pbx-bg-gray-900 pbx-p-8 sm:pbx-flex-row-reverse sm:pbx-items-end lg:pbx-w-full lg:pbx-max-w-sm lg:pbx-flex-auto lg:pbx-flex-col lg:pbx-items-start lg:pbx-gap-y-44"><div class="pbx-text-white pbx-text-lg lg:pbx-text-2xl"><p>$8.9 billion</p></div><div class="sm:pbx-w-80 sm:pbx-shrink lg:pbx-w-auto lg:pbx-flex-none pbx-text-white"><p>We’re that our customers have made over $8 billion in total revenue.</p><p>Eu duis porta aliquam ornare. Elementum eget magna egestas.</p></div> </div> <div class="pbx-flex pbx-flex-col-reverse pbx-justify-between pbx-gap-x-16 pbx-gap-y-8 pbx-rounded-2xl pbx-bg-indigo-600 pbx-p-8 sm:pbx-w-11/12 sm:pbx-max-w-xl sm:pbx-flex-row-reverse sm:pbx-items-end lg:pbx-w-full lg:pbx-max-w-none lg:pbx-flex-auto lg:pbx-flex-col lg:pbx-items-start lg:pbx-gap-y-28"><div class="pbx-text-white pbx-text-lg lg:pbx-text-2xl"><p>401k</p></div><div class="sm:pbx-w-80 sm:pbx-shrink lg:pbx-w-auto lg:pbx-flex-none pbx-text-white"><p>Transactions this year</p><p>Eu duis porta aliquam ornare. Elementum eget magna egestas. Eu duis porta aliquam ornare.</p></div> </div> </div> </div></div></section>`,
374
+ category: 'Marketing',
375
+ cover_image: `
376
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="103.953 200.017 225.995 103.408" width="225.995px" height="103.408px">
377
+ <rect class="bg" x="103.953" width="103.408" height="103.408" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
378
+ <polygon class="fg" points="119.698 267.14 145.377 236.302 171.076 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
379
+ <polygon class="fg" points="165.937 267.14 178.786 251.721 191.636 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
380
+ <circle class="fg" cx="178.786" cy="240.579" r="4.277" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
381
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
382
+ <rect class="bg" x="226.54" y="207.688" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
383
+ <rect class="bg" x="226.54" y="223.011" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
384
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="230.62"/>
385
+ <rect class="bg" x="226.54" y="238.291" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
386
+ <rect class="bg" x="226.54" y="215.499" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
387
+ </svg>
388
+ `,
389
+ },
390
+ {
391
+ title: 'Stats With two column',
392
+ html_code: `<section><div class="pbx-relative pbx-py-4 pbx-bg-gray-900"><div class="pbx-py-24 sm:pbx-py-32"> <div class="pbx-mx-auto pbx-max-w-7xl pbx-px-6 lg:pbx-px-8"> <div class="pbx-mx-auto pbx-max-w-2xl lg:pbx-mx-0 lg:pbx-max-w-none"> <div class="pbx-text-base/7 pbx-font-semibold pbx-text-indigo-400"> <p>Deploy faster</p> </div> <div class="pbx-mt-2 pbx-text-pretty pbx-font-semibold pbx-tracking-tight pbx-text-white pbx-text-2xl lg:pbx-text-4xl pbx-font-medium"><h1>A better workflow</h1></div> <div class="pbx-mt-10 pbx-grid pbx-max-w-xl pbx-grid-cols-1 pbx-gap-8 pbx-text-base/7 pbx-text-gray-300 lg:pbx-max-w-none lg:pbx-grid-cols-2"> <div> <div><p>Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget risus enim. Mattis mauris semper sed amet vitae sed turpis id. Id dolor praesent donec est. Odio penatibus risus viverra tellus varius sit neque erat velit. Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget risus enim. Mattis mauris semper sed amet vitae sed turpis id.</p></div> <div class="pbx-mt-8"><p>Et vitae blandit facilisi magna lacus commodo. Vitae sapien duis odio id et. Id blandit molestie auctor fermentum dignissim. Lacus diam tincidunt ac cursus in vel. Mauris varius vulputate et ultrices hac adipiscing egestas.</p></div> </div> <div> <div><p>Erat pellentesque dictumst ligula porttitor risus eget et eget. Ultricies tellus felis id dignissim eget. Est augue maecenas risus nulla ultrices congue nunc tortor. Enim et nesciunt doloremque nesciunt voluptate.</p></div> <div class="pbx-mt-8"><p>Et vitae blandit facilisi magna lacus commodo. Vitae sapien duis odio id et. Id blandit molestie auctor fermentum dignissim. Lacus diam tincidunt ac cursus in vel. Mauris varius vulputate et ultrices hac adipiscing egestas. Iaculis convallis ac tempor et ut. Ac lorem vel integer orci.</p></div> </div> </div> <div class="pbx-mt-16 pbx-grid pbx-grid-cols-1 pbx-gap-x-8 pbx-gap-y-12 sm:pbx-mt-20 sm:pbx-grid-cols-2 sm:pbx-gap-y-16 lg:pbx-mt-28 lg:pbx-grid-cols-4"> <div class="pbx-flex pbx-flex-col-reverse pbx-gap-y-3 pbx-border-l pbx-border-white/20 pbx-pl-6"> <div class="pbx-text-base/7 pbx-text-white"><p>Founded</p></div> <div class="pbx-text-3xl pbx-font-semibold pbx-tracking-tight pbx-text-white"><p>2021</p></div> </div> <div class="pbx-flex pbx-flex-col-reverse pbx-gap-y-3 pbx-border-l pbx-border-white/20 pbx-pl-6"> <div class="pbx-text-base/7 pbx-text-white"><p>Employees</p></div> <div class="pbx-text-3xl pbx-font-semibold pbx-tracking-tight pbx-text-white"><p>37</p></div> </div> <div class="pbx-flex pbx-flex-col-reverse pbx-gap-y-3 pbx-border-l pbx-border-white/20 pbx-pl-6"> <div class="pbx-text-base/7 pbx-text-white"> <p>Countries</p> </div> <div class="pbx-text-3xl pbx-font-semibold pbx-tracking-tight pbx-text-white"><p>12</p></div> </div> <div class="pbx-flex pbx-flex-col-reverse pbx-gap-y-3 pbx-border-l pbx-border-white/20 pbx-pl-6"> <div class="pbx-text-base/7 pbx-text-white"> <p>Raised</p> </div> <div class="pbx-text-3xl pbx-font-semibold pbx-tracking-tight pbx-text-white"><p>$25M</p></div> </div> </div> </div> </div> </div></div></section>`,
393
+ category: 'Marketing',
394
+ cover_image: `
395
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="103.953 200.017 225.995 103.408" width="225.995px" height="103.408px">
396
+ <rect class="bg" x="103.953" width="103.408" height="103.408" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
397
+ <polygon class="fg" points="119.698 267.14 145.377 236.302 171.076 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
398
+ <polygon class="fg" points="165.937 267.14 178.786 251.721 191.636 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
399
+ <circle class="fg" cx="178.786" cy="240.579" r="4.277" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
400
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
401
+ <rect class="bg" x="226.54" y="207.688" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
402
+ <rect class="bg" x="226.54" y="223.011" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
403
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="230.62"/>
404
+ <rect class="bg" x="226.54" y="238.291" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
405
+ <rect class="bg" x="226.54" y="215.499" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
406
+ </svg>
407
+ `,
408
+ },
409
+ {
410
+ title: 'Timeline Simple',
411
+ html_code: `<section><div class="pbx-bg-white pbx-py-24 sm:pbx-py-32"> <div class="pbx-mx-auto pbx-max-w-7xl pbx-px-6 lg:pbx-px-8"> <div class="pbx-mx-auto pbx-grid pbx-max-w-2xl pbx-grid-cols-1 pbx-gap-8 pbx-overflow-hidden lg:pbx-mx-0 lg:pbx-max-w-none lg:pbx-grid-cols-4"> <div> <div class="pbx-flex pbx-items-center pbx-text-sm/6 pbx-font-semibold pbx-text-indigo-600"> <div class="pbx-text-black"><p>Aug 2021</p></div> </div> <div class="pbx-mt-6 pbx-text-lg/8 pbx-font-semibold pbx-tracking-tight pbx-text-black"><p>Founded company</p></div> <div class="pbx-mt-1 pbx-text-base/7 pbx-text-black"><p>Nihil aut nam. Dignissimos a pariatur et quos omnis. Aspernatur asperiores et dolorem dolorem optio voluptate repudiandae.</p></div> </div> <div> <div class="pbx-flex pbx-items-center pbx-text-sm/6 pbx-font-semibold pbx-text-indigo-600"> <div class="pbx-text-black"><p>Dec 2021</p></div> </div> <div class="pbx-mt-6 pbx-text-lg/8 pbx-font-semibold pbx-tracking-tight pbx-text-black"><p>Secured $65m in funding</p></div> <div class="pbx-mt-1 pbx-text-base/7 pbx-text-black"> <p>Provident quia ut esse. Vero vel eos repudiandae aspernatur. Cumque minima impedit sapiente a architecto nihil.</p> </div> </div> <div> <div class="pbx-flex pbx-items-center pbx-text-sm/6 pbx-font-semibold pbx-text-indigo-600"> <div class="pbx-text-black"><p>Feb 2022</p></div> </div> <div class="pbx-mt-6 pbx-text-lg/8 pbx-font-semibold pbx-tracking-tight pbx-text-black"><p>Released beta</p></div> <div class="pbx-mt-1 pbx-text-base/7 pbx-text-black"> <p>Sunt perspiciatis incidunt. Non necessitatibus aliquid. Consequatur ut officiis earum eum quia facilis. Hic deleniti dolorem quia et.</p> </div> </div> <div> <div class="pbx-flex pbx-items-center pbx-text-sm/6 pbx-font-semibold pbx-text-indigo-600"> <div class="pbx-text-black"><p>Dec 2022</p></div> </div> <div class="pbx-mt-6 pbx-text-lg/8 pbx-font-semibold pbx-tracking-tight pbx-text-black"> <p>Global launch of product</p> </div> <div class="pbx-mt-1 pbx-text-base/7 pbx-text-black"><p>Ut ipsa sint distinctio quod itaque nam qui. Possimus aut unde id architecto voluptatem hic aut pariatur velit.</p></div> </div> </div> </div> </div></section>`,
412
+ category: 'Marketing',
413
+ cover_image: `
414
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="103.953 200.017 225.995 103.408" width="225.995px" height="103.408px">
415
+ <rect class="bg" x="103.953" width="103.408" height="103.408" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
416
+ <polygon class="fg" points="119.698 267.14 145.377 236.302 171.076 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
417
+ <polygon class="fg" points="165.937 267.14 178.786 251.721 191.636 267.14" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
418
+ <circle class="fg" cx="178.786" cy="240.579" r="4.277" style="fill: rgb(113, 128, 150); stroke-width: 1;"/>
419
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="200.017"/>
420
+ <rect class="bg" x="226.54" y="207.688" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
421
+ <rect class="bg" x="226.54" y="223.011" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
422
+ <rect class="bg" x="226.54" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;" y="230.62"/>
423
+ <rect class="bg" x="226.54" y="238.291" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
424
+ <rect class="bg" x="226.54" y="215.499" width="103.408" height="5.619" style="fill: rgb(56, 65, 82); stroke-width: 1;"/>
425
+ </svg>
426
+ `,
427
+ },
352
428
  {
353
429
  title: 'Show Single Product',
354
- html_code: `<section data-component-title="Three Square Images With Text" > <div class="md:pbx-pt-12 md:pbx-pb-12 pbx-pt-4 pbx-pb-4 lg:pbx-px-4 pbx-px-2"><div class="pbx-mx-auto pbx-max-w-7xl"><div class="pbx-myPrimaryGap"> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> <div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> </div> </div> </div> </section>`,
355
- category: 'Product',
430
+ html_code: `<section> <div class="md:pbx-pt-12 md:pbx-pb-12 pbx-pt-4 pbx-pb-4 lg:pbx-px-4 pbx-px-2"><div class="pbx-mx-auto pbx-max-w-7xl"><div class="pbx-myPrimaryGap"> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> <div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> </div> </div> </div> </section>`,
431
+ category: 'Products',
356
432
  cover_image: `
357
433
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="122.319 300.3 122.364 160.763" width="122.364px" height="160.763px">
358
434
  <rect class="bg" width="122.364" height="122.364" style="fill: rgb(56, 65, 82); stroke-width: 1;" x="122.319" y="300.3"/>
@@ -42,7 +42,7 @@ const component: Themes[] = [
42
42
  html_code: `<div id="pagebuilder" class=" style=""><section data-component-title="Header H2"><div class="pbx-relative pbx-py-4"><div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"><div class="pbx-break-words pbx-font-medium pbx-text-3xl lg:pbx-text-6xl"><h2>Inceptos himenaeos</h2></div></div></div></section> <section data-component-title="Text"> <div class="pbx-relative pbx-py-4"> <div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"> <div><p>Quisque faucibus ex sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra.<br><br>Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.</p></div> </div> </div> </section> <section data-component-title="Header H3" class=""><div class="pbx-relative pbx-py-4"><div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"><div class="pbx-break-words pbx-text-1xl lg:pbx-text-3xl pbx-font-medium"><h3>Fringilla lacus nec metus</h3></div></div></div></section> <section data-component-title="Text" class=""> <div class="pbx-relative pbx-py-4"> <div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"> <div><p>Sapien vitae pellentesque sem placerat. In id cursus mi pretium tellus duis convallis. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra.</p><ul><li><p><strong>Blorf nizgat quarnip veloop</strong></p></li><li><p><strong>Dramble froop with lartic spindles</strong></p></li><li><p><strong>Quibber on flemt zarglo dynamics</strong></p></li><li><p><strong>Slooped jarnix under flibble zones</strong></p></li><li><p><strong>Plonk-ready trizzit with garm logic</strong></p><p><br></p></li></ul><p>Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.</p></div> </div> </div> </section> <section data-component-title="Header H3" class=""><div class="pbx-relative pbx-py-4"><div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"><div class="pbx-break-words pbx-text-1xl lg:pbx-text-3xl pbx-font-medium"><h3>Conubia nostra inceptos</h3></div></div></div></section> <section data-component-title="Text"> <div class="pbx-relative pbx-py-4"> <div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"> <div><p>Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. <br><br>Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. Tempus leo eu aenean sed diam urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos. <br><br>Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra. Pulvinar vivamus fringilla lacus nec metus bibendum egestas. Iaculis massa nisl malesuada lacinia integer nunc posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad litora torquent per conubia nostra inceptos himenaeos.</p></div> </div> </div> </section></div>`,
43
43
  category: 'Article',
44
44
  cover_image: `
45
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" id="article">
45
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
46
46
  <path fill="#4e4e50" d="M32 4H0V0h32v4zM20 12H0V8h20v4zM32 24H0v-4h32v4zM24 32H0v-4h24v4zM32 30a2.001 2.001 0 0 1-4.004 0A2.001 2.001 0 0 1 32 30z"/>
47
47
  </svg>
48
48
  `,
@@ -67,6 +67,16 @@ const component: Themes[] = [
67
67
  </svg>
68
68
  `,
69
69
  },
70
+ {
71
+ title: 'Stats Simple',
72
+ html_code: `<section data-component-title="Header H2" ><div class="pbx-relative pbx-py-4"><div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"><div class="pbx-break-words pbx-font-medium pbx-text-3xl lg:pbx-text-6xl"><h2>Eaque, iste dolor cupiditate blanditiis ratione</h2></div></div></div></section> <section data-component-title="Stats Split with image" > <div class="md:pbx-pt-12 md:pbx-pb-12 pbx-pt-4 pbx-pb-4 lg:pbx-px-4 pbx-px-2"><div class="pbx-mx-auto pbx-max-w-7xl"><div class="pbx-myPrimaryGap pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 lg:pbx-grid-cols-2"> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square "src="${getPlaceholderImageDataUrl()}" alt="provider"> </div> <div> <div class=""> <p class="pbx-font-semibold">Our track record</p> </div> <div class="pbx-font-medium pbx-text-2xl lg:pbx-text-4xl"><p>Trusted by thousands of creators worldwide</p></div> <div><p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.</p></div> <div class="pbx-mt-16 pbx-grid pbx-max-w-xl pbx-grid-cols-1 pbx-gap-8 sm:pbx-mt-20 sm:pbx-grid-cols-2 xl:pbx-mt-16"> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div><p>Creators on the platform</p></div> <div class="pbx-font-medium pbx-text-lg lg:pbx-text-2xl"><p>8,000+</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Flat platform fee</p> </div> <div class="pbx-font-medium pbx-text-lg lg:pbx-text-2xl"><p>3%</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Uptime guarantee</p> </div> <div class="pbx-text-lg lg:pbx-text-2xl pbx-font-medium"><p>99.9%</p></div> </div> <div class="pbx-flex pbx-flex-col pbx-gap-y-3 pbx-border-l pbx-border-gray-900/10 pbx-pl-6"> <div> <p class="pbx-text-sm/6 pbx-text-gray-600">Paid out to creators</p> </div> <div class="pbx-text-lg lg:pbx-text-2xl pbx-font-medium"><p>$70M</p></div> </div> </div> </div></div> </div></div> </section> <section data-component-title="Header H3" ><div class="pbx-relative pbx-py-4"><div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"><div class="pbx-break-words pbx-text-1xl lg:pbx-text-3xl pbx-font-medium"><h3>Layouts and visual.</h3></div></div></div></section> <section data-component-title="Text" > <div class="pbx-relative pbx-py-4"> <div class="pbx-mx-auto pbx-max-w-7xl lg:pbx-px-4 pbx-px-2"> <div><p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione. Dolor sit amet consectetur adipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione. Cadipisicing elit. Maiores impedit perferendis suscipit eaque, iste dolor cupiditate blanditiis ratione.</p></div> </div> </div> </section> <section data-component-title="Four Square Images With Text" > <div class="md:pbx-pt-12 md:pbx-pb-12 pbx-pt-4 pbx-pb-4 lg:pbx-px-4 pbx-px-2"><div class="pbx-mx-auto pbx-max-w-7xl"><div class="pbx-myPrimaryGap pbx-grid pbx-grid-cols-2 sm:pbx-grid-cols-2 lg:pbx-grid-cols-4"> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> <div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> <div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"> <div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> <div class="pbx-flex-1 pbx-py-2"> <img class="pbx-object-cover pbx-w-full pbx-object-top pbx-aspect-square " src="${getPlaceholderImageDataUrl()}" alt="provider"><div class="pbx-break-words pbx-py-2"><p>Layouts and visual.</p><p>Start customizing by editing this default text directly in the editor.</p></div> </div> </div> </div> </div> </section>`,
73
+ category: 'Marketing',
74
+ cover_image: `
75
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
76
+ <path fill="#4e4e50" d="M32 4H0V0h32v4zM20 12H0V8h20v4zM32 24H0v-4h32v4zM24 32H0v-4h24v4zM32 30a2.001 2.001 0 0 1-4.004 0A2.001 2.001 0 0 1 32 30z"/>
77
+ </svg>
78
+ `,
79
+ },
70
80
  ],
71
81
  },
72
82
  },