From d42d1510e98d91ca5555f631f8bd498867e6b1a2 Mon Sep 17 00:00:00 2001 From: CodingPhoenixx Date: Fri, 13 Feb 2026 16:28:15 +0100 Subject: [PATCH] Reworked homepage --- flightscore/src/pages/home-page.ts | 629 ++++++++++++++++++++++++++++- 1 file changed, 626 insertions(+), 3 deletions(-) diff --git a/flightscore/src/pages/home-page.ts b/flightscore/src/pages/home-page.ts index 45d0a06..afc691d 100644 --- a/flightscore/src/pages/home-page.ts +++ b/flightscore/src/pages/home-page.ts @@ -1,12 +1,635 @@ -import { LitElement, html } from 'lit'; +import { LitElement, html, css } from 'lit'; import { customElement } from 'lit/decorators.js'; +import '../components/ui-card'; +import '../components/ui-button'; +import '../components/ui-link'; @customElement('home-page') export class HomePage extends LitElement { + static styles = css` + :host { + flex: 1; + display: flex; + flex-direction: column; + } + + .hero { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 5rem 1.5rem 4rem; + background: + radial-gradient( + ellipse at 40% 0%, + color-mix(in srgb, var(--color-accent) 18%, transparent) 0%, + transparent 55% + ), + radial-gradient( + ellipse at 80% 60%, + color-mix(in srgb, var(--color-accent) 8%, transparent) 0%, + transparent 50% + ), + var(--color-bg); + overflow: hidden; + } + + .hero::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: var(--color-border); + } + + .hero-badge { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.35rem 0.85rem; + font-size: 0.78rem; + font-weight: 600; + letter-spacing: 0.03em; + text-transform: uppercase; + color: var(--color-accent); + background: color-mix(in srgb, var(--color-accent) 10%, transparent); + border: 1px solid color-mix(in srgb, var(--color-accent) 25%, transparent); + border-radius: 2rem; + margin-bottom: 1.5rem; + } + + .hero-badge svg { + width: 0.85rem; + height: 0.85rem; + } + + .hero h1 { + margin: 0; + font-size: clamp(2.2rem, 5vw, 3.5rem); + font-weight: 800; + letter-spacing: -0.03em; + line-height: 1.1; + color: var(--color-text); + max-width: 700px; + } + + .hero h1 span { + background: linear-gradient( + 135deg, + var(--color-accent), + color-mix(in srgb, var(--color-accent) 60%, transparent) + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + + .hero-sub { + margin: 1.25rem 0 2rem; + font-size: 1.05rem; + line-height: 1.65; + color: color-mix(in srgb, var(--color-text) 60%, transparent); + max-width: 520px; + } + + .hero-actions { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + justify-content: center; + } + + .btn-secondary { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.65rem 1.25rem; + font-size: 0.95rem; + font-weight: 600; + color: var(--color-text); + background: transparent; + border: 1px solid var(--color-border); + border-radius: 0.5rem; + cursor: pointer; + transition: + border-color 0.25s ease, + color 0.25s ease, + background 0.25s ease; + } + + .btn-secondary:hover { + border-color: var(--color-accent); + color: var(--color-accent); + background: color-mix(in srgb, var(--color-accent) 6%, transparent); + } + + section { + padding: 4rem 1.5rem; + max-width: 1100px; + margin: 0 auto; + width: 100%; + } + + section + section { + border-top: 1px solid var(--color-border); + } + + .section-label { + font-size: 0.78rem; + font-weight: 600; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--color-accent); + margin: 0 0 0.5rem; + } + + .section-title { + margin: 0 0 0.5rem; + font-size: 1.75rem; + font-weight: 700; + letter-spacing: -0.02em; + color: var(--color-text); + } + + .section-desc { + margin: 0 0 2.5rem; + font-size: 0.95rem; + color: color-mix(in srgb, var(--color-text) 55%, transparent); + max-width: 520px; + line-height: 1.6; + } + + .stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 1rem; + } + + .stat-card { + background: var(--color-bg-nav); + border: 1px solid var(--color-border); + border-radius: 0.75rem; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 0.25rem; + transition: border-color 0.25s ease; + } + + .stat-card:hover { + border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); + } + + .stat-value { + font-size: 2rem; + font-weight: 800; + letter-spacing: -0.03em; + color: var(--color-accent); + } + + .stat-label { + font-size: 0.85rem; + color: color-mix(in srgb, var(--color-text) 55%, transparent); + font-weight: 500; + } + + .features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1.25rem; + } + + .feature-card { + background: var(--color-bg-nav); + border: 1px solid var(--color-border); + border-radius: 0.75rem; + padding: 1.75rem; + display: flex; + flex-direction: column; + gap: 0.75rem; + transition: border-color 0.25s ease; + } + + .feature-card:hover { + border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); + } + + .feature-icon { + width: 2.25rem; + height: 2.25rem; + display: grid; + place-items: center; + border-radius: 0.5rem; + background: color-mix(in srgb, var(--color-accent) 10%, transparent); + color: var(--color-accent); + } + + .feature-icon svg { + width: 1.15rem; + height: 1.15rem; + } + + .feature-card h3 { + margin: 0; + font-size: 1rem; + font-weight: 650; + color: var(--color-text); + } + + .feature-card p { + margin: 0; + font-size: 0.875rem; + line-height: 1.6; + color: color-mix(in srgb, var(--color-text) 55%, transparent); + } + + .competitions-list { + display: flex; + flex-direction: column; + gap: 0.75rem; + } + + .comp-row { + display: flex; + align-items: center; + gap: 1.25rem; + background: var(--color-bg-nav); + border: 1px solid var(--color-border); + border-radius: 0.75rem; + padding: 1.25rem 1.5rem; + transition: border-color 0.25s ease; + cursor: pointer; + } + + .comp-row:hover { + border-color: color-mix(in srgb, var(--color-accent) 40%, transparent); + } + + .comp-date { + display: flex; + flex-direction: column; + align-items: center; + min-width: 3.5rem; + padding: 0.5rem 0.65rem; + background: color-mix(in srgb, var(--color-accent) 10%, transparent); + border-radius: 0.5rem; + flex-shrink: 0; + } + + .comp-date-day { + font-size: 1.25rem; + font-weight: 800; + color: var(--color-accent); + line-height: 1; + } + + .comp-date-month { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.04em; + color: var(--color-accent); + margin-top: 0.15rem; + } + + .comp-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 0.2rem; + } + + .comp-name { + font-size: 1rem; + font-weight: 650; + color: var(--color-text); + } + + .comp-location { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.82rem; + color: color-mix(in srgb, var(--color-text) 50%, transparent); + } + + .comp-location svg { + width: 0.8rem; + height: 0.8rem; + flex-shrink: 0; + } + + .comp-badge { + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.03em; + text-transform: uppercase; + padding: 0.3rem 0.7rem; + border-radius: 2rem; + flex-shrink: 0; + } + + .comp-badge.upcoming { + color: var(--color-accent); + background: color-mix(in srgb, var(--color-accent) 10%, transparent); + border: 1px solid + color-mix(in srgb, var(--color-accent) 25%, transparent); + } + + .comp-badge.live { + color: #30a46c; + background: color-mix(in srgb, #30a46c 10%, transparent); + border: 1px solid color-mix(in srgb, #30a46c 25%, transparent); + } + + .comp-badge.ended { + color: color-mix(in srgb, var(--color-text) 45%, transparent); + background: color-mix(in srgb, var(--color-text) 6%, transparent); + border: 1px solid var(--color-border); + } + + @media (max-width: 600px) { + .hero { + padding: 3.5rem 1.25rem 3rem; + } + + section { + padding: 3rem 1.25rem; + } + + .comp-row { + flex-wrap: wrap; + gap: 0.75rem; + } + + .comp-badge { + margin-left: auto; + } + } + `; + + private navigate(path: string) { + this.dispatchEvent( + new CustomEvent('nav', { + detail: { path }, + bubbles: true, + composed: true, + }) + ); + } + render() { return html` -

Welcome to the Balloon Tracker

-

Analyze your tracks visually.

+
+
+ + + + + + Live Scoring Platform +
+

Precision scoring for balloon competitions

+

+ Track tasks, manage participants, and deliver real-time results + for hot air balloon competitions worldwide. +

+
+ this.navigate('/competitions')}> + Browse competitions + + +
+
+ +
+ +

Platform in numbers

+

+ FlightScore powers balloon competitions across the globe. +

+
+
+ 42 + Competitions scored +
+
+ 318 + Registered pilots +
+
+ 1,240 + Tasks completed +
+
+ 12 + Countries +
+
+
+ +
+ +

Built for balloon events

+

+ Everything organizers, judges, and pilots need in one place. +

+
+
+
+ + + + +
+

Real-Time Scoring

+

+ Scores update live as judges submit results. Pilots and + spectators always see the latest standings. +

+
+
+
+ + + + + + + +
+

Task Management

+

+ Define and manage competition tasks with support for all + standard ballooning task types. +

+
+
+
+ + + + + + +
+

Pilot Profiles

+

+ Every pilot gets a profile with competition history, + rankings, and performance statistics. +

+
+
+
+ + + + + + +
+

Live Leaderboard

+

+ Public leaderboards let spectators follow the action + from anywhere in the world. +

+
+
+
+ + + + +
+

GPS Integration

+

+ Import GPS tracks and calculate distances to targets + automatically for precise scoring. +

+
+
+
+ + + + + +
+

Result Export

+

+ Export final standings and detailed score sheets as PDF + or CSV for official records. +

+
+
+
+ +
+ +

Upcoming and recent events

+

+ Discover balloon competitions scored with FlightScore. +

+
+
this.navigate('/competitions/1')} + > +
+ 18 + Mar +
+
+ European Balloon Challenge 2026 + + + + + + Salzburg, Austria + +
+ Upcoming +
+ +
this.navigate('/competitions/2')} + > +
+ 14 + Feb +
+
+ Cappadocia Open 2026 + + + + + + Goreme, Turkey + +
+ Live +
+ +
this.navigate('/competitions/3')} + > +
+ 02 + Feb +
+
+ Albuquerque Winter Fiesta + + + + + + New Mexico, USA + +
+ Ended +
+ +
this.navigate('/competitions/4')} + > +
+ 11 + Jan +
+
+ Swiss Alpine Balloon Trophy + + + + + + Chateau-d'Oex, Switzerland + +
+ Ended +
+
+
`; } } \ No newline at end of file