From 139250b2acc8880586059b3c61481105b86da148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20M=C3=B6rling?= Date: Fri, 22 May 2026 12:47:42 +0200 Subject: [PATCH] Redesign homepage with clearer marketing sections and honest copy. - Add structured use-case cards mapped to real letter templates - Replace generic hero with bullets on traceability, anonymity, and timing - Add three-step how-it-works flow with manual posting disclaimer - Reframe trust section around convenience rather than hidden addresses - Refresh layout with gradient heroes, icons, and consistent section styling Co-authored-by: Cursor --- frontend/src/pages/HomePage.vue | 1126 +++++++++++++++++++++++++++---- 1 file changed, 988 insertions(+), 138 deletions(-) diff --git a/frontend/src/pages/HomePage.vue b/frontend/src/pages/HomePage.vue index 552d02b..8992fc3 100644 --- a/frontend/src/pages/HomePage.vue +++ b/frontend/src/pages/HomePage.vue @@ -6,6 +6,96 @@ import VehicleInfo from '@/components/VehicleInfo.vue' import type { VehicleInfo as VehicleData } from '@/components/VehicleInfo.vue' import { lookupVehicle } from '@/api/vehicles' +const useCases = [ + { + variant: 'buy', + title: 'Vill köpa bilen', + description: + 'Lämna ett vänligt bud eller dina kontaktuppgifter om du är intresserad av att köpa bilen, utan att stå kvar på parkeringen och vänta.', + templateName: 'Köpförfrågan', + }, + { + variant: 'praise', + title: 'Vill säga något fint', + description: + 'Beröm någon som uppenbarligen tar hand om sin bil. Ett oväntat brev som ofta uppskattas mer än man tror.', + templateName: 'Komplimang', + }, + { + variant: 'tip', + title: 'Vill tipsa om något', + description: + 'Säg till om trasig baklykta, slitna däck eller annat du märkt som ägaren kanske inte sett själv.', + templateName: 'Tips / servicebehov', + }, + { + variant: 'driving', + title: 'Reagerade på körbeteende', + description: + 'Om något i trafiken upprörde dig kan du nå föraren med ett sakligt och respektfullt meddelande, utan att eskalera på plats.', + templateName: 'Körbeteende', + }, + { + variant: 'frustration', + title: 'Efter tuta eller irritation', + description: + 'När det hettade till i trafiken kan ett lugnt brev vara bättre än att tuta eller gestikulera. Mallen hjälper dig att formulera det neutralt.', + templateName: 'Tuta / frustration', + }, + { + variant: 'damage', + title: 'Orsakat en parkeringsskada', + description: + 'Om du råkat skada bilen när du parkerade kan du be om ursäkt och lämna dina uppgifter så ni kan lösa det tillsammans.', + templateName: 'Mindre parkeringsskada', + }, +] as const + +const steps = [ + { + number: 1, + variant: 'lookup', + title: 'Verifiera registreringsnumret', + description: + 'Ange nummerplåten och kontrollera att märke och modell stämmer. Vi använder uppgifterna för att hitta rätt mottagare.', + }, + { + number: 2, + variant: 'compose', + title: 'Skriv, granska och betala', + description: + 'Välj en mall eller skriv fritt, justera texten och betala 49 kr via Swish. Du ser hela brevet innan det skickas.', + }, + { + number: 3, + variant: 'send', + title: 'Vi postar brevet', + description: + 'Efter betalning tar vi hand om utskick manuellt. Brevet postas vanligtvis inom några vardagar. I Mina beställningar ser du status och får spårningsnummer när det skickats.', + }, +] as const + +const trustPoints = [ + { + variant: 'privacy', + title: 'Anonymt om du vill', + description: + 'Du når bilägaren utan att automatiskt lämna ut namn, telefon eller adress. Vill du att de ska kunna svara lägger du till det i brevet.', + }, + { + variant: 'convenience', + title: 'Registreringsnummer räcker', + description: + 'Du behöver inte veta vem som äger bilen eller var personen bor. Skriv brevet här så sköter vi utskicket.', + }, + { + variant: 'letter', + title: 'Fysiskt brev med spårning', + description: + 'Meddelandet skickas som riktigt brev med posten, inte som SMS eller mejl. När brevet skickats kan du följa det med spårningsnummer.', + }, +] as const + const plate = ref('') const vehicle = ref(null) const notFound = ref(false) @@ -35,16 +125,74 @@ async function handleLookup(lookedUpPlate: string) {