Skip to content

Commit 71b46ba

Browse files
authored
Feature/new default components 1 (#82)
* Bump version to 3.4.11 * Fix/UI ux minor issues 12: Enhance theme selection functionality and improve component layout * Fix/UI ux minor issues 13: Rearrange theme selection template for improved clarity * Fix/UI ux minor issues 14: Refactor theme selection logic and enhance theme display functionality * Add theme management functionality and new theme components * Add demo GIF to README for enhanced visual representation * Replace demo GIF in README with updated version for improved visual representation * Refactor addTheme method to use mountComponentsToDOM for improved component handling * Refactor CSS styles for improved readability and consistency in page builder editor * Add new components for product display and blog post themes * Refactor SVG cover images and HTML structure in component and themes files - Updated SVG graphics for cover images in component.ts to enhance visual quality and consistency. - Modified HTML structure for various components in themes.ts to improve layout and responsiveness. - Ensured placeholder images are dynamically generated using getPlaceholderImageDataUrl function.
1 parent 0b00302 commit 71b46ba

File tree

8 files changed

+333
-118
lines changed

8 files changed

+333
-118
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ Create and enhance digital experiences with Vue on any backend.
6565
Experience the power and simplicity of the Vue Website Page Builder in action.
6666
Try the live demo to explore real-time visual updates and smooth content management.
6767

68+
<img style="width: 100%;" src="./public/home/for_read_me/vue3_page_builder_myissue.gif" alt="Vue Website Page Builder - the editor" />
69+
6870
[Play around with the Page Builder](https://mybuilder.dev)
6971

7072
## Overview

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@myissue/vue-website-page-builder",
3-
"version": "3.4.10",
3+
"version": "3.4.11",
44
"description": "Vue 3 page builder component with drag & drop functionality.",
55
"type": "module",
66
"main": "./dist/vue-website-page-builder.umd.cjs",
Loading

src/css/style.css

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -440,10 +440,6 @@
440440
width: 100%;
441441
cursor: pointer;
442442
}
443-
#page-builder-editor strong,
444-
#pagebuilder strong {
445-
font-weight: 500;
446-
}
447443

448444
.pbx-reorder-highlight {
449445
animation: pbx-reorder-flash 0.4s ease-in-out;
@@ -520,18 +516,9 @@
520516
#page-builder-editor ul,
521517
#pagebuilder ul {
522518
list-style: disc !important;
523-
padding: 1rem 0 0 1rem;
519+
padding: 1rem 0 0 1.4rem;
524520
margin-left: 1em;
525-
line-height: 1.2;
526-
}
527-
528-
#page-builder-editor ol,
529-
#page-builder-editor-editable-area ol,
530-
#page-builder-editor ul,
531-
#page-builder-editor-editable-area ul {
532-
list-style: disc !important;
533-
padding: 1rem 0 0 1rem;
534-
line-height: 1.2;
521+
line-height: 2rem;
535522
}
536523

537524
.pbx-headless-dropdown {
@@ -593,9 +580,15 @@
593580
color: inherit;
594581
text-decoration: none;
595582
}
583+
584+
#page-builder-editor strong,
585+
#pagebuilder strong {
586+
font: inherit;
587+
font-weight: 500;
588+
}
589+
596590
#pagebuilder code,
597591
#pagebuilder pre,
598-
#pagebuilder strong,
599592
#pagebuilder em {
600593
font: inherit;
601594
font-weight: inherit;

src/services/PageBuilderService.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,6 +2444,17 @@ export class PageBuilderService {
24442444
this.addHyperlinkToElement(hyperlinkEnable, urlInput || null, openHyperlinkInNewTab || false)
24452445
}
24462446

2447+
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)
2455+
}
2456+
}
2457+
24472458
/**
24482459
* Adds a new component to the page builder.
24492460
* @param {ComponentObject} componentObject - The component to add.

src/tests/DefaultComponents/DefaultBuilderComponents.vue

Lines changed: 152 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { ref, computed } from 'vue'
33
import componentHelpers from '../../utils/html-elements/componentHelpers'
44
import components from '../../utils/html-elements/component'
5+
import themes from '../../utils/html-elements/themes'
56
import { usePageBuilderModal } from '../../composables/usePageBuilderModal'
67
import type { ComponentObject } from '../../types'
78
import { getPageBuilder } from '../../composables/builderInstance'
@@ -20,6 +21,9 @@ defineProps({
2021
2122
const isLoading = ref(false)
2223
24+
const selectedThemeSelection = ref('Components')
25+
26+
const componentOrThemes = ['Components', 'Themes']
2327
const selectedCategory = ref('All')
2428
2529
const categories = computed(() => {
@@ -34,9 +38,32 @@ const filteredComponents = computed(() => {
3438
return components[0].components.data.filter((comp) => comp.category === selectedCategory.value)
3539
})
3640
41+
const selectedThemeCategory = ref('All')
42+
43+
const themeCategories = computed(() => {
44+
const allCategories = themes[0].themes.data.map((comp) => comp.category)
45+
return ['All', ...new Set(allCategories)]
46+
})
47+
48+
const filteredThemes = computed(() => {
49+
if (selectedThemeCategory.value === 'All') {
50+
return themes[0].themes.data
51+
}
52+
return themes[0].themes.data.filter((comp) => comp.category === selectedThemeCategory.value)
53+
})
54+
3755
// Get modal close function
3856
const { closeAddComponentModal } = usePageBuilderModal()
3957
58+
// Super simple component addition with professional modal closing!
59+
const handleDropTheme = async function (components: string) {
60+
isLoading.value = true
61+
62+
await pageBuilderService.addTheme(components)
63+
closeAddComponentModal()
64+
isLoading.value = false
65+
}
66+
4067
// Super simple component addition with professional modal closing!
4168
const handleDropComponent = async function (componentObject: ComponentObject) {
4269
isLoading.value = true
@@ -104,81 +131,151 @@ const convertToComponentObject = function (comp: any): ComponentObject {
104131
</div>
105132
</template>
106133
<div v-if="!isLoading">
107-
<!-- Helper Components Section -->
108-
<div class="pbx-mb-8">
109-
<h3 class="pbx-myQuaternaryHeader pbx-mb-4">{{ translate('Helper Components') }}</h3>
110-
<div
111-
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"
134+
<div class="pbx-mb-4 pbx-flex pbx-jusitify-left pbx-items-center pbx-gap-2">
135+
<button
136+
v-for="category in componentOrThemes"
137+
:key="category"
138+
@click="selectedThemeSelection = category"
139+
class="pbx-mySecondaryButton pbx-text-xs pbx-px-4"
140+
:class="[
141+
selectedThemeSelection === category
142+
? 'pbx-bg-myPrimaryLinkColor pbx-text-white hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white'
143+
: 'hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white',
144+
]"
112145
>
146+
{{ translate(category) }}
147+
</button>
148+
</div>
149+
150+
<!-- theme is selected start -->
151+
<template v-if="selectedThemeSelection === 'Themes'">
152+
<div class="pbx-mb-8">
153+
<h3 class="pbx-myQuaternaryHeader pbx-mb-4">{{ translate('Themes') }}</h3>
154+
<div class="pbx-mb-4 pbx-flex pbx-jusitify-left pbx-items-center pbx-gap-2">
155+
<button
156+
v-for="category in themeCategories"
157+
:key="category"
158+
@click="selectedThemeCategory = category"
159+
class="pbx-mySecondaryButton pbx-text-xs pbx-px-4"
160+
:class="[
161+
selectedThemeCategory === category
162+
? 'pbx-bg-myPrimaryLinkColor pbx-text-white hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white'
163+
: 'hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white',
164+
]"
165+
>
166+
{{ translate(category) }}
167+
</button>
168+
</div>
169+
113170
<div
114-
v-for="helper in componentHelpers"
115-
:key="helper.title"
116-
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"
117-
@click="handleDropComponent(helper)"
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"
118172
>
119173
<div
120-
class="pbx-max-h-72 pbx-cursor-pointer pbx-object-contain pbx-bg-white pbx-mx-auto"
174+
v-for="theme in filteredThemes"
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"
177+
@click="handleDropTheme(theme.html_code)"
121178
>
122-
<div v-if="false" class="pbx-mr-2" v-html="helper.icon"></div>
123-
<h4 class="pbx-myPrimaryParagraph pbx-text-base pbx-font-medium">
124-
{{ translate(helper.title) }}
125-
</h4>
126-
</div>
127-
<div class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-normal pbx-pt-2">
128-
{{ translate('Click to add') }} {{ helper.title.toLowerCase() }}
129-
{{ translate('component') }}
179+
<div
180+
class="pbx-overflow-hidden pbx-whitespace-pre-line pbx-flex-1 pbx-h-auto pbx-border-0 pbx-border-solid pbx-border-b pbx-border-gray-200 lg:pbx-py-10 pbx-py-8 pbx-px-2"
181+
>
182+
<!-- Use SVG preview instead of external images -->
183+
<div
184+
class="pbx-max-h-72 pbx-cursor-pointer pbx-bg-white pbx-mx-auto pbx-flex pbx-items-center pbx-justify-center"
185+
v-html="theme.cover_image"
186+
></div>
187+
</div>
188+
<div class="pbx-p-3">
189+
<h4 class="pbx-myPrimaryParagraph pbx-text-sm pbx-font-normal">
190+
{{ translate(theme.title) }}
191+
</h4>
192+
<div class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-normal pbx-pt-2">
193+
{{ translate('Click to add theme') }}
194+
</div>
195+
</div>
130196
</div>
131197
</div>
132198
</div>
133-
</div>
199+
</template>
200+
<!-- theme is selected end -->
134201

135-
<!-- Regular Components Section -->
136-
<div class="pbx-px-2" v-if="customMediaComponent">
137-
<h3 class="pbx-myQuaternaryHeader pbx-mb-4">{{ translate('Layout Components') }}</h3>
138-
<div class="pbx-mb-4 pbx-flex pbx-jusitify-left pbx-items-center pbx-gap-2">
139-
<button
140-
v-for="category in categories"
141-
:key="category"
142-
@click="selectedCategory = category"
143-
class="pbx-mySecondaryButton pbx-text-xs pbx-px-4"
144-
:class="[
145-
selectedCategory === category
146-
? 'pbx-bg-myPrimaryLinkColor pbx-text-white hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white'
147-
: 'hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white',
148-
]"
202+
<template v-if="selectedThemeSelection === 'Components'">
203+
<!-- Helper Components Section -->
204+
<div class="pbx-mb-8">
205+
<h3 class="pbx-myQuaternaryHeader pbx-mb-4">{{ translate('Helper Components') }}</h3>
206+
<div
207+
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"
149208
>
150-
{{ translate(category) }}
151-
</button>
209+
<div
210+
v-for="helper in componentHelpers"
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"
213+
@click="handleDropComponent(helper)"
214+
>
215+
<div
216+
class="pbx-max-h-72 pbx-cursor-pointer pbx-object-contain pbx-bg-white pbx-mx-auto"
217+
>
218+
<div v-if="false" class="pbx-mr-2" v-html="helper.icon"></div>
219+
<h4 class="pbx-myPrimaryParagraph pbx-text-base pbx-font-medium">
220+
{{ translate(helper.title) }}
221+
</h4>
222+
</div>
223+
<div class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-normal pbx-pt-2">
224+
{{ translate('Click to add') }} {{ helper.title.toLowerCase() }}
225+
{{ translate('component') }}
226+
</div>
227+
</div>
228+
</div>
152229
</div>
153-
<div
154-
class="pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 pbx-gap-4 pbx-pb-4"
155-
>
230+
231+
<!-- Regular Components Section -->
232+
<div class="pbx-px-2" v-if="customMediaComponent">
233+
<h3 class="pbx-myQuaternaryHeader pbx-mb-4">{{ translate('Layout Components') }}</h3>
234+
<div class="pbx-mb-4 pbx-flex pbx-jusitify-left pbx-items-center pbx-gap-2">
235+
<button
236+
v-for="category in categories"
237+
:key="category"
238+
@click="selectedCategory = category"
239+
class="pbx-mySecondaryButton pbx-text-xs pbx-px-4"
240+
:class="[
241+
selectedCategory === category
242+
? 'pbx-bg-myPrimaryLinkColor pbx-text-white hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white'
243+
: 'hover:pbx-bg-myPrimaryLinkColor hover:pbx-text-white',
244+
]"
245+
>
246+
{{ translate(category) }}
247+
</button>
248+
</div>
156249
<div
157-
v-for="comp in filteredComponents"
158-
:key="comp.title"
159-
class="pbx-border-solid pbx-border pbx-border-gray-400 pbx-overflow-hidden hover:pbx-border-myPrimaryLinkColor pbx-duration-100 pbx-cursor-pointer"
160-
@click="handleDropComponent(convertToComponentObject(comp))"
250+
class="pbx-grid pbx-grid-cols-1 sm:pbx-grid-cols-2 md:pbx-grid-cols-3 pbx-gap-4 pbx-pb-4"
161251
>
162252
<div
163-
class="pbx-overflow-hidden pbx-whitespace-pre-line pbx-flex-1 pbx-h-auto pbx-border-0 pbx-border-solid pbx-border-b pbx-border-gray-200 lg:pbx-py-10 pbx-py-8 pbx-px-2"
253+
v-for="comp in filteredComponents"
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"
256+
@click="handleDropComponent(convertToComponentObject(comp))"
164257
>
165-
<!-- Use SVG preview instead of external images -->
166258
<div
167-
class="pbx-max-h-72 pbx-cursor-pointer pbx-bg-white pbx-mx-auto pbx-flex pbx-items-center pbx-justify-center"
168-
v-html="comp.cover_image"
169-
></div>
170-
</div>
171-
<div class="pbx-p-3">
172-
<h4 class="pbx-myPrimaryParagraph pbx-text-sm pbx-font-normal">
173-
{{ translate(comp.title) }}
174-
</h4>
175-
<div class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-normal pbx-pt-2">
176-
{{ translate('Click to add component') }}
259+
class="pbx-overflow-hidden pbx-whitespace-pre-line pbx-flex-1 pbx-h-auto pbx-border-0 pbx-border-solid pbx-border-b pbx-border-gray-200 lg:pbx-py-10 pbx-py-8 pbx-px-2"
260+
>
261+
<!-- Use SVG preview instead of external images -->
262+
<div
263+
class="pbx-max-h-72 pbx-cursor-pointer pbx-bg-white pbx-mx-auto pbx-flex pbx-items-center pbx-justify-center"
264+
v-html="comp.cover_image"
265+
></div>
266+
</div>
267+
<div class="pbx-p-3">
268+
<h4 class="pbx-myPrimaryParagraph pbx-text-sm pbx-font-normal">
269+
{{ translate(comp.title) }}
270+
</h4>
271+
<div class="pbx-myPrimaryParagraph pbx-text-xs pbx-font-normal pbx-pt-2">
272+
{{ translate('Click to add component') }}
273+
</div>
177274
</div>
178275
</div>
179276
</div>
180277
</div>
181-
</div>
278+
</template>
182279
<div>
183280
<button class="pbx-sr-only">Focusable fallback</button>
184281
</div>

0 commit comments

Comments
 (0)