@@ -513,3 +513,107 @@ body {
513513 animation : none !important ;
514514 }
515515}
516+
517+
518+ /* ═══════════════════════════════════════════════════════════════════
519+ TRACK CARDS (landing page)
520+ All selectors are scoped to .tlm-track-card so these rules only
521+ apply inside a card and never leak to the hero or other sections.
522+ ═══════════════════════════════════════════════════════════════════ */
523+
524+ /* Card shell — portrait 3:4, clips everything inside */
525+ .tlm-track-card {
526+ position : relative;
527+ overflow : hidden; /* clips img zoom AND any text that would escape */
528+ cursor : pointer;
529+ border : 2px solid # a07830 ;
530+ box-shadow : 4px 4px 0 # 3a2d10 ;
531+ flex-shrink : 0 ;
532+ /* Default size used by home.html — landing.html overrides with aspect-ratio */
533+ width : 180px ;
534+ height : 240px ;
535+ }
536+
537+ /* Image — sepia tint at rest, smooth transition for hover */
538+ .tlm-track-card img {
539+ width : 100% ;
540+ height : 100% ;
541+ object-fit : cover;
542+ display : block;
543+ filter : sepia (55% ) brightness (0.85 ) contrast (1.05 );
544+ /* Smooth zoom + desaturate on hover */
545+ transition : transform 0.5s cubic-bezier (0.25 , 0.46 , 0.45 , 0.94 ),
546+ filter 0.5s ease;
547+ transform-origin : center center;
548+ }
549+
550+ /* Hover: smooth zoom-in + full greyscale */
551+ .tlm-track-card : hover img {
552+ transform : scale (1.1 );
553+ filter : grayscale (100% ) brightness (0.72 ) contrast (1.15 );
554+ }
555+
556+ /* Dark vignette overlay — left strip + bottom fade.
557+ Scoped to .tlm-track-card so it never affects other elements. */
558+ .tlm-track-card .tlm-track-overlay {
559+ position : absolute;
560+ inset : 0 ;
561+ pointer-events : none;
562+ z-index : 1 ;
563+ background :
564+ linear-gradient (to right, rgba (10 , 8 , 2 , 0.55 ) 0% , transparent 38% ),
565+ linear-gradient (to top, rgba (10 , 8 , 2 , 0.60 ) 0% , transparent 38% );
566+ }
567+
568+ /* Name strip — a 22 px column flush to the left edge, full card height.
569+ Uses writing-mode so text flows vertically without transform hacks,
570+ which means the text is always contained within the strip's box and
571+ overflow:hidden on .tlm-track-card clips it safely. */
572+ .tlm-track-card .tlm-track-name-strip {
573+ position : absolute;
574+ left : 0 ;
575+ top : 0 ;
576+ bottom : 0 ;
577+ width : 22px ;
578+ z-index : 2 ;
579+ pointer-events : none;
580+ /* Stack children bottom-to-top, centred in the strip */
581+ display : flex;
582+ align-items : center;
583+ justify-content : center;
584+ writing-mode : vertical-rl;
585+ transform : rotate (180deg ); /* flip: text now reads bottom → top (CCW) */
586+ padding : 0.5rem 0 ;
587+ }
588+
589+ /* The name text itself — static inside the strip, no absolute positioning */
590+ .tlm-track-card .tlm-track-name {
591+ position : static;
592+ transform : none;
593+ left : auto;
594+ top : auto;
595+ margin-left : 0 ;
596+ font-family : 'JetBrains Mono' , 'Courier New' , monospace;
597+ font-size : 0.72rem ;
598+ font-weight : 700 ;
599+ color : # ffffff ;
600+ letter-spacing : 0.1em ;
601+ text-shadow : 1px 1px 3px rgba (0 , 0 , 0 , 0.9 );
602+ white-space : nowrap;
603+ }
604+
605+ /* Points — bottom-right corner, always inside the card */
606+ .tlm-track-card .tlm-track-pts {
607+ position : absolute;
608+ bottom : 0.45rem ;
609+ right : 0.55rem ;
610+ left : auto;
611+ top : auto;
612+ z-index : 2 ;
613+ font-family : 'JetBrains Mono' , 'Courier New' , monospace;
614+ font-size : 0.72rem ;
615+ font-weight : 700 ;
616+ color : # ffffff ;
617+ letter-spacing : 0.08em ;
618+ text-shadow : 1px 1px 4px rgba (0 , 0 , 0 , 0.95 );
619+ }
0 commit comments