bilhej/frontend/src/pages/ContactPage.vue
Joakim Mörling 7a95c1423c
Some checks failed
CI / Lint, type check, unit tests, coverage (pull_request) Successful in 2m22s
CI / E2E browser tests (pull_request) Failing after 1m3s
Make customer-facing UI usable on smartphones.
Mobile traffic was breaking on narrow viewports because the header nav
overflowed and several pages used desktop-only spacing. This adds a
shared phone breakpoint, a hamburger menu, and scroll-to-top on route
changes so footer and menu navigation always land at the top of the page.

- Add --page-gutter and max-width 639px rules in base.css
- AppHeader: hamburger panel on small screens; flat account links on mobile
- AppFooter: stack footer links vertically on phones
- Home, compose, edit order, orders, auth, and legal pages: tighter gutters
  and responsive layout (orders card actions stack; home grids single-column)
- Router scrollBehavior: scroll to top on navigation; restore on browser back
- Tests: AppHeader menu toggle, Router scrollBehavior, mobile Playwright checks

Admin page is intentionally unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 13:03:35 +02:00

238 lines
5.6 KiB
Vue

<script setup lang="ts">
const contactChannels = [
{
variant: 'support',
title: 'Support',
description:
'Beställningar, betalning via Swish, tekniska problem eller frågor om status och spårning.',
email: 'support@bilhej.se',
label: 'Skicka till support',
},
{
variant: 'general',
title: 'Allmän kontakt',
description:
'Övriga frågor om tjänsten, synpunkter som inte är klagomål, eller om du är osäker på vilken adress du ska använda.',
email: 'kontakt@bilhej.se',
label: 'Skicka e-post',
},
{
variant: 'complaints',
title: 'Klagomål',
description:
'Om något gått fel eller du vill lämna ett klagomål direkt till oss som driver tjänsten.',
email: 'klagomal@bilhej.se',
label: 'Skicka klagomål',
},
]
</script>
<template>
<div class="contact">
<section class="contact__hero">
<p class="contact__eyebrow">Kontakt</p>
<h1 class="contact__title">Kontakta oss</h1>
<p class="contact__lead">
Vi svarar snart vi kan. Använd support för beställningar och tekniska
frågor, kontakt för övrigt, eller klagomål-adressen om något gått fel.
</p>
</section>
<section class="contact__section">
<div class="contact__cards">
<article
v-for="channel in contactChannels"
:key="channel.email"
class="contact__card"
:class="`contact__card--${channel.variant}`"
>
<h2>{{ channel.title }}</h2>
<p>{{ channel.description }}</p>
<a
class="contact__mailto"
:href="`mailto:${channel.email}`"
:aria-label="`${channel.label}: ${channel.email}`"
>
{{ channel.email }}
</a>
</article>
</div>
</section>
<section class="contact__section">
<div class="contact__tips">
<h2 class="contact__tips-title">Innan du skriver</h2>
<ul class="contact__tips-list">
<li>
Har du en pågående beställning? Kontrollera
<strong>Mina beställningar</strong> först. Där ser du status och
spårning.
</li>
<li>
Vid klagomål, skriv gärna med beställnings-ID och
registreringsnummer kan vi hitta ärendet snabbare.
</li>
<li>
Vi läser all e-post manuellt och återkommer när vi har tittat
ditt ärende.
</li>
</ul>
</div>
</section>
</div>
</template>
<style scoped>
.contact {
max-width: 48rem;
margin: 0 auto;
padding: clamp(var(--space-xl), 6vw, var(--space-3xl)) var(--page-gutter);
}
.contact__hero {
margin-bottom: var(--space-2xl);
padding: var(--space-2xl);
background: linear-gradient(
145deg,
var(--color-surface) 0%,
#f8faff 55%,
var(--color-paper) 100%
);
border: 1px solid var(--color-border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
}
.contact__eyebrow {
display: inline-block;
margin: 0 0 var(--space-md) 0;
font-size: 0.8125rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--color-primary-dark);
background: var(--color-primary-soft);
border: 1px solid #bfdbfe;
padding: 0.35rem 0.75rem;
border-radius: var(--radius-full);
}
.contact__title {
margin: 0 0 var(--space-md) 0;
font-size: clamp(1.75rem, 4vw, 2.25rem);
font-weight: 800;
letter-spacing: -0.02em;
color: var(--color-ink);
}
.contact__lead {
margin: 0;
font-size: 1.0625rem;
line-height: 1.75;
color: var(--color-muted);
}
.contact__section {
margin-bottom: var(--space-2xl);
}
.contact__cards {
display: grid;
gap: var(--space-lg);
}
.contact__card {
position: relative;
overflow: hidden;
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-xl);
padding: var(--space-xl);
box-shadow: var(--shadow-card);
}
.contact__card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: var(--contact-accent);
}
.contact__card--support {
--contact-accent: linear-gradient(90deg, #0f766e, #2dd4bf);
}
.contact__card--general {
--contact-accent: linear-gradient(90deg, #1d4ed8, #60a5fa);
}
.contact__card--complaints {
--contact-accent: linear-gradient(90deg, #4338ca, #818cf8);
}
.contact__card h2 {
margin: 0 0 var(--space-sm) 0;
font-size: 1.125rem;
color: var(--color-ink);
}
.contact__card p {
margin: 0 0 var(--space-md) 0;
font-size: 0.9375rem;
line-height: 1.65;
color: var(--color-muted);
}
.contact__mailto {
display: inline-flex;
align-items: center;
padding: 0.65rem 1rem;
font-family: var(--font-sans);
font-size: 1rem;
font-weight: 600;
color: var(--color-primary-dark);
background: var(--color-primary-soft);
border: 1px solid #bfdbfe;
border-radius: var(--radius-md);
transition:
background var(--transition-fast),
border-color var(--transition-fast);
}
.contact__mailto:hover {
background: #dbeafe;
border-color: #93c5fd;
color: var(--color-primary-dark);
}
.contact__tips {
padding: var(--space-xl);
background: var(--color-border-light);
border: 1px solid var(--color-border);
border-radius: var(--radius-xl);
}
.contact__tips-title {
margin: 0 0 var(--space-md) 0;
font-size: 1.0625rem;
color: var(--color-ink);
}
.contact__tips-list {
margin: 0;
padding-left: 1.25rem;
color: var(--color-muted);
}
.contact__tips-list li + li {
margin-top: var(--space-sm);
}
.contact__tips-list li {
font-size: 0.9375rem;
line-height: 1.65;
}
</style>