From d822b77fb0268ec1cc91e40c197b88e49624ae82 Mon Sep 17 00:00:00 2001 From: Ovidiu U Date: Mon, 20 Apr 2026 20:27:02 +0100 Subject: [PATCH] feat: redesign homepage with responsive hero, verdict card preview, and modular landing components - Extract LandingNav, LiveTicker, StatsRow, VerdictCard, and HeroSearch into reusable landing components - Implement responsive two-layout strategy: mobile stacked (hero search + verdict card + CTA) vs desktop inline pill input with verdict card sidebar - Add serif/mono font tokens and live-dot pulse animation to CSS - Move verdict card above search input on mobile, to right sidebar on desktop - Replace hero "fill up now" mockup with dynamic VerdictCard showing top stations, pricing, and recommendation - Simplify navigation with uppercase tracking, add Fleet anchor, and gate CTA by auth state - Lazy-load LeafletMap with defineAsyncComponent to reduce initial bundle - Relocate SearchBar below hero on search attempt for persistent filter UI - Add meta description for SEO --- resources/css/app.css | 13 ++ .../js/components/landing/HeroSearch.vue | 127 +++++++++++++++ .../js/components/landing/LandingNav.vue | 46 ++++++ .../js/components/landing/LiveTicker.vue | 45 ++++++ resources/js/components/landing/StatsRow.vue | 28 ++++ .../js/components/landing/VerdictCard.vue | 73 +++++++++ resources/js/views/Home.vue | 147 ++++-------------- resources/views/app.blade.php | 1 + 8 files changed, 365 insertions(+), 115 deletions(-) create mode 100644 resources/js/components/landing/HeroSearch.vue create mode 100644 resources/js/components/landing/LandingNav.vue create mode 100644 resources/js/components/landing/LiveTicker.vue create mode 100644 resources/js/components/landing/StatsRow.vue create mode 100644 resources/js/components/landing/VerdictCard.vue diff --git a/resources/css/app.css b/resources/css/app.css index 905b963..defe91f 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -51,6 +51,10 @@ /* Display font */ --font-display: 'Manrope', ui-sans-serif, system-ui, sans-serif; + + /* Hero type pairing — swap these tokens to upgrade to Instrument Serif / Geist Mono later */ + --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; } @@ -66,6 +70,15 @@ backdrop-filter: blur(12px); border: 1px solid color-mix(in oklch, var(--color-border) 60%, transparent); } + + .live-dot { + animation: live-pulse 2s ease-in-out infinite; + } + + @keyframes live-pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } + } } @layer base { diff --git a/resources/js/components/landing/HeroSearch.vue b/resources/js/components/landing/HeroSearch.vue new file mode 100644 index 0000000..4109f79 --- /dev/null +++ b/resources/js/components/landing/HeroSearch.vue @@ -0,0 +1,127 @@ + + + diff --git a/resources/js/components/landing/LandingNav.vue b/resources/js/components/landing/LandingNav.vue new file mode 100644 index 0000000..74d81eb --- /dev/null +++ b/resources/js/components/landing/LandingNav.vue @@ -0,0 +1,46 @@ + + + diff --git a/resources/js/components/landing/LiveTicker.vue b/resources/js/components/landing/LiveTicker.vue new file mode 100644 index 0000000..0eb73b0 --- /dev/null +++ b/resources/js/components/landing/LiveTicker.vue @@ -0,0 +1,45 @@ + + + diff --git a/resources/js/components/landing/StatsRow.vue b/resources/js/components/landing/StatsRow.vue new file mode 100644 index 0000000..3a00cd8 --- /dev/null +++ b/resources/js/components/landing/StatsRow.vue @@ -0,0 +1,28 @@ + + + diff --git a/resources/js/components/landing/VerdictCard.vue b/resources/js/components/landing/VerdictCard.vue new file mode 100644 index 0000000..33dc83e --- /dev/null +++ b/resources/js/components/landing/VerdictCard.vue @@ -0,0 +1,73 @@ + + + diff --git a/resources/js/views/Home.vue b/resources/js/views/Home.vue index abd5fce..1f19fae 100644 --- a/resources/js/views/Home.vue +++ b/resources/js/views/Home.vue @@ -1,98 +1,31 @@