/* === Variables CSS (héritées de admin.css) === */ :root[data-theme="dark"] { --bg-primary: #1a1a1a; --bg-secondary: #2a2a2a; --bg-tertiary: #3a3a3a; --text-primary: #e0e0e0; --text-secondary: #a0a0a0; --accent: #4a9eff; --accent-hover: #3a8eef; --success: #4caf50; --warning: #ff9800; --danger: #f44336; --border: #404040; --temp-cold: #4a9eff; --temp-warm: #ff9800; --temp-hot: #f44336; } :root[data-theme="light"] { --bg-primary: #ffffff; --bg-secondary: #f5f5f5; --bg-tertiary: #e0e0e0; --text-primary: #1a1a1a; --text-secondary: #606060; --accent: #2196f3; --accent-hover: #1976d2; --success: #4caf50; --warning: #ff9800; --danger: #f44336; --border: #d0d0d0; --temp-cold: #2196f3; --temp-warm: #ff9800; --temp-hot: #f44336; } :root[data-theme="blue"] { --bg-primary: #0d1117; --bg-secondary: #161b22; --bg-tertiary: #21262d; --text-primary: #c9d1d9; --text-secondary: #8b949e; --accent: #58a6ff; --accent-hover: #4896ef; --success: #3fb950; --warning: #d29922; --danger: #f85149; --border: #30363d; --temp-cold: #58a6ff; --temp-warm: #d29922; --temp-hot: #f85149; } /* === Reset === */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: var(--bg-primary); color: var(--text-primary); line-height: 1.6; overflow-x: hidden; } /* === Font Families === */ .font-family-system { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; } .font-family-roboto { font-family: 'Roboto', sans-serif; } .font-family-opensans { font-family: 'Open Sans', sans-serif; } .font-family-lato { font-family: 'Lato', sans-serif; } .font-family-montserrat { font-family: 'Montserrat', sans-serif; } .font-family-poppins { font-family: 'Poppins', sans-serif; } .font-family-inter { font-family: 'Inter', sans-serif; } .font-family-mono { font-family: 'Share Tech Mono', 'Consolas', 'Monaco', monospace; } .font-family-digital { font-family: 'Orbitron', 'Share Tech Mono', monospace; letter-spacing: 1px; } /* === Font Weight === */ .font-bold { font-weight: 700; } .font-bold .sensor-name { font-weight: 600; } .font-bold .sensor-value { font-weight: 700; } .font-normal { font-weight: 400; } .font-normal .sensor-name { font-weight: 400; } .font-normal .sensor-value { font-weight: 500; } /* === Container === */ .container { max-width: 100%; height: 100vh; display: flex; flex-direction: column; padding: 15px; } /* === Header === */ header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 2px solid var(--border); flex-shrink: 0; } header h1 { font-size: 24px; font-weight: 600; } .header-actions { display: flex; align-items: center; gap: 15px; } #last-update { font-size: 13px; color: var(--text-secondary); } .btn { padding: 8px 16px; border: none; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s; text-decoration: none; display: inline-block; } .btn-secondary { background: var(--bg-tertiary); color: var(--text-primary); } .btn-secondary:hover { background: var(--border); } .btn-primary { background: var(--accent); color: white; } .btn-primary:hover { background: var(--accent-hover); } /* === Tabs Navigation === */ .tabs-nav { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid var(--border); flex-shrink: 0; overflow-x: auto; } .tab-button { padding: 12px 24px; background: transparent; border: none; border-bottom: 3px solid transparent; color: var(--text-secondary); cursor: pointer; font-size: 15px; font-weight: 500; transition: all 0.2s; white-space: nowrap; } .tab-button:hover { color: var(--text-primary); background: var(--bg-secondary); } .tab-button.active { color: var(--accent); border-bottom-color: var(--accent); } /* === Tabs Content === */ .tabs-content { flex: 1; overflow-y: auto; } .tab-pane { display: none; } .tab-pane.active { display: block; } /* === Sensors Grid === */ .sensors-grid { display: grid; grid-template-columns: repeat(12, 1fr); gap: 15px; margin-bottom: 20px; } /* === Sensor Card === */ .sensor-card { background: var(--bg-secondary); border-radius: 12px; padding: 15px; border: 1px solid var(--border); transition: all 0.2s; } /* Tailles de cartes (grille 12 colonnes) */ .sensor-card.card-tiny { grid-column: span 1; /* 1/12 = 8.3% */ } .sensor-card.card-xs { grid-column: span 2; /* 2/12 = 16.7% */ } .sensor-card.card-small { grid-column: span 3; /* 3/12 = 25% */ } .sensor-card.card-medium { grid-column: span 4; /* 4/12 = 33.3% */ } .sensor-card.card-large { grid-column: span 6; /* 6/12 = 50% */ } .sensor-card.card-xl { grid-column: span 8; /* 8/12 = 66.7% */ } .sensor-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .sensor-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; } .sensor-name { font-size: 14px; color: var(--text-secondary); font-weight: 500; } .sensor-type-badge { font-size: 11px; padding: 3px 8px; border-radius: 4px; background: var(--bg-tertiary); color: var(--text-secondary); } .sensor-value { font-size: 32px; font-weight: 600; margin-bottom: 10px; } /* Couleurs selon le type */ .sensor-value.temperature { color: var(--temp-warm); } .sensor-value.temperature.cold { color: var(--temp-cold); } .sensor-value.temperature.hot { color: var(--temp-hot); } .sensor-value.percentage { color: var(--accent); } .sensor-value.percentage.high { color: var(--warning); } .sensor-value.percentage.critical { color: var(--danger); } .sensor-value.fan { color: var(--success); } .sensor-value.power { color: var(--warning); } /* === Sensor Chart (Canvas directement dans la carte) === */ .sensor-chart { width: 100% !important; height: 120px !important; max-height: 120px; margin-top: 10px; display: block; } /* Hauteurs de graphiques personnalisées */ .sensor-chart.chart-tiny { height: 50px !important; max-height: 50px; margin-top: 6px; } .sensor-chart.chart-xs { height: 70px !important; max-height: 70px; margin-top: 8px; } .sensor-chart.chart-small { height: 90px !important; max-height: 90px; margin-top: 8px; } .sensor-chart.chart-medium { height: 120px !important; max-height: 120px; } .sensor-chart.chart-large { height: 180px !important; max-height: 180px; } /* === Sensor Gauge (Canvas directement dans la carte) === */ .sensor-gauge { width: 100% !important; max-width: 180px; height: 180px !important; max-height: 180px; margin: 10px auto 0; display: block; } /* Tailles de jauges personnalisées */ .sensor-gauge.gauge-tiny { max-width: 60px; width: 60px !important; height: 60px !important; max-height: 60px; margin-top: 6px; } .sensor-gauge.gauge-xs { max-width: 90px; width: 90px !important; height: 90px !important; max-height: 90px; margin-top: 8px; } .sensor-gauge.gauge-small { max-width: 120px; width: 120px !important; height: 120px !important; max-height: 120px; margin-top: 8px; } .sensor-gauge.gauge-medium { max-width: 180px; width: 180px !important; height: 180px !important; max-height: 180px; } .sensor-gauge.gauge-large { max-width: 240px; width: 240px !important; height: 240px !important; max-height: 240px; } /* === Apps Section === */ .apps-section { margin-top: 30px; padding-top: 20px; border-top: 2px solid var(--border); } .apps-section h3 { margin-bottom: 15px; font-size: 18px; } .apps-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; } .app-button { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 12px; padding: 20px 15px; cursor: pointer; transition: all 0.2s; text-align: center; } .app-button:hover { background: var(--bg-tertiary); transform: translateY(-2px); } .app-icon { font-size: 32px; margin-bottom: 8px; } .app-name { font-size: 13px; font-weight: 500; } /* === Empty State === */ .empty-state, .error-state { text-align: center; padding: 60px 20px; } .empty-icon, .error-icon { font-size: 64px; margin-bottom: 20px; } .empty-state h2, .error-state h2 { font-size: 24px; margin-bottom: 10px; } .empty-state p, .error-state p { color: var(--text-secondary); margin-bottom: 20px; } /* === Loading State === */ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .loading { animation: pulse 1.5s ease-in-out infinite; } /* === Responsive === */ /* Masquer header sur mobile EN PORTRAIT (largeur < 768px) */ @media (max-width: 768px) { /* MASQUER LE HEADER sur mobile pour économiser l'espace */ header { display: none !important; } .container { padding: 4px; /* Réduit de 8px à 4px */ } /* Sur mobile, toutes les cartes prennent la largeur disponible */ .sensors-grid { grid-template-columns: repeat(6, 1fr); gap: 4px; /* Réduit de 8px à 4px */ margin-bottom: 8px; } /* Les cartes tiny/xs gardent leur taille sur mobile */ .sensor-card.card-tiny { grid-column: span 1; } .sensor-card.card-xs { grid-column: span 2; } .sensor-card.card-small { grid-column: span 3; } .sensor-card.card-medium { grid-column: span 4; } .sensor-card.card-large { grid-column: span 6; } .sensor-card.card-xl { grid-column: span 6; } /* Cartes TRÈS compactes sur mobile */ .sensor-card { padding: 4px; /* Réduit de 8px à 4px */ border-radius: 6px; border-width: 1px; } .sensor-card:hover { transform: none; } .sensor-header { margin-bottom: 3px; /* Réduit */ } .sensor-name { font-size: 10px; /* Plus petit */ } .sensor-type-badge { font-size: 8px; padding: 1px 4px; } .sensor-value { font-size: 18px; /* Réduit de 22px */ margin-bottom: 3px; /* Réduit */ } /* Option pour masquer la valeur sur mobile et donner plus d'espace au graphique */ .sensor-card.hide-value-mobile .sensor-value { display: none; } .sensor-card.hide-value-mobile .sensor-header { margin-bottom: 2px; /* Encore plus compact */ } /* GRAPHIQUES - Canvas direct, aucun padding intermédiaire */ .sensor-chart { margin-top: 4px; } .sensor-chart.chart-tiny { height: 45px; margin-top: 2px; } .sensor-chart.chart-xs { height: 60px; margin-top: 3px; } .sensor-chart.chart-small { height: 75px; margin-top: 4px; } .sensor-chart.chart-medium { height: 95px; margin-top: 4px; } .sensor-chart.chart-large { height: 125px; margin-top: 5px; } /* JAUGES - Canvas direct, aucun padding intermédiaire */ .sensor-gauge { margin-top: 4px; } .sensor-gauge.gauge-tiny { max-width: 60px; height: 60px; margin-top: 2px; } .sensor-gauge.gauge-xs { max-width: 90px; height: 90px; margin-top: 3px; } .sensor-gauge.gauge-small { max-width: 120px; height: 120px; margin-top: 4px; } .sensor-gauge.gauge-medium { max-width: 165px; height: 165px; margin-top: 4px; } .sensor-gauge.gauge-large { max-width: 205px; height: 205px; margin-top: 5px; } /* Tailles de police personnalisables sur mobile */ .sensor-card.font-tiny .sensor-name { font-size: 8px !important; } .sensor-card.font-tiny .sensor-type-badge { font-size: 7px !important; padding: 1px 3px !important; } .sensor-card.font-tiny .sensor-value { font-size: 14px !important; } .sensor-card.font-xs .sensor-name { font-size: 9px !important; } .sensor-card.font-xs .sensor-type-badge { font-size: 7px !important; padding: 1px 4px !important; } .sensor-card.font-xs .sensor-value { font-size: 16px !important; } .sensor-card.font-small .sensor-name { font-size: 10px !important; } .sensor-card.font-small .sensor-type-badge { font-size: 8px !important; } .sensor-card.font-small .sensor-value { font-size: 18px !important; } .sensor-card.font-medium .sensor-name { font-size: 11px !important; } .sensor-card.font-medium .sensor-type-badge { font-size: 9px !important; } .sensor-card.font-medium .sensor-value { font-size: 20px !important; } .sensor-card.font-large .sensor-name { font-size: 12px !important; } .sensor-card.font-large .sensor-type-badge { font-size: 10px !important; } .sensor-card.font-large .sensor-value { font-size: 22px !important; } .tabs-nav { gap: 3px; margin-bottom: 8px; } .tab-button { padding: 6px 10px; font-size: 11px; } .apps-grid { grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); gap: 6px; } .app-button { padding: 8px; font-size: 10px; } } /* === Mobile en MODE PAYSAGE === */ @media (orientation: landscape) and (max-height: 500px) { /* MASQUER LE HEADER en paysage mobile */ header { display: none !important; } .container { padding: 4px; height: 100vh; } /* Grille optimisée pour paysage - plus de colonnes */ .sensors-grid { grid-template-columns: repeat(12, 1fr); gap: 4px; } /* Tailles de cartes réduites pour paysage */ .sensor-card.card-tiny { grid-column: span 1; } .sensor-card.card-xs { grid-column: span 1; } .sensor-card.card-small { grid-column: span 2; } .sensor-card.card-medium { grid-column: span 2; } .sensor-card.card-large { grid-column: span 3; } .sensor-card.card-xl { grid-column: span 4; } .sensor-card { padding: 4px 6px; border-radius: 6px; } .sensor-header { margin-bottom: 2px; } .sensor-name { font-size: 9px !important; } .sensor-type-badge { font-size: 7px !important; padding: 1px 4px !important; } .sensor-value { font-size: 14px !important; margin-bottom: 2px; } /* Graphiques compacts en paysage */ .sensor-chart { margin-top: 2px; } .sensor-chart.chart-tiny, .sensor-chart.chart-xs { height: 30px !important; } .sensor-chart.chart-small { height: 40px !important; } .sensor-chart.chart-medium { height: 50px !important; } .sensor-chart.chart-large { height: 70px !important; } /* Jauges compactes en paysage */ .sensor-gauge { margin-top: 2px; } .sensor-gauge.gauge-tiny, .sensor-gauge.gauge-xs { max-width: 40px !important; height: 40px !important; } .sensor-gauge.gauge-small { max-width: 55px !important; height: 55px !important; } .sensor-gauge.gauge-medium { max-width: 70px !important; height: 70px !important; } .sensor-gauge.gauge-large { max-width: 90px !important; height: 90px !important; } /* Tabs compacts */ .tabs-nav { gap: 2px; margin-bottom: 4px; padding-bottom: 4px; } .tab-button { padding: 4px 8px; font-size: 10px; } /* Masquer la section apps en paysage pour plus d'espace */ .apps-section { display: none; } } /* Mode paysage tablette / grand mobile */ @media (orientation: landscape) and (min-height: 501px) and (max-height: 800px) { header { padding: 8px 0; margin-bottom: 8px; } header h1 { font-size: 18px; } .container { padding: 8px; } .sensors-grid { grid-template-columns: repeat(12, 1fr); gap: 6px; } /* Tailles intermédiaires */ .sensor-card.card-tiny { grid-column: span 1; } .sensor-card.card-xs { grid-column: span 2; } .sensor-card.card-small { grid-column: span 2; } .sensor-card.card-medium { grid-column: span 3; } .sensor-card.card-large { grid-column: span 4; } .sensor-card { padding: 6px 8px; } .sensor-name { font-size: 10px; } .sensor-value { font-size: 16px; } } /* === Scrollbar === */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--bg-primary); } ::-webkit-scrollbar-thumb { background: var(--bg-tertiary); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--border); } /* === Swipe Indicators === */ .swipe-indicators { display: flex; justify-content: center; align-items: center; gap: 8px; padding: 8px 0; margin-bottom: 10px; } .swipe-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--bg-tertiary); cursor: pointer; transition: all 0.3s ease; } .swipe-dot:hover { background: var(--text-secondary); transform: scale(1.2); } .swipe-dot.active { background: var(--accent); width: 24px; border-radius: 4px; } /* === Swipe Animation === */ .tabs-content { transition: transform 0.2s ease-out; } .tabs-content.swipe-next { animation: swipeLeft 0.2s ease-out; } .tabs-content.swipe-prev { animation: swipeRight 0.2s ease-out; } @keyframes swipeLeft { 0% { transform: translateX(20px); opacity: 0.7; } 100% { transform: translateX(0); opacity: 1; } } @keyframes swipeRight { 0% { transform: translateX(-20px); opacity: 0.7; } 100% { transform: translateX(0); opacity: 1; } } /* === Mobile Swipe Indicators === */ @media (max-width: 768px) { .swipe-indicators { padding: 6px 0; margin-bottom: 6px; gap: 6px; } .swipe-dot { width: 6px; height: 6px; } .swipe-dot.active { width: 18px; } } /* Paysage mobile - indicateurs encore plus petits */ @media (orientation: landscape) and (max-height: 500px) { .swipe-indicators { padding: 3px 0; margin-bottom: 3px; gap: 4px; } .swipe-dot { width: 5px; height: 5px; } .swipe-dot.active { width: 14px; } } /* === Apps in Tab === */ .apps-section-in-tab { margin-top: 20px; padding-top: 15px; border-top: 1px solid var(--border); } .apps-title-in-tab { font-size: 14px; color: var(--text-secondary); margin-bottom: 10px; } .apps-grid-in-tab { display: grid; grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); gap: 10px; } @media (max-width: 480px) { .apps-section-in-tab { margin-top: 12px; padding-top: 10px; } .apps-title-in-tab { font-size: 12px; margin-bottom: 8px; } .apps-grid-in-tab { grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); gap: 6px; } } @media (orientation: landscape) and (max-height: 500px) { .apps-section-in-tab { margin-top: 8px; padding-top: 6px; } .apps-title-in-tab { font-size: 10px; margin-bottom: 4px; } .apps-grid-in-tab { grid-template-columns: repeat(auto-fill, minmax(50px, 1fr)); gap: 4px; } }