997 lines
29 KiB
Markdown
Executable File
997 lines
29 KiB
Markdown
Executable File
# 🎨 DESIGN SYSTEM - Documentazione Completa NetGescon
|
|
|
|
> **Sistema di Design dell'interfaccia universale**
|
|
> **📅 Creato:** 21/07/2025
|
|
> **🔄 Ultimo aggiornamento:** 21/07/2025
|
|
> **🎯 Priorità:** ⚡ ALTO
|
|
|
|
---
|
|
|
|
## 📋 **OVERVIEW DESIGN SYSTEM**
|
|
|
|
Il Design System NetGescon fornisce **LINEE GUIDA UNIFICATE** per:
|
|
- 🎨 **Palette Colori**
|
|
- 📝 **Typography System**
|
|
- 📏 **Spacing & Layout**
|
|
- 🔘 **Button Styles**
|
|
- 📋 **Form Elements**
|
|
- 📊 **Data Visualization**
|
|
- 🎭 **Icons & Graphics**
|
|
|
|
### 🎯 **Design Philosophy**
|
|
- **Consistenza** - Ogni elemento segue le stesse regole
|
|
- **Scalabilità** - Facilmente estendibile e mantenibile
|
|
- **Accessibilità** - WCAG 2.1 AA compliant
|
|
- **Performance** - Ottimizzato per velocità e fluidità
|
|
|
|
---
|
|
|
|
## 🌈 **PALETTE COLORI**
|
|
|
|
### 🎨 **CSS Variables System**
|
|
```css
|
|
/* /public/css/design-system/colors.css */
|
|
|
|
:root {
|
|
/* === PRIMARY COLORS === */
|
|
--netgescon-primary: #2563eb; /* Blue 600 */
|
|
--netgescon-primary-light: #3b82f6; /* Blue 500 */
|
|
--netgescon-primary-dark: #1d4ed8; /* Blue 700 */
|
|
--netgescon-primary-50: #eff6ff; /* Blue 50 */
|
|
--netgescon-primary-100: #dbeafe; /* Blue 100 */
|
|
--netgescon-primary-200: #bfdbfe; /* Blue 200 */
|
|
|
|
/* === SECONDARY COLORS === */
|
|
--netgescon-secondary: #64748b; /* Slate 500 */
|
|
--netgescon-secondary-light: #94a3b8; /* Slate 400 */
|
|
--netgescon-secondary-dark: #475569; /* Slate 600 */
|
|
|
|
/* === SEMANTIC COLORS === */
|
|
--netgescon-success: #16a34a; /* Green 600 */
|
|
--netgescon-success-light: #22c55e; /* Green 500 */
|
|
--netgescon-success-dark: #15803d; /* Green 700 */
|
|
--netgescon-success-50: #f0fdf4; /* Green 50 */
|
|
|
|
--netgescon-warning: #d97706; /* Orange 600 */
|
|
--netgescon-warning-light: #f59e0b; /* Orange 500 */
|
|
--netgescon-warning-dark: #b45309; /* Orange 700 */
|
|
--netgescon-warning-50: #fffbeb; /* Orange 50 */
|
|
|
|
--netgescon-danger: #dc2626; /* Red 600 */
|
|
--netgescon-danger-light: #ef4444; /* Red 500 */
|
|
--netgescon-danger-dark: #b91c1c; /* Red 700 */
|
|
--netgescon-danger-50: #fef2f2; /* Red 50 */
|
|
|
|
--netgescon-info: #0891b2; /* Cyan 600 */
|
|
--netgescon-info-light: #06b6d4; /* Cyan 500 */
|
|
--netgescon-info-dark: #0e7490; /* Cyan 700 */
|
|
--netgescon-info-50: #ecfeff; /* Cyan 50 */
|
|
|
|
/* === NEUTRAL COLORS === */
|
|
--netgescon-white: #ffffff;
|
|
--netgescon-gray-50: #f8fafc;
|
|
--netgescon-gray-100: #f1f5f9;
|
|
--netgescon-gray-200: #e2e8f0;
|
|
--netgescon-gray-300: #cbd5e1;
|
|
--netgescon-gray-400: #94a3b8;
|
|
--netgescon-gray-500: #64748b;
|
|
--netgescon-gray-600: #475569;
|
|
--netgescon-gray-700: #334155;
|
|
--netgescon-gray-800: #1e293b;
|
|
--netgescon-gray-900: #0f172a;
|
|
--netgescon-black: #000000;
|
|
|
|
/* === GRADIENTS === */
|
|
--netgescon-gradient-primary: linear-gradient(135deg, var(--netgescon-primary-light) 0%, var(--netgescon-primary) 100%);
|
|
--netgescon-gradient-success: linear-gradient(135deg, var(--netgescon-success-light) 0%, var(--netgescon-success) 100%);
|
|
--netgescon-gradient-warning: linear-gradient(135deg, var(--netgescon-warning-light) 0%, var(--netgescon-warning) 100%);
|
|
--netgescon-gradient-danger: linear-gradient(135deg, var(--netgescon-danger-light) 0%, var(--netgescon-danger) 100%);
|
|
|
|
/* === SHADOWS === */
|
|
--netgescon-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
--netgescon-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
|
|
--netgescon-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
--netgescon-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
|
--netgescon-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
|
|
|
/* === BORDERS === */
|
|
--netgescon-border-radius: 8px;
|
|
--netgescon-border-radius-sm: 4px;
|
|
--netgescon-border-radius-md: 6px;
|
|
--netgescon-border-radius-lg: 12px;
|
|
--netgescon-border-radius-xl: 16px;
|
|
--netgescon-border-radius-full: 9999px;
|
|
}
|
|
```
|
|
|
|
### 🎨 **Color Usage Guide**
|
|
```css
|
|
/* Primary - Per azioni principali */
|
|
.btn-primary { background-color: var(--netgescon-primary); }
|
|
.text-primary { color: var(--netgescon-primary); }
|
|
.border-primary { border-color: var(--netgescon-primary); }
|
|
|
|
/* Success - Per conferme e successi */
|
|
.alert-success { background-color: var(--netgescon-success-50); color: var(--netgescon-success-dark); }
|
|
.icon-success { color: var(--netgescon-success); }
|
|
|
|
/* Warning - Per avvisi e attenzioni */
|
|
.alert-warning { background-color: var(--netgescon-warning-50); color: var(--netgescon-warning-dark); }
|
|
.badge-warning { background-color: var(--netgescon-warning); }
|
|
|
|
/* Danger - Per errori e azioni distruttive */
|
|
.btn-danger { background-color: var(--netgescon-danger); }
|
|
.text-danger { color: var(--netgescon-danger); }
|
|
|
|
/* Neutral - Per testi e backgrounds */
|
|
.bg-gray-50 { background-color: var(--netgescon-gray-50); }
|
|
.text-gray-900 { color: var(--netgescon-gray-900); }
|
|
.border-gray-200 { border-color: var(--netgescon-gray-200); }
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 **TYPOGRAPHY SYSTEM**
|
|
|
|
### ⚡ **Font Configuration**
|
|
```css
|
|
/* /public/css/design-system/typography.css */
|
|
|
|
/* === FONT FAMILIES === */
|
|
:root {
|
|
--netgescon-font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
--netgescon-font-family-mono: 'JetBrains Mono', 'Fira Code', Consolas, 'Liberation Mono', Menlo, Monaco, 'Courier New', monospace;
|
|
}
|
|
|
|
/* === FONT SIZES === */
|
|
:root {
|
|
--netgescon-text-xs: 0.75rem; /* 12px */
|
|
--netgescon-text-sm: 0.875rem; /* 14px */
|
|
--netgescon-text-base: 1rem; /* 16px */
|
|
--netgescon-text-lg: 1.125rem; /* 18px */
|
|
--netgescon-text-xl: 1.25rem; /* 20px */
|
|
--netgescon-text-2xl: 1.5rem; /* 24px */
|
|
--netgescon-text-3xl: 1.875rem; /* 30px */
|
|
--netgescon-text-4xl: 2.25rem; /* 36px */
|
|
--netgescon-text-5xl: 3rem; /* 48px */
|
|
--netgescon-text-6xl: 4rem; /* 64px */
|
|
}
|
|
|
|
/* === FONT WEIGHTS === */
|
|
:root {
|
|
--netgescon-font-thin: 100;
|
|
--netgescon-font-light: 300;
|
|
--netgescon-font-normal: 400;
|
|
--netgescon-font-medium: 500;
|
|
--netgescon-font-semibold: 600;
|
|
--netgescon-font-bold: 700;
|
|
--netgescon-font-extrabold: 800;
|
|
--netgescon-font-black: 900;
|
|
}
|
|
|
|
/* === LINE HEIGHTS === */
|
|
:root {
|
|
--netgescon-leading-none: 1;
|
|
--netgescon-leading-tight: 1.25;
|
|
--netgescon-leading-snug: 1.375;
|
|
--netgescon-leading-normal: 1.5;
|
|
--netgescon-leading-relaxed: 1.625;
|
|
--netgescon-leading-loose: 2;
|
|
}
|
|
```
|
|
|
|
### 📖 **Typography Classes**
|
|
```css
|
|
/* === HEADINGS === */
|
|
.netgescon-h1 {
|
|
font-size: var(--netgescon-text-4xl);
|
|
font-weight: var(--netgescon-font-bold);
|
|
line-height: var(--netgescon-leading-tight);
|
|
color: var(--netgescon-gray-900);
|
|
margin-bottom: 1.5rem;
|
|
}
|
|
|
|
.netgescon-h2 {
|
|
font-size: var(--netgescon-text-3xl);
|
|
font-weight: var(--netgescon-font-semibold);
|
|
line-height: var(--netgescon-leading-tight);
|
|
color: var(--netgescon-gray-900);
|
|
margin-bottom: 1.25rem;
|
|
}
|
|
|
|
.netgescon-h3 {
|
|
font-size: var(--netgescon-text-2xl);
|
|
font-weight: var(--netgescon-font-semibold);
|
|
line-height: var(--netgescon-leading-snug);
|
|
color: var(--netgescon-gray-900);
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.netgescon-h4 {
|
|
font-size: var(--netgescon-text-xl);
|
|
font-weight: var(--netgescon-font-medium);
|
|
line-height: var(--netgescon-leading-snug);
|
|
color: var(--netgescon-gray-900);
|
|
margin-bottom: 0.75rem;
|
|
}
|
|
|
|
/* === BODY TEXT === */
|
|
.netgescon-body {
|
|
font-size: var(--netgescon-text-base);
|
|
font-weight: var(--netgescon-font-normal);
|
|
line-height: var(--netgescon-leading-relaxed);
|
|
color: var(--netgescon-gray-700);
|
|
}
|
|
|
|
.netgescon-body-sm {
|
|
font-size: var(--netgescon-text-sm);
|
|
font-weight: var(--netgescon-font-normal);
|
|
line-height: var(--netgescon-leading-normal);
|
|
color: var(--netgescon-gray-600);
|
|
}
|
|
|
|
.netgescon-body-lg {
|
|
font-size: var(--netgescon-text-lg);
|
|
font-weight: var(--netgescon-font-normal);
|
|
line-height: var(--netgescon-leading-relaxed);
|
|
color: var(--netgescon-gray-700);
|
|
}
|
|
|
|
/* === SPECIAL TEXT === */
|
|
.netgescon-label {
|
|
font-size: var(--netgescon-text-sm);
|
|
font-weight: var(--netgescon-font-medium);
|
|
line-height: var(--netgescon-leading-normal);
|
|
color: var(--netgescon-gray-700);
|
|
display: block;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.netgescon-caption {
|
|
font-size: var(--netgescon-text-xs);
|
|
font-weight: var(--netgescon-font-normal);
|
|
line-height: var(--netgescon-leading-normal);
|
|
color: var(--netgescon-gray-500);
|
|
}
|
|
|
|
.netgescon-code {
|
|
font-family: var(--netgescon-font-family-mono);
|
|
font-size: var(--netgescon-text-sm);
|
|
background-color: var(--netgescon-gray-100);
|
|
padding: 0.125rem 0.25rem;
|
|
border-radius: var(--netgescon-border-radius-sm);
|
|
color: var(--netgescon-gray-800);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📏 **SPACING & LAYOUT**
|
|
|
|
### 📐 **Spacing Scale**
|
|
```css
|
|
/* /public/css/design-system/spacing.css */
|
|
|
|
:root {
|
|
/* === SPACING SCALE === */
|
|
--netgescon-space-0: 0;
|
|
--netgescon-space-px: 1px;
|
|
--netgescon-space-0-5: 0.125rem; /* 2px */
|
|
--netgescon-space-1: 0.25rem; /* 4px */
|
|
--netgescon-space-1-5: 0.375rem; /* 6px */
|
|
--netgescon-space-2: 0.5rem; /* 8px */
|
|
--netgescon-space-2-5: 0.625rem; /* 10px */
|
|
--netgescon-space-3: 0.75rem; /* 12px */
|
|
--netgescon-space-3-5: 0.875rem; /* 14px */
|
|
--netgescon-space-4: 1rem; /* 16px */
|
|
--netgescon-space-5: 1.25rem; /* 20px */
|
|
--netgescon-space-6: 1.5rem; /* 24px */
|
|
--netgescon-space-7: 1.75rem; /* 28px */
|
|
--netgescon-space-8: 2rem; /* 32px */
|
|
--netgescon-space-9: 2.25rem; /* 36px */
|
|
--netgescon-space-10: 2.5rem; /* 40px */
|
|
--netgescon-space-12: 3rem; /* 48px */
|
|
--netgescon-space-16: 4rem; /* 64px */
|
|
--netgescon-space-20: 5rem; /* 80px */
|
|
--netgescon-space-24: 6rem; /* 96px */
|
|
--netgescon-space-32: 8rem; /* 128px */
|
|
|
|
/* === LAYOUT CONSTANTS === */
|
|
--netgescon-header-height: 70px;
|
|
--netgescon-footer-height: 70px;
|
|
--netgescon-sidebar-width: 280px;
|
|
--netgescon-sidebar-collapsed-width: 70px;
|
|
--netgescon-container-max-width: 1280px;
|
|
}
|
|
```
|
|
|
|
### 🏗️ **Layout Utilities**
|
|
```css
|
|
/* === CONTAINER === */
|
|
.netgescon-container {
|
|
width: 100%;
|
|
max-width: var(--netgescon-container-max-width);
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
padding-left: var(--netgescon-space-4);
|
|
padding-right: var(--netgescon-space-4);
|
|
}
|
|
|
|
/* === FLEXBOX UTILITIES === */
|
|
.netgescon-flex {
|
|
display: flex;
|
|
}
|
|
|
|
.netgescon-flex-col {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.netgescon-flex-wrap {
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.netgescon-items-center {
|
|
align-items: center;
|
|
}
|
|
|
|
.netgescon-items-start {
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.netgescon-items-end {
|
|
align-items: flex-end;
|
|
}
|
|
|
|
.netgescon-justify-center {
|
|
justify-content: center;
|
|
}
|
|
|
|
.netgescon-justify-between {
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.netgescon-justify-start {
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.netgescon-justify-end {
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
/* === GRID UTILITIES === */
|
|
.netgescon-grid {
|
|
display: grid;
|
|
}
|
|
|
|
.netgescon-grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
|
|
.netgescon-grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
.netgescon-grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
.netgescon-grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
|
|
.netgescon-grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
|
|
.netgescon-grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); }
|
|
|
|
.netgescon-gap-1 { gap: var(--netgescon-space-1); }
|
|
.netgescon-gap-2 { gap: var(--netgescon-space-2); }
|
|
.netgescon-gap-3 { gap: var(--netgescon-space-3); }
|
|
.netgescon-gap-4 { gap: var(--netgescon-space-4); }
|
|
.netgescon-gap-6 { gap: var(--netgescon-space-6); }
|
|
.netgescon-gap-8 { gap: var(--netgescon-space-8); }
|
|
```
|
|
|
|
---
|
|
|
|
## 🔘 **BUTTON SYSTEM**
|
|
|
|
### 🎨 **Button Base Styles**
|
|
```css
|
|
/* /public/css/design-system/buttons.css */
|
|
|
|
.btn {
|
|
/* Base button styles */
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: var(--netgescon-border-radius);
|
|
font-weight: var(--netgescon-font-medium);
|
|
transition: all 0.2s ease-in-out;
|
|
cursor: pointer;
|
|
border: 1px solid transparent;
|
|
text-decoration: none;
|
|
white-space: nowrap;
|
|
user-select: none;
|
|
|
|
/* Size defaults */
|
|
padding: var(--netgescon-space-2-5) var(--netgescon-space-4);
|
|
font-size: var(--netgescon-text-sm);
|
|
line-height: 1.25;
|
|
}
|
|
|
|
.btn:disabled,
|
|
.btn.disabled {
|
|
opacity: 0.6;
|
|
cursor: not-allowed;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* === BUTTON SIZES === */
|
|
.btn-xs {
|
|
padding: var(--netgescon-space-1) var(--netgescon-space-2);
|
|
font-size: var(--netgescon-text-xs);
|
|
}
|
|
|
|
.btn-sm {
|
|
padding: var(--netgescon-space-2) var(--netgescon-space-3);
|
|
font-size: var(--netgescon-text-sm);
|
|
}
|
|
|
|
.btn-md {
|
|
padding: var(--netgescon-space-2-5) var(--netgescon-space-4);
|
|
font-size: var(--netgescon-text-sm);
|
|
}
|
|
|
|
.btn-lg {
|
|
padding: var(--netgescon-space-3) var(--netgescon-space-6);
|
|
font-size: var(--netgescon-text-base);
|
|
}
|
|
|
|
.btn-xl {
|
|
padding: var(--netgescon-space-4) var(--netgescon-space-8);
|
|
font-size: var(--netgescon-text-lg);
|
|
}
|
|
|
|
/* === BUTTON VARIANTS === */
|
|
.btn-primary {
|
|
background-color: var(--netgescon-primary);
|
|
border-color: var(--netgescon-primary);
|
|
color: white;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background-color: var(--netgescon-primary-dark);
|
|
border-color: var(--netgescon-primary-dark);
|
|
transform: translateY(-1px);
|
|
box-shadow: var(--netgescon-shadow-md);
|
|
}
|
|
|
|
.btn-secondary {
|
|
background-color: var(--netgescon-secondary);
|
|
border-color: var(--netgescon-secondary);
|
|
color: white;
|
|
}
|
|
|
|
.btn-secondary:hover {
|
|
background-color: var(--netgescon-secondary-dark);
|
|
border-color: var(--netgescon-secondary-dark);
|
|
}
|
|
|
|
.btn-success {
|
|
background-color: var(--netgescon-success);
|
|
border-color: var(--netgescon-success);
|
|
color: white;
|
|
}
|
|
|
|
.btn-success:hover {
|
|
background-color: var(--netgescon-success-dark);
|
|
border-color: var(--netgescon-success-dark);
|
|
}
|
|
|
|
.btn-warning {
|
|
background-color: var(--netgescon-warning);
|
|
border-color: var(--netgescon-warning);
|
|
color: white;
|
|
}
|
|
|
|
.btn-warning:hover {
|
|
background-color: var(--netgescon-warning-dark);
|
|
border-color: var(--netgescon-warning-dark);
|
|
}
|
|
|
|
.btn-danger {
|
|
background-color: var(--netgescon-danger);
|
|
border-color: var(--netgescon-danger);
|
|
color: white;
|
|
}
|
|
|
|
.btn-danger:hover {
|
|
background-color: var(--netgescon-danger-dark);
|
|
border-color: var(--netgescon-danger-dark);
|
|
}
|
|
|
|
/* === OUTLINE VARIANTS === */
|
|
.btn-outline-primary {
|
|
background-color: transparent;
|
|
border-color: var(--netgescon-primary);
|
|
color: var(--netgescon-primary);
|
|
}
|
|
|
|
.btn-outline-primary:hover {
|
|
background-color: var(--netgescon-primary);
|
|
color: white;
|
|
}
|
|
|
|
/* === GHOST VARIANTS === */
|
|
.btn-ghost {
|
|
background-color: transparent;
|
|
border-color: transparent;
|
|
color: var(--netgescon-gray-700);
|
|
}
|
|
|
|
.btn-ghost:hover {
|
|
background-color: var(--netgescon-gray-100);
|
|
color: var(--netgescon-gray-900);
|
|
}
|
|
|
|
/* === ICON BUTTONS === */
|
|
.btn-icon-only {
|
|
padding: var(--netgescon-space-2);
|
|
width: 2.5rem;
|
|
height: 2.5rem;
|
|
}
|
|
|
|
.btn-icon-only.btn-sm {
|
|
width: 2rem;
|
|
height: 2rem;
|
|
padding: var(--netgescon-space-1-5);
|
|
}
|
|
|
|
.btn-icon-only.btn-lg {
|
|
width: 3rem;
|
|
height: 3rem;
|
|
padding: var(--netgescon-space-3);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 **FORM ELEMENTS**
|
|
|
|
### 🎯 **Input Styles**
|
|
```css
|
|
/* /public/css/design-system/forms.css */
|
|
|
|
.form-input {
|
|
display: block;
|
|
width: 100%;
|
|
padding: var(--netgescon-space-2-5) var(--netgescon-space-3);
|
|
font-size: var(--netgescon-text-sm);
|
|
line-height: 1.5;
|
|
color: var(--netgescon-gray-900);
|
|
background-color: var(--netgescon-white);
|
|
border: 1px solid var(--netgescon-gray-300);
|
|
border-radius: var(--netgescon-border-radius);
|
|
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
|
}
|
|
|
|
.form-input:focus {
|
|
outline: none;
|
|
border-color: var(--netgescon-primary);
|
|
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
|
}
|
|
|
|
.form-input.is-invalid {
|
|
border-color: var(--netgescon-danger);
|
|
}
|
|
|
|
.form-input.is-invalid:focus {
|
|
border-color: var(--netgescon-danger);
|
|
box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1);
|
|
}
|
|
|
|
/* === INPUT SIZES === */
|
|
.form-input-sm {
|
|
padding: var(--netgescon-space-1-5) var(--netgescon-space-2-5);
|
|
font-size: var(--netgescon-text-xs);
|
|
}
|
|
|
|
.form-input-lg {
|
|
padding: var(--netgescon-space-4) var(--netgescon-space-4);
|
|
font-size: var(--netgescon-text-base);
|
|
}
|
|
|
|
/* === SELECT STYLES === */
|
|
.form-select {
|
|
display: block;
|
|
width: 100%;
|
|
padding: var(--netgescon-space-2-5) var(--netgescon-space-8) var(--netgescon-space-2-5) var(--netgescon-space-3);
|
|
font-size: var(--netgescon-text-sm);
|
|
line-height: 1.5;
|
|
color: var(--netgescon-gray-900);
|
|
background-color: var(--netgescon-white);
|
|
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3E%3C/svg%3E");
|
|
background-repeat: no-repeat;
|
|
background-position: right var(--netgescon-space-3) center;
|
|
background-size: 16px 12px;
|
|
border: 1px solid var(--netgescon-gray-300);
|
|
border-radius: var(--netgescon-border-radius);
|
|
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
|
appearance: none;
|
|
}
|
|
|
|
.form-select:focus {
|
|
border-color: var(--netgescon-primary);
|
|
outline: none;
|
|
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
|
}
|
|
|
|
/* === CHECKBOX & RADIO === */
|
|
.form-check-input {
|
|
width: 1rem;
|
|
height: 1rem;
|
|
margin-top: 0.25rem;
|
|
vertical-align: top;
|
|
background-color: var(--netgescon-white);
|
|
border: 1px solid var(--netgescon-gray-300);
|
|
appearance: none;
|
|
color: var(--netgescon-primary);
|
|
background-repeat: no-repeat;
|
|
background-position: center;
|
|
background-size: contain;
|
|
transition: all 0.15s ease-in-out;
|
|
}
|
|
|
|
.form-check-input[type="checkbox"] {
|
|
border-radius: var(--netgescon-border-radius-sm);
|
|
}
|
|
|
|
.form-check-input[type="radio"] {
|
|
border-radius: 50%;
|
|
}
|
|
|
|
.form-check-input:checked {
|
|
background-color: var(--netgescon-primary);
|
|
border-color: var(--netgescon-primary);
|
|
}
|
|
|
|
.form-check-input:checked[type="checkbox"] {
|
|
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3 6-6'/%3E%3C/svg%3E");
|
|
}
|
|
|
|
.form-check-input:checked[type="radio"] {
|
|
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='2' fill='%23fff'/%3E%3C/svg%3E");
|
|
}
|
|
|
|
/* === FORM GROUPS === */
|
|
.form-group {
|
|
margin-bottom: var(--netgescon-space-4);
|
|
}
|
|
|
|
.form-label {
|
|
display: inline-block;
|
|
margin-bottom: var(--netgescon-space-2);
|
|
font-weight: var(--netgescon-font-medium);
|
|
color: var(--netgescon-gray-700);
|
|
}
|
|
|
|
.form-label.required::after {
|
|
content: ' *';
|
|
color: var(--netgescon-danger);
|
|
}
|
|
|
|
.form-text {
|
|
margin-top: var(--netgescon-space-1);
|
|
font-size: var(--netgescon-text-xs);
|
|
color: var(--netgescon-gray-500);
|
|
}
|
|
|
|
.invalid-feedback {
|
|
display: block;
|
|
width: 100%;
|
|
margin-top: var(--netgescon-space-1);
|
|
font-size: var(--netgescon-text-xs);
|
|
color: var(--netgescon-danger);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 **DATA VISUALIZATION**
|
|
|
|
### 📈 **Chart Color Palettes**
|
|
```css
|
|
/* /public/css/design-system/charts.css */
|
|
|
|
:root {
|
|
/* === CHART COLORS === */
|
|
--netgescon-chart-primary: var(--netgescon-primary);
|
|
--netgescon-chart-secondary: var(--netgescon-secondary);
|
|
--netgescon-chart-success: var(--netgescon-success);
|
|
--netgescon-chart-warning: var(--netgescon-warning);
|
|
--netgescon-chart-danger: var(--netgescon-danger);
|
|
--netgescon-chart-info: var(--netgescon-info);
|
|
|
|
/* === CHART PALETTE === */
|
|
--netgescon-chart-palette-1: #2563eb;
|
|
--netgescon-chart-palette-2: #16a34a;
|
|
--netgescon-chart-palette-3: #d97706;
|
|
--netgescon-chart-palette-4: #dc2626;
|
|
--netgescon-chart-palette-5: #7c3aed;
|
|
--netgescon-chart-palette-6: #0891b2;
|
|
--netgescon-chart-palette-7: #be185d;
|
|
--netgescon-chart-palette-8: #059669;
|
|
|
|
/* === CHART GRADIENTS === */
|
|
--netgescon-chart-gradient-1: linear-gradient(180deg, rgba(37, 99, 235, 0.2) 0%, rgba(37, 99, 235, 0.05) 100%);
|
|
--netgescon-chart-gradient-2: linear-gradient(180deg, rgba(22, 163, 74, 0.2) 0%, rgba(22, 163, 74, 0.05) 100%);
|
|
--netgescon-chart-gradient-3: linear-gradient(180deg, rgba(217, 119, 6, 0.2) 0%, rgba(217, 119, 6, 0.05) 100%);
|
|
}
|
|
```
|
|
|
|
### 📊 **Table Styles**
|
|
```css
|
|
.netgescon-table {
|
|
width: 100%;
|
|
margin-bottom: var(--netgescon-space-4);
|
|
color: var(--netgescon-gray-900);
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
.netgescon-table th,
|
|
.netgescon-table td {
|
|
padding: var(--netgescon-space-3) var(--netgescon-space-4);
|
|
text-align: left;
|
|
border-bottom: 1px solid var(--netgescon-gray-200);
|
|
}
|
|
|
|
.netgescon-table thead th {
|
|
background-color: var(--netgescon-gray-50);
|
|
font-weight: var(--netgescon-font-semibold);
|
|
color: var(--netgescon-gray-700);
|
|
font-size: var(--netgescon-text-sm);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.025em;
|
|
}
|
|
|
|
.netgescon-table tbody tr:hover {
|
|
background-color: var(--netgescon-gray-50);
|
|
}
|
|
|
|
.netgescon-table-striped tbody tr:nth-child(odd) {
|
|
background-color: var(--netgescon-gray-50);
|
|
}
|
|
|
|
.netgescon-table-striped tbody tr:nth-child(odd):hover {
|
|
background-color: var(--netgescon-gray-100);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🎭 **ICONS & GRAPHICS**
|
|
|
|
### 🎨 **Icon System**
|
|
```css
|
|
/* /public/css/design-system/icons.css */
|
|
|
|
.netgescon-icon {
|
|
display: inline-block;
|
|
vertical-align: middle;
|
|
color: currentColor;
|
|
}
|
|
|
|
.netgescon-icon-xs { font-size: var(--netgescon-text-xs); }
|
|
.netgescon-icon-sm { font-size: var(--netgescon-text-sm); }
|
|
.netgescon-icon-md { font-size: var(--netgescon-text-base); }
|
|
.netgescon-icon-lg { font-size: var(--netgescon-text-lg); }
|
|
.netgescon-icon-xl { font-size: var(--netgescon-text-xl); }
|
|
.netgescon-icon-2xl { font-size: var(--netgescon-text-2xl); }
|
|
|
|
/* === ICON COLORS === */
|
|
.netgescon-icon-primary { color: var(--netgescon-primary); }
|
|
.netgescon-icon-secondary { color: var(--netgescon-secondary); }
|
|
.netgescon-icon-success { color: var(--netgescon-success); }
|
|
.netgescon-icon-warning { color: var(--netgescon-warning); }
|
|
.netgescon-icon-danger { color: var(--netgescon-danger); }
|
|
.netgescon-icon-info { color: var(--netgescon-info); }
|
|
.netgescon-icon-muted { color: var(--netgescon-gray-500); }
|
|
|
|
/* === ICON BUTTONS === */
|
|
.netgescon-icon-button {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 2.5rem;
|
|
height: 2.5rem;
|
|
border-radius: var(--netgescon-border-radius);
|
|
background-color: transparent;
|
|
border: none;
|
|
color: var(--netgescon-gray-600);
|
|
cursor: pointer;
|
|
transition: all 0.2s ease-in-out;
|
|
}
|
|
|
|
.netgescon-icon-button:hover {
|
|
background-color: var(--netgescon-gray-100);
|
|
color: var(--netgescon-gray-900);
|
|
}
|
|
|
|
.netgescon-icon-button:focus {
|
|
outline: none;
|
|
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📱 **RESPONSIVE DESIGN TOKENS**
|
|
|
|
### 📐 **Breakpoints**
|
|
```css
|
|
/* /public/css/design-system/responsive.css */
|
|
|
|
:root {
|
|
/* === BREAKPOINTS === */
|
|
--netgescon-breakpoint-sm: 640px;
|
|
--netgescon-breakpoint-md: 768px;
|
|
--netgescon-breakpoint-lg: 1024px;
|
|
--netgescon-breakpoint-xl: 1280px;
|
|
--netgescon-breakpoint-2xl: 1536px;
|
|
}
|
|
|
|
/* === MEDIA QUERIES === */
|
|
@media (min-width: 640px) {
|
|
.sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
.sm\:text-lg { font-size: var(--netgescon-text-lg); }
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
.md\:text-xl { font-size: var(--netgescon-text-xl); }
|
|
.md\:p-6 { padding: var(--netgescon-space-6); }
|
|
}
|
|
|
|
@media (min-width: 1024px) {
|
|
.lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
|
|
.lg\:text-2xl { font-size: var(--netgescon-text-2xl); }
|
|
.lg\:p-8 { padding: var(--netgescon-space-8); }
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 **USAGE EXAMPLES**
|
|
|
|
### 🎯 **Complete Component Example**
|
|
```blade
|
|
<!-- Esempio: Card con Design System completo -->
|
|
<div class="netgescon-card">
|
|
<!-- Header -->
|
|
<div class="netgescon-flex netgescon-items-center netgescon-justify-between mb-4">
|
|
<h3 class="netgescon-h4 mb-0">Gestione Stabili</h3>
|
|
<button class="btn btn-primary btn-sm">
|
|
<i class="fas fa-plus netgescon-icon-sm mr-2"></i>
|
|
Nuovo
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Content -->
|
|
<div class="netgescon-body mb-6">
|
|
Gestisci tutti gli stabili del tuo portafoglio immobiliare con strumenti avanzati.
|
|
</div>
|
|
|
|
<!-- Stats -->
|
|
<div class="netgescon-grid netgescon-grid-cols-3 netgescon-gap-4 mb-6">
|
|
<div class="text-center">
|
|
<div class="netgescon-h3 text-primary">124</div>
|
|
<div class="netgescon-caption">Stabili Totali</div>
|
|
</div>
|
|
<div class="text-center">
|
|
<div class="netgescon-h3 text-success">98%</div>
|
|
<div class="netgescon-caption">Occupazione</div>
|
|
</div>
|
|
<div class="text-center">
|
|
<div class="netgescon-h3 text-warning">€2.4M</div>
|
|
<div class="netgescon-caption">Valore</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Actions -->
|
|
<div class="netgescon-flex netgescon-justify-between">
|
|
<button class="btn btn-outline-primary">
|
|
<i class="fas fa-chart-bar netgescon-icon-sm mr-2"></i>
|
|
Report
|
|
</button>
|
|
<button class="btn btn-secondary">
|
|
<i class="fas fa-cog netgescon-icon-sm mr-2"></i>
|
|
Impostazioni
|
|
</button>
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 **TESTING & VALIDATION**
|
|
|
|
### ✅ **Design System Checklist**
|
|
- [ ] **Colori** - Tutti i colori seguono le variabili CSS
|
|
- [ ] **Typography** - Font sizes e weights consistenti
|
|
- [ ] **Spacing** - Margini e padding seguono la scala
|
|
- [ ] **Componenti** - Stili riutilizzabili e modulari
|
|
- [ ] **Responsiveness** - Breakpoints funzionali
|
|
- [ ] **Accessibilità** - Contrasto e focus states
|
|
- [ ] **Performance** - CSS ottimizzato e minificato
|
|
|
|
### 🎨 **Style Guide Generator**
|
|
```blade
|
|
<!-- resources/views/admin/style-guide.blade.php -->
|
|
@extends('layouts.admin')
|
|
|
|
@section('title', 'Style Guide NetGescon')
|
|
|
|
@section('content')
|
|
<div class="netgescon-container">
|
|
<!-- Colors -->
|
|
<section class="mb-12">
|
|
<h2 class="netgescon-h2">Palette Colori</h2>
|
|
<div class="netgescon-grid netgescon-grid-cols-6 netgescon-gap-4">
|
|
<div class="text-center">
|
|
<div class="w-16 h-16 rounded-lg mx-auto mb-2" style="background-color: var(--netgescon-primary);"></div>
|
|
<div class="netgescon-caption">Primary</div>
|
|
</div>
|
|
<!-- Altri colori... -->
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Typography -->
|
|
<section class="mb-12">
|
|
<h2 class="netgescon-h2">Typography</h2>
|
|
<div class="space-y-4">
|
|
<h1 class="netgescon-h1">Heading 1</h1>
|
|
<h2 class="netgescon-h2">Heading 2</h2>
|
|
<h3 class="netgescon-h3">Heading 3</h3>
|
|
<h4 class="netgescon-h4">Heading 4</h4>
|
|
<p class="netgescon-body">Body text regular</p>
|
|
<p class="netgescon-body-sm">Body text small</p>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Buttons -->
|
|
<section class="mb-12">
|
|
<h2 class="netgescon-h2">Buttons</h2>
|
|
<div class="netgescon-flex netgescon-flex-wrap netgescon-gap-4">
|
|
<button class="btn btn-primary">Primary</button>
|
|
<button class="btn btn-secondary">Secondary</button>
|
|
<button class="btn btn-success">Success</button>
|
|
<button class="btn btn-warning">Warning</button>
|
|
<button class="btn btn-danger">Danger</button>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
@endsection
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 **FILES CORRELATI**
|
|
|
|
### 🎨 **Design System Files**
|
|
- `/public/css/design-system/` (directory)
|
|
- `/public/css/design-system/colors.css`
|
|
- `/public/css/design-system/typography.css`
|
|
- `/public/css/design-system/spacing.css`
|
|
- `/public/css/design-system/buttons.css`
|
|
- `/public/css/design-system/forms.css`
|
|
- `/public/css/design-system/charts.css`
|
|
- `/public/css/design-system/icons.css`
|
|
- `/public/css/design-system/responsive.css`
|
|
|
|
### 📄 **Template Files**
|
|
- `/resources/views/admin/style-guide.blade.php`
|
|
- `/resources/views/components/design-system/` (directory)
|
|
|
|
---
|
|
|
|
## 🎯 **NEXT STEPS**
|
|
|
|
### 🔮 **Design System Evolution**
|
|
- [ ] **CSS Variables 2.0** - Support per advanced features
|
|
- [ ] **Dark Mode** - Tema scuro completo
|
|
- [ ] **Animation Library** - Micro-animations standardizzate
|
|
- [ ] **Component Variants** - Più varianti per ogni componente
|
|
- [ ] **Design Tokens Export** - Export per altri tools
|
|
|
|
---
|
|
|
|
*📝 Documento mantenuto da: GitHub Copilot AI Assistant*
|
|
*🔗 Componente: Design System NetGescon Interface v2.1.0*
|