mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2025-10-26 07:46:35 +01:00
830 lines
18 KiB
Markdown
830 lines
18 KiB
Markdown
|
|
# CyberPanel 2.5.5-dev Custom CSS Guide
|
||
|
|
|
||
|
|
A comprehensive guide for creating custom CSS that fully works with the new design system of CyberPanel 2.5.5-dev.
|
||
|
|
|
||
|
|
## Table of Contents
|
||
|
|
|
||
|
|
1. [Overview](#overview)
|
||
|
|
2. [Design System Architecture](#design-system-architecture)
|
||
|
|
3. [CSS Variables Reference](#css-variables-reference)
|
||
|
|
4. [Component Structure](#component-structure)
|
||
|
|
5. [Customization Examples](#customization-examples)
|
||
|
|
6. [Best Practices](#best-practices)
|
||
|
|
7. [Troubleshooting](#troubleshooting)
|
||
|
|
8. [Advanced Techniques](#advanced-techniques)
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
CyberPanel 2.5.5-dev features a modern, CSS-variable-based design system that supports both light and dark themes. The system is built with:
|
||
|
|
|
||
|
|
- **CSS Custom Properties (Variables)** for consistent theming
|
||
|
|
- **Modern CSS Grid and Flexbox** layouts
|
||
|
|
- **Responsive design** principles
|
||
|
|
- **Dark mode support** with automatic theme switching
|
||
|
|
- **Component-based architecture** for easy customization
|
||
|
|
|
||
|
|
## Design System Architecture
|
||
|
|
|
||
|
|
### Core Structure
|
||
|
|
|
||
|
|
The design system is built around CSS custom properties defined in `:root` and `[data-theme="dark"]` selectors:
|
||
|
|
|
||
|
|
```css
|
||
|
|
:root {
|
||
|
|
/* Light Theme Variables */
|
||
|
|
--bg-primary: #f0f0ff;
|
||
|
|
--bg-secondary: white;
|
||
|
|
--text-primary: #2f3640;
|
||
|
|
--accent-color: #5856d6;
|
||
|
|
/* ... more variables */
|
||
|
|
}
|
||
|
|
|
||
|
|
[data-theme="dark"] {
|
||
|
|
/* Dark Theme Variables */
|
||
|
|
--bg-primary: #0f0f23;
|
||
|
|
--bg-secondary: #1a1a3e;
|
||
|
|
--text-primary: #e4e4e7;
|
||
|
|
--accent-color: #7c7ff3;
|
||
|
|
/* ... more variables */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Key Components
|
||
|
|
|
||
|
|
1. **Header** (`#header`) - Top navigation bar
|
||
|
|
2. **Sidebar** (`#sidebar`) - Left navigation panel
|
||
|
|
3. **Main Content** (`#main-content`) - Page content area
|
||
|
|
4. **Cards** (`.content-card`) - Content containers
|
||
|
|
5. **Buttons** (`.btn`) - Interactive elements
|
||
|
|
6. **Forms** (`.form-*`) - Input elements
|
||
|
|
|
||
|
|
## CSS Variables Reference
|
||
|
|
|
||
|
|
### Color Variables
|
||
|
|
|
||
|
|
#### Background Colors
|
||
|
|
```css
|
||
|
|
--bg-primary /* Main background color */
|
||
|
|
--bg-secondary /* Card/container background */
|
||
|
|
--bg-sidebar /* Sidebar background */
|
||
|
|
--bg-sidebar-item /* Sidebar menu item background */
|
||
|
|
--bg-hover /* Hover state background */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Text Colors
|
||
|
|
```css
|
||
|
|
--text-primary /* Main text color */
|
||
|
|
--text-secondary /* Secondary text color */
|
||
|
|
--text-heading /* Heading text color */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Accent Colors
|
||
|
|
```css
|
||
|
|
--accent-color /* Primary accent color */
|
||
|
|
--accent-hover /* Accent hover state */
|
||
|
|
--danger-color /* Error/danger color */
|
||
|
|
--success-color /* Success color */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Border & Shadow
|
||
|
|
```css
|
||
|
|
--border-color /* Default border color */
|
||
|
|
--shadow-color /* Default shadow color */
|
||
|
|
```
|
||
|
|
|
||
|
|
### Special Variables
|
||
|
|
|
||
|
|
#### Gradients
|
||
|
|
```css
|
||
|
|
--warning-bg /* Warning banner gradient */
|
||
|
|
--ai-banner-bg /* AI scanner banner gradient */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Status Colors
|
||
|
|
```css
|
||
|
|
--success-bg /* Success background */
|
||
|
|
--success-border /* Success border */
|
||
|
|
--danger-bg /* Danger background */
|
||
|
|
--danger-border /* Danger border */
|
||
|
|
--warning-bg /* Warning background */
|
||
|
|
--info-bg /* Info background */
|
||
|
|
```
|
||
|
|
|
||
|
|
## Component Structure
|
||
|
|
|
||
|
|
### Header Component
|
||
|
|
|
||
|
|
```css
|
||
|
|
#header {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
height: 80px;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
padding: 0 30px;
|
||
|
|
box-shadow: 0 2px 12px var(--shadow-color);
|
||
|
|
position: fixed;
|
||
|
|
top: 0;
|
||
|
|
left: 260px;
|
||
|
|
right: 0;
|
||
|
|
z-index: 1000;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Customization Example:**
|
||
|
|
```css
|
||
|
|
/* Change header height and add custom styling */
|
||
|
|
#header {
|
||
|
|
height: 100px;
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
border-bottom: 3px solid var(--accent-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
#header .logo-text .brand {
|
||
|
|
font-size: 32px;
|
||
|
|
text-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Sidebar Component
|
||
|
|
|
||
|
|
```css
|
||
|
|
#sidebar {
|
||
|
|
width: 260px;
|
||
|
|
background: var(--bg-sidebar);
|
||
|
|
height: 100vh;
|
||
|
|
position: fixed;
|
||
|
|
left: 0;
|
||
|
|
top: 0;
|
||
|
|
overflow-y: auto;
|
||
|
|
z-index: 1001;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Customization Example:**
|
||
|
|
```css
|
||
|
|
/* Make sidebar wider with custom styling */
|
||
|
|
#sidebar {
|
||
|
|
width: 300px;
|
||
|
|
background: linear-gradient(180deg, var(--bg-sidebar), var(--bg-secondary));
|
||
|
|
border-right: 2px solid var(--accent-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item {
|
||
|
|
margin: 4px 20px;
|
||
|
|
border-radius: 12px;
|
||
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item:hover {
|
||
|
|
transform: translateX(5px);
|
||
|
|
box-shadow: 0 4px 12px var(--shadow-color);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Content Cards
|
||
|
|
|
||
|
|
```css
|
||
|
|
.content-card {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
border-radius: 12px;
|
||
|
|
padding: 30px;
|
||
|
|
box-shadow: 0 2px 8px var(--shadow-color);
|
||
|
|
border: 1px solid var(--border-color);
|
||
|
|
margin-bottom: 25px;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Customization Example:**
|
||
|
|
```css
|
||
|
|
/* Add glassmorphism effect to cards */
|
||
|
|
.content-card {
|
||
|
|
background: rgba(255, 255, 255, 0.1);
|
||
|
|
backdrop-filter: blur(10px);
|
||
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
[data-theme="dark"] .content-card {
|
||
|
|
background: rgba(26, 26, 62, 0.3);
|
||
|
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Customization Examples
|
||
|
|
|
||
|
|
### 1. Complete Theme Override
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Custom Purple Theme */
|
||
|
|
:root {
|
||
|
|
--bg-primary: #f8f4ff;
|
||
|
|
--bg-secondary: #ffffff;
|
||
|
|
--bg-sidebar: #f3f0ff;
|
||
|
|
--bg-hover: #e8e0ff;
|
||
|
|
--text-primary: #2d1b69;
|
||
|
|
--text-secondary: #6b46c1;
|
||
|
|
--accent-color: #8b5cf6;
|
||
|
|
--accent-hover: #7c3aed;
|
||
|
|
--border-color: #e0d7ff;
|
||
|
|
--shadow-color: rgba(139, 92, 246, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
[data-theme="dark"] {
|
||
|
|
--bg-primary: #1a0b2e;
|
||
|
|
--bg-secondary: #2d1b69;
|
||
|
|
--bg-sidebar: #1e0a3e;
|
||
|
|
--bg-hover: #3d2a7a;
|
||
|
|
--text-primary: #f3f0ff;
|
||
|
|
--text-secondary: #c4b5fd;
|
||
|
|
--accent-color: #a78bfa;
|
||
|
|
--accent-hover: #8b5cf6;
|
||
|
|
--border-color: #4c1d95;
|
||
|
|
--shadow-color: rgba(139, 92, 246, 0.3);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Custom Button Styles
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Custom button variants */
|
||
|
|
.btn-custom {
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
border: none;
|
||
|
|
border-radius: 20px;
|
||
|
|
padding: 12px 24px;
|
||
|
|
color: white;
|
||
|
|
font-weight: 600;
|
||
|
|
text-transform: uppercase;
|
||
|
|
letter-spacing: 0.5px;
|
||
|
|
box-shadow: 0 4px 15px rgba(139, 92, 246, 0.3);
|
||
|
|
transition: all 0.3s ease;
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-custom:hover {
|
||
|
|
transform: translateY(-2px);
|
||
|
|
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.4);
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-custom:active {
|
||
|
|
transform: translateY(0);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Custom Sidebar Menu Items
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Animated sidebar menu items */
|
||
|
|
#sidebar .menu-item {
|
||
|
|
position: relative;
|
||
|
|
overflow: hidden;
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item::before {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
top: 0;
|
||
|
|
left: -100%;
|
||
|
|
width: 100%;
|
||
|
|
height: 100%;
|
||
|
|
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
|
||
|
|
transition: left 0.5s;
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item:hover::before {
|
||
|
|
left: 100%;
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item .icon-wrapper {
|
||
|
|
position: relative;
|
||
|
|
z-index: 1;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Custom Form Styling
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Modern form inputs */
|
||
|
|
.form-control {
|
||
|
|
border: 2px solid var(--border-color);
|
||
|
|
border-radius: 12px;
|
||
|
|
padding: 12px 16px;
|
||
|
|
font-size: 14px;
|
||
|
|
transition: all 0.3s ease;
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-control:focus {
|
||
|
|
border-color: var(--accent-color);
|
||
|
|
box-shadow: 0 0 0 4px rgba(139, 92, 246, 0.1);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-control::placeholder {
|
||
|
|
color: var(--text-secondary);
|
||
|
|
opacity: 0.7;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Custom Notifications
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Custom notification banners */
|
||
|
|
.notification-banner {
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
border-radius: 16px;
|
||
|
|
padding: 20px;
|
||
|
|
margin: 20px;
|
||
|
|
box-shadow: 0 8px 32px rgba(139, 92, 246, 0.3);
|
||
|
|
position: relative;
|
||
|
|
overflow: hidden;
|
||
|
|
}
|
||
|
|
|
||
|
|
.notification-banner::before {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
height: 4px;
|
||
|
|
background: linear-gradient(90deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4);
|
||
|
|
animation: rainbow 3s linear infinite;
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes rainbow {
|
||
|
|
0% { background-position: 0% 50%; }
|
||
|
|
50% { background-position: 100% 50%; }
|
||
|
|
100% { background-position: 0% 50%; }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
### 1. Use CSS Variables
|
||
|
|
|
||
|
|
Always use CSS variables instead of hardcoded values:
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* ✅ Good */
|
||
|
|
.custom-element {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
color: var(--text-primary);
|
||
|
|
border: 1px solid var(--border-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* ❌ Bad */
|
||
|
|
.custom-element {
|
||
|
|
background: white;
|
||
|
|
color: #2f3640;
|
||
|
|
border: 1px solid #e8e9ff;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Support Both Themes
|
||
|
|
|
||
|
|
Always provide both light and dark theme support:
|
||
|
|
|
||
|
|
```css
|
||
|
|
.custom-element {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
color: var(--text-primary);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Dark theme specific adjustments */
|
||
|
|
[data-theme="dark"] .custom-element {
|
||
|
|
/* Additional dark theme styling if needed */
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Use Semantic Class Names
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* ✅ Good */
|
||
|
|
.primary-button { }
|
||
|
|
.content-container { }
|
||
|
|
.navigation-item { }
|
||
|
|
|
||
|
|
/* ❌ Bad */
|
||
|
|
.red-button { }
|
||
|
|
.big-box { }
|
||
|
|
.item1 { }
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Maintain Responsive Design
|
||
|
|
|
||
|
|
```css
|
||
|
|
.custom-element {
|
||
|
|
padding: 20px;
|
||
|
|
font-size: 16px;
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
.custom-element {
|
||
|
|
padding: 15px;
|
||
|
|
font-size: 14px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. Use Modern CSS Features
|
||
|
|
|
||
|
|
```css
|
||
|
|
.custom-element {
|
||
|
|
/* Use CSS Grid for layouts */
|
||
|
|
display: grid;
|
||
|
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
||
|
|
gap: 20px;
|
||
|
|
|
||
|
|
/* Use Flexbox for alignment */
|
||
|
|
align-items: center;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
/* Use CSS custom properties for calculations */
|
||
|
|
--element-height: 60px;
|
||
|
|
height: var(--element-height);
|
||
|
|
|
||
|
|
/* Use modern selectors */
|
||
|
|
&:hover { }
|
||
|
|
&:focus-within { }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Common Issues
|
||
|
|
|
||
|
|
#### 1. Custom CSS Not Applying
|
||
|
|
|
||
|
|
**Problem:** Custom CSS doesn't appear to be working.
|
||
|
|
|
||
|
|
**Solution:**
|
||
|
|
- Check CSS specificity - use more specific selectors
|
||
|
|
- Ensure CSS is placed after the base styles
|
||
|
|
- Use `!important` sparingly and only when necessary
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Increase specificity */
|
||
|
|
#main-content .content-card .custom-element {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 2. Dark Mode Not Working
|
||
|
|
|
||
|
|
**Problem:** Custom styles don't adapt to dark mode.
|
||
|
|
|
||
|
|
**Solution:**
|
||
|
|
- Always use CSS variables
|
||
|
|
- Test both light and dark themes
|
||
|
|
- Provide dark mode specific overrides when needed
|
||
|
|
|
||
|
|
```css
|
||
|
|
.custom-element {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
color: var(--text-primary);
|
||
|
|
}
|
||
|
|
|
||
|
|
[data-theme="dark"] .custom-element {
|
||
|
|
/* Dark mode specific adjustments */
|
||
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### 3. Responsive Issues
|
||
|
|
|
||
|
|
**Problem:** Custom styles break on mobile devices.
|
||
|
|
|
||
|
|
**Solution:**
|
||
|
|
- Use relative units (rem, em, %)
|
||
|
|
- Test on different screen sizes
|
||
|
|
- Use CSS Grid and Flexbox for responsive layouts
|
||
|
|
|
||
|
|
```css
|
||
|
|
.custom-element {
|
||
|
|
width: 100%;
|
||
|
|
max-width: 1200px;
|
||
|
|
margin: 0 auto;
|
||
|
|
padding: 1rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
.custom-element {
|
||
|
|
padding: 0.5rem;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Advanced Techniques
|
||
|
|
|
||
|
|
### 1. CSS Animations
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Smooth page transitions */
|
||
|
|
.page-transition {
|
||
|
|
animation: fadeIn 0.3s ease-in-out;
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes fadeIn {
|
||
|
|
from { opacity: 0; transform: translateY(20px); }
|
||
|
|
to { opacity: 1; transform: translateY(0); }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Hover animations */
|
||
|
|
.interactive-element {
|
||
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.interactive-element:hover {
|
||
|
|
transform: translateY(-2px) scale(1.02);
|
||
|
|
box-shadow: 0 8px 25px var(--shadow-color);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. CSS Grid Layouts
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Advanced grid layouts */
|
||
|
|
.dashboard-grid {
|
||
|
|
display: grid;
|
||
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||
|
|
gap: 20px;
|
||
|
|
padding: 20px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.dashboard-card {
|
||
|
|
grid-column: span 1;
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
border-radius: 12px;
|
||
|
|
padding: 20px;
|
||
|
|
box-shadow: 0 2px 8px var(--shadow-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
.dashboard-card.featured {
|
||
|
|
grid-column: span 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
.dashboard-card.featured {
|
||
|
|
grid-column: span 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. CSS Custom Properties with JavaScript
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Dynamic theming with CSS variables */
|
||
|
|
:root {
|
||
|
|
--custom-accent: #5856d6;
|
||
|
|
--custom-accent-hover: #4644c0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.custom-theme {
|
||
|
|
--accent-color: var(--custom-accent);
|
||
|
|
--accent-hover: var(--custom-accent-hover);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Advanced Selectors
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Complex selectors for specific styling */
|
||
|
|
#sidebar .menu-item:not(.active):hover {
|
||
|
|
background: var(--bg-hover);
|
||
|
|
transform: translateX(5px);
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-card > *:first-child {
|
||
|
|
margin-top: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-card > *:last-child {
|
||
|
|
margin-bottom: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Attribute selectors */
|
||
|
|
[data-status="success"] {
|
||
|
|
border-left: 4px solid var(--success-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
[data-status="error"] {
|
||
|
|
border-left: 4px solid var(--danger-color);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. CSS Functions and Calculations
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Using CSS functions */
|
||
|
|
.responsive-text {
|
||
|
|
font-size: clamp(14px, 2.5vw, 18px);
|
||
|
|
line-height: calc(1.5em + 0.5vw);
|
||
|
|
}
|
||
|
|
|
||
|
|
.dynamic-spacing {
|
||
|
|
padding: calc(1rem + 2vw);
|
||
|
|
margin: calc(0.5rem + 1vw);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* CSS custom properties with calculations */
|
||
|
|
:root {
|
||
|
|
--base-size: 16px;
|
||
|
|
--scale-factor: 1.2;
|
||
|
|
--large-size: calc(var(--base-size) * var(--scale-factor));
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Implementation Guide
|
||
|
|
|
||
|
|
### Step 1: Access the Design Page
|
||
|
|
|
||
|
|
1. Log into CyberPanel
|
||
|
|
2. Navigate to **Design** in the sidebar
|
||
|
|
3. Scroll down to the **Custom CSS** section
|
||
|
|
|
||
|
|
### Step 2: Add Your Custom CSS
|
||
|
|
|
||
|
|
1. Paste your custom CSS into the textarea
|
||
|
|
2. Click **Save Changes**
|
||
|
|
3. Refresh the page to see your changes
|
||
|
|
|
||
|
|
### Step 3: Test Your Changes
|
||
|
|
|
||
|
|
1. Test in both light and dark modes
|
||
|
|
2. Test on different screen sizes
|
||
|
|
3. Verify all interactive elements work correctly
|
||
|
|
|
||
|
|
### Step 4: Iterate and Refine
|
||
|
|
|
||
|
|
1. Make adjustments as needed
|
||
|
|
2. Test thoroughly before finalizing
|
||
|
|
3. Document your customizations
|
||
|
|
|
||
|
|
## Example: Complete Custom Theme
|
||
|
|
|
||
|
|
Here's a complete example of a custom theme that you can use as a starting point:
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Custom CyberPanel Theme - Ocean Blue */
|
||
|
|
|
||
|
|
/* Light Theme */
|
||
|
|
:root {
|
||
|
|
--bg-primary: #f0f9ff;
|
||
|
|
--bg-secondary: #ffffff;
|
||
|
|
--bg-sidebar: #e0f2fe;
|
||
|
|
--bg-sidebar-item: #ffffff;
|
||
|
|
--bg-hover: #bae6fd;
|
||
|
|
--text-primary: #0c4a6e;
|
||
|
|
--text-secondary: #0369a1;
|
||
|
|
--text-heading: #0c4a6e;
|
||
|
|
--border-color: #bae6fd;
|
||
|
|
--shadow-color: rgba(6, 105, 161, 0.1);
|
||
|
|
--accent-color: #0284c7;
|
||
|
|
--accent-hover: #0369a1;
|
||
|
|
--danger-color: #dc2626;
|
||
|
|
--success-color: #059669;
|
||
|
|
--warning-bg: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
|
||
|
|
--ai-banner-bg: linear-gradient(135deg, #0284c7 0%, #0369a1 50%, #0c4a6e 100%);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Dark Theme */
|
||
|
|
[data-theme="dark"] {
|
||
|
|
--bg-primary: #0c4a6e;
|
||
|
|
--bg-secondary: #075985;
|
||
|
|
--bg-sidebar: #0c4a6e;
|
||
|
|
--bg-sidebar-item: #075985;
|
||
|
|
--bg-hover: #0369a1;
|
||
|
|
--text-primary: #e0f2fe;
|
||
|
|
--text-secondary: #bae6fd;
|
||
|
|
--text-heading: #f0f9ff;
|
||
|
|
--border-color: #0369a1;
|
||
|
|
--shadow-color: rgba(0, 0, 0, 0.3);
|
||
|
|
--accent-color: #38bdf8;
|
||
|
|
--accent-hover: #0ea5e9;
|
||
|
|
--danger-color: #f87171;
|
||
|
|
--success-color: #34d399;
|
||
|
|
--warning-bg: linear-gradient(135deg, #78350f 0%, #92400e 100%);
|
||
|
|
--ai-banner-bg: linear-gradient(135deg, #0c4a6e 0%, #075985 50%, #0369a1 100%);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Header Styling */
|
||
|
|
#header {
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
box-shadow: 0 4px 20px var(--shadow-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
#header .logo-text .brand {
|
||
|
|
color: white;
|
||
|
|
text-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Sidebar Styling */
|
||
|
|
#sidebar {
|
||
|
|
background: linear-gradient(180deg, var(--bg-sidebar), var(--bg-secondary));
|
||
|
|
border-right: 3px solid var(--accent-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item {
|
||
|
|
border-radius: 12px;
|
||
|
|
margin: 4px 20px;
|
||
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item:hover {
|
||
|
|
transform: translateX(8px);
|
||
|
|
box-shadow: 0 4px 15px var(--shadow-color);
|
||
|
|
}
|
||
|
|
|
||
|
|
#sidebar .menu-item.active {
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
box-shadow: 0 4px 15px rgba(2, 132, 199, 0.3);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Content Cards */
|
||
|
|
.content-card {
|
||
|
|
background: var(--bg-secondary);
|
||
|
|
border-radius: 16px;
|
||
|
|
box-shadow: 0 4px 20px var(--shadow-color);
|
||
|
|
border: 1px solid var(--border-color);
|
||
|
|
position: relative;
|
||
|
|
overflow: hidden;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-card::before {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
height: 4px;
|
||
|
|
background: linear-gradient(90deg, var(--accent-color), var(--accent-hover));
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Buttons */
|
||
|
|
.btn {
|
||
|
|
border-radius: 12px;
|
||
|
|
font-weight: 600;
|
||
|
|
text-transform: uppercase;
|
||
|
|
letter-spacing: 0.5px;
|
||
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-primary {
|
||
|
|
background: linear-gradient(135deg, var(--accent-color), var(--accent-hover));
|
||
|
|
box-shadow: 0 4px 15px rgba(2, 132, 199, 0.3);
|
||
|
|
}
|
||
|
|
|
||
|
|
.btn-primary:hover {
|
||
|
|
transform: translateY(-2px);
|
||
|
|
box-shadow: 0 6px 20px rgba(2, 132, 199, 0.4);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Form Elements */
|
||
|
|
.form-control {
|
||
|
|
border: 2px solid var(--border-color);
|
||
|
|
border-radius: 12px;
|
||
|
|
transition: all 0.3s ease;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-control:focus {
|
||
|
|
border-color: var(--accent-color);
|
||
|
|
box-shadow: 0 0 0 4px rgba(2, 132, 199, 0.1);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Custom Animations */
|
||
|
|
@keyframes slideIn {
|
||
|
|
from {
|
||
|
|
opacity: 0;
|
||
|
|
transform: translateY(20px);
|
||
|
|
}
|
||
|
|
to {
|
||
|
|
opacity: 1;
|
||
|
|
transform: translateY(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-card {
|
||
|
|
animation: slideIn 0.5s ease-out;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Responsive Design */
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
#sidebar {
|
||
|
|
width: 100%;
|
||
|
|
height: auto;
|
||
|
|
position: relative;
|
||
|
|
}
|
||
|
|
|
||
|
|
#header {
|
||
|
|
left: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.content-card {
|
||
|
|
margin: 10px;
|
||
|
|
padding: 20px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
This guide provides everything you need to create beautiful, functional custom CSS for CyberPanel 2.5.5+. Remember to always test your changes thoroughly and use the CSS variables for consistency across themes.
|