V2.0.0 : VOICI LES MODIFICATIONS MAJEURS APPRTÉES DANS CETTE VERSION :

-> REFONTE DU DESIGN DES AFFICHEURS CLASSIQUES (GÉNÉRAL + QUAIS)
-> IMPLÉMENTATION DU DESIGN AFL : GÉNÉRAL ET QUAIS

-> CHOIX DE LA SÉLECTION DES TYPES D'AFFICHEURS (GÉNÉRAL / QUAIS) UNE FOIS LE TYPE D'AFFICHEUR SÉLECTIONNÉS

EN COURS DE DÉVELOPPEMENT :

-> IMPLÉMENTATION DES PERTURBATION DU LANDEMAIN POUR LES HORAIRES DU LANDEMAIN AFFICHÉS AVANT MINUIT.
-> IMPLÉMENTATION DES AFFICHEURS D'INFORMATIONS / INFOS TRAVAUX, etc... (AFFICHEURS AFL)
This commit is contained in:
Ferrovia committed 2026-06-14 22:02:08 +02:00
1 parent f0d9ed9ee7
commit f06ebbaf48
43 files changed
+10519 -3813

No files matched your search

@@ -1,17 +1,6 @@
/* Copié depuis ClassiquesDeparts.css — styles identiques pour les arrivées */
:where(.classiques-arrivees-container, .aff-quais__container--arrivees) {
/* variables locales aux composants Arrivées (ne pas définir sur :root) */
--green-dark: #2d522c; /* bande foncée */
--green: #38723c; /* bande claire */
--accent-yellow: #e1c14c; /* heure */
--white: #f3f3f3;
--rows: 9; /* 9 horaires visibles + 1 footer */
--footer-height: 100px; /* hauteur de la dernière 'ligne' servant de footer */
--watermark-green: rgb(75, 154, 84);
}
/* Déclaration des fontes Achemine (dans public/fonts/) */
/* ══════════════════════════════════════════════════════════════════
Fontes Achemine
══════════════════════════════════════════════════════════════════ */
@font-face {
font-family: 'Achemine';
src: url('/public/fonts/achemine_regular.ttf') format('truetype');
@@ -34,365 +23,400 @@
font-display: swap;
}
.classiques-arrivees-container{
/* ══════════════════════════════════════════════════════════════════
ANIMATIONS
══════════════════════════════════════════════════════════════════ */
/* Info cause perturbation — slide-in de droite vers la gauche */
@keyframes infoWrapperGrow {
from { max-width: 0; }
to { max-width: 30vw; }
}
@keyframes infoSlideIn {
from { transform: translateX(100%); opacity: 0; }
40% { opacity: 1; }
to { transform: translateX(0%); opacity: 1; }
}
/* ══════════════════════════════════════════════════════════════════
CONTENEUR PRINCIPAL
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__container {
/* Couleurs inspirées du vrai afficheur SNCF */
--yellow: #FFCC00;
--blue-bg: #1e4a30;
--blue-odd: #216b3e;
--blue-even: #16552a;
--text-white: #ffffff;
--text-muted: #7EE0A0;
position: relative;
width: 100%;
width: 100vw;
height: 100vh;
/* autoriser l'affichage des boîtes agrandies qui débordent des lignes */
overflow: visible;
font-family: "Achemine", "Helvetica Neue", Arial, sans-serif;
background: var(--green-dark);
/* plus de padding-bottom : le footer sera superposé en position absolute */
}
.station-box-arrivees{
position: absolute;
left: 18px;
top: 12px;
color: #ffffff;
background: rgba(0,0,0,0.08);
padding: 6px 10px;
border-radius: 6px;
font-weight: 700;
z-index: 40;
}
.classiques-arrivees-container{
border-bottom-right-radius: 10px;
border-bottom-left-radius: 4px;
}
.arrivees-list{
list-style: none;
margin: 0;
padding: 0;
/* La liste occupe toute la hauteur de l'écran; le footer sera affiché
en position absolue par-dessus la partie inférieure. */
height: 100vh;
display: flex;
flex-direction: column;
}
.arrivee-row{
display: flex;
/* laisser les colonnes occuper toute la hauteur de la ligne, puis centrer leur contenu */
align-items: stretch;
box-sizing: border-box;
padding: 0 1.2vw;
/* Répartit l'espace en var(--rows) parts ; on utilise 100% / var(--rows) pour que
9 lignes + 1 footer occupent l'écran de façon uniforme. */
flex: 0 0 calc(100% / var(--rows));
min-height: 50px; /* garde une bonne hauteur sur petits écrans */
max-height: 120px;
position: relative; /* pour positionner la .platform-box en absolu */
overflow: visible; /* laisser la platform-box déborder si agrandie */
}
.arrivee-row:nth-child(odd){
background: var(--green);
}
.arrivee-row:nth-child(even){
background: var(--green-dark);
}
/* Cacher la dernière ligne qui sera sous le footer */
/* ne plus cacher la dernière ligne — on laisse le footer la recouvrir visuellement */
.col-logo-arrivees{
max-width: 100px;
display:flex;
/* organiser verticalement les éléments et les centrer verticalement */
flex-direction: column;
justify-content: center; /* centre verticalement le contenu (logo + meta) */
align-items: flex-start; /* garder l'alignement horizontal à gauche */
flex: 0 0 10%; /* largeur fixe pour se comporter comme une colonne de tableau */
}
.logo-box-arrivees{
/* pastille/logo : ne pas forcer la hauteur pour permettre l'empilement vertical */
height: auto;
width: 100px;
display:flex;
align-items:flex-start;
justify-content:center;
font-weight:800;
font-size: clamp(14px, 1.6vw, 20px);
box-sizing: border-box;
flex: 0 0 auto;
align-self: flex-start; /* centrer la pastille dans la colonne */
}
/* Logo SVG chargé depuis public/type */
.op-logo-arrivees{
max-width: 90%;
max-height: 100%;
height: auto;
}
/* Texte à l'intérieur de la pastille/logo (quai) */
.logo-text-arrivees{
text-align: center;
/* taille plus grande, responsive ; s'assure qu'elle reste lisible sur petits et grands écrans */
font-size: 20px;
line-height: 1;
letter-spacing: 0.5px;
}
.col-time-arrivees{
max-width: 15%;
padding-left: 20px;
display:flex;
/* colonne verticale : centrer verticalement l'heure */
flex-direction: column;
align-items: center;
justify-content: center;
flex: 0 0 18%; /* largeur fixe pour alignement table-like */
}
.time-arrivees{
color: var(--accent-yellow);
font-weight:850;
/* tailles responsives similaires à l'image */
font-size: clamp(26px, 7.5vw, 70px);
line-height: 1;
display: flex;
align-items: baseline; /* centre le chiffre verticalement */
height: auto;
width: 100%; /* occupe toute la colonne pour être centré */
text-align: center;
}
.col-destination-arrivees{
flex: 1 1 auto; /* colonne flexible qui prend l'espace restant */
display: flex;
/* colonne verticale : centrer verticalement la destination */
flex-direction: column;
justify-content: center;
align-items: flex-start; /* garder le texte aligné à gauche */
}
.destination-arrivees{
color: var(--white);
font-weight: 500;
font-size: clamp(28px, 8vw, 80px);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
background: var(--blue-bg);
font-family: "Achemine", "Arial Narrow", Arial, sans-serif;
}
.col-platform-arrivees{
/* La colonne laisse la boîte gérer sa taille ; on aligne la boîte à droite
et l'on centre verticalement pour qu'elle suive la hauteur de la ligne. */
display:flex;
flex: 0 0 8%;
align-items: center;
justify-content: flex-end;
padding-right: 0.5vw;
box-sizing: border-box;
}
.platform-box-arrivees{
/* Boîte quai : garder un format carré mais ne pas forcer l'étirement vertical */
height: 90px; /* limite maximale, garde l'aspect visuel */
width: 90px;
aspect-ratio: 1 / 1; /* carré strict */
display:flex;
align-items:center;
justify-content:center;
background: transparent; /* intérieur transparent pour montrer la couleur de la ligne */
border-radius: 12px;
box-sizing: border-box;
border: 4px solid #ffffff; /* bord blanc épais */
padding: 8px; /* espace intérieur pour éloigner le texte du bord */
flex: 0 0 auto;
align-self: center;
}
.platform-text-arrivees{
color: #ffffff;
font-weight: 900;
/* réduire légèrement la taille du texte afin qu'il ne touche pas la bordure */
font-size: clamp(60px, 2.6vw, 100px);
line-height:1;
letter-spacing: 0.8px;
}
/* removed duplicated/corrupted block */
.col-train-type-arrivees{
max-width: 9%;
display:flex;
/* colonne verticale : centrer verticalement l'heure */
flex-direction: column;
align-items: stretch;
justify-content: center;
flex: 0 0 18%; /* largeur fixe pour alignement table-like */
}
.train-type-box-arrivees{
height: auto;
aspect-ratio: 1 / 1;
display:flex;
align-items:center;
justify-content:center;
background: transparent;
border-radius: 10px;
box-sizing: border-box;
}
.train-type-fallback-arrivees{ text-align:center; }
.train-meta-arrivees{
flex-direction:column;
align-items:flex-start;
/* centrer verticalement sans forcer la hauteur (pour permettre l'empilement) */
justify-content: center;
color: #ffffff;
height: auto;
flex: 0 0 auto;
}
.train-meta-arrivees .op-name-arrivees{
font-weight:900;
font-size:1.50rem; /* plus visible */
padding-left: 20px;
line-height:1;
justify-content: flex-start;
text-align: left; /* aligner à gauche dans la colonne */
}
.train-meta-arrivees .op-number-arrivees{
font-weight:500;
font-size:1.25rem;
padding-left: 20px;
text-align: left; /* aligner à gauche */
margin: 0 0 2px 0;
}
.train-meta-arrivees.status-delayed-arrivees .op-name-arrivees,
.train-meta-arrivees.status-delayed-arrivees .op-number-arrivees,
.train-meta-arrivees.status-suppressed-arrivees .op-name-arrivees,
.train-meta-arrivees.status-suppressed-arrivees .op-number-arrivees{
color: var(--accent-yellow);
}
/* Si on veut un alignement plus spécifique quand train-meta apparaît dans la colonne de type */
.col-train-type-arrivees .train-meta-arrivees{ align-items: flex-start; justify-content: center; }
.col-train-type-arrivees .train-meta-arrivees .op-name-arrivees,
.col-train-type-arrivees .train-meta-arrivees .op-number-arrivees{ text-align: left; }
.watermark-arrivees{
/* ══════════════════════════════════════════════════════════════════
WATERMARK "arrivées" — pivotée à 90°, fixée à droite
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__watermark {
position: absolute;
/* placer strictement à droite et faire déborder le watermark en dehors de l'afficheur */
right: -6vw; /* décalage vers l'extérieur pour qu'il soit strictement à droite */
right: -9vh;
top: 50%;
transform: translateY(-50%) rotate(-90deg);
transform-origin: center;
font-size: 10.8vw;
color: var(--watermark-green);
font-weight:800;
letter-spacing: 6px;
/* Taille géante, très visible comme dans l'image */
font-size: 23vh;
color: #216b3e;
font-weight: 900;
letter-spacing: 0.05em;
pointer-events: none;
user-select: none;
/* s'assurer qu'il soit au-dessus des lignes */
z-index: 45;
z-index: 1;
white-space: nowrap;
opacity: 0.3; /* Opacité diminuée */
}
.helpline-arrivees{
position: absolute;
right: 18px;
top: 12px;
width:80px;
height:80px;
border-radius:6px;
border:3px solid #fff;
color:#fff;
display:flex;
align-items:center;
justify-content:center;
font-weight:900;
/* ══════════════════════════════════════════════════════════════════
LISTE STATIQUE — 10 lignes sur exactement 100vh
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__list {
list-style: none;
margin: 0;
padding: 0;
height: 100vh;
display: flex;
flex-direction: column;
position: relative;
z-index: 2;
}
.clock-container-arrivees{
position: relative; /* contenu positionné par le footer */
pointer-events: none;
z-index: 30; /* au-dessus du footer */
display: inline-flex;
align-items: center;
height: 100%; /* prendra la hauteur de la ligne footer */
/* ══════════════════════════════════════════════════════════════════
MODE DÉFILEMENT — conteneur + track animé
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__scroll-container {
height: 100vh;
overflow: hidden;
position: relative;
z-index: 2;
}
.clock-box-arrivees{
display: inline-flex;
/* Le track contient 2× les données pour une boucle seamless */
.aff-classiques-arrivees__scroll-track {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
}
/* ══════════════════════════════════════════════════════════════════
ROW — chaque ligne occupe 1/10 de 100vh
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__row {
display: flex;
align-items: center;
justify-content: center;
background: var(--green-dark); /* fond foncé interne comme sur la maquette */
border-radius: 10px;
padding: 4px 8px; /* réduire padding pour diminuer légèrement la taille globale */
border: 6px solid #ffffff; /* bordure un peu moins épaisse */
box-shadow: 0 2px 0 rgba(0,0,0,0.12);
flex: 0 0 calc(100vh / 10);
height: calc(100vh / 10);
min-height: 0;
padding: 0;
box-sizing: border-box;
overflow: hidden;
/* hauteur adaptée pour rentrer exactement dans la ligne footer */
height: calc(var(--footer-height) - 12px);
min-height: 34px;
}
.afficheur-footer-arrivees{
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: var(--footer-height);
/* Alternance de tons bleus (comme l'image) */
.aff-classiques-arrivees__row:nth-child(odd) { background: var(--blue-odd); }
.aff-classiques-arrivees__row:nth-child(even) { background: var(--blue-even); }
.aff-classiques-arrivees__row--empty {
flex-direction: column;
justify-content: center;
align-items: center;
color: var(--text-white);
font-size: 3vh;
text-align: center;
}
/* ══════════════════════════════════════════════════════════════════
COL 1 — Logo opérateur (~9 % largeur)
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__col-logo {
width: 9vw;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 20; /* en dessous de l'horloge */
}
.afficheur-footer-arrivees .footer-inner-arrivees{
width: 100%;
height: 100%;
position: relative;
padding: 0 0.4vw;
box-sizing: border-box;
}
.aff-classiques-arrivees__logo-box {
width: 100%;
/* Logo prend ~65% de la hauteur de la ligne */
height: 6vh;
display: flex;
align-items: center; /* centre verticalement le contenu (la clock) */
justify-content: flex-end; /* place la clock à droite */
padding-right: 12px; /* espace entre le bord et la clock pour le coin arrondi */
/* léger dégradé pour donner l'effet de bande plus claire en haut */
background: linear-gradient(to bottom, rgba(11,123,180,0.18) 0%, var(--green-dark) 30%);
box-shadow: inset 0 6px 0 rgba(0,0,0,0.08);
/* arrondir côté droit comme sur la maquette */
align-items: center;
justify-content: center;
}
/* légère ligne (accent) en haut du footer pour séparer visuellement */
.afficheur-footer-arrivees .footer-inner-arrivees::before{
content: '';
.aff-classiques-arrivees__op-logo {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.aff-classiques-arrivees__logo-text {
color: var(--text-white);
font-weight: 700;
font-size: 2vh;
text-align: center;
word-break: break-word;
line-height: 1.1;
}
/* ══════════════════════════════════════════════════════════════════
COL 2 — Type + Numéro OU Statut (~11 % largeur)
Alterne toutes les 4 secondes
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__col-meta {
width: 11vw;
flex-shrink: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
padding: 0 0.5vw 0 0;
box-sizing: border-box;
gap: 0.05vh;
overflow: hidden;
text-align: center;
}
/* Vue normale — type (ex: "MOBIGO") */
.aff-classiques-arrivees__train-type {
font-size: 2.2vh;
color: var(--text-white);
font-weight: 600;
line-height: 1.3;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
}
/* Vue normale — numéro de sillon (ex: "894251") */
.aff-classiques-arrivees__train-number {
font-size: 2.2vh;
color: var(--text-white);
font-weight: 400;
line-height: 1.3;
white-space: nowrap;
}
/* Vue statut — à l'heure */
.aff-classiques-arrivees__status-ontime {
font-size: 2.2vh;
color: var(--text-white);
font-weight: 400;
line-height: 1.3;
white-space: nowrap;
}
/* Vue statut — retardé */
.aff-classiques-arrivees__status-delayed {
display: flex;
flex-direction: column;
gap: 0;
line-height: 1.15;
}
.aff-classiques-arrivees__status-label {
font-size: 2.2vh;
color: var(--yellow);
font-weight: 500;
white-space: nowrap;
}
.aff-classiques-arrivees__status-value {
font-size: 2.2vh;
color: var(--yellow);
font-weight: 700;
white-space: nowrap;
}
/* Vue statut — supprimé */
.aff-classiques-arrivees__status-suppressed {
font-size: 2.2vh;
color: var(--yellow);
font-weight: 700;
white-space: nowrap;
}
/* ══════════════════════════════════════════════════════════════════
COL 3 — Heure (~15 % largeur)
Grande, jaune vif (#FFCC00), bold — comme dans l'image
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__col-time {
width: 15vw;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: flex-start;
height: 100%;
padding: 0 0.3vw 0 0;
box-sizing: border-box;
}
.aff-classiques-arrivees__time {
/* Jaune vif exactement comme dans la vidéo/image */
color: var(--yellow);
font-weight: 700;
/* Grande taille — occupe ~65% de la hauteur de ligne */
font-size: 6.5vh;
line-height: 1;
white-space: nowrap;
}
/* ══════════════════════════════════════════════════════════════════
COL 4 — Destination + Info cause (flex:1 — prend tout le reste)
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__col-origin {
flex: 1 1 0;
min-width: 0;
display: flex;
align-items: center;
overflow: hidden;
height: 100%;
padding-right: 0.5vw;
}
/* Texte destination — blanc, bold, très grand */
.aff-classiques-arrivees__destination {
color: var(--text-white);
font-weight: 700;
font-size: 6.5vh;
line-height: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1 1 0;
min-width: 0;
}
/* ─── Wrapper animé cause perturbation ────────────────────────── */
.aff-classiques-arrivees__info-wrapper {
flex-shrink: 0;
overflow: hidden;
max-width: 0;
animation: infoWrapperGrow 0.85s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
.aff-classiques-arrivees__info-inner {
display: flex;
align-items: center;
transform: translateX(100%);
animation: infoSlideIn 0.85s cubic-bezier(0.4, 0, 0.2, 1) forwards;
white-space: nowrap;
}
.aff-classiques-arrivees__separator {
color: var(--text-white);
font-size: 4.5vh;
font-weight: 200;
line-height: 1;
flex-shrink: 0;
padding: 0 0.9vw;
}
.aff-classiques-arrivees__info-text {
color: var(--text-white);
font-size: 1.9vh;
font-weight: 400;
white-space: normal;
overflow: hidden;
line-height: 1.25;
max-width: 22vw;
}
/* ══════════════════════════════════════════════════════════════════
COL 5 — Quai OU icône bus (~6.5 % largeur)
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__col-platform {
width: 6.5vw;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
box-sizing: border-box;
padding: 0.5vh 0.4vw;
}
/* Boîte quai — bordure blanche */
.aff-classiques-arrivees__platform-box {
width: 6vh;
height: 6vh;
border: 2.5px solid rgba(255, 255, 255, 0.88);
display: flex;
align-items: center;
justify-content: center;
border-radius: 7px;
background: transparent;
box-sizing: border-box;
}
.aff-classiques-arrivees__platform-text {
color: var(--text-white);
font-weight: 700;
font-size: 4.5vh;
line-height: 1;
}
/* ══════════════════════════════════════════════════════════════════
HORLOGE — superposée en bas à droite (z-index élevé)
══════════════════════════════════════════════════════════════════ */
.aff-classiques-arrivees__footer {
position: absolute;
left: 0;
right: 0;
top: 0;
height: 8px;
background: rgba(255,255,255,0.03);
right: 1.2vw;
bottom: 0.8vh;
z-index: 30;
pointer-events: none;
border-top-right-radius: 12px;
}
.clock-main-arrivees{
color: #ffffff;
font-weight: 800;
/* légèrement plus petit pour tenir dans le footer */
font-size: clamp(28px, 4.2vw, 60px);
line-height: 1;
font-family: "Achemine", "Helvetica Neue", Arial, sans-serif;
margin-right: 6px;
.aff-classiques-arrivees__clock-container {
display: flex;
align-items: center;
}
.clock-seconds-arrivees{
color: var(--accent-yellow);
.aff-classiques-arrivees__clock-box {
border: 2.5px solid rgba(255, 255, 255, 0.88);
background: rgba(0, 51, 102, 0.93);
border-radius: 8px;
padding: 0.4vh 1.1vw;
display: flex;
align-items: baseline;
gap: 0.5vw;
box-shadow: 0 2px 16px rgba(0, 0, 0, 0.65);
}
.aff-classiques-arrivees__clock-main {
color: var(--text-white);
font-weight: 800;
font-size: clamp(16px, 2.8vw, 36px);
font-size: 4.4vh;
line-height: 1;
}
/* Ajustements pour petits écrans */
@media (max-width: 700px){
.col-logo-arrivees{width: 18%;}
.col-time-arrivees{width: 24%;}
.watermark-arrivees{display:none}
.aff-classiques-arrivees__clock-seconds {
color: var(--yellow);
font-weight: 800;
font-size: 2.7vh;
line-height: 1;
}
/* masqué */
.aff-classiques-arrivees__station-box { display: none; }