- 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
29 lines
960 B
Vue
29 lines
960 B
Vue
<template>
|
|
<dl class="hidden md:flex items-center gap-8 divide-x divide-zinc-300">
|
|
<div v-for="(stat, idx) in stats" :key="stat.label" :class="idx === 0 ? '' : 'pl-8'">
|
|
<dt class="sr-only">{{ stat.label }}</dt>
|
|
<dd>
|
|
<span class="block font-serif text-2xl text-zinc-900 leading-none">{{ stat.value }}</span>
|
|
<span class="block font-mono text-[11px] uppercase tracking-widest text-zinc-500 mt-1.5">{{ stat.label }}</span>
|
|
</dd>
|
|
</div>
|
|
</dl>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed } from 'vue'
|
|
|
|
const props = defineProps({
|
|
stationCount: { type: Number, default: null },
|
|
})
|
|
|
|
const stats = computed(() => [
|
|
{
|
|
value: props.stationCount ? props.stationCount.toLocaleString('en-GB') : '11,482',
|
|
label: 'Stations tracked',
|
|
},
|
|
{ value: '£273', label: 'Median saving / yr' },
|
|
{ value: '84%', label: 'Forecast accuracy' },
|
|
])
|
|
</script>
|