Checkpoint: Application Budget Renouvellement SI 2027 Itinova — Version complète avec dashboard KPIs, grille des 75 établissements, panneau de détail par établissement avec tableau de synthèse et liste des équipements filtrables.

This commit is contained in:
Manus
2026-04-01 03:48:42 -04:00
parent 0f673d9ab0
commit 745ea5dce6
14 changed files with 19551 additions and 117 deletions

View File

@@ -1,3 +1,12 @@
/* =============================================================
ITINOVA — Budget Renouvellement SI 2027
Design: Corporate Modernism
Palette: Bleu marine sidebar #1A2E4A, Blanc cassé #F8F6F2,
Bleu Itinova #0066CC, Orange vétusté #E8820C,
Vert récent #3D7A5F, Anthracite #2C2C2C
Fonts: Sora (titres) + Inter (corps)
============================================================= */
@import "tailwindcss";
@import "tw-animate-css";
@@ -40,77 +49,53 @@
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
/* Custom Itinova tokens */
--font-display: 'Sora', sans-serif;
--font-body: 'Inter', sans-serif;
--itinova-navy: oklch(0.22 0.06 240);
--itinova-navy-light: oklch(0.28 0.06 240);
--itinova-blue: oklch(0.48 0.18 255);
--itinova-orange: oklch(0.65 0.17 50);
--itinova-green: oklch(0.50 0.10 160);
--itinova-red: oklch(0.55 0.20 25);
--itinova-bg: oklch(0.985 0.005 80);
}
:root {
--primary: var(--color-blue-700);
--primary-foreground: var(--color-blue-50);
--sidebar-primary: var(--color-blue-600);
--sidebar-primary-foreground: var(--color-blue-50);
--chart-1: var(--color-blue-300);
--chart-2: var(--color-blue-500);
--chart-3: var(--color-blue-600);
--chart-4: var(--color-blue-700);
--chart-5: var(--color-blue-800);
--radius: 0.65rem;
--background: oklch(1 0 0);
--foreground: oklch(0.235 0.015 65);
--radius: 0.5rem;
--background: oklch(0.985 0.005 80);
--foreground: oklch(0.18 0.01 260);
--card: oklch(1 0 0);
--card-foreground: oklch(0.235 0.015 65);
--card-foreground: oklch(0.18 0.01 260);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.235 0.015 65);
--secondary: oklch(0.98 0.001 286.375);
--secondary-foreground: oklch(0.4 0.015 65);
--muted: oklch(0.967 0.001 286.375);
--muted-foreground: oklch(0.552 0.016 285.938);
--accent: oklch(0.967 0.001 286.375);
--accent-foreground: oklch(0.141 0.005 285.823);
--destructive: oklch(0.577 0.245 27.325);
--destructive-foreground: oklch(0.985 0 0);
--border: oklch(0.92 0.004 286.32);
--input: oklch(0.92 0.004 286.32);
--ring: oklch(0.623 0.214 259.815);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.235 0.015 65);
--sidebar-accent: oklch(0.967 0.001 286.375);
--sidebar-accent-foreground: oklch(0.141 0.005 285.823);
--sidebar-border: oklch(0.92 0.004 286.32);
--sidebar-ring: oklch(0.623 0.214 259.815);
}
.dark {
--primary: var(--color-blue-700);
--primary-foreground: var(--color-blue-50);
--sidebar-primary: var(--color-blue-500);
--sidebar-primary-foreground: var(--color-blue-50);
--background: oklch(0.141 0.005 285.823);
--foreground: oklch(0.85 0.005 65);
--card: oklch(0.21 0.006 285.885);
--card-foreground: oklch(0.85 0.005 65);
--popover: oklch(0.21 0.006 285.885);
--popover-foreground: oklch(0.85 0.005 65);
--secondary: oklch(0.24 0.006 286.033);
--secondary-foreground: oklch(0.7 0.005 65);
--muted: oklch(0.274 0.006 286.033);
--muted-foreground: oklch(0.705 0.015 286.067);
--accent: oklch(0.274 0.006 286.033);
--accent-foreground: oklch(0.92 0.005 65);
--destructive: oklch(0.704 0.191 22.216);
--destructive-foreground: oklch(0.985 0 0);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.488 0.243 264.376);
--chart-1: var(--color-blue-300);
--chart-2: var(--color-blue-500);
--chart-3: var(--color-blue-600);
--chart-4: var(--color-blue-700);
--chart-5: var(--color-blue-800);
--sidebar: oklch(0.21 0.006 285.885);
--sidebar-foreground: oklch(0.85 0.005 65);
--sidebar-accent: oklch(0.274 0.006 286.033);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.488 0.243 264.376);
--popover-foreground: oklch(0.18 0.01 260);
--primary: oklch(0.48 0.18 255);
--primary-foreground: oklch(0.98 0 0);
--secondary: oklch(0.95 0.005 240);
--secondary-foreground: oklch(0.22 0.06 240);
--muted: oklch(0.94 0.005 80);
--muted-foreground: oklch(0.50 0.01 260);
--accent: oklch(0.93 0.01 240);
--accent-foreground: oklch(0.22 0.06 240);
--destructive: oklch(0.55 0.20 25);
--destructive-foreground: oklch(0.98 0 0);
--border: oklch(0.88 0.005 260);
--input: oklch(0.92 0.005 260);
--ring: oklch(0.48 0.18 255);
--chart-1: oklch(0.48 0.18 255);
--chart-2: oklch(0.65 0.17 50);
--chart-3: oklch(0.50 0.10 160);
--chart-4: oklch(0.55 0.20 25);
--chart-5: oklch(0.22 0.06 240);
--sidebar: oklch(0.22 0.06 240);
--sidebar-foreground: oklch(0.92 0.01 240);
--sidebar-primary: oklch(0.48 0.18 255);
--sidebar-primary-foreground: oklch(0.98 0 0);
--sidebar-accent: oklch(0.28 0.06 240);
--sidebar-accent-foreground: oklch(0.92 0.01 240);
--sidebar-border: oklch(0.30 0.05 240);
--sidebar-ring: oklch(0.48 0.18 255);
}
@layer base {
@@ -119,6 +104,10 @@
}
body {
@apply bg-background text-foreground;
font-family: 'Inter', sans-serif;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Sora', sans-serif;
}
button:not(:disabled),
[role="button"]:not([aria-disabled="true"]),
@@ -134,24 +123,11 @@
}
@layer components {
/**
* Custom container utility that centers content and adds responsive padding.
*
* This overrides Tailwind's default container behavior to:
* - Auto-center content (mx-auto)
* - Add responsive horizontal padding
* - Set max-width for large screens
*
* Usage: <div className="container">...</div>
*
* For custom widths, use max-w-* utilities directly:
* <div className="max-w-6xl mx-auto px-4">...</div>
*/
.container {
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: 1rem; /* 16px - mobile padding */
padding-left: 1rem;
padding-right: 1rem;
}
@@ -162,16 +138,76 @@
@media (min-width: 640px) {
.container {
padding-left: 1.5rem; /* 24px - tablet padding */
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
@media (min-width: 1024px) {
.container {
padding-left: 2rem; /* 32px - desktop padding */
padding-left: 2rem;
padding-right: 2rem;
max-width: 1280px; /* Standard content width */
max-width: 1400px;
}
}
}
/* Barre de vétusté */
.vetusite-bar {
height: 4px;
border-radius: 2px;
transition: width 0.6s ease-out;
}
/* Card établissement */
.etab-card {
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.etab-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px oklch(0.22 0.06 240 / 0.12);
}
/* Liseré coloré en haut des sections */
.section-accent {
border-top: 3px solid oklch(0.48 0.18 255);
}
/* Chiffre clé */
.kpi-value {
font-family: 'Sora', sans-serif;
font-weight: 800;
letter-spacing: -0.02em;
}
}
/* Animations d'entrée */
@keyframes fadeSlideUp {
from {
opacity: 0;
transform: translateY(12px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-fade-slide-up {
animation: fadeSlideUp 0.35s ease-out forwards;
}
/* Scrollbar personnalisée */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: oklch(0.94 0.005 80);
}
::-webkit-scrollbar-thumb {
background: oklch(0.70 0.01 260);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: oklch(0.48 0.18 255);
}