13 KiB
layout | title | nav_order |
---|---|---|
default | Configuration | 3 |
Configuration Guide
{: .no_toc }
Complete guide to configuring and customizing Gentelella Admin Template {: .fs-6 .fw-300 }
Table of contents
{: .no_toc .text-delta }
- TOC {:toc}
Vite Configuration
Basic Configuration
The vite.config.js
file contains optimized settings for both development and production builds:
import { defineConfig } from 'vite';
import { resolve } from 'path';
export default defineConfig({
// Development server configuration
server: {
port: 3000,
host: true,
open: true
},
// Build configuration
build: {
outDir: 'dist',
assetsDir: 'assets',
rollupOptions: {
input: {
// All 42 HTML files are configured as entry points
'index': 'production/index.html',
'index2': 'production/index2.html',
'index3': 'production/index3.html',
'form': 'production/form.html',
'form_advanced': 'production/form_advanced.html',
'tables': 'production/tables.html',
'charts': 'production/chartjs.html',
// ... and 35 more pages
},
output: {
// Manual chunk splitting for optimal loading
manualChunks: {
'vendor-core': ['bootstrap', '@popperjs/core'],
'vendor-charts': ['chart.js', 'morris.js'],
'vendor-forms': ['select2', 'tempus-dominus'],
'vendor-tables': ['datatables.net'],
'vendor-utils': ['dayjs', 'nprogress']
}
}
},
// Asset optimization
assetsInlineLimit: 4096,
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
}
});
Advanced Vite Options
Development Optimizations
export default defineConfig({
server: {
// Custom port
port: 3001,
// Enable HTTPS for local development
https: true,
// Proxy API requests
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
},
// Enable source maps in development
css: {
devSourcemap: true
}
});
Production Optimizations
export default defineConfig({
build: {
// Target modern browsers for smaller bundles
target: 'es2018',
// Enable CSS code splitting
cssCodeSplit: true,
// Generate source maps for production debugging
sourcemap: true,
// Optimize chunk size
chunkSizeWarningLimit: 1000
}
});
SASS Configuration
Main SASS File
The src/main.scss
file is the entry point for all styles:
// Modern @use syntax (recommended)
@use "bootstrap/scss/bootstrap";
@use "./scss/custom.scss";
// Legacy @import syntax (still supported)
// @import "bootstrap/scss/bootstrap";
// @import "./scss/custom.scss";
Bootstrap Customization
Create src/scss/bootstrap-custom.scss
to override Bootstrap variables:
// Override Bootstrap variables BEFORE importing Bootstrap
$primary: #73879C;
$secondary: #6c757d;
$success: #26B99A;
$info: #3498DB;
$warning: #F39C12;
$danger: #E74C3C;
// Typography
$font-family-base: 'Roboto', 'Helvetica Neue', Arial, sans-serif;
$font-size-base: 14px;
$line-height-base: 1.5;
// Sidebar customization
$sidebar-width: 230px;
$sidebar-bg: #2A3F54;
$sidebar-text-color: #E7E7E7;
// Import Bootstrap with your customizations
@import "bootstrap/scss/bootstrap";
Custom Component Styles
Create src/scss/components/
directory for modular styles:
// src/scss/components/_dashboard.scss
.dashboard-card {
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
transition: transform 0.2s ease-in-out;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.card-header {
background: linear-gradient(135deg, $primary, darken($primary, 10%));
color: white;
border-radius: 8px 8px 0 0;
}
}
// src/scss/components/_sidebar.scss
.sidebar {
width: $sidebar-width;
background-color: $sidebar-bg;
.nav-link {
color: $sidebar-text-color;
padding: 12px 20px;
border-radius: 4px;
margin: 2px 10px;
transition: all 0.3s ease;
&:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
&.active {
background-color: $primary;
color: white;
}
}
}
Module Configuration
Smart Loading System
Configure which modules load automatically vs. on-demand:
// src/main-core.js - Always loaded essentials
import 'bootstrap/dist/js/bootstrap.bundle.min.js';
import './js/custom.min.js';
// Initialize core functionality
document.addEventListener('DOMContentLoaded', function() {
// Initialize tooltips
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl =>
new bootstrap.Tooltip(tooltipTriggerEl)
);
// Initialize popovers
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]');
const popoverList = [...popoverTriggerList].map(popoverTriggerEl =>
new bootstrap.Popover(popoverTriggerEl)
);
});
// Dynamic module loading
export async function loadModule(moduleName) {
try {
switch(moduleName) {
case 'charts':
return await import('./modules/charts.js');
case 'forms':
return await import('./modules/forms.js');
case 'tables':
return await import('./modules/tables.js');
case 'dashboard':
return await import('./modules/dashboard.js');
default:
throw new Error(`Unknown module: ${moduleName}`);
}
} catch (error) {
console.error(`Failed to load module ${moduleName}:`, error);
return null;
}
}
Chart Module Configuration
// src/modules/charts.js
import Chart from 'chart.js/auto';
export const chartConfig = {
// Default Chart.js configuration
defaultOptions: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'bottom'
}
},
scales: {
y: {
beginAtZero: true
}
}
},
// Chart themes
themes: {
primary: {
backgroundColor: 'rgba(115, 135, 156, 0.1)',
borderColor: '#73879C',
pointBackgroundColor: '#73879C'
},
success: {
backgroundColor: 'rgba(38, 185, 154, 0.1)',
borderColor: '#26B99A',
pointBackgroundColor: '#26B99A'
}
}
};
export function initializeCharts() {
// Auto-initialize charts on page load
const chartElements = document.querySelectorAll('.chart-container canvas');
chartElements.forEach(canvas => {
const chartType = canvas.dataset.chartType || 'line';
const chartData = JSON.parse(canvas.dataset.chartData || '{}');
new Chart(canvas, {
type: chartType,
data: chartData,
options: chartConfig.defaultOptions
});
});
}
Form Module Configuration
// src/modules/forms.js
import { DateTime } from 'tempus-dominus';
export const formConfig = {
// Select2 configuration
select2: {
theme: 'bootstrap-5',
width: '100%',
placeholder: 'Select an option...',
allowClear: true
},
// Date picker configuration
datePicker: {
display: {
theme: 'light',
components: {
calendar: true,
date: true,
month: true,
year: true,
decades: true,
clock: false
}
},
localization: {
format: 'MM/dd/yyyy'
}
},
// Validation rules
validation: {
errorClass: 'is-invalid',
successClass: 'is-valid',
errorElement: 'div',
errorPlacement: function(error, element) {
error.addClass('invalid-feedback');
element.closest('.form-group').append(error);
}
}
};
export function initializeForms() {
// Initialize Select2
$('.select2').select2(formConfig.select2);
// Initialize date pickers
$('.datepicker').each(function() {
new DateTime(this, formConfig.datePicker);
});
// Initialize form validation
$('form[data-validate]').each(function() {
$(this).validate(formConfig.validation);
});
}
Environment Variables
Development Environment
Create .env.development
:
# Development settings
VITE_API_URL=http://localhost:8080/api
VITE_APP_NAME=Gentelella Admin (Dev)
VITE_DEBUG_MODE=true
VITE_BUNDLE_ANALYZER=false
# Feature flags
VITE_ENABLE_CHARTS=true
VITE_ENABLE_MAPS=true
VITE_ENABLE_REAL_TIME=false
Production Environment
Create .env.production
:
# Production settings
VITE_API_URL=https://api.yoursite.com
VITE_APP_NAME=Gentelella Admin
VITE_DEBUG_MODE=false
VITE_BUNDLE_ANALYZER=false
# Performance settings
VITE_PRELOAD_MODULES=charts,forms
VITE_CDN_URL=https://cdn.yoursite.com
Using Environment Variables
// In your JavaScript files
const apiUrl = import.meta.env.VITE_API_URL;
const debugMode = import.meta.env.VITE_DEBUG_MODE === 'true';
if (debugMode) {
console.log('Debug mode enabled');
}
// Conditional module loading
if (import.meta.env.VITE_ENABLE_CHARTS === 'true') {
const charts = await import('./modules/charts.js');
charts.initializeCharts();
}
Performance Configuration
Bundle Optimization
// vite.config.js - Production optimizations
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
// Core vendor libraries (loaded on every page)
'vendor-core': [
'bootstrap',
'@popperjs/core',
'jquery'
],
// Chart libraries (loaded only on chart pages)
'vendor-charts': [
'chart.js',
'morris.js',
'gauge.js',
'jquery-sparkline'
],
// Form enhancement libraries
'vendor-forms': [
'select2',
'tempus-dominus',
'ion-rangeslider',
'switchery'
],
// Table functionality
'vendor-tables': [
'datatables.net',
'datatables.net-bs5',
'datatables.net-responsive'
],
// Utility libraries
'vendor-utils': [
'dayjs',
'nprogress',
'autosize'
]
}
}
}
}
});
Asset Optimization
// vite.config.js - Asset handling
export default defineConfig({
assetsInclude: ['**/*.xlsx', '**/*.pdf'],
build: {
assetsInlineLimit: 4096, // Inline assets smaller than 4KB
rollupOptions: {
output: {
assetFileNames: (assetInfo) => {
const info = assetInfo.name.split('.');
const extType = info[info.length - 1];
if (/\.(png|jpe?g|svg|gif|tiff|bmp|ico)$/i.test(assetInfo.name)) {
return `images/[name]-[hash][extname]`;
}
if (/\.(woff2?|eot|ttf|otf)$/i.test(assetInfo.name)) {
return `fonts/[name]-[hash][extname]`;
}
if (/\.css$/i.test(assetInfo.name)) {
return `css/[name]-[hash][extname]`;
}
return `assets/[name]-[hash][extname]`;
}
}
}
}
});
Advanced Configuration
TypeScript Support
Enable TypeScript by creating tsconfig.json
:
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"paths": {
"@/*": ["./src/*"],
"@components/*": ["./src/components/*"],
"@modules/*": ["./src/modules/*"]
}
},
"include": ["src"]
}
ESLint Configuration
Create .eslintrc.js
:
module.exports = {
env: {
browser: true,
es2021: true,
node: true
},
extends: [
'eslint:recommended',
'@typescript-eslint/recommended'
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module'
},
plugins: ['@typescript-eslint'],
rules: {
'no-console': 'warn',
'no-debugger': 'error',
'prefer-const': 'error',
'no-var': 'error'
},
ignorePatterns: ['dist', 'node_modules', 'vendors']
};
Prettier Configuration
Create .prettierrc
:
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"bracketSpacing": true,
"arrowParens": "avoid",
"endOfLine": "lf"
}
Next Steps
- [Components Guide]({{ site.baseurl }}/docs/components/) - Explore all available components
- [Customization Guide]({{ site.baseurl }}/docs/customization/) - Advanced customization techniques
- [Performance Guide]({{ site.baseurl }}/docs/performance/) - Optimization strategies
- [Deployment Guide]({{ site.baseurl }}/docs/deployment/) - Deploy to production
{: .highlight } 💡 Pro Tip: Start with the default configuration and gradually customize based on your project needs. The modular architecture allows you to enable/disable features as required.