netgescon-day0/docs/00-MASTER-DOCS-UNIFICATI/03-MANUALI-OPERATIVI/06-DESIGN-SYSTEM.md

29 KiB
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

/* /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

/* 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

/* /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

/* === 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

/* /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

/* === 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

/* /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

/* /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

/* /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

.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

/* /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

/* /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

<!-- 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

<!-- 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