Vue Site Builder
This project is a Vue.js application designed to be a visual site builder, allowing users to drag and drop various UI components onto an artboard, arrange them, and customize their properties. The goal is to provide a flexible and intuitive interface for designing web layouts, adhering to a modern, dark-themed aesthetic with rounded elements and a bluish tint.
Features
Theming & Design
- Dark Theme & Modern UI: The application features a minimal, dark-themed interface with rounded corners on all UI elements and a cohesive bluish tint across various components and controls, ensuring a sleek and consistent user experience.
Project Management
- Create New Projects: Users can start new design projects.
- Save/Load Projects: (Planned/Future Feature) Persistence of project state.
- Multiple Pages: Each project can contain multiple design pages.
Editor Functionality
Component Library
- Diverse UI Components: A wide range of common UI elements (headings, paragraphs, buttons, inputs, images, cards, navigation, feedback components, dividers, spacers, video players, and maps) are available for selection.
- Categorized Components: Components are grouped into logical categories (e.g., Layout, Typography, Forms, Content, Navigation, Feedback, Media) for easy discovery.
- Drag-and-Drop: Users can drag components from the library onto the artboard.
- Hover Previews: Hovering over a component in the library displays a scaled-down visual preview of the component, allowing users to quickly see what it looks like before dropping it onto the artboard.
Artboard
- Dynamic Component Rendering: Components dropped onto the artboard are rendered dynamically based on their
type, utilizing dedicated Vue components for each UI element to ensure correct visual representation and behavior. Default component styles are theme-consistent and visually distinct. - Responsive Aspect Ratios & Scaling: The artboard container now correctly scales its content to fit different aspect ratios and zoom levels. Components retain their percentage-based positions and sizes, adapting smoothly to new artboard dimensions without being cut off.
- Zoom In/Out: Users can zoom the artboard to focus on details or get an overview.
- Grid System:
- Toggle Grid Lines: Grid lines can be shown or hidden.
- Snap to Grid: Components can snap to the grid for precise alignment. The visual grid now dynamically scales with the artboard's dimensions and zoom level, ensuring perfect alignment with snapping points.
- Component Placement and Manipulation:
- Click-to-Select: Components can be selected instantly by clicking them on the artboard, allowing immediate access to their properties in the Properties Panel.
- Move Tool: Components can be moved around the artboard by clicking and dragging. The drag interaction is now more responsive with a reduced movement threshold.
- Smart Guides: Visual guides appear to assist with aligning components relative to each other and the artboard (e.g., center alignment, edge alignment), supporting both horizontal and vertical snapping.
- Axis Locking: Holding
Shiftwhile dragging locks movement to either the horizontal or vertical axis. - Resizable Components: Selected components display resize handles, allowing users to adjust their width and height.
Properties Panel
- Enhanced Properties Editor: When a component is selected, a comprehensive properties panel is displayed, allowing granular control over various aspects of the component.
- Layout Controls: Dedicated inputs for
X Position (%),Y Position (%),Width (%), andHeight (%)enable precise placement and sizing. - Extended Style Controls: Includes inputs for
Background Color,Text Color,Font Size (px),Padding (px),Border Color,Border Style,Border Width (px),Border Radius (px), and individualMarginproperties (Top,Right,Bottom,Leftin px). - Unit Handling: Numerical style properties (e.g., font size, padding, border width/radius, margins) are correctly handled with 'px' units.
- Live Updates: Changes made in the properties panel are immediately reflected on the artboard.
Other Panels
- Pages Panel: Manage and navigate between different pages within a project.
- Logic Editor: (Currently a placeholder) Intended for advanced users to add custom logic or interactivity to components.
Windows
- Fixed Panels: Floating windows/panels (e.g., Component Library, Properties Panel) are now fixed in their positions, providing a stable and uncluttered workspace.
Setup Steps
-
Clone the repository:
git clone <repository-url> cd vue-site-builder -
Install dependencies:
npm install -
Run the development server:
npm run devThis will start the Vite development server, usually accessible at
http://localhost:5173/.
Project Structure (Key Files)
src/main.js: Entry point of the Vue application. Initializes Pinia and Vue Router.src/App.vue: Main application layout and global CSS variables for theming.src/router/index.js: Vue Router configuration.src/stores/projectStore.js: Pinia store for managing project state, including pages and components.src/views/Editor.vue: The main editor interface, responsible for integrating the component library, canvas, and property panels. It now imports component definitions fromStandardComponents.js.src/components/ComponentLibrary.vue: Displays the list of available UI components that can be dragged onto the artboard. Now includes hover previews.src/components/Artboard.vue: The main canvas area where components are dropped and manipulated. Handles drag/drop, movement, resizing, and rendering of dynamic components with proper scaling and grid snapping.src/components/PropertiesPanel.vue: Displays and allows editing of selected component properties with enhanced controls.src/components/DraggablePanel.vue: (Renamed conceptually to FixedPanel) Base component for fixed UI panels.src/components/componentMap.js: Maps componenttypestrings to their corresponding Vue render components. Now includes new components like Divider, Spacer, Video, and Map.StandardComponents.js: Defines the structure and default properties/styles for all UI components available in the library. This is the central source of truth for component definitions.src/components/render-components/: This directory contains individual Vue components (H1Component.vue,ButtonComponent.vue,ImgComponent.vue,DividerComponent.vue,SpacerComponent.vue,VideoComponent.vue,MapComponent.vue, etc.) responsible for rendering specific UI elements on the artboard. Their default styles are theme-consistent and visually distinct.
Development Notes
- Component Diversity: The application uses a dynamic component rendering approach. Each UI element (e.g., button, image, input) has its own dedicated Vue component in
src/components/render-components/. This allows for flexible styling and property management per component type. - Component Definition: Components available in the library are defined in
StandardComponents.js. Each definition includestype,name,group, and adefaultsobject containingprops(for data liketext,src,placeholder) andstyle(for CSS properties). - State Management:
Piniais used for global state management, particularly forprojectStorewhich holds the current project's data, active page, and components. - Theming: Global CSS variables in
App.vue(--bg-color,--panel-color,--accent-color,--border-color,--text-color,--border-radius) provide a centralized and consistent dark theme.
To-Do / Future Enhancements
- Implement full functionality for currently placeholder components (e.g.,
LogicEditor). - Add more advanced layout tools (e.g., grouping, alignment tools, distribution).
- Implement Undo/Redo functionality.
- Integrate persistent storage for projects (e.g., LocalStorage, IndexedDB, or a backend).
- Further refine the properties panel with dynamic input types based on property types (e.g., dropdowns for enums, toggles for booleans).
- Code generation: currently logs to console, needs a proper export feature.
Description
Languages
Vue
85.8%
JavaScript
13.8%
HTML
0.4%