Vue 3 Click & Drop Page Builder. Power your vision and build impressive pages. 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.
A Vue 3 page builder component with drag & drop functionality for creating dynamic web pages.
The web builder for stunning pages. Enable users to design and publish modern pages at any scale.
npm install @myissue/vue-website-page-builder
Play around with the Page Builder
Lightweight & Minimalist Page Builder with an elegant and intuitive design, focused on simplicity and speed.
Build responsive pages like listings, jobs or blog posts and manage content easily using the free Click & Drop Page Builder.
To star the repository, simply click on the Star button located at the top-right corner of the GitHub page. Thank you in advance for your support! 🙌
Introducing the The Lightweight Free Vue Click & Drop Page Builder
create and enhance digital experiences with Vue on any backend.
Play around with the Page Builder
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.
Includes:
The Page Builder is packed with features:
Powerful Page Builder for any growing merchants, brands, &
agencies. Empower users to create the perfect content with the Page Builder.
Please note that these instructions assume you have Node.js installed.
Make sure to install the dependencies:
# npm
npm install
# pnpm
pnpm install
# yarn
yarn install
# bun
bun install
The Page Builder requires its CSS file to be imported for proper styling and automatic icon loading:
import '@myissue/vue-website-page-builder/style.css'
This import automatically includes:
Get up and running quickly and initializing the builder in your Vue project. The following example demonstrates the minimal setup required to start building pages.
<script setup>
import { PageBuilder } from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
</script>
<template>
<PageBuilder />
</template>
Get up and running quickly by importing the PageBuilder component, setting up your configuration, and initializing the builder in your Vue project. The following example demonstrates the minimal setup required to start building pages with your own config and logo.
sharedPageBuilderStore
to ensure the external PageBuilderClass and internal PageBuilder component share the same stateconfigPageBuilder
object to customize the builder, such as:
pageBuilderLogo
to display your company logo in the builder toolbarresourceData
to prefill the builder with initial datauserSettings
to set user preferences such as theme, language, or autoSavebrandColor
set brand’s primary color, which will be used for key UI elements in the builder in the settings
configformName
(recommended): Specify the resource type (e.g., "article"
, "jobPost"
, "store"
, etc.) in the updateOrCreate
config. This is especially useful if your platform supports multiple resource types. By providing a unique name, the Page Builder can correctly manage layouts and local storage for each resource type, allowing users to continue where they left off for different resources.<script setup>
import {
PageBuilder,
PageBuilderClass,
sharedPageBuilderStore,
} from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
const configPageBuilder = {
updateOrCreate: {
// Set the resource type for better local storage and multi-resource support
formName: 'article',
},
pageBuilderLogo: {
src: '/logo/logo.svg',
},
userForPageBuilder: { name: 'John Doe' },
resourceData: {
title: 'Demo Article',
id: 1,
},
userSettings: {
theme: 'light',
language: 'en',
autoSave: true,
},
settings: {
brandColor: '#DB93B0',
},
}
// Use sharedPageBuilderStore for shared state between PageBuilderClass and PageBuilder component
const pageBuilderStateStore = sharedPageBuilderStore
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
// Initializing with essential configuration
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
</script>
<template>
<PageBuilder />
</template>
You can display your company logo in the Page Builder interface and set the currently logged-in user by passing both a logo URL and user information in your config object:
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
. When provided, the logo will appear at the top of the Page Builder with proper spacing in the toolbar.userForPageBuilder
object in your config to display or use the logged-in user’s information within the builder (e.g., for audit trails, personalization, or permissions).Basic Usage:
src
in your config object and passing it to the PageBuilder using pageBuilderClass.setConfigPageBuilder(configPageBuilder)
. When provided, the logo will appear in the top of the page builder.Basic Usage:
<script setup>
import {
PageBuilder,
PageBuilderClass,
sharedPageBuilderStore,
} from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
const configPageBuilder = {
pageBuilderLogo: {
src: '/logo/logo.svg',
},
userForPageBuilder: { name: 'John Doe' },
}
// Use sharedPageBuilderStore for shared state between PageBuilderClass and PageBuilder component
const pageBuilderStateStore = sharedPageBuilderStore
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
// Initializing with essential configuration
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
</script>
<template>
<PageBuilder />
</template>
Configuration Options
Prop | Type | Default | Description |
---|---|---|---|
PageBuilderLogo |
String |
null |
URL path to your company logo image |
The Page Builder automatically manages all changes using the browser’s local storage. Every change you make—such as adding, editing, or deleting components—is saved in local storage. This ensures that your progress is not lost, even if you accidentally close the browser or navigate away.
Each save is stored in local storage using a unique key. The key is determined by whether you are creating a new resource or updating an existing one:
page-builder-create-resource
.page-builder-update-resource
.You can further customize and uniquely identify the storage key by providing a formName
in your configPageBuilder
:
<script setup>
import {
PageBuilder,
PageBuilderClass,
sharedPageBuilderStore,
} from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
const configPageBuilder = {
updateOrCreate: {
// Set the resource type for better local storage and multi-resource support
formName: 'article',
},
// ...other config options
}
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
// Initializing with essential configuration
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
// Populating page builder with existing resource content
pageBuilderClass.loadExistingContent(existingResourceFromBackend)
</script>
<template>
<PageBuilder />
</template>
This allows you to manage drafts for multiple resource types (e.g., articles, jobs, stores) independently in local storage.
Tip: The local storage key will automatically include the resource type if
formName
is provided, ensuring that drafts for different resource types do not overwrite each other.
If a user started creating a new resource but hasn’t finished (e.g., they want to continue the next day), you can restore their draft from local storage:
formType
to "create"
in your config object.Example: Set formType
to “create” for continuing a new resource draft
<script setup>
import {
PageBuilder,
PageBuilderClass,
sharedPageBuilderStore,
} from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
const pageBuilderStateStore = sharedPageBuilderStore
const configPageBuilder = {
updateOrCreate: {
formType: 'create',
formName: 'article',
},
}
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
// Initializing with essential configuration
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
// No need to call loadExistingContent; the builder will auto-restore from local storage if available
</script>
<template>
<PageBuilder />
</template>
Tip: Use
formType: 'create'
for new resources andformType: 'update'
for editing existing resources. This ensures the correct local storage key is used and the right content is loaded.
To load existing content that was created with this PageBuilder from any backend:
sharedPageBuilderStore
to ensure the external PageBuilderClass
and internal PageBuilder
component share the same state.PageBuilderClass
which contains all methods to manipulate and control the page builder state. Use the loadExistingContent()
method to load existing content into the page builder.PageBuilderClass
uses the shared store to maintain state consistency between external operations and the internal PageBuilder
component, ensuring that when you load content externally it appears correctly in the PageBuilder interface.formType
to "update"
in your config object and pass it to the PageBuilder using pageBuilderClass.setConfigPageBuilder(configPageBuilder)
. This tells the PageBuilder that you’re editing an existing resource rather than creating a new one, which affects how the component handles data and interactions.Example: Set formType
to “update” for editing an existing resource
<script setup>
import {
PageBuilder,
PageBuilderClass,
sharedPageBuilderStore,
} from '@myissue/vue-website-page-builder'
import '@myissue/vue-website-page-builder/style.css'
const pageBuilderStateStore = sharedPageBuilderStore
const configPageBuilder = {
updateOrCreate: {
formType: 'update',
formName: 'article',
},
}
const pageBuilderClass = new PageBuilderClass(pageBuilderStateStore)
// Initializing with essential configuration
pageBuilderClass.setConfigPageBuilder(configPageBuilder)
// Recommended HTML wrapper for optimal layout and responsiveness:
// Wrap your components using the following structure to ensure proper spacing and alignment:
//
// <section>
// <div class="relative py-4">
// <div class="mx-auto max-w-7xl lg:px-4 px-2">
// <div class="break-words">
// <!-- Your HTML layout goes here -->
// </div>
// </div>
// </div>
// </section>
const existingResourceFromBackend = [
{
html_code:
'<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words"><h2>Component Example One</h2></div></div></div></section>',
id: null,
title: 'Header H2',
},
{
html_code:
'<section><div class="relative py-4"><div class="mx-auto max-w-7xl lg:px-4 px-2"><div class="break-words" selected=""><h3>Component Example Two</h3></div></div></div></section>',
id: null,
title: 'Header H3',
},
]
// Populating page builder with existing resource content from backend
pageBuilderClass.loadExistingContent(existingResourceFromBackend)
</script>
<template>
<PageBuilder />
</template>
existingResourceFromBackend
look?The example below shows the structure as it would appear when loaded from local storage after components have been added in the builder.
Example existingResourceFromBackend
:
[
{
"html_code": "<section><div class=\"relative py-4\"><div class=\"mx-auto max-w-7xl lg:px-4 px-2\"><div class=\"break-words\"><h2>Component Example One</h2></div></div></div></section>",
"id": null,
"title": "Header H2"
},
{
"html_code": "<section><div class=\"relative py-4\"><div class=\"mx-auto max-w-7xl lg:px-4 px-2\"><div class=\"break-words\" selected=\"\"><h3>Component Example Two</h3></div></div></div></section>",
"id": null,
"title": "Header H3"
}
]
Customizing the page builder is made simple since all the logic resides in the PageBuilder Class.
Want to add your own media library or Create custom components that can be injected into the page builder:
📚 Custom Components Setup Guide - Learn how to create and integrate your own components
Example integration:
<script setup>
import { PageBuilder } from '@myissue/vue-website-page-builder'
import YourMediaLibraryComponent from './ComponentsPageBuilder/YourMediaLibraryComponent.vue'
import YourCustomBuilderComponents from './ComponentsPageBuilder/YourCustomBuilderComponents.vue'
</script>
<template>
<PageBuilder :CustomMediaLibraryComponent="YourMediaLibraryComponent" :CustomBuilderComponents="YourCustomBuilderComponents" />
</template>
If fonts (Jost, Cormorant) or Material Icons are not displaying correctly, verify that:
CSS Import: Ensure you’re importing the CSS file:
import '@myissue/vue-website-page-builder/style.css'
Network Access: The package loads fonts and icons from Google Fonts CDN. Ensure your application can access:
https://fonts.googleapis.com/css2?family=Jost:*
https://fonts.googleapis.com/css2?family=Cormorant:*
https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined
Content Security Policy: If using CSP, allow Google Fonts:
<meta
http-equiv="Content-Security-Policy"
content="font-src 'self' https://fonts.googleapis.com;"
/>
If you discover a security vulnerability, please send us a message.
If you have any questions or if you’re looking for customization, feel free to connect with our developer.
Suggestions, or any issues you encounter while using this app. Feel free to reach out.
We would greatly appreciate it if you could star the GitHub repository. Starring the project helps to boost its visibility.