Initial commit

Created from https://vercel.com/new
This commit is contained in:
MrPatator230 committed 2026-03-19 15:46:03 +00:00
commit 3fcdf7e5ef
172 files changed
+52525

No files matched your search

@@ -0,0 +1,398 @@
.aff-classiques-departs__container{
--blue-dark: #173771; /* bande foncée */
--blue: #275e9f; /* 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-blue: rgba(10,120,180,0.15);
}
/* Déclaration des fontes Achemine (dans public/fonts/) */
@font-face {
font-family: 'Achemine';
src: url('/public/fonts/achemine_regular.ttf') format('truetype');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Achemine';
src: url('/public/fonts/achemine_bold.ttf') format('truetype');
font-weight: 700;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Achemine';
src: url('/public/fonts/achemine_italic.ttf') format('truetype');
font-weight: 400;
font-style: italic;
font-display: swap;
}
/* Conteneur plein écran pour l'afficheur */
.aff-classiques-departs__container{
position: relative;
width: 100%;
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(--blue-dark);
/* plus de padding-bottom : le footer sera superposé en position absolute */
}
/* Boîte affichant le nom de la gare configuré via ?gare=Nom-de-la-gare */
.aff-classiques-departs__station-box{
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;
}
/* arrondir légèrement le bas de l'afficheur pour coller à la maquette */
.aff-classiques-departs__container{
border-bottom-right-radius: 10px;
border-bottom-left-radius: 4px;
}
/* Liste des lignes (bandes horizontales) */
.aff-classiques-departs__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;
}
.aff-classiques-departs__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 */
}
.aff-classiques-departs__row:nth-child(odd){
background: var(--blue);
}
.aff-classiques-departs__row:nth-child(even){
background: var(--blue-dark);
}
/* Colonne logo */
.aff-classiques-departs__col-logo{
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 */
}
.aff-classiques-departs__logo-box{
/* 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 */
.aff-classiques-departs__op-logo{
max-width: 90%;
max-height: 100%;
height: auto;
}
/* Texte à l'intérieur de la pastille/logo (quai) */
.aff-classiques-departs__logo-text{
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;
}
/* Colonne heure */
.aff-classiques-departs__col-time{
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 */
}
.aff-classiques-departs__time{
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;
}
/* Destination */
.aff-classiques-departs__col-destination{
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 */
}
.aff-classiques-departs__destination{
color: var(--white);
font-weight: 500;
font-size: clamp(28px, 8vw, 80px);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
/* Colonne Platform (quai) affichée à droite de chaque ligne */
.aff-classiques-departs__col-platform{
/* 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;
}
.aff-classiques-departs__platform-box{
/* 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;
}
.aff-classiques-departs__platform-text{
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;
}
/* Colonne Type de train (victoire de la séparation avec la colonne logo) */
.aff-classiques-departs__col-train-type{
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 */
}
.aff-classiques-departs__train-type-box{
height: auto;
aspect-ratio: 1 / 1;
display:flex;
align-items:center;
justify-content:center;
background: transparent;
border-radius: 10px;
box-sizing: border-box;
}
.aff-classiques-departs__train-type-fallback{ text-align:center; }
/* Numéro de train / opérateur (texte sous logo) */
.aff-classiques-departs__train-meta{
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;
}
.aff-classiques-departs__train-meta .aff-classiques-departs__op-name{
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 */
}
.aff-classiques-departs__train-meta .aff-classiques-departs__op-number{
font-weight:500;
font-size:1.25rem;
padding-left: 20px;
text-align: left; /* aligner à gauche */
margin: 0 0 2px 0;
}
/* Statuts spéciaux : retardé / supprimé doivent ressortir en jaune */
.aff-classiques-departs__train-meta.aff-classiques-departs__train-meta--delayed .aff-classiques-departs__op-name,
.aff-classiques-departs__train-meta.aff-classiques-departs__train-meta--delayed .aff-classiques-departs__op-number,
.aff-classiques-departs__train-meta.aff-classiques-departs__train-meta--suppressed .aff-classiques-departs__op-name,
.aff-classiques-departs__train-meta.aff-classiques-departs__train-meta--suppressed .aff-classiques-departs__op-number{
color: var(--accent-yellow);
}
/* Si on veut un alignement plus spécifique quand train-meta apparaît dans la colonne de type */
.aff-classiques-departs__col-train-type .aff-classiques-departs__train-meta{ align-items: flex-start; justify-content: center; }
.aff-classiques-departs__col-train-type .aff-classiques-departs__train-meta .aff-classiques-departs__op-name,
.aff-classiques-departs__col-train-type .aff-classiques-departs__train-meta .aff-classiques-departs__op-number{ text-align: left; }
/* Watermark vertical à droite */
.aff-classiques-departs__watermark{
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%) rotate(-90deg);
transform-origin: center;
font-size: 10.8vw;
color: var(--watermark-blue);
font-weight:800;
letter-spacing: 6px;
pointer-events: none;
user-select: none;
}
/* Petite pastille H en haut à droite (optionnelle) */
.aff-classiques-departs__helpline{
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;
}
/* Horloge en bas à droite, proche du bord droit (à 400px du bord droit) */
.aff-classiques-departs__clock-container{
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 */
}
.aff-classiques-departs__clock-box{
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--blue-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);
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;
}
/* Footer visuel : barre foncée en bas qui chevauche la liste */
.aff-classiques-departs__footer{
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: var(--footer-height);
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 20; /* en dessous de l'horloge */
}
.aff-classiques-departs__footer .aff-classiques-departs__footer-inner{
width: 100%;
height: 100%;
position: relative;
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(--blue-dark) 30%);
box-shadow: inset 0 6px 0 rgba(0,0,0,0.08);
/* arrondir côté droit comme sur la maquette */
}
/* légère ligne (accent) en haut du footer pour séparer visuellement */
.aff-classiques-departs__footer .aff-classiques-departs__footer-inner::before{
content: '';
position: absolute;
left: 0;
right: 0;
top: 0;
height: 8px;
background: rgba(255,255,255,0.03);
pointer-events: none;
border-top-right-radius: 12px;
}
.aff-classiques-departs__clock-main{
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-departs__clock-seconds{
color: var(--accent-yellow);
font-weight: 800;
font-size: clamp(16px, 2.8vw, 36px);
line-height: 1;
}
/* Ajustements pour petits écrans */
@media (max-width: 700px){
.aff-classiques-departs__col-logo{width: 18%;}
.aff-classiques-departs__col-time{width: 24%;}
}