Skip to content

Commit 118ff42

Browse files
committed
Landing page added
1 parent 1370eb4 commit 118ff42

13 files changed

Lines changed: 400 additions & 363 deletions

File tree

corpus/corpus/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676

7777
MIDDLEWARE = [
7878
"django.middleware.security.SecurityMiddleware",
79+
"tlm.middleware.TLMLaunchGateMiddleware",
7980
"django.contrib.sessions.middleware.SessionMiddleware",
8081
"django.middleware.common.CommonMiddleware",
8182
"django.middleware.csrf.CsrfViewMiddleware",

corpus/templates/static/css/tlm.css

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}
1.18 MB
Loading
2.94 MB
Loading
709 KB
Loading
2.32 MB
Loading

corpus/templates/tlm/403.html

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{% extends 'tlm/base.html' %}
2+
{% load static %}
3+
4+
{% block title %}Access Denied{% endblock %}
5+
6+
{% block style %}
7+
8+
{# Set theme synchronously — same pattern as landing.html #}
9+
<script>document.documentElement.setAttribute("data-theme","tlm");</script>
10+
11+
<link rel="preconnect" href="https://fonts.googleapis.com">
12+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13+
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
14+
15+
<style>
16+
@font-face {
17+
font-family: 'Space Age';
18+
src: url({% static 'css/SpaceAge.ttf' %}) format('truetype');
19+
font-display: swap;
20+
}
21+
22+
/* ── LOGO FIX — same as landing.html ──
23+
Hides the dark logo immediately before any JS runs,
24+
so the duplicate never flashes even for a single frame. */
25+
.dark-logo { display: none !important; }
26+
.light-logo { display: inline !important; }
27+
</style>
28+
29+
<link rel="stylesheet" href="{% static 'css/tlm.css' %}">
30+
31+
{% endblock %}
32+
33+
34+
{% block content %}
35+
36+
<section class="tlm-hero min-h-screen w-full flex flex-col items-center justify-center">
37+
<div class="relative z-10 text-center px-6 flex flex-col items-center gap-6">
38+
<span class="tlm-title-the">Error</span>
39+
<h1 class="tlm-title-main" style="font-size: clamp(4rem, 15vw, 10rem); line-height: 1;">403</h1>
40+
<p class="tlm-tagline">Access Denied</p>
41+
<p class="tlm-date-text">The mission has not begun yet.</p>
42+
<p class="tlm-date-text">Return on Mar 20, 2026 at 18:00 IST.</p>
43+
</div>
44+
</section>
45+
46+
{% endblock %}

corpus/templates/tlm/base.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,20 @@
99
{% block script %}
1010
{{ block.super }}
1111
<script>
12+
document.addEventListener("DOMContentLoaded", async function () {
13+
await new Promise(r => setTimeout(r, 100));
14+
const themeButton = document.getElementById("dark-mode-button");
15+
if (themeButton) themeButton.remove();
16+
document.documentElement.setAttribute("data-theme", "tlm");
17+
});
1218
// Belt-and-suspenders fallback. The primary theme-set is the
1319
// synchronous inline script inside the style block in home.html,
1420
// which runs in <head> before any CSS or body renders.
1521
// This fallback handles any edge-case where that script didn't fire.
1622
document.documentElement.setAttribute("data-theme", "tlm");
1723
</script>
1824
{% endblock %}
25+
26+
27+
28+

corpus/templates/tlm/home.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ <h1 class="tlm-title-main">LAZARUS MISSIONS</h1>
7575
</div>
7676

7777
{# Register button - REPLACE # WITH REAL REGISTRATION LINK #}
78-
<a href="#"
78+
<a href= {% url 'tlm_landing' %}
7979
id="tlm-begin-mission-btn"
8080
class="btn btn-primary tlm-register-btn mt-2"
8181
style="opacity:0.5;cursor:not-allowed;"

0 commit comments

Comments
 (0)