@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 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, Self-Hosted, Integration-First
5
+ # Vue 3 Page Builder — Free Open-Source Visual Editor for Ecommerce Admin, SaaS & Headless CMS
6
6
 
7
- **The Vue page builder for ecommerce admin panels, multi-tenant SaaS, and API-backed CMS dashboards.** Embed a visual editor in your product, connect your own media library and product catalog, and save portable HTML to your backend.
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
- - [Vue 3 Page Builder Free, Self-Hosted, Integration-First](#vue-3-page-builder--free-self-hosted-integration-first)
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
- From solo freelancers to fast-growing startups and established enterprises, the Page Builder is trusted by teams everywhere. With its intuitive click-and-drop editor, real-time visual editing, and a rich library of reusable components, you can turn ideas into polished pages in minutes. Built for merchants, brands, and agencies, it empowers anyone to create high-impact content.
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
- Discover how the Vue Website Page Builder is empowering businesses to create dynamic and responsive web pages. Used by teams at myself.ae, Zara, H&M, Chanel, BOSS, DKNY, Aldo, Bershka, Furla, Pandora, The New York Times, and Pentagram — the builder powers engaging, user-friendly pages across fashion, retail, media, and design.
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">Teams from top companies building using this page builder</h3>
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
  &nbsp;&nbsp;
231
- <img src="./public/logo/top-companies/zara.jpg" width="80" height="80" alt="Zara" title="Zara" />
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
  &nbsp;&nbsp;
233
- <img src="./public/logo/top-companies/hm.png" width="80" height="80" alt="H&amp;M" title="H&amp;M" />
266
+ <img src="./public/logo/top-companies/hm.png" width="80" height="80" alt="Retail campaign page use case" title="Retail campaigns" />
234
267
  &nbsp;&nbsp;
235
- <img src="./public/logo/top-companies/chanel.avif" width="80" height="80" alt="Chanel" title="Chanel" />
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="BOSS" title="BOSS" />
270
+ <img src="./public/logo/top-companies/boss.jpg" width="80" height="80" alt="Apparel ecommerce page use case" title="Apparel ecommerce" />
238
271
  &nbsp;&nbsp;
239
- <img src="./public/logo/top-companies/dkny.jpg" width="80" height="80" alt="DKNY" title="DKNY" />
272
+ <img src="./public/logo/top-companies/dkny.jpg" width="80" height="80" alt="Lifestyle brand page use case" title="Lifestyle brands" />
240
273
  &nbsp;&nbsp;
241
- <img src="./public/logo/top-companies/aldo.jpg" width="80" height="80" alt="Aldo" title="Aldo" />
274
+ <img src="./public/logo/top-companies/aldo.jpg" width="80" height="80" alt="Product collection page use case" title="Collection pages" />
242
275
  &nbsp;&nbsp;
243
- <img src="./public/logo/top-companies/bershka.jpg" width="80" height="80" alt="Bershka" title="Bershka" />
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="Furla" title="Furla" />
278
+ <img src="./public/logo/top-companies/furla.jpg" width="80" height="80" alt="Accessories brand page use case" title="Brand pages" />
246
279
  &nbsp;&nbsp;
247
- <img src="./public/logo/top-companies/pandora.jpg" width="80" height="80" alt="Pandora" title="Pandora" />
280
+ <img src="./public/logo/top-companies/pandora.jpg" width="80" height="80" alt="Jewelry ecommerce content use case" title="Ecommerce content" />
248
281
  &nbsp;&nbsp;
249
- <img src="./public/logo/top-companies/bottega_veneta.png" width="80" height="80" alt="Bottega Veneta" title="Bottega Veneta" />
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
  &nbsp;&nbsp;
251
- <img src="./public/logo/top-companies/charles_keith.jpg" width="80" height="80" alt="Charles & Keith" title="Charles & Keith" />
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): Promise<void>;
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;