@myissue/vue-website-page-builder 3.5.65 → 3.5.67
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/README.md +54 -19
- package/dist/index.d.ts +42 -2
- package/dist/style.css +1 -1
- package/dist/vue-website-page-builder.js +14069 -13129
- package/dist/vue-website-page-builder.umd.cjs +123 -109
- package/package.json +10 -3
package/README.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
<p align="center" dir="auto">
|
|
2
|
-
<img width="200" style="max-width: 100%;" src="./public/logo/logo.svg" alt="Vue Website Page Builder Logo" />
|
|
2
|
+
<img width="200" style="max-width: 100%;" src="./public/logo/logo.svg" alt="Vue Website Page Builder Logo — open source Vue 3 page builder by MyBuilder" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
# Vue 3 Page Builder — Free
|
|
5
|
+
# Vue 3 Page Builder — Free Open-Source Visual Editor for Ecommerce Admin, SaaS & Headless CMS
|
|
6
6
|
|
|
7
|
-
**
|
|
7
|
+
**[MyBuilder](https://mybuilder.dev)** is a **free, open-source, self-hosted Vue 3 page builder** you embed in your own product — not a locked hosted CMS. Use it as a **drag-and-drop visual editor** for **ecommerce admin panels**, **multi-tenant SaaS**, and **API-backed headless CMS** dashboards. Connect your media library and product catalog, then save portable HTML to your backend.
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
Search-friendly aliases: Vue page builder · Vue website builder · open source page builder · self-hosted page builder · drag and drop editor for Vue · ecommerce page builder · headless CMS visual editor · Builder.io alternative for Vue · GrapesJS alternative for Vue 3.
|
|
10
|
+
|
|
11
|
+
- [Vue 3 Page Builder — Free Open-Source Visual Editor for Ecommerce Admin, SaaS \& Headless CMS](#vue-3-page-builder--free-open-source-visual-editor-for-ecommerce-admin-saas--headless-cms)
|
|
10
12
|
- [Demo](#demo)
|
|
11
13
|
- [Guide \& Documentation](#guide--documentation)
|
|
12
14
|
- [Built for Ecommerce Admin \& Multi-Tenant SaaS](#built-for-ecommerce-admin--multi-tenant-saas)
|
|
@@ -14,6 +16,7 @@
|
|
|
14
16
|
- [Who This Is For](#who-this-is-for)
|
|
15
17
|
- [Backend and CMS Integration](#backend-and-cms-integration)
|
|
16
18
|
- [Why Choose This Vue Page Builder](#why-choose-this-vue-page-builder)
|
|
19
|
+
- [Open-Source Vue Page Builder vs Hosted Platforms](#open-source-vue-page-builder-vs-hosted-platforms)
|
|
17
20
|
- [Overview](#overview)
|
|
18
21
|
- [Get Started in Minutes](#get-started-in-minutes)
|
|
19
22
|
- [About](#about)
|
|
@@ -192,6 +195,27 @@ Many page builders are heavy, opinionated, or tied to one CMS. This project focu
|
|
|
192
195
|
|
|
193
196
|
This is a general-purpose builder by design. It does not try to replace your backend, authentication, permissions, CDN, or publishing workflow. It gives your product a visual editor while letting your platform stay in charge of data, scale, security, and deployment.
|
|
194
197
|
|
|
198
|
+
## Open-Source Vue Page Builder vs Hosted Platforms
|
|
199
|
+
|
|
200
|
+
Large vendors win on brand recognition and sales teams. This project wins when you need a **Vue-native, self-hosted page builder** inside software you already own. If you are comparing an open-source Vue page builder to hosted visual CMS platforms, this is the honest fit:
|
|
201
|
+
|
|
202
|
+
| Concern | How this builder addresses it |
|
|
203
|
+
|--------|--------------------------------|
|
|
204
|
+
| **Vendor lock-in** | MIT-licensed, npm package, runs in **your** Vue/Nuxt/Laravel admin. You keep HTML, auth, and hosting. |
|
|
205
|
+
| **Data, GDPR & compliance** | Content never has to leave your infrastructure. You apply **your** policies, audit trail, and region hosting — not a third-party editor cloud. |
|
|
206
|
+
| **Roles & collaboration** | Permissions, SSO, and multi-user workflows stay in **your** product (where enterprises already invest). The builder is the visual layer. |
|
|
207
|
+
| **Support & SLAs** | Community + docs for the editor; **your** team owns production SLAs for the full stack — or hire [customization support](https://mybuilder.dev). |
|
|
208
|
+
| **Ecosystem & integrations** | Integration-first hooks: `:CustomMediaLibraryComponent`, `:DisplayProducts`, TypeScript APIs, portable HTML — plug Shopify, WooCommerce, S3, Cloudinary, Strapi, Directus, or custom APIs. |
|
|
209
|
+
| **Scale & traffic** | The builder is for **authoring**. Public traffic hits **your** CDN, storefront, and database — the same pattern used by serious headless setups. |
|
|
210
|
+
| **Bundle & performance** | Ship the editor to admin users only; publish lean HTML to the public site. Tree-shake and lazy-load the builder where needed. |
|
|
211
|
+
| **Long-term ownership** | You can fork, patch, and extend. No forced plan upgrades or “editor disappeared from the marketplace” risk. |
|
|
212
|
+
|
|
213
|
+
**Best alternative when:** you want a **Builder.io-style or GrapesJS-style experience**, but as an **embeddable Vue 3 component** with ecommerce product sections, custom media, draft autosave, SEO checks, and HTML you store yourself.
|
|
214
|
+
|
|
215
|
+
**Not a replacement for:** a full hosted CMS with built-in A/B testing, managed CDN, and enterprise procurement packs out of the box — and that is intentional. Pair this open-source page builder with the platform you already trust for those jobs.
|
|
216
|
+
|
|
217
|
+
Live product: [mybuilder.dev](https://mybuilder.dev) · Docs: [Guides](https://myissue-studio.github.io/vue-website-page-builder/) · npm: `@myissue/vue-website-page-builder`
|
|
218
|
+
|
|
195
219
|
## Overview
|
|
196
220
|
|
|
197
221
|
If you're a Vue 3 developer, this builder feels right at home. It installs quickly via npm and supports full customization through props and configuration objects. You can even set specific user settings like image, name, theme, language, company logo, and autosave preferences, making it a personalized experience for every user.
|
|
@@ -217,40 +241,51 @@ A Page Builder designed for growth. Build your website pages with ready-made com
|
|
|
217
241
|
|
|
218
242
|
## Real-World Application Example
|
|
219
243
|
|
|
220
|
-
|
|
244
|
+
The Vue Website Page Builder is built for production admin products: merchants and editors design landing pages, collection pages, and campaign blocks while your platform owns catalog, checkout, auth, and hosting.
|
|
245
|
+
|
|
246
|
+
A live reference implementation is **[myself.ae](https://myself.ae)** / **[mybuilder.dev](https://mybuilder.dev)** — a Vue-based visual editor with product sections, media integration, responsive components, and HTML persistence suitable for ecommerce and multi-tenant SaaS.
|
|
247
|
+
|
|
248
|
+
**Typical production shape:**
|
|
221
249
|
|
|
222
|
-
|
|
250
|
+
1. Embed `PageBuilder` in your Vue or Nuxt admin
|
|
251
|
+
2. Inject your media library and product catalog
|
|
252
|
+
3. Autosave drafts locally; publish full HTML to your API
|
|
253
|
+
4. Serve that HTML on your storefront or marketing site behind your CDN
|
|
254
|
+
|
|
255
|
+
That model gives medium and large product teams what procurement usually asks for — **control of data, security boundaries, and deployment** — without replacing your existing CMS or commerce stack.
|
|
223
256
|
|
|
224
257
|
<br>
|
|
225
258
|
|
|
226
|
-
<h3 align="center">
|
|
259
|
+
<h3 align="center">Built for retail, fashion, media, and brand content workflows</h3>
|
|
227
260
|
|
|
228
261
|
<p align="center">
|
|
229
|
-
<img src="./public/logo/top-companies/myself.ae.jpg" width="80" height="80" alt="myself.ae" title="myself.ae" />
|
|
262
|
+
<img src="./public/logo/top-companies/myself.ae.jpg" width="80" height="80" alt="myself.ae — Vue page builder product example" title="myself.ae" />
|
|
230
263
|
|
|
231
|
-
<img src="./public/logo/top-companies/zara.jpg" width="80" height="80" alt="
|
|
264
|
+
<img src="./public/logo/top-companies/zara.jpg" width="80" height="80" alt="Fashion retail landing page use case" title="Fashion retail" />
|
|
232
265
|
|
|
233
|
-
<img src="./public/logo/top-companies/hm.png" width="80" height="80" alt="
|
|
266
|
+
<img src="./public/logo/top-companies/hm.png" width="80" height="80" alt="Retail campaign page use case" title="Retail campaigns" />
|
|
234
267
|
|
|
235
|
-
<img src="./public/logo/top-companies/chanel.avif" width="80" height="80" alt="
|
|
268
|
+
<img src="./public/logo/top-companies/chanel.avif" width="80" height="80" alt="Luxury brand content page use case" title="Brand content" />
|
|
236
269
|
<br><br>
|
|
237
|
-
<img src="./public/logo/top-companies/boss.jpg" width="80" height="80" alt="
|
|
270
|
+
<img src="./public/logo/top-companies/boss.jpg" width="80" height="80" alt="Apparel ecommerce page use case" title="Apparel ecommerce" />
|
|
238
271
|
|
|
239
|
-
<img src="./public/logo/top-companies/dkny.jpg" width="80" height="80" alt="
|
|
272
|
+
<img src="./public/logo/top-companies/dkny.jpg" width="80" height="80" alt="Lifestyle brand page use case" title="Lifestyle brands" />
|
|
240
273
|
|
|
241
|
-
<img src="./public/logo/top-companies/aldo.jpg" width="80" height="80" alt="
|
|
274
|
+
<img src="./public/logo/top-companies/aldo.jpg" width="80" height="80" alt="Product collection page use case" title="Collection pages" />
|
|
242
275
|
|
|
243
|
-
<img src="./public/logo/top-companies/bershka.jpg" width="80" height="80" alt="
|
|
276
|
+
<img src="./public/logo/top-companies/bershka.jpg" width="80" height="80" alt="Youth retail marketing page use case" title="Marketing pages" />
|
|
244
277
|
<br><br>
|
|
245
|
-
<img src="./public/logo/top-companies/furla.jpg" width="80" height="80" alt="
|
|
278
|
+
<img src="./public/logo/top-companies/furla.jpg" width="80" height="80" alt="Accessories brand page use case" title="Brand pages" />
|
|
246
279
|
|
|
247
|
-
<img src="./public/logo/top-companies/pandora.jpg" width="80" height="80" alt="
|
|
280
|
+
<img src="./public/logo/top-companies/pandora.jpg" width="80" height="80" alt="Jewelry ecommerce content use case" title="Ecommerce content" />
|
|
248
281
|
|
|
249
|
-
<img src="./public/logo/top-companies/bottega_veneta.png" width="80" height="80" alt="
|
|
282
|
+
<img src="./public/logo/top-companies/bottega_veneta.png" width="80" height="80" alt="Premium retail page use case" title="Premium retail" />
|
|
250
283
|
|
|
251
|
-
<img src="./public/logo/top-companies/charles_keith.jpg" width="80" height="80" alt="
|
|
284
|
+
<img src="./public/logo/top-companies/charles_keith.jpg" width="80" height="80" alt="Storefront editorial page use case" title="Editorial pages" />
|
|
252
285
|
</p>
|
|
253
286
|
|
|
287
|
+
<p align="center"><em>Industry examples of the page types teams build — fashion, retail, and brand landing pages — using a self-hosted Vue visual editor connected to their own catalog and CMS.</em></p>
|
|
288
|
+
|
|
254
289
|
<br>
|
|
255
290
|
|
|
256
291
|
## Reviews, Ratings, and User Testimonials
|
package/dist/index.d.ts
CHANGED
|
@@ -107,6 +107,7 @@ export declare function buildProductSectionHtml(products: ReadonlyArray<PageBuil
|
|
|
107
107
|
|
|
108
108
|
declare interface BuildProductSectionStyleOptions {
|
|
109
109
|
cardStyle?: ProductCardStyle;
|
|
110
|
+
cardDesign?: ProductCardDesign;
|
|
110
111
|
roundedImages?: boolean;
|
|
111
112
|
openInNewTab?: boolean;
|
|
112
113
|
buttonStyle?: ProductButtonStyle;
|
|
@@ -159,6 +160,8 @@ export declare interface InsertProductsOptions {
|
|
|
159
160
|
layout?: ProductGridLayout;
|
|
160
161
|
mobileColumns?: ProductMobileColumns;
|
|
161
162
|
cardStyle?: ProductCardStyle;
|
|
163
|
+
/** Layout/typography preset for product cards */
|
|
164
|
+
cardDesign?: ProductCardDesign;
|
|
162
165
|
/** Adds rounded corners to product images */
|
|
163
166
|
roundedImages?: boolean;
|
|
164
167
|
/** Adds target="_blank" rel="noopener noreferrer" to product links */
|
|
@@ -230,6 +233,12 @@ export declare interface PageBuilderConfig {
|
|
|
230
233
|
};
|
|
231
234
|
autoSave?: boolean;
|
|
232
235
|
notifications?: boolean;
|
|
236
|
+
/**
|
|
237
|
+
* When `true`, TipTap editors hide the H1 control and do not allow creating
|
|
238
|
+
* level-1 headings (H2–H6 remain available). Useful when the host page already
|
|
239
|
+
* owns the single page `<h1>` outside the builder.
|
|
240
|
+
*/
|
|
241
|
+
disableH1?: boolean;
|
|
233
242
|
/**
|
|
234
243
|
* Default canvas font and, optionally, the restricted set of fonts shown in
|
|
235
244
|
* the font-family picker.
|
|
@@ -551,7 +560,12 @@ export declare class PageBuilderService {
|
|
|
551
560
|
hasButtons: boolean;
|
|
552
561
|
hasLinks: boolean;
|
|
553
562
|
};
|
|
554
|
-
updateSelectedProductSection(options: ProductSectionOptions
|
|
563
|
+
updateSelectedProductSection(options: ProductSectionOptions, applyOptions?: {
|
|
564
|
+
persist?: boolean;
|
|
565
|
+
}): Promise<void>;
|
|
566
|
+
/** Prefer the live canvas section; getElement can point at a detached remount leftover. */
|
|
567
|
+
private resolveLiveSelectedProductSection;
|
|
568
|
+
private findProductSectionByComponentId;
|
|
555
569
|
/**
|
|
556
570
|
* Returns true when the global page wrapper has the full-width class applied.
|
|
557
571
|
*/
|
|
@@ -565,6 +579,12 @@ export declare class PageBuilderService {
|
|
|
565
579
|
isSelectedElementImage(): boolean;
|
|
566
580
|
setImageSettingsModalOpen(open: boolean): void;
|
|
567
581
|
isImageSettingsModalOpen(): boolean;
|
|
582
|
+
/**
|
|
583
|
+
* Closes Image Settings after flushing live DOM changes.
|
|
584
|
+
* Remounts once so Pinia matches the canvas, then re-selects the same image
|
|
585
|
+
* (autosave remounts during the panel would drop selection mid-edit).
|
|
586
|
+
*/
|
|
587
|
+
closeImageSettingsModal(): Promise<void>;
|
|
568
588
|
private findImageAspectClass;
|
|
569
589
|
private removeImageAspectClasses;
|
|
570
590
|
handleImageObjectFit(userSelection?: string): void;
|
|
@@ -861,6 +881,11 @@ export declare class PageBuilderService {
|
|
|
861
881
|
* after it in the DOM, then syncs the change to the store.
|
|
862
882
|
*/
|
|
863
883
|
duplicateElementInDOM(): Promise<void>;
|
|
884
|
+
/**
|
|
885
|
+
* When duplicating an element under a sibling (e.g. stacking images in a slide),
|
|
886
|
+
* ensure the copy has top spacing so it doesn't sit flush against the original.
|
|
887
|
+
*/
|
|
888
|
+
private ensureVerticalGapOnStackedDuplicate;
|
|
864
889
|
/**
|
|
865
890
|
* Deletes the currently selected element from the DOM and stores it for potential restoration.
|
|
866
891
|
* @returns {Promise<void>}
|
|
@@ -915,7 +940,7 @@ export declare class PageBuilderService {
|
|
|
915
940
|
/**
|
|
916
941
|
* Generates a preview of the current page design.
|
|
917
942
|
*/
|
|
918
|
-
previewCurrentDesign(): void
|
|
943
|
+
previewCurrentDesign(): Promise<void>;
|
|
919
944
|
/**
|
|
920
945
|
* Sanitizes a string to be used as a key in local storage.
|
|
921
946
|
* @param {string} input - The string to sanitize.
|
|
@@ -1043,6 +1068,8 @@ export declare class PageBuilderService {
|
|
|
1043
1068
|
* @returns {Promise<void>}
|
|
1044
1069
|
*/
|
|
1045
1070
|
applySelectedImage(image: ImageObject): Promise<void>;
|
|
1071
|
+
/** After v-html remount, select the slider image we just updated (same src + active slide). */
|
|
1072
|
+
private reselectSliderImageAfterRemount;
|
|
1046
1073
|
/**
|
|
1047
1074
|
* Sets the base primary image from the currently selected element if it's an image.
|
|
1048
1075
|
* @private
|
|
@@ -1071,8 +1098,15 @@ export declare class PageBuilderService {
|
|
|
1071
1098
|
addTheme(components: string): Promise<void>;
|
|
1072
1099
|
/**
|
|
1073
1100
|
* Replaces the entire page with a theme template (clears existing sections first).
|
|
1101
|
+
* Also resets Page Design global classes/styles so theme layouts are not mixed
|
|
1102
|
+
* with leftover page-wide font/color/background settings.
|
|
1074
1103
|
*/
|
|
1075
1104
|
replaceTheme(themeHtml: string): Promise<void>;
|
|
1105
|
+
/**
|
|
1106
|
+
* Clears #pagebuilder Page Design classes/styles and runtime pageSettings so a
|
|
1107
|
+
* full-page theme is not overridden by previous global page styles.
|
|
1108
|
+
*/
|
|
1109
|
+
private resetPageDesignSettingsForThemeReplace;
|
|
1076
1110
|
getPageMeta(): PageMeta;
|
|
1077
1111
|
setPageMeta(partial: Partial<PageMeta>): Promise<void>;
|
|
1078
1112
|
analyzeSEO(): Promise<SEOSummary>;
|
|
@@ -1274,6 +1308,9 @@ export declare type PassedComponentHtmlWarning = {
|
|
|
1274
1308
|
|
|
1275
1309
|
declare type ProductButtonStyle = 'text' | 'button' | (string & {});
|
|
1276
1310
|
|
|
1311
|
+
/** Product card layout/typography preset (orthogonal to border/shadow Card style). */
|
|
1312
|
+
export declare type ProductCardDesign = 'classic' | 'modern' | 'minimal' | (string & {});
|
|
1313
|
+
|
|
1277
1314
|
export declare type ProductCardStyle = 'minimal' | 'bordered' | 'shadow' | 'elevated' | (string & {});
|
|
1278
1315
|
|
|
1279
1316
|
export declare type ProductGridLayout = 'grid-1' | 'grid-2' | 'grid-3' | 'grid-4' | 'grid-6' | (string & {});
|
|
@@ -1284,6 +1321,8 @@ export declare interface ProductSectionOptions {
|
|
|
1284
1321
|
layout: ProductGridLayout;
|
|
1285
1322
|
mobileColumns?: ProductMobileColumns;
|
|
1286
1323
|
cardStyle?: ProductCardStyle;
|
|
1324
|
+
/** Layout/typography preset for product cards */
|
|
1325
|
+
cardDesign?: ProductCardDesign;
|
|
1287
1326
|
roundedImages?: boolean;
|
|
1288
1327
|
openInNewTab?: boolean;
|
|
1289
1328
|
/** Product CTA appearance: plain text link or button style */
|
|
@@ -1549,6 +1588,7 @@ export declare const usePageBuilderStateStore: StoreDefinition<"pageBuilderState
|
|
|
1549
1588
|
} | undefined;
|
|
1550
1589
|
autoSave?: boolean | undefined;
|
|
1551
1590
|
notifications?: boolean | undefined;
|
|
1591
|
+
disableH1?: boolean | undefined;
|
|
1552
1592
|
fontFamily?: string | undefined;
|
|
1553
1593
|
elementFonts?: {
|
|
1554
1594
|
h1?: string | undefined;
|