Files
PC-Monitor/static/css/dashboard.css
2026-03-24 07:17:48 +01:00

1266 lines
24 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* === 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;
}
}
/* ==================== Widget Plexamp ==================== */
.plexamp-widget {
background: var(--bg-secondary);
border-radius: 16px;
padding: 20px;
margin: 20px 0;
display: flex;
gap: 20px;
align-items: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.plexamp-artwork {
position: relative;
width: 120px;
height: 120px;
flex-shrink: 0;
border-radius: 12px;
overflow: hidden;
background: var(--bg-tertiary);
}
.plexamp-artwork img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.plexamp-no-music {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: var(--bg-tertiary);
color: var(--text-secondary);
}
.plexamp-no-music span {
font-size: 2.5em;
margin-bottom: 5px;
}
.plexamp-no-music p {
font-size: 0.75em;
margin: 0;
}
.plexamp-info {
flex: 1;
min-width: 0;
}
.plexamp-track {
margin-bottom: 15px;
}
.plexamp-title {
font-size: 1.2em;
font-weight: 600;
color: var(--text-primary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.plexamp-artist {
font-size: 1em;
color: var(--accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 4px;
}
.plexamp-album {
font-size: 0.85em;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 2px;
}
.plexamp-progress {
margin-bottom: 15px;
}
.plexamp-progress-bar {
height: 6px;
background: var(--bg-tertiary);
border-radius: 3px;
overflow: hidden;
cursor: pointer;
}
.plexamp-progress-fill {
height: 100%;
background: var(--accent);
border-radius: 3px;
width: 0%;
transition: width 0.3s ease;
}
.plexamp-times {
display: flex;
justify-content: space-between;
font-size: 0.75em;
color: var(--text-secondary);
margin-top: 5px;
}
.plexamp-controls {
display: flex;
align-items: center;
gap: 15px;
}
.plexamp-btn {
background: var(--bg-tertiary);
border: none;
border-radius: 50%;
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 1.2em;
transition: all 0.2s;
}
.plexamp-btn:hover {
background: var(--accent);
transform: scale(1.1);
}
.plexamp-btn-play {
width: 56px;
height: 56px;
font-size: 1.5em;
background: var(--accent);
}
.plexamp-btn-play:hover {
background: var(--accent-hover);
}
/* Responsive */
@media (max-width: 600px) {
.plexamp-widget {
flex-direction: column;
text-align: center;
}
.plexamp-artwork {
width: 150px;
height: 150px;
}
.plexamp-controls {
justify-content: center;
}
.plexamp-title,
.plexamp-artist,
.plexamp-album {
text-align: center;
}
}