From b507fb10337525109b4b59a78238e1323d28f7e0 Mon Sep 17 00:00:00 2001 From: KONE SOREL Date: Thu, 2 Apr 2026 16:31:36 +0000 Subject: [PATCH] z --- Bootstrap_new/css/theme-modern copy.css | 1964 +++++++++++++++++++++++ Bootstrap_new/css/theme-modern.css | 29 +- Config/prod.ini | 4 + Cron/prod.ini | 4 + 4 files changed, 1985 insertions(+), 16 deletions(-) create mode 100644 Bootstrap_new/css/theme-modern copy.css diff --git a/Bootstrap_new/css/theme-modern copy.css b/Bootstrap_new/css/theme-modern copy.css new file mode 100644 index 00000000..badd880d --- /dev/null +++ b/Bootstrap_new/css/theme-modern copy.css @@ -0,0 +1,1964 @@ +/* ============================= + INTER SANTÉ — THEME NEUTRAL PRO + SaaS Minimal UI v2025 + Palette : Charcoal · Gris · Blanc + ============================= */ + +/* === FONTS === */ +@import url('https://fonts.googleapis.com/css2?family=Syne:wght@400;500;600;700;800&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&display=swap'); + +/* === CSS VARIABLES === */ +:root { + /* Brand Colors — Charcoal / Gris neutre (zéro vert) */ + --color-primary: #212E53; /*#2e3440;*/ /* charcoal foncé */ + --color-primary-light: #4c566a; /* slate moyen */ + --color-primary-dark: #1a1d24; /* quasi-noir */ + --color-primary-ghost: rgba(46, 52, 64, 0.07); + + /* Accent / Status — conservés pour lisibilité fonctionnelle */ + --color-accent: #5e6e82; /* gris-bleu neutre */ + --color-urgent: #c0392b; + --color-warning: #e67e22; + --color-success: #27ae60; + --color-info: #2980b9; + --color-neutral: #7f8c8d; + + /* Backgrounds */ + --bg-base: #f2f3f5; + --bg-surface: #ffffff; + --bg-surface-2: #f8f9fa; + --bg-sidebar: #7A90A4;/*#1e2228;*/ /* charcoal très sombre */ + --bg-header: #ffffff; + + /* Text — contraste maximal */ + --text-primary: #1a1d24; + --text-secondary: #4c566a; + --text-muted: #7b8a99; + --text-inverse: #ffffff; + + /* Borders */ + --border-light: #e3e6ea; + --border-medium: #c8cdd4; + + /* Spacing & Radius */ + --radius-sm: 6px; + --radius-md: 12px; + --radius-lg: 16px; + --radius-xl: 24px; + --radius-full: 9999px; + + /* Shadows — neutres, sans teinte colorée */ + --shadow-xs: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04); + --shadow-sm: 0 2px 8px rgba(0,0,0,.08), 0 1px 3px rgba(0,0,0,.05); + --shadow-md: 0 4px 16px rgba(0,0,0,.10), 0 2px 6px rgba(0,0,0,.06); + --shadow-lg: 0 8px 32px rgba(0,0,0,.12), 0 4px 12px rgba(0,0,0,.07); + --shadow-xl: 0 16px 48px rgba(0,0,0,.14), 0 8px 24px rgba(0,0,0,.08); + --shadow-primary: 0 4px 20px rgba(30,34,40,.20); + + /* Transitions */ + --transition-fast: 0.15s ease; + --transition-base: 0.25s ease; + --transition-slow: 0.4s cubic-bezier(.4,0,.2,1); + + /* Layout */ + --sidebar-width: 200px; + --sidebar-collapsed: 68px; + --header-height: 64px; + --context-width: 320px; +} + +/* === BASE RESET & GLOBALS === */ +*, *::before, *::after { box-sizing: border-box; } + +html { font-size: 14px; scroll-behavior: smooth; } + +body { + font-family: 'DM Sans', system-ui, sans-serif; + background: var(--bg-base); + color: var(--text-primary); + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6, +.fw-bold, .fw-semibold, .nav-link span { + font-family: 'Syne', sans-serif; +} + +/* === SCROLLBAR === */ +::-webkit-scrollbar { width: 5px; height: 5px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { background: var(--border-medium); border-radius: var(--radius-full); } +::-webkit-scrollbar-thumb:hover { background: var(--color-primary-light); } + +/* ============================== + HEADER + ============================== */ +#header { + height: var(--header-height); + background: var(--bg-header); + border-bottom: 1px solid var(--border-light); + box-shadow: var(--shadow-xs); + padding: 0 1.25rem; + z-index: 2000; + transition: background var(--transition-base); +} + +#header.mode-test { + background: linear-gradient(90deg, #5d0000, #c0392b); +} + +#header .logo { + gap: 10px; + text-decoration: none; +} + +#header .logo img { + width: 34px; + height: 34px; + border-radius: var(--radius-sm); + object-fit: contain; +} + +#header .logo span { + font-family: 'Syne', sans-serif; + font-weight: 800; + font-size: 1.05rem; + color: var(--color-primary); + letter-spacing: -0.02em; +} + +/* Toggle sidebar button */ +.toggle-sidebar-btn { + font-size: 1.4rem; + color: var(--text-secondary); + cursor: pointer; + padding: 4px 8px; + border-radius: var(--radius-sm); + transition: all var(--transition-fast); + margin-left: 12px; +} +.toggle-sidebar-btn:hover { + color: var(--color-primary); + background: var(--color-primary-ghost); +} + +/* Breadcrumb */ +.breadcrumb { + background: transparent !important; + padding: 0 !important; + margin: 0; + font-size: 0.8rem; +} +.breadcrumb-item a { + color: var(--text-muted); + text-decoration: none; + transition: color var(--transition-fast); +} +.breadcrumb-item a:hover { color: var(--color-primary); } +.breadcrumb-item.active { color: var(--color-primary); } +.breadcrumb-item + .breadcrumb-item::before { color: var(--border-medium); } +#descriptionVue{color:#212E53 !important; font-weight: bold;} + +/* Header Nav Icons */ +#header .header-nav .nav-link { + color: var(--text-secondary); + padding: 6px 10px; + border-radius: var(--radius-sm); + transition: all var(--transition-fast); + position: relative; +} +#header .header-nav .nav-link:hover { + color: var(--color-primary); + background: var(--color-primary-ghost); +} + +.badge-number { + position: absolute; + top: 2px; right: 4px; + background: var(--color-urgent) !important; + font-size: 0.6rem; + min-width: 16px; + height: 16px; + border-radius: var(--radius-full); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border: 2px solid white; + transition: transform var(--transition-fast); +} +.badge-number:hover { transform: scale(1.2); } + +/* Company logo area */ +.company-logo-area { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 10px; + border-radius: var(--radius-md); + border: 1px solid var(--border-light); + background: var(--bg-surface-2); + transition: all var(--transition-fast); + max-width: 180px; +} +.company-logo-area:hover { + border-color: var(--color-primary-light); + box-shadow: var(--shadow-sm); +} +.company-logo-area img { height: 32px; width: auto; object-fit: contain; } +.company-logo-area .company-name { + font-size: 0.75rem; + font-weight: 600; + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* User Initials Badge */ +.initials { + width: 32px; + height: 32px; + border-radius: var(--radius-sm); + background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light)); + color: white; + font-family: 'Syne', sans-serif; + font-weight: 700; + font-size: 0.75rem; + display: inline-flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-primary); + transition: transform var(--transition-fast); +} +.nav-link:hover .initials { transform: scale(1.08); } + +/* Dropdown */ +.dropdown-menu { + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + box-shadow: var(--shadow-lg); + padding: 6px; + font-size: 0.85rem; + margin-top: 8px !important; + z-index: 9999 !important; +} +.dropdown-item { + border-radius: var(--radius-sm); + padding: 8px 12px; + gap: 10px; + display: flex; + align-items: center; + color: var(--text-primary); + transition: all var(--transition-fast); +} +.dropdown-item:hover { + background: var(--color-primary-ghost); + color: var(--color-primary); +} +.dropdown-item i { width: 16px; color: var(--text-muted); } + +/* Language flag */ +.lang-selector img { border-radius: 3px; } + +/* ============================== + SIDEBAR + ============================== */ +#sidebar { + width: var(--sidebar-width); + background: var(--bg-sidebar); + position: fixed; + top: var(--header-height); + left: 0; + height: calc(100vh - var(--header-height)); + overflow-y: auto; + overflow-x: hidden; + transition: width var(--transition-slow); + z-index: 900; + padding: 8px 4px; +} + +/* Liseré supérieur discret — gris clair */ +#sidebar::before { + content: ''; + position: absolute; + top: 0; left: 0; right: 0; + height: 2px; + background: linear-gradient(90deg, #4c566a, #7b8a99); +} + +/* Sidebar Nav */ +.sidebar-nav { + list-style: none; + padding: 0; + margin: 0; +} + +.sidebar-nav .nav-item { margin-bottom: 2px; } + +/* Parent links */ +.sidebar-nav > .nav-item > .nav-link { + display: flex; + align-items: center; + gap: 2px; + padding: 9px 10px; + border-radius: var(--radius-md); + color: rgba(255,255,255,0.72); + font-size: 0.82rem; + font-weight: 500; + text-decoration: none; + transition: all var(--transition-base); + position: relative; +} + +.sidebar-nav > .nav-item > .nav-link:hover, +.sidebar-nav > .nav-item > .nav-link.active { + background: rgba(255,255,255,0.10); + color: white; +} + +.sidebar-nav > .nav-item > .nav-link i:first-child { + font-size: 1.1rem; + width: 22px; + text-align: center; + flex-shrink: 0; + opacity: 0.85; +} + +.sidebar-nav > .nav-item > .nav-link span { + font-family: 'Syne', sans-serif; + font-size: 0.8rem; + letter-spacing: 0.01em; + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Active item : blanc brillant */ +.sidebar-nav > .nav-item > .nav-link span.active-main { + color: var(--text-primary); + font-weight: 700; +} + +.sidebar-nav > .nav-item > .nav-link .bi-chevron-down { + font-size: 0.65rem; + opacity: 0.6; + transition: transform var(--transition-base); + flex-shrink: 0; +} + +.sidebar-nav > .nav-item > .nav-link[aria-expanded="true"] .bi-chevron-down { + transform: rotate(180deg); + opacity: 1; +} + +/* Sub-menu (Level 1) */ +.sidebar-nav .nav-content { + list-style: none; + padding: 4px 0 4px 32px; + margin: 0; + background: rgba(0,0,0,0.18); + border-radius: var(--radius-sm); + margin-bottom: 2px; +} + +.sidebar-nav .nav-content li { margin-bottom: 1px; } + +.sidebar-nav .nav-content li a { + display: block; + padding: 7px 10px; + border-radius: var(--radius-sm); + color: rgba(255,255,255,0.55); + font-size: 0.78rem; + text-decoration: none; + transition: all var(--transition-fast); + border-left: 2px solid transparent; + position: relative; +} + +.sidebar-nav .nav-content li a:hover { + color: white; + background: rgba(255,255,255,0.07); + border-left-color: rgba(255,255,255,0.5); + padding-left: 14px; +} + +/* Sous-menu actif : fond blanc translucide + bordure blanche */ +.sidebar-nav .nav-content li a.active-submenu { + color: #ffffff; + background: rgba(255,255,255,0.12); + border-left-color: #ffffff; + font-weight: 600; + padding-left: 10px; + width: 100% !important; +} + +.sidebar-nav .nav-content li a.active-submenu::after { + content: ''; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + width: 5px; + height: 5px; + border-radius: 50%; + background: rgba(255,255,255,0.8); +} + +/* Separator label */ +.sidebar-section-label { + font-family: 'Syne', sans-serif; + font-size: 0.6rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: rgba(255,255,255,0.28); + padding: 12px 10px 4px; + margin-top: 4px; +} + +.sidebar-footer { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + padding: 15px; + border-top: 1px solid var(--border-light); + background: var(--bg-sidebar); /* Garde la couleur de ta sidebar */ +} + +.version-info { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.7rem; + color: rgba(255, 255, 255, 0.4); /* Très discret sur fond sombre */ + font-family: 'DM Sans', sans-serif; + letter-spacing: 0.05em; + text-transform: uppercase; +} + +.version-tag { + background: rgba(255, 255, 255, 0.1); + padding: 2px 6px; + border-radius: 4px; + font-weight: 700; +} + +/* ============================== + MAIN CONTENT + ============================== */ +#main { + margin-left: var(--sidebar-width); + padding-top: calc(var(--header-height) + 16px); + min-height: 100vh; + transition: margin-left var(--transition-slow); + padding-bottom: 32px; +} + +@media (max-width: 1199px) { + #main { margin-left: 0 !important; } + #sidebar { transform: translateX(-100%); } + #sidebar.sidebar-open { transform: translateX(0); } +} + +/* Scroll Menu */ +.scrollmenu { + display: flex; + gap: 4px; + overflow-x: auto; + padding: 8px 16px; + background: var(--bg-surface); + border-radius: var(--radius-md); + box-shadow: var(--shadow-xs); + margin: 0 1px 16px; + scrollbar-width: none; +} +.scrollmenu::-webkit-scrollbar { display: none; } + +.scrollmenu a { + white-space: nowrap; + padding: 6px 14px; + border-radius: var(--radius-full); + font-size: 0.78rem; + font-weight: 500; + color: var(--text-secondary); + text-decoration: none; + transition: all var(--transition-fast); + border: 1px solid transparent; + flex-shrink: 0; +} + +.scrollmenu a:hover { + background: var(--color-primary-ghost); + color: var(--color-primary); + border-color: rgba(46,52,64,0.15); +} + +.scrollmenu a.active { + background: var(--color-primary); + color: white; + box-shadow: var(--shadow-primary); +} + +/* Page content wrapper */ +.page-content { + padding: 26px 0px; +} + +/* Fixed header within main */ +.fixed-div { + position: sticky; + top: var(--header-height); + z-index: 1060; + background: var(--bg-base); +} + +.section { padding: 0; } + +/* ============================== + CONTEXT DRAWER (Barre Latérale D) + ============================== */ + +/* Trigger button — gris charcoal */ +.btn-info-context { + position: fixed; + right: 0; + top: 50%; + transform: translateY(-50%); + z-index: 1100; + background: var(--color-primary); + color: white; + border: none; + border-radius: var(--radius-lg) 0 0 var(--radius-lg); + padding: 12px 10px; + cursor: pointer; + box-shadow: var(--shadow-md); + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + transition: all var(--transition-base); +} +.btn-info-context:hover { + background: var(--color-primary-light); + padding-left: 14px; +} +.btn-info-context i { font-size: 16px; } + +/* Context Drawer Panel */ +#barre_laterale_d { + position: fixed; + right: 0; + top: var(--header-height); + width: var(--context-width) !important; + height: calc(100vh - var(--header-height)); + background: var(--bg-surface); + border-left: 1px solid var(--border-light); + box-shadow: var(--shadow-xl); + z-index: 9999 !important; + overflow-y: auto; + overflow-x: hidden; + padding: 0 !important; + display: none; + transition: transform var(--transition-slow); + border-radius: 5px; +} + +#barre_laterale_d .drawer-inner { + padding: 16px; +} + +/* Drawer Close Button */ +.btn-cacher-contexte { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 12px; + background: var(--bg-sidebar); + color: white; + border: none; + cursor: pointer; + font-size: 0.8rem; + font-family: 'Syne', sans-serif; + font-weight: 600; + letter-spacing: 0.04em; + transition: background var(--transition-fast); + margin-bottom: 16px; + border-radius: 0; +} +.btn-cacher-contexte:hover { background: var(--color-primary-light); } + +/* Context Cards */ +.context-card { + background: var(--bg-surface-2); + border: 1px solid var(--border-light); + border-radius: var(--radius-md); + padding: 12px; + margin-bottom: 10px; + transition: box-shadow var(--transition-fast); +} +.context-card:hover { box-shadow: var(--shadow-sm); } + +.context-card-label { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + margin-bottom: 6px; + display: flex; + align-items: center; + gap: 6px; +} +/* Icône label — gris moyen */ +.context-card-label i { color: var(--color-primary-light); } + +.context-card-label a { + color: var(--color-primary); + text-decoration: none; + font-weight: 700; + margin-left: auto; + font-size: 0.7rem; +} +.context-card-label a:hover { text-decoration: underline; } + +.context-btn { + width: 100%; + background: white; + border: 1px solid var(--border-medium); + border-radius: var(--radius-sm); + padding: 7px 10px; + text-align: left; + font-size: 0.78rem; + font-weight: 600; + color: var(--text-primary); + cursor: pointer; + transition: all var(--transition-fast); + display: flex; + align-items: center; + gap: 8px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.context-btn:hover { + background: var(--color-primary-ghost); + border-color: var(--color-primary-light); + color: var(--color-primary); +} +.context-btn i { color: var(--color-primary-light); flex-shrink: 0; } + +.context-btn.btn-primary-context { + background: var(--color-primary); + border-color: var(--color-primary); + color: white; +} +.context-btn.btn-primary-context:hover { + background: var(--color-primary-light); + border-color: var(--color-primary-light); + color: white; +} +.context-btn.btn-primary-context i { color: rgba(255,255,255,0.8); } + +/* Stats row in context */ +.context-stats { + display: flex; + gap: 4px; + margin-bottom: 10px; +} +.context-stat { + flex: 1; + background: var(--bg-surface-2); + border: 1px solid var(--border-light); + border-radius: var(--radius-sm); + padding: 8px 4px; + text-align: center; +} +.context-stat-value { + font-family: 'Syne', sans-serif; + font-size: 0.95rem; + font-weight: 800; + color: var(--color-primary); +} +.context-stat-label { + font-size: 0.58rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +/* Recent Policies List */ +.recent-policies-title { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 8px; +} +.recent-policies-title i { color: var(--color-primary-light); } + +.policy-item { + padding: 7px 10px; + border-radius: var(--radius-sm); + border: 1px solid var(--border-light); + margin-bottom: 4px; + background: white; + transition: all var(--transition-fast); + font-size: 0.75rem; + color: var(--text-secondary); + text-decoration: none; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.policy-item:hover { + background: var(--color-primary-ghost); + color: var(--color-primary); + border-color: rgba(46,52,64,0.18); + padding-left: 14px; +} + +/* Photo container */ +.photo-container { + text-align: center; + margin-bottom: 10px; +} +.photo-container img { + width: 80px; + height: 80px; + object-fit: cover; + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + border: 3px solid white; + transition: transform var(--transition-base); + cursor: pointer; +} +.photo-container img:hover { transform: scale(1.05); } + +/* Password change link */ +.change-pwd-link { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 12px; + border-radius: var(--radius-md); + background: var(--bg-surface-2); + border: 1px dashed var(--border-medium); + text-decoration: none; + color: var(--text-secondary); + font-size: 0.78rem; + transition: all var(--transition-fast); + margin-bottom: 10px; +} +.change-pwd-link:hover { + background: var(--color-primary-ghost); + border-color: var(--color-primary-light); + color: var(--color-primary); +} +.change-pwd-link img { width: 22px; } + +/* Devis mode banner */ +.mode-devis-banner { + background: linear-gradient(135deg, #3a3a4a, #55556a); + color: white; + text-align: center; + font-family: 'Syne', sans-serif; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.08em; + padding: 8px; + border-radius: var(--radius-sm); + margin-bottom: 10px; + text-transform: uppercase; +} + +/* ============================== + TABLES (DataTables) + ============================== */ +.table-container { + background: white; + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + overflow: hidden; + border: 1px solid var(--border-light); +} + +.table { + background: white !important; + border-collapse: separate; + border-spacing: 0; + width: 100%; + font-size: 0.82rem; + --bs-table-bg: transparent !important; + --bs-table-color: var(--text-primary) !important; + --bs-table-striped-color: var(--text-primary) !important; +} + +/* En-tête : charcoal sombre */ +.table thead tr { + background: var(--color-primary) !important; + color: white !important; +} + +.table > thead { + background-color: var(--color-primary) !important; +} + +.table th { + background: var(--color-primary) !important; + color: white !important; + font-family: 'Syne', sans-serif; + font-size: 0.72rem; + font-weight: 700; + letter-spacing: 0.05em; + text-transform: uppercase; + padding: 12px 14px !important; + border: none !important; + white-space: nowrap; +} +.table th:hover { background: var(--color-primary-dark) !important; } + +.table td { + padding: 10px 14px !important; + border-bottom: 1px solid var(--border-light) !important; + border-top: none !important; + vertical-align: middle; + color: var(--text-primary); +} +.table td:hover { font-style: normal !important; } + +.table tr:last-child td { border-bottom: none !important; } + +.table tbody tr { + transition: all var(--transition-fast); +} +.table tbody tr:hover { + background: var(--color-primary-ghost) !important; + font-style: normal !important; +} +/* Bordure gauche gris moyen au survol */ +.table tbody tr:hover td:first-child { + border-left: 3px solid var(--color-primary-light); +} + +/* Status Badges */ +.badge-status { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 3px 10px; + border-radius: var(--radius-full); + font-size: 0.68rem; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} +.badge-status::before { + content: ''; + width: 5px; + height: 5px; + border-radius: 50%; + background: currentColor; +} +.badge-valide { background: rgba(39,174,96,0.10); color: #1e8449; } +.badge-urgent { background: rgba(192,57,43,0.10); color: var(--color-urgent); } +.badge-attente { background: rgba(230,126,34,0.10); color: #b9720a; } +.badge-info { background: rgba(41,128,185,0.10); color: #1a6898; } +.badge-inactive { background: rgba(127,140,141,0.10); color: var(--color-neutral); } + +/* ============================== + CARDS + ============================== */ +.card { + background: var(--bg-surface); + border: 1px solid var(--border-light); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xs); + transition: box-shadow var(--transition-base); +} +.card:hover { box-shadow: var(--shadow-md); } + +.card-header { + background: transparent; + border-bottom: 1px solid var(--border-light); + padding: 14px 18px; + font-family: 'Syne', sans-serif; + font-weight: 700; + font-size: 0.88rem; +} + +/* ============================== + BUTTONS + ============================== */ +.btn { + border-radius: var(--radius-sm) !important; + font-size: 0.8rem; + font-weight: 600; + font-family: 'DM Sans', sans-serif; + padding: 7px 16px; + transition: all var(--transition-fast); + border: none; + display: inline-flex; + align-items: center; + gap: 6px; +} + +/* Bouton primaire : charcoal */ +.btn-primary { + background: var(--color-primary) !important; + color: white !important; + box-shadow: 0 2px 8px rgba(30,34,40,.22); +} +.btn-primary:hover { + background: var(--color-primary-light) !important; + box-shadow: 0 4px 16px rgba(30,34,40,.30); + transform: translateY(-1px); +} + +.btn-info { + background: var(--color-info) !important; + color: white !important; +} +.btn-info:hover { + background: #1f6fa0 !important; + transform: translateY(-1px); +} + +.btn-warning { + background: var(--color-urgent) !important; + color: white !important; +} + +.btn-default, .btn-outline-secondary { + background: white; + border: 1px solid var(--border-medium) !important; + color: var(--text-secondary) !important; +} +.btn-default:hover, .btn-outline-secondary:hover { + border-color: var(--color-primary-light) !important; + color: var(--color-primary) !important; + background: var(--color-primary-ghost); +} + +.btn-sm { padding: 5px 12px; font-size: 0.75rem; } + +/* ============================== + FORM ELEMENTS + ============================== */ +.form-control, .form-select { + border: 1px solid var(--border-medium); + border-radius: var(--radius-sm); + font-size: 0.82rem; + color: var(--text-primary); + height: auto !important; + transition: border-color var(--transition-fast), box-shadow var(--transition-fast); +} +.form-control:focus, .form-select:focus { + border-color: var(--color-primary-light); + box-shadow: 0 0 0 3px rgba(46,52,64,0.10); + outline: none; +} + +td input[readonly], td select[readonly], +td input[disabled], td select[disabled] { + background: #f1f4f6 !important; + font-weight: 600; + color: var(--text-secondary); +} + +/* ============================== + LEGENDS & FIELDSETS + ============================== */ +legend, #chemin, +fieldset legend, form legend { + background: linear-gradient(135deg, var(--color-primary), var(--color-primary-light)) !important; + color: white; + font-family: 'Syne', sans-serif; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.04em; + padding: 6px 14px; + border-radius: var(--radius-sm); + display: block; +} + +/* ============================== + MODALS + ============================== */ +.modal-content { + border: none; + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + overflow: hidden; +} + +/* Header modal : charcoal */ +.modal-header { + background: var(--color-primary) !important; + color: white !important; + padding: 16px 20px; + border-bottom: none; +} + +.modal-title { + font-family: 'Syne', sans-serif; + font-size: 0.92rem !important; + font-weight: 700; +} + +.modal-header .close, .modal-header .btn-close { + background: rgba(255,255,255,0.18) !important; + color: white !important; + border: 1px solid rgba(255,255,255,0.28) !important; + border-radius: var(--radius-sm); + opacity: 1; + transition: background var(--transition-fast); + font-size: 0.75rem; + padding: 4px 10px; +} +.modal-header .close:hover { background: rgba(255,255,255,0.32) !important; } + +.modal-body { padding: 20px; } + +.modal-footer { + border-top: 1px solid var(--border-light); + padding: 12px 20px; + gap: 8px; +} + +/* Side Panel Modal */ +.modal.side-panel .modal-dialog { + position: fixed; + top: 0; right: 0; + margin: 0; + max-width: 480px; + width: 100%; + height: 100%; +} +.modal.side-panel .modal-content { + height: 100%; + border-radius: 0; +} + +/* Modales au-dessus de la barre de contexte (2000) et du header */ +.modal { + z-index: 3000 !important; +} + +/* Le fond noir (backdrop) doit aussi suivre */ +.modal-backdrop { + z-index: 2999 !important; +} + +/* ============================== + NAV TABS + ============================== */ +.nav-tabs { + border-bottom: 2px solid var(--border-light); + gap: 4px; +} +.nav-tabs .nav-link { + color: var(--text-secondary); + border: none; + border-radius: var(--radius-sm) var(--radius-sm) 0 0; + padding: 8px 16px; + font-size: 0.8rem; + font-weight: 500; + transition: all var(--transition-fast); +} +.nav-tabs .nav-link:hover { + color: var(--color-primary); + background: var(--color-primary-ghost); +} +/* Onglet actif : charcoal */ +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + background: var(--color-primary) !important; + color: white !important; + font-family: 'Syne', sans-serif; + font-weight: 700; + border: none; +} + +/* ============================== + ALERTS & TOASTS + ============================== */ +.alert { + border: none; + border-radius: var(--radius-md); + font-size: 0.82rem; + border-left: 4px solid; +} +.alert-success { border-color: var(--color-success); background: rgba(39,174,96,0.08); } +.alert-danger { border-color: var(--color-urgent); background: rgba(192,57,43,0.08); } +.alert-warning { border-color: var(--color-warning); background: rgba(230,126,34,0.08); } +.alert-info { border-color: var(--color-info); background: rgba(41,128,185,0.08); } + +/* ============================== + FOOTER + ============================== */ +footer { background: transparent !important; color: var(--text-muted) !important; font-size: 0.7rem; } + +/* ============================== + MICRO-INTERACTIONS & UTILS + ============================== */ +.hover-shadow-sm:hover { + box-shadow: var(--shadow-md) !important; + transform: translateY(-2px); + transition: all var(--transition-base); +} + +.hover-scale:hover { + transform: scale(1.04); + box-shadow: var(--shadow-md); + transition: all var(--transition-base); +} + +.transition { transition: all var(--transition-base); } + +/* Skeleton Loader */ +.skeleton { + background: linear-gradient(90deg, #ebebeb 25%, #dcdcdc 50%, #ebebeb 75%); + background-size: 200% 100%; + animation: skeleton-loading 1.5s infinite; + border-radius: var(--radius-sm); +} +@keyframes skeleton-loading { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } +} + +/* AJAX Loading overlay */ +.ajax-loading { + position: relative; + pointer-events: none; + opacity: 0.6; +} +.ajax-loading::after { + content: ''; + position: absolute; + inset: 0; + background: rgba(255,255,255,0.6); + border-radius: inherit; + display: flex; + align-items: center; + justify-content: center; + z-index: 10; +} + +/* Pulse animation for notifications */ +@keyframes pulse-badge { + 0%, 100% { box-shadow: 0 0 0 0 rgba(192,57,43,0.4); } + 50% { box-shadow: 0 0 0 5px rgba(192,57,43,0); } +} +.badge-number { animation: pulse-badge 2s infinite; color:#fff;} + +/* Mode Test Banner */ +.mode-test-active #header { + background: linear-gradient(90deg, #5d0000, #c0392b) !important; +} +.mode-test-banner { + background: repeating-linear-gradient( + 45deg, #cccccc, #cccccc 10px, #333333 10px, #333333 20px + ); + color: white; + text-align: center; + font-weight: 800; + font-size: 0.7rem; + padding: 3px; + letter-spacing: 0.15em; +} + +/* Filter option */ +.filter-option-inner-inner { + background-color: #f1f4f6 !important; +} + +/* h6 links in context */ +h6 a { + text-decoration: none; + color: var(--color-primary); + font-weight: 600; + border-bottom: 1px dashed var(--color-primary-light); + transition: all var(--transition-fast); +} +h6 a:hover { + background: var(--color-primary); + color: white; + border-bottom-color: transparent; + padding: 1px 4px; + border-radius: 3px; +} + +/* Textarea in context */ +.mb-2 textarea { + font-size: 0.78rem; + width: 100%; + border: 1px solid var(--border-medium); + border-radius: var(--radius-sm); + padding: 8px; +} + +/* .sr-only */ +.sr-only { + position: absolute; + width: 1px; height: 1px; + padding: 0; margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border-width: 0; +} + +/* ============================== + SCROLLBAR hover — gris neutre */ +::-webkit-scrollbar-thumb:hover { background: var(--color-primary-light); } + +/* ============================== + RESPONSIVE + ============================== */ +@media (max-width: 768px) { + #sidebar { width: var(--sidebar-width); } + #barre_laterale_d { width: 100% !important; } + .scrollmenu { margin: 0 8px 8px; } + .page-content { padding: 18px 0px; } +} + +/* --- COMPOSANTS GLOBAUX --- */ +.required::after { content: " *"; color: var(--color-urgent); font-weight: bold; } + +/* ============================================================ + BOOTSTRAP-SELECT : CORRECTIF FINAL SANS LARGEUR FORCÉE + ============================================================ */ + +/* 1. DISPARITION TOTALE DU SELECT NATIF + On utilise opacity et position pour le rendre invisible sans casser + le fonctionnement du plugin, tout en évitant le doublon visuel. */ +select.selectpicker, +select[class*="selectpicker"], +.bootstrap-select > select.bs-select-hidden { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + position: absolute !important; + z-index: -1 !important; +} + +/* 2. STYLE DU BOUTON (L'interface visible) + On retire le "width: 100%" pour laisser le bouton s'adapter à son contenu + ou à sa colonne parente naturelle. */ +.btn-form-select { + background-color: #ffffff !important; + border: 1px solid #e2e8f0 !important; + color: var(--color-primary) !important; + font-size: 0.82rem !important; + padding: 0.5rem 0.75rem !important; + border-radius: var(--radius-sm) !important; + display: inline-flex !important; /* Permet au bouton de ne pas prendre toute la largeur */ + align-items: center; + justify-content: space-between; + min-width: 200px; /* Optionnel : définit une largeur minimale raisonnable */ +} + +/* 3. NETTOYAGE DE L'ÉLÉMENT INTERNE (Ce que vous avez vu à l'image) + On s'assure qu'il n'y a pas de background ou de bordure parasite */ +.bootstrap-select .filter-option { + display: flex; + align-items: center; +} + +.filter-option-inner-inner { + background-color: transparent !important; + padding: 0 !important; + color: inherit !important; +} + +/* 4. LE MENU DÉROULANT + On le laisse s'adapter à la largeur du bouton parent */ +.bootstrap-select .dropdown-menu { + border: 1px solid #e2e8f0; + box-shadow: var(--shadow-lg); + border-radius: var(--radius-md); + font-size: 0.82rem; + z-index: 9999 !important; +} + +/* 5. ZONE DE RECHERCHE */ +.bootstrap-select .bs-searchbox .form-control { + border: 1px solid #ced4da !important; + font-size: 0.8rem !important; + background-color: #fff !important; +} + +/* --- Style spécifique aux onglets de paramètres --- */ + +/* On cible les ID des conteneurs pour isoler le style */ +#Generaux, #Production, #Medical, #Prestation { + animation: fadeIn 0.4s ease-in-out; +} + +/* On cible les lignes de paramètres spécifiquement dans ces ID */ +#Generaux .table td, +#Production .table td, +#Medical .table td, +#Prestation .table td { + padding: 1.1rem 1rem; + border-top: 1px solid #f1f4f6; + vertical-align: middle; +} + +/* --- THÈME NEUTRAL PRO : HAUT CONTRASTE --- */ +.text-dark { color: #1a1d24 !important; } +.bg-success-ghost { background-color: rgba(39, 174, 96, 0.12); color: #27ae60; } +.bg-danger-ghost { background-color: rgba(192, 57, 43, 0.12); color: #c0392b; } +.bg-primary-ghost { background-color: rgba(33, 46, 83, 0.08); color: #212e53; } +.bg-info-ghost { background-color: rgba(52, 152, 219, 0.12); color: #3498db; } +.bg-warning-ghost { background-color: rgba(243, 156, 18, 0.12); color: #f39c12; } + + +/* Navigation Pills Modernes */ +.nav-pills .nav-link { color: #64748b; padding: 10px 20px; transition: 0.3s; border: none; background: none; } +.nav-pills .nav-link.active { background-color: #212e53 !important; color: white !important; box-shadow: var(--shadow-md); } + +/* Tableaux et Cards */ +.table td { padding: 1.2rem 1rem !important; border-top: 1px solid #f1f4f6 !important; font-size:0.95rem !important;} +.table-hover tbody tr:hover { background-color: #f8fafc; cursor: pointer; } + +.bg-light-info { background-color: rgba(33, 46, 83, 0.02); } +.bg-light-success { background-color: rgba(39, 174, 96, 0.02); } + +.fs-5 { font-size: 1.15rem !important; } + +.searchable-row:hover { background-color: #f8fafc !important; } + + +/* ============================================================ + DESIGN SYSTEM - PAGE PARAMÈTRES (NEUTRAL PRO) + ============================================================ */ + +/* Conteneurs de sections (Onglets) */ +.tab-custom-content { + animation: fadeIn 0.4s ease-in-out; +} + +/* Style des Cartes (Sections) */ +.tab-custom-content .card { + border-radius: var(--radius-md); + overflow: hidden; + margin-bottom: 1.5rem; +} + +/* En-têtes de tableaux/sections */ +.tab-custom-content .card-header { + padding: 0.75rem 1.25rem; +} + +.tab-custom-content .card-header h6 { + margin-bottom: 0; + font-size: 0.85rem; + letter-spacing: 0.05em; +} + +/* Tableaux de paramètres */ +.tab-custom-content .table td { + padding: 1.1rem 1rem; + border-top: 1px solid #f1f4f6; + vertical-align: middle; +} + +/* Libellés de paramètres (Haut Contraste) */ +.tab-custom-content .text-dark { + color: #1a1d24 !important; /* Noir profond */ + font-weight: 700 !important; /* Gras pour la lisibilité */ + font-size: 0.95rem; +} + +/* Valeurs (Colonne de droite) */ +.tab-custom-content .valeur-display { + text-align: center; + border-left: 1px solid #f1f4f6; + background-color: rgba(248, 250, 252, 0.5); + font-weight: 700; +} + +/* BADGES "GHOST" (Sémantique des couleurs) */ +.badge-ghost { + padding: 0.5rem 0.8rem; + border-radius: 50px; + font-weight: 700; + font-size: 0.75rem; +} + +/* Animation */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(5px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Optionnel : Réduire légèrement l'entête lors du scroll (via JS si besoin) */ +#titre-page { + color: var(--color-primary); + letter-spacing: -0.5px; + font-family: 'DM Sans', sans-serif; /* Ou votre police SaaS */ +} + +/* --- LE HEADER STICKY (Base Neutral Pro) --- */ +.header-section { + position: sticky; + top: 0; + z-index: 1000 !important; + background-color: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + padding: 5px 0; + margin-bottom: 0.65rem !important; + border-bottom: 1px solid rgba(0,0,0,0.05); +} + +.header-section > div { + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.08) !important; +} + +/* Ajustement des icônes pour plus de finesse */ +.icon-shape { + flex-shrink: 0; +} + +/* Force le bouton de fermeture en blanc pur */ +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%) !important; + color: #fff !important; +} + +.modal-header .btn:hover { + transform: scale(1.2); + opacity: 0.8; +} + + +/* S'assurer que le titre "Rechercher :" est aligné avec son input */ +.dataTables_filter label { + display: flex; + align-items: center; + margin-bottom: 0; + font-weight: 600; + color: var(--text-dark); +} + +/* Espacement entre les boutons export */ +.dt-buttons { + display: flex; + align-items: center; +} + +/* Style pour maintenir la bordure visible quand le filtre est activé */ +.bootstrap-select > button.btn:focus, +.bootstrap-select > button.btn:active, +.bootstrap-select.show > button.btn { + outline: none !important; + border: 2px solid #212e53 !important; /* Votre couleur Primary */ + box-shadow: 0 0 0 0.25rem rgba(33, 46, 83, 0.25) !important; + background-color: #fff !important; +} + +/* Ajustement pour que le conteneur en pointillé ne gêne pas le focus */ +#div_listetables .bootstrap-select { + width: 100% !important; +} + +/* Aligne le bouton SelectPicker avec l'icône de l'input-group */ +.input-group > .bootstrap-select.form-control { + flex: 1 1 auto; + width: 1% !important; +} + +/* 1. Force la bordure sur le bouton du select */ +.bootstrap-select > .dropdown-toggle { + border: 2px solid #dee2e6 !important; /* Même couleur que ton input Nom */ + border-left: 0 !important; /* Supprime la bordure gauche pour coller à l'icône */ + background-color: #fff !important; + height: 38px !important; /* Aligne la hauteur sur l'input Nom */ + display: flex !important; + align-items: center; +} + +/* Styles sidebar toggle + ligne sélectionnée */ +/* ── Ligne DataTable sélectionnée ── */ + .table tbody tr.row-selected > td { + background: rgba(26, 107, 74, 0.08) !important; + border-left: 3px solid var(--color-accent, #0abf7c); + } + + /* ── Transitions fluides (doivent être déclarées ici, APRÈS le CSS du template, + pour ne pas être écrasées par Bootstrap/css/style.css) ── */ + /* + #sidebar { + transition: width 0.3s cubic-bezier(.4,0,.2,1), + transform 0.3s cubic-bezier(.4,0,.2,1) !important; + overflow: hidden !important; + will-change: width; + } + */ + + /* + #main { + transition: margin-left 0.3s cubic-bezier(.4,0,.2,1) !important; + will-change: margin-left; + } + */ + + /* ── Mode réduit (icônes seules) — desktop ── */ + body.toggle-sidebar #sidebar { + width: 68px !important; + min-width: 68px !important; + } + + body.toggle-sidebar #main { + margin-left: 68px !important; + } + + /* Masquer textes et chevrons */ + body.toggle-sidebar #sidebar .nav-link span, + body.toggle-sidebar #sidebar .nav-link .bi-chevron-down, + body.toggle-sidebar #sidebar .sidebar-section-label { + opacity: 0; + width: 0; + overflow: hidden; + white-space: nowrap; + display: inline-block; /* garder dans le flux mais invisible — évite le reflow brutal */ + transition: opacity 0.2s ease, width 0.2s ease; + } + body:not(.toggle-sidebar) #sidebar .nav-link span, + body:not(.toggle-sidebar) #sidebar .nav-link .bi-chevron-down { + opacity: 1; + width: auto; + transition: opacity 0.25s ease 0.05s, width 0.25s ease; + } + /* Centrer les icônes et agrandir légèrement */ + body.toggle-sidebar #sidebar .nav-link { + justify-content: center !important; + padding: 11px 0 !important; + } + body.toggle-sidebar #sidebar .nav-link i:first-child { + font-size: 1.25rem !important; + width: auto !important; + margin: 0 !important; + } + /* Fermer les sous-menus */ + body.toggle-sidebar #sidebar .nav-content { + display: none !important; + } + /* Tooltip natif au survol en mode réduit */ + body.toggle-sidebar #sidebar .nav-link { + position: relative; + } + + /* ── Mobile : slide depuis la gauche ── */ + @media (max-width: 1199px) { + #sidebar { + transform: translateX(-100%); + width: var(--sidebar-width, 240px) !important; + } + #sidebar.sidebar-mobile-open { + transform: translateX(0); + } + /* Overlay semi-transparent derrière le sidebar mobile */ + #sidebar.sidebar-mobile-open::after { + content: ''; + position: fixed; + inset: 0; + background: rgba(0,0,0,0.35); + z-index: -1; + } + #main { + margin-left: 0 !important; + } + } + + /* Empêche l'affichage cumulatif si le plugin déraille */ +.bootstrap-select .filter-option-inner-inner { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block !important; +} + +/* ===== WRAPPER & BORDURE ANIMÉE ===== */ +.scan-wrapper { + position: relative; + width: 100%; + max-width: 720px; + margin: 40px auto; +} + +.scan-wrapper::before { + content: ''; + position: absolute; + inset: -3px; + border-radius: 20px; + background: linear-gradient(135deg, #00c9ff, #0055a5, #00e5ff, #0055a5, #00c9ff); + background-size: 300% 300%; + animation: borderGlow 3s linear infinite; + z-index: 0; +} + +.scan-wrapper.has-value::before { + background: linear-gradient(135deg, #00c853, #1b5e20, #69f0ae, #1b5e20, #00c853); + background-size: 300% 300%; +} + +.scan-wrapper.has-error::before { + background: linear-gradient(135deg, #ff1744, #b71c1c, #ff6e6e, #b71c1c, #ff1744); + background-size: 300% 300%; +} + +@keyframes borderGlow { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +/* ===== INNER CONTAINER ===== */ +.scan-inner { + position: relative; + z-index: 1; + background: #050f20; + border-radius: 18px; + padding: 16px 20px 20px; + overflow: hidden; +} + +/* Ligne de scan animée */ +.scan-inner::after { + content: ''; + position: absolute; + left: 0; right: 0; + height: 2px; + background: linear-gradient(90deg, transparent 0%, #00e5ff 30%, #ffffff 50%, #00e5ff 70%, transparent 100%); + animation: scanLine 2.5s ease-in-out infinite; + pointer-events: none; + z-index: 2; + opacity: 0.7; +} + +@keyframes scanLine { + 0% { top: 0%; opacity: 0; } + 5% { opacity: 0.8; } + 95% { opacity: 0.8; } + 100% { top: 100%; opacity: 0; } +} + +/* ===== COINS DÉCORATIFS ===== */ +.scan-corner { + position: absolute; + width: 20px; height: 20px; + border-color: #00c9ff; + border-style: solid; + z-index: 4; + transition: border-color 0.3s; +} +.scan-corner.tl { top: 10px; left: 10px; border-width: 2px 0 0 2px; border-radius: 4px 0 0 0; } +.scan-corner.tr { top: 10px; right: 10px; border-width: 2px 2px 0 0; border-radius: 0 4px 0 0; } +.scan-corner.bl { bottom: 10px; left: 10px; border-width: 0 0 2px 2px; border-radius: 0 0 0 4px; } +.scan-corner.br { bottom: 10px; right: 10px; border-width: 0 2px 2px 0; border-radius: 0 0 4px 0; } + +.scan-wrapper.has-value .scan-corner { border-color: #00c853; } +.scan-wrapper.has-error .scan-corner { border-color: #ff1744; } + +/* ===== LABEL EN-TÊTE ===== */ +.scan-label { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + font-family: 'Exo 2', sans-serif; + font-size: 9.5pt; + font-weight: 600; + letter-spacing: 3px; + text-transform: uppercase; + color: rgba(0, 180, 230, 0.6); + margin-bottom: 6px; +} + +.nfc-icon-pulse { + animation: pulse 2.2s ease-in-out infinite; +} +@keyframes pulse { + 0%, 100% { opacity: 0.35; transform: scale(1); } + 50% { opacity: 1; transform: scale(1.2); } +} + +/* ===== CHAMP INPUT ===== */ +#donneesCarte { + font-family: 'Rajdhani', monospace !important; + font-size: 24pt !important; + font-weight: 700; + height: 130px !important; + width: 100% !important; + text-align: center; + /* Données masquées (sécurité) */ + color: transparent !important; + text-shadow: 0 0 10px rgba(0, 229, 255, 0.8) !important; + caret-color: #00e5ff; + /* Fond & bordure */ + background: transparent !important; + border: none !important; + outline: none !important; + box-shadow: none !important; + letter-spacing: 4px; + position: relative; + z-index: 3; + transition: text-shadow 0.3s; +} + +#donneesCarte::placeholder { + font-family: 'Exo 2', sans-serif !important; + font-size: 20pt !important; + font-weight: 600; + color: rgba(0, 210, 255, 0.85) !important; + text-shadow: 0 0 12px rgba(0, 210, 255, 0.5) !important; + letter-spacing: 1px; +} + +#donneesCarte:focus::placeholder { + color: rgba(0, 210, 255, 0.55) !important; + text-shadow: 0 0 8px rgba(0, 210, 255, 0.3) !important; +} + +/* État : données détectées */ +#donneesCarte.reading { + text-shadow: 0 0 14px rgba(0, 200, 83, 0.9) !important; + animation: none !important; +} + +/* Force l'alignement de la hauteur du SelectPicker avec les inputs sm */ +.bootstrap-select .btn.dropdown-toggle { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + height: 31px !important; /* Hauteur standard du form-control-sm */ + font-size: 8.5pt !important; + display: flex; + align-items: center; + background-color: #fff !important; + border-width: 2px !important; +} + +/* Aligne l'icône de flèche */ +.bootstrap-select .btn.dropdown-toggle .filter-option { + display: flex; + align-items: center; + height: 100%; +} + +/* Corrige la bordure spécifique si vous utilisez border-start-0 */ +.bootstrap-select.border-2 .btn.dropdown-toggle { + border-color: #dee2e6 !important; +} + +/* --- LE DATEPICKER (Correction Visuelle & Z-Index) --- */ +.datepicker-dropdown { + /* Le secret : un index supérieur au header (1000) */ + z-index: 2000 !important; + position: absolute !important; + padding: 10px !important; + border: 2px solid #212e53 !important; + border-radius: 10px !important; + box-shadow: 0 10px 25px rgba(0,0,0,0.1) !important; + background-color: #fff !important; +} + +/* Style des jours actifs (Couleur de ta charte) */ +.datepicker table tr td.active { + background-color: #212e53 !important; + border-radius: 5px !important; + color: #fff !important; +} + +/* 1. On ne force JAMAIS le display:block ici, sinon il reste visible en bas de page */ +#ui-datepicker-div { + z-index: 99999 !important; /* Priorité absolue sur le header et les modals */ + display: none; /* Laisse jQuery UI le contrôler */ + + /* Design SaaS Neutral Pro */ + background: #ffffff !important; + border: 1px solid #212e53 !important; + border-radius: 12px !important; + box-shadow: 0 15px 35px rgba(0,0,0,0.2) !important; + padding: 10px !important; + font-family: inherit; +} + +/* --- LE DATEPICKER "NEUTRAL PRO" (jQuery UI) --- */ +/* Conteneur principal : Plus grand, plus aéré, ombre premium */ +.ui-datepicker { + font-size: 10pt !important; /* Police plus lisible */ + background: #fff !important; /* Fond blanc pur */ + border: 2px solid #212e53 !important; /* Couleur Primary */ + border-radius: 12px !important; + padding: 15px !important; /* Plus d'espace interne */ + box-shadow: 0 10px 30px rgba(0,0,0,0.15) !important; /* Ombre plus douce */ + width: 280px !important; /* Largeur fixe pour la lisibilité */ +} + +.ui-datepicker-header { + background: #f8f9fa !important; + border: none !important; + border-bottom: 1px solid #eee !important; + border-radius: 8px 8px 0 0 !important; +} + +.ui-datepicker-title { + color: #212e53 !important; /* Couleur Primary */ + font-weight: bold !important; + text-transform: uppercase; + font-size: 11pt !important; +} + +/* Masquage des flèches par défaut */ +.ui-icon-circle-triangle-w, .ui-icon-circle-triangle-e { display: none; } + +/* Jours de la semaine : Gris légers, en majuscules */ +.ui-datepicker-calendar th { + font-weight: bold; + color: #888; + text-transform: uppercase; + font-size: 8.5pt; + padding-bottom: 10px; +} + +/* Tableau des jours : Cellules plus grandes, sans bordures lourdes */ +.ui-datepicker-calendar { + border-collapse: collapse; +} + +.ui-datepicker-calendar td { + padding: 2px; +} + +/* Style des Jours Standards : Pas de bordures, fond blanc */ +.ui-datepicker .ui-state-default { + background: #fff !important; + color: #555 !important; + border: none !important; + text-align: center; + padding: 8px !important; + border-radius: 8px; /* Jours arrondis */ + font-weight: 500; +} + +/* Hover sur les jours : Gris très léger */ +.ui-datepicker .ui-state-default:hover { + background-color: #f1f3f5 !important; + color: #212e53 !important; +} + +/* Jours Désactivés (Passés/Futurs) : Gris léger */ +.ui-state-disabled { + opacity: 0.35 !important; +} + +/* --- LE STYLE DES ÉTATS (Charte Graphique) --- */ +/* --- LE STYLE DU JOUR COURANT (AUJOURD'HUI) --- */ +.ui-datepicker-today a { + background-color: #FFF88D !important; /* Ton Jaune Charte */ + color: #212e53 !important; /* On garde le bleu Primary pour le texte */ + font-weight: 800 !important; /* On force un gras très prononcé */ + border-radius: 50% !important; /* On en fait une pastille parfaite */ + width: 35px; + height: 35px; + display: flex !important; + align-items: center; + justify-content: center; + margin: 0 auto !important; + position: relative; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); /* Un léger relief */ +} + +/* Petit indicateur visuel discret sous le numéro d'aujourd'hui */ +.ui-datepicker-today a::after { + content: ''; + position: absolute; + bottom: 2px; + width: 12px; + height: 2px; + background-color: #dc3545; /* Barre rouge horizontale sous le chiffre */ + border-radius: 2px; +} + +/* Jour Sélectionné (Si l'utilisateur clique dessus) */ +/* Couleur Primary Charte avec texte blanc net */ +.ui-datepicker-current-day a, +.ui-datepicker .ui-state-active { + background-color: #212e53 !important; /* Couleur Primary Charte */ + color: #fff !important; /* Texte blanc pur */ + font-weight: bold !important; + border: none !important; + box-shadow: 0 2px 5px rgba(0,0,0,0.2); /* Légère ombre pour le relief */ +} + +/* Effet au survol pour plus de dynamisme */ +.ui-datepicker-today a:hover { + background-color: #f7e031 !important; /* Un jaune un peu plus soutenu */ + transform: scale(1.1); + transition: all 0.2s ease; +} + +/* --- LE STYLE DU JOUR COURANT (AUJOURD'HUI) --- */ +/* On cible le lien car jQuery UI applique ses styles dessus */ +.ui-datepicker-today a.ui-state-default { + background-color: #FFF88D !important; /* Ton Jaune Charte */ + color: #212e53 !important; /* Texte bleu foncé */ + font-weight: 800 !important; + border: 1px solid #212e53 !important; /* Bordure pour bien voir le cercle */ + border-radius: 50% !important; /* Cercle parfait */ + + /* On centre le chiffre dans le cercle */ + display: flex !important; + align-items: center; + justify-content: center; + + width: 30px !important; + height: 30px !important; + margin: 0 auto !important; + padding: 0 !important; + box-shadow: 0 2px 4px rgba(0,0,0,0.1) !important; +} + +/* La petite barre rouge sous le chiffre pour le rappel d'importance */ +.ui-datepicker-today a.ui-state-default::after { + content: ''; + position: absolute; + bottom: 2px; + width: 10px; + height: 2px; + background-color: #dc3545; + border-radius: 2px; +} + +/* --- LE STYLE DU JOUR SÉLECTIONNÉ (CLIQUE) --- */ +.ui-datepicker-current-day a.ui-state-active { + background-color: #212e53 !important; /* Primary */ + color: #ffffff !important; /* Blanc */ + border-radius: 50% !important; + border: none !important; +} + +/* On s'assure que les jours sont propres */ +.ui-datepicker th { color: #888 !important; text-transform: uppercase; font-size: 8pt; } +.ui-datepicker td span, .ui-datepicker td a { + border: none !important; + background: none !important; + text-align: center !important; + border-radius: 6px !important; +} \ No newline at end of file diff --git a/Bootstrap_new/css/theme-modern.css b/Bootstrap_new/css/theme-modern.css index badd880d..84d99c5a 100644 --- a/Bootstrap_new/css/theme-modern.css +++ b/Bootstrap_new/css/theme-modern.css @@ -13,7 +13,7 @@ --color-primary: #212E53; /*#2e3440;*/ /* charcoal foncé */ --color-primary-light: #4c566a; /* slate moyen */ --color-primary-dark: #1a1d24; /* quasi-noir */ - --color-primary-ghost: rgba(46, 52, 64, 0.07); + --color-primary-ghost: rgba(33, 46, 83, 0.05); /* Ajusté sur le Charcoal */ /* Accent / Status — conservés pour lisibilité fonctionnelle */ --color-accent: #5e6e82; /* gris-bleu neutre */ @@ -35,35 +35,32 @@ --text-secondary: #4c566a; --text-muted: #7b8a99; --text-inverse: #ffffff; - + /* Borders */ --border-light: #e3e6ea; --border-medium: #c8cdd4; /* Spacing & Radius */ - --radius-sm: 6px; - --radius-md: 12px; - --radius-lg: 16px; - --radius-xl: 24px; + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 8px; + --radius-xl: 12px; --radius-full: 9999px; /* Shadows — neutres, sans teinte colorée */ - --shadow-xs: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04); - --shadow-sm: 0 2px 8px rgba(0,0,0,.08), 0 1px 3px rgba(0,0,0,.05); - --shadow-md: 0 4px 16px rgba(0,0,0,.10), 0 2px 6px rgba(0,0,0,.06); - --shadow-lg: 0 8px 32px rgba(0,0,0,.12), 0 4px 12px rgba(0,0,0,.07); - --shadow-xl: 0 16px 48px rgba(0,0,0,.14), 0 8px 24px rgba(0,0,0,.08); - --shadow-primary: 0 4px 20px rgba(30,34,40,.20); - + --shadow-xs: 0 1px 2px rgba(0,0,0,.05); + --shadow-sm: 0 2px 4px rgba(0,0,0,.05); + --shadow-lg: 0 10px 25px rgba(0,0,0,.1); + /* Transitions */ --transition-fast: 0.15s ease; --transition-base: 0.25s ease; --transition-slow: 0.4s cubic-bezier(.4,0,.2,1); /* Layout */ - --sidebar-width: 200px; - --sidebar-collapsed: 68px; - --header-height: 64px; + --sidebar-width: 240px; + --sidebar-collapsed: 60px; + --header-height: 60px; --context-width: 320px; } diff --git a/Config/prod.ini b/Config/prod.ini index 8a45d8dd..b0e999f0 100755 --- a/Config/prod.ini +++ b/Config/prod.ini @@ -14,3 +14,7 @@ mdpcentral=5358ue6PDcPxxP3P dsnebene='mysql:host=localhost;port=3306;dbname=bdintersante;charset=utf8' loginebene=intersante mdpebene=5358ue6PDcPxxP3P + +dsnric='mysql:host=localhost;port=3306;dbname=db_migration_royal;charset=utf8' +loginric=intersante +mdpric=5358ue6PDcPxxP3P diff --git a/Cron/prod.ini b/Cron/prod.ini index 8a45d8dd..b0e999f0 100755 --- a/Cron/prod.ini +++ b/Cron/prod.ini @@ -14,3 +14,7 @@ mdpcentral=5358ue6PDcPxxP3P dsnebene='mysql:host=localhost;port=3306;dbname=bdintersante;charset=utf8' loginebene=intersante mdpebene=5358ue6PDcPxxP3P + +dsnric='mysql:host=localhost;port=3306;dbname=db_migration_royal;charset=utf8' +loginric=intersante +mdpric=5358ue6PDcPxxP3P