@myissue/vue-website-page-builder 3.5.21 → 3.5.23
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 +78 -4
- package/dist/index.d.ts +98 -0
- package/dist/style.css +1 -1
- package/dist/vue-website-page-builder.js +18936 -16559
- package/dist/vue-website-page-builder.umd.cjs +106 -100
- package/package.json +19 -11
package/README.md
CHANGED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
<img width="200" style="max-width: 100%;" src="./public/logo/logo.svg" alt="Vue Website Page Builder Logo" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# Vue 3 Page Builder — Free, Self-Hosted, Integration-First
|
|
6
6
|
|
|
7
|
-
|
|
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.
|
|
8
|
+
|
|
9
|
+
- [Vue 3 Page Builder — Free, Self-Hosted, Integration-First](#vue-3-page-builder--free-self-hosted-integration-first)
|
|
8
10
|
- [Demo](#demo)
|
|
9
11
|
- [Guide \& Documentation](#guide--documentation)
|
|
12
|
+
- [Built for Ecommerce Admin \& Multi-Tenant SaaS](#built-for-ecommerce-admin--multi-tenant-saas)
|
|
13
|
+
- [Ecommerce Product Sections](#ecommerce-product-sections)
|
|
14
|
+
- [Who This Is For](#who-this-is-for)
|
|
10
15
|
- [Backend and CMS Integration](#backend-and-cms-integration)
|
|
11
16
|
- [Why Choose This Vue Page Builder](#why-choose-this-vue-page-builder)
|
|
12
17
|
- [Overview](#overview)
|
|
@@ -27,7 +32,7 @@
|
|
|
27
32
|
|
|
28
33
|
## Demo
|
|
29
34
|
|
|
30
|
-
Vue 3
|
|
35
|
+
Free **Vue 3 page builder** with drag-and-drop editing for ecommerce admin, SaaS dashboards, and CMS workflows. Try the live demo for real-time visual updates, product sections, and content management.
|
|
31
36
|
|
|
32
37
|
Try the live demo to explore real-time visual updates and smooth content management.
|
|
33
38
|
<br>
|
|
@@ -47,6 +52,72 @@ This section covers installation, requirements, quick start, advanced usage, and
|
|
|
47
52
|
|
|
48
53
|
[Open Guides & Docs](https://myissue-studio.github.io/vue-website-page-builder/)
|
|
49
54
|
|
|
55
|
+
Key integration guides:
|
|
56
|
+
|
|
57
|
+
- [Display Products (Ecommerce)](https://myissue-studio.github.io/vue-website-page-builder/display-products) — connect your catalog and insert product grids
|
|
58
|
+
- [Custom Media Library](https://myissue-studio.github.io/vue-website-page-builder/custom-media-library) — wire your uploads, CDN, or DAM
|
|
59
|
+
- [TypeScript Support](https://myissue-studio.github.io/vue-website-page-builder/typescript-support) — typed config, products, and services
|
|
60
|
+
|
|
61
|
+
## Built for Ecommerce Admin & Multi-Tenant SaaS
|
|
62
|
+
|
|
63
|
+
Most page builders are tied to one CMS, one storefront, or one cloud platform. This project is built for teams that already have a **Vue admin**, a **REST or GraphQL API**, and a **database** — and need a visual editor inside that product.
|
|
64
|
+
|
|
65
|
+
**Best fit if you are building:**
|
|
66
|
+
|
|
67
|
+
- **Ecommerce admin** — merchants edit landing pages, collection pages, and promotional blocks while your platform owns catalog, cart, and checkout
|
|
68
|
+
- **Multi-tenant SaaS** — each customer gets branded pages; your app handles auth, billing, and tenancy; the builder outputs HTML you store per tenant
|
|
69
|
+
- **Headless CMS / marketplace admin** — editors compose pages from blocks; your backend persists full HTML and serves it on the public site
|
|
70
|
+
- **Agency & startup dashboards** — free, MIT-licensed, self-hosted; no vendor lock-in on hosting or storage
|
|
71
|
+
|
|
72
|
+
**Why Vue teams choose this over generic builders:**
|
|
73
|
+
|
|
74
|
+
- **Vue-native** — serious Vue 3 component with fewer integration compromises than dropping a React-only or iframe-based editor into a Nuxt or Laravel + Inertia app
|
|
75
|
+
- **Integration-first** — inject `:CustomMediaLibraryComponent` and `:DisplayProducts` instead of being locked to one asset provider or product database
|
|
76
|
+
- **Your backend stays in charge** — authentication, permissions, publishing, CDN, and checkout remain on your stack; the builder focuses on visual editing and portable HTML output
|
|
77
|
+
|
|
78
|
+
[Live demo](https://mybuilder.dev) · [Display Products guide](https://myissue-studio.github.io/vue-website-page-builder/display-products)
|
|
79
|
+
|
|
80
|
+
## Ecommerce Product Sections
|
|
81
|
+
|
|
82
|
+
Add real product catalog blocks to any page — without WooCommerce shortcodes or rigid storefront widgets.
|
|
83
|
+
|
|
84
|
+
Pass `:DisplayProducts` with your own product picker component. The builder opens it in the **Products** modal; when the editor confirms, you call `insertProducts()` and the canvas gets a responsive product grid (1, 2, 3, 4, or 6 columns).
|
|
85
|
+
|
|
86
|
+
**What you get out of the box:**
|
|
87
|
+
|
|
88
|
+
- **Your catalog UI** — search, categories, API pagination, Shopify/WooCommerce/custom ERP feeds (you implement the picker; we provide the hook)
|
|
89
|
+
- **Built-in grid layouts** — `grid-1` through `grid-6`, mobile column options, card styles (clean, bordered, shadow, elevated), rounded product images
|
|
90
|
+
- **Toolbar editing after insert** — change grid, mobile layout, and card style from the floating editor without re-inserting products
|
|
91
|
+
- **Portable HTML** — sections include `data-pbx-product-section` and `data-pbx-product-id` for hydration or tracking on your storefront
|
|
92
|
+
|
|
93
|
+
```vue
|
|
94
|
+
<script setup>
|
|
95
|
+
import PageBuilder from '@myissue/vue-website-page-builder'
|
|
96
|
+
import YourDisplayProducts from './YourDisplayProducts.vue'
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
<template>
|
|
100
|
+
<PageBuilder :DisplayProducts="YourDisplayProducts" />
|
|
101
|
+
</template>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Copy the reference picker from `src/tests/TestComponents/DemoDisplayProductsTest.vue` and swap static JSON for your API. Full walkthrough: [Display Products documentation](https://myissue-studio.github.io/vue-website-page-builder/display-products).
|
|
105
|
+
|
|
106
|
+
The package does **not** include cart, checkout, or inventory — by design. You keep your ecommerce stack; the builder handles layout and visual editing.
|
|
107
|
+
|
|
108
|
+
## Who This Is For
|
|
109
|
+
|
|
110
|
+
| Use case | Why this builder |
|
|
111
|
+
|----------|------------------|
|
|
112
|
+
| **Ecommerce admin panels** | Merchants design pages; you connect `:DisplayProducts` to your catalog API |
|
|
113
|
+
| **Multi-tenant SaaS** | Per-tenant pages, your auth and storage; HTML output works on any frontend |
|
|
114
|
+
| **Laravel / Nuxt / Vue admin** | Drop-in `PageBuilder` component + `getPageBuilder()` service |
|
|
115
|
+
| **Headless CMS (Strapi, Directus, custom)** | Save `getSavedPageHtml()` to your content API; reload with `parsePageBuilderHTML()` |
|
|
116
|
+
| **Marketplaces & listings** | Job boards, directories, blogs — same editor, your data layer |
|
|
117
|
+
| **Agencies & startups** | Free, MIT, self-hosted — low friction to embed and ship |
|
|
118
|
+
|
|
119
|
+
Works with Laravel, Rails, Django, Express, Nuxt, Inertia, and any API that can store and return an HTML string.
|
|
120
|
+
|
|
50
121
|
## Backend and CMS Integration
|
|
51
122
|
|
|
52
123
|
This Vue page builder is designed for real CMS, SaaS, marketplace, blog, job board, listing, and ecommerce admin workflows. The editor uses browser local storage for draft recovery and autosave, but production persistence belongs to your backend.
|
|
@@ -104,6 +175,8 @@ Many page builders are heavy, opinionated, or tied to one CMS. This project focu
|
|
|
104
175
|
- **Works with existing systems**: integrate with custom CMS dashboards, SaaS admin panels, marketplaces, job boards, blogs, and ecommerce content tools.
|
|
105
176
|
- **Vue-native integration**: use the `PageBuilder` component and `getPageBuilder()` service directly in Vue or Nuxt projects.
|
|
106
177
|
- **Bring your own media library**: inject your own media picker, storage URLs, and upload flow instead of being locked into one asset provider.
|
|
178
|
+
- **Bring your own product catalog**: inject `:DisplayProducts` to browse real SKUs from your API and insert responsive product grids — ideal for ecommerce admin and storefront content teams.
|
|
179
|
+
- **Edit product sections on canvas**: after insert, change grid layout, mobile columns, card style, and rounded images from the toolbar without re-opening the catalog modal.
|
|
107
180
|
- **Global page styles included**: `pageSettings` can be saved and restored with the page, so editing existing posts keeps fonts, colors, backgrounds, and spacing.
|
|
108
181
|
- **No Tailwind setup required**: the package ships the needed prefixed styles and avoids class conflicts with your app.
|
|
109
182
|
- **Open and customizable**: MIT licensed, component-driven, and practical for teams that need control over the editing experience.
|
|
@@ -224,7 +297,8 @@ The Page Builder is packed with features:
|
|
|
224
297
|
- **Click & Drop**: Easily rearrange elements on your page.
|
|
225
298
|
- **Reordering**: Change the order of your content without hassle.
|
|
226
299
|
- **True Visual Editing**: See your changes in real-time as you make them.
|
|
227
|
-
- **Media Library**:
|
|
300
|
+
- **Media Library**: Inject your own custom media library component (`:CustomMediaLibraryComponent`) — S3, Cloudinary, Unsplash, or internal DAM.
|
|
301
|
+
- **Ecommerce Product Sections**: Inject your own product picker (`:DisplayProducts`) — connect Shopify, WooCommerce, Medusa, or custom APIs; built-in grids, card styles, and toolbar layout editing.
|
|
228
302
|
- **Advanced Sliders & Carousels**: Build responsive image and content sliders with autoplay, navigation controls, touch support, and full customization options.
|
|
229
303
|
- **Draft Recovery & Auto-Save**: Never lose in-progress work—changes are saved locally as a draft while your backend stores published HTML.
|
|
230
304
|
- **Unsplash**: Unsplash integration.
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ declare const __VLS_export: DefineComponent<ExtractPropTypes<{
|
|
|
14
14
|
type: ObjectConstructor;
|
|
15
15
|
default: null;
|
|
16
16
|
};
|
|
17
|
+
DisplayProducts: {
|
|
18
|
+
type: ObjectConstructor;
|
|
19
|
+
default: null;
|
|
20
|
+
};
|
|
17
21
|
CustomBuilderComponents: {
|
|
18
22
|
type: ObjectConstructor;
|
|
19
23
|
default: null;
|
|
@@ -34,6 +38,10 @@ declare const __VLS_export: DefineComponent<ExtractPropTypes<{
|
|
|
34
38
|
type: ObjectConstructor;
|
|
35
39
|
default: null;
|
|
36
40
|
};
|
|
41
|
+
DisplayProducts: {
|
|
42
|
+
type: ObjectConstructor;
|
|
43
|
+
default: null;
|
|
44
|
+
};
|
|
37
45
|
CustomBuilderComponents: {
|
|
38
46
|
type: ObjectConstructor;
|
|
39
47
|
default: null;
|
|
@@ -52,6 +60,7 @@ declare const __VLS_export: DefineComponent<ExtractPropTypes<{
|
|
|
52
60
|
}>, {
|
|
53
61
|
CustomBuilderComponents: Record<string, any>;
|
|
54
62
|
CustomMediaLibraryComponent: Record<string, any>;
|
|
63
|
+
DisplayProducts: Record<string, any>;
|
|
55
64
|
showCloseButton: boolean;
|
|
56
65
|
showPublishButton: boolean;
|
|
57
66
|
}, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
|
|
@@ -78,6 +87,14 @@ export declare interface BuilderResourceComponent {
|
|
|
78
87
|
|
|
79
88
|
export declare type BuilderResourceData = BuilderResourceComponent[];
|
|
80
89
|
|
|
90
|
+
export declare function buildProductSectionHtml(products: ReadonlyArray<PageBuilderProductInput>, layout?: ProductGridLayout, sectionTitle?: string, styleOptions?: BuildProductSectionStyleOptions): string;
|
|
91
|
+
|
|
92
|
+
declare interface BuildProductSectionStyleOptions {
|
|
93
|
+
cardStyle?: ProductCardStyle;
|
|
94
|
+
roundedImages?: boolean;
|
|
95
|
+
mobileColumns?: 1 | 2;
|
|
96
|
+
}
|
|
97
|
+
|
|
81
98
|
/**
|
|
82
99
|
* Build a user-scoped storage key so each user keeps their own presets.
|
|
83
100
|
* Falls back to the shared key when no `userForPageBuilder.id` is provided.
|
|
@@ -115,6 +132,17 @@ export declare interface ImageObject {
|
|
|
115
132
|
[key: string]: unknown;
|
|
116
133
|
}
|
|
117
134
|
|
|
135
|
+
export declare interface InsertProductsOptions {
|
|
136
|
+
layout?: ProductGridLayout;
|
|
137
|
+
mobileColumns?: ProductMobileColumns;
|
|
138
|
+
cardStyle?: ProductCardStyle;
|
|
139
|
+
/** Adds rounded corners to product images */
|
|
140
|
+
roundedImages?: boolean;
|
|
141
|
+
sectionTitle?: string;
|
|
142
|
+
/** unshift | push | insert (uses current add index) */
|
|
143
|
+
method?: 'unshift' | 'push' | 'insert' | (string & {});
|
|
144
|
+
}
|
|
145
|
+
|
|
118
146
|
export declare const PageBuilder: typeof __VLS_export;
|
|
119
147
|
|
|
120
148
|
export declare const pageBuilder: {
|
|
@@ -215,6 +243,34 @@ declare interface PageBuilderElementFonts {
|
|
|
215
243
|
|
|
216
244
|
export declare const PageBuilderPreview: typeof __VLS_export_2;
|
|
217
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Flexible product shape for ecommerce integrations.
|
|
248
|
+
* All fields are optional — hosts decide what to show in their custom picker or layouts.
|
|
249
|
+
* Includes an index signature for custom fields used in templates.
|
|
250
|
+
*/
|
|
251
|
+
export declare type PageBuilderProduct = PageBuilderProductInput & {
|
|
252
|
+
[key: string]: unknown;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Product fields accepted by insertProducts() / buildProductSectionHtml().
|
|
257
|
+
* No index signature — assign from your API interfaces without extra casting.
|
|
258
|
+
*/
|
|
259
|
+
export declare interface PageBuilderProductInput {
|
|
260
|
+
id?: string | number;
|
|
261
|
+
title?: string;
|
|
262
|
+
description?: string;
|
|
263
|
+
image?: string;
|
|
264
|
+
imageAlt?: string;
|
|
265
|
+
price?: string | number;
|
|
266
|
+
compareAtPrice?: string | number;
|
|
267
|
+
badge?: string;
|
|
268
|
+
/** Product or checkout URL on the host storefront */
|
|
269
|
+
url?: string;
|
|
270
|
+
buttonText?: string;
|
|
271
|
+
sku?: string;
|
|
272
|
+
}
|
|
273
|
+
|
|
218
274
|
export declare class PageBuilderService {
|
|
219
275
|
private fontSizeRegex;
|
|
220
276
|
protected pageBuilderStateStore: ReturnType<typeof usePageBuilderStateStore>;
|
|
@@ -410,6 +466,9 @@ export declare class PageBuilderService {
|
|
|
410
466
|
isSelectedComponentTopElement(): boolean;
|
|
411
467
|
selectedComponentIsFullWidth(): boolean;
|
|
412
468
|
setSelectedComponentFullWidth(enabled: boolean): Promise<void>;
|
|
469
|
+
isSelectedProductSection(): boolean;
|
|
470
|
+
getSelectedProductSectionOptions(): ProductSectionOptions;
|
|
471
|
+
updateSelectedProductSection(options: ProductSectionOptions): Promise<void>;
|
|
413
472
|
/**
|
|
414
473
|
* Returns true when the global page wrapper has the full-width class applied.
|
|
415
474
|
*/
|
|
@@ -878,6 +937,12 @@ export declare class PageBuilderService {
|
|
|
878
937
|
*/
|
|
879
938
|
handleHyperlink(hyperlinkEnable?: boolean, urlInput?: string | null, openHyperlinkInNewTab?: boolean): void;
|
|
880
939
|
addTheme(components: string): Promise<void>;
|
|
940
|
+
/**
|
|
941
|
+
* Replaces the entire page with a theme template (clears existing sections first).
|
|
942
|
+
*/
|
|
943
|
+
replaceTheme(themeHtml: string): Promise<void>;
|
|
944
|
+
getPageMeta(): PageMeta;
|
|
945
|
+
setPageMeta(partial: Partial<PageMeta>): Promise<void>;
|
|
881
946
|
analyzeSEO(): Promise<SEOSummary>;
|
|
882
947
|
/**
|
|
883
948
|
* Adds a new component to the page builder.
|
|
@@ -885,6 +950,15 @@ export declare class PageBuilderService {
|
|
|
885
950
|
* @returns {Promise<void>}
|
|
886
951
|
*/
|
|
887
952
|
addComponent(componentObject: ComponentObject): Promise<void>;
|
|
953
|
+
/**
|
|
954
|
+
* Inserts a product section using raw HTML from a custom product picker.
|
|
955
|
+
*/
|
|
956
|
+
insertProductHtml(html: string, title?: string): Promise<void>;
|
|
957
|
+
/**
|
|
958
|
+
* Inserts products using a built-in grid layout helper.
|
|
959
|
+
* Hosts can also call insertProductHtml() with fully custom markup.
|
|
960
|
+
*/
|
|
961
|
+
insertProducts(products: ReadonlyArray<PageBuilderProductInput>, options?: InsertProductsOptions): Promise<void>;
|
|
888
962
|
/**
|
|
889
963
|
* Adds a prefix to Tailwind CSS classes in a string.
|
|
890
964
|
* @param {string} classList - The string of classes.
|
|
@@ -1046,12 +1120,31 @@ export declare interface PageBuilderUser {
|
|
|
1046
1120
|
image?: string;
|
|
1047
1121
|
}
|
|
1048
1122
|
|
|
1123
|
+
export declare interface PageMeta {
|
|
1124
|
+
title?: string;
|
|
1125
|
+
description?: string;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1049
1128
|
export declare interface PageSettings {
|
|
1050
1129
|
classes?: string;
|
|
1051
1130
|
style?: string | Record<string, string>;
|
|
1131
|
+
meta?: PageMeta;
|
|
1052
1132
|
[key: string]: unknown;
|
|
1053
1133
|
}
|
|
1054
1134
|
|
|
1135
|
+
export declare type ProductCardStyle = 'minimal' | 'bordered' | 'shadow' | 'elevated' | (string & {});
|
|
1136
|
+
|
|
1137
|
+
export declare type ProductGridLayout = 'grid-1' | 'grid-2' | 'grid-3' | 'grid-4' | 'grid-6' | (string & {});
|
|
1138
|
+
|
|
1139
|
+
declare type ProductMobileColumns = 1 | 2;
|
|
1140
|
+
|
|
1141
|
+
export declare interface ProductSectionOptions {
|
|
1142
|
+
layout: ProductGridLayout;
|
|
1143
|
+
mobileColumns?: ProductMobileColumns;
|
|
1144
|
+
cardStyle?: ProductCardStyle;
|
|
1145
|
+
roundedImages?: boolean;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1055
1148
|
/**
|
|
1056
1149
|
* Clear the stored theme color presets for the current user and reset the
|
|
1057
1150
|
* in-memory state to built-in defaults.
|
|
@@ -1131,6 +1224,7 @@ export declare interface ThemeColorPresetSettingsInput {
|
|
|
1131
1224
|
export declare function usePageBuilderModal(): {
|
|
1132
1225
|
closeAddComponentModal: () => void;
|
|
1133
1226
|
closeMediaLibraryModal: () => void;
|
|
1227
|
+
closeProductLibraryModal: () => void;
|
|
1134
1228
|
};
|
|
1135
1229
|
|
|
1136
1230
|
export declare const usePageBuilderStateStore: StoreDefinition<"pageBuilderState", PageBuilderState, {
|
|
@@ -1336,6 +1430,10 @@ export declare const usePageBuilderStateStore: StoreDefinition<"pageBuilderState
|
|
|
1336
1430
|
[x: string]: unknown;
|
|
1337
1431
|
classes?: string | undefined;
|
|
1338
1432
|
style?: (string | Record<string, string>) | undefined;
|
|
1433
|
+
meta?: {
|
|
1434
|
+
title?: string | undefined;
|
|
1435
|
+
description?: string | undefined;
|
|
1436
|
+
} | undefined;
|
|
1339
1437
|
} | undefined;
|
|
1340
1438
|
} | null;
|
|
1341
1439
|
showModalHTMLEditor: boolean;
|