feat: apply Funktechnik Schubert branding

This commit is contained in:
Schubert Ferenc 2026-07-03 21:08:04 +02:00
parent 9a648e2ec8
commit 99e8201745
17 changed files with 335 additions and 104 deletions

View file

@ -10,10 +10,11 @@ export async function POST(request: Request) {
const email = form.get("email");
const manufacturer = form.get("manufacturer");
const model = form.get("model");
const deviceType = form.get("deviceType");
const description = form.get("description");
const privacy = form.get("privacy");
if (!required(name) || !required(email) || !required(manufacturer) || !required(model) || !required(description) || privacy !== "on") {
if (!required(name) || !required(email) || !required(manufacturer) || !required(model) || !required(deviceType) || !required(description) || privacy !== "on") {
return NextResponse.json({ message: "Bitte füllen Sie alle Pflichtfelder aus." }, { status: 400 });
}
@ -24,8 +25,10 @@ export async function POST(request: Request) {
hasIntakeIntegration: Boolean(intakeUrl && hasIntegrationToken),
manufacturer: String(manufacturer),
model: String(model),
deviceType: String(deviceType),
hasPhone: required(form.get("phone")),
hasSerialNumber: required(form.get("serialNumber")),
hasAccessories: required(form.get("accessories")),
});
return NextResponse.json({

View file

@ -9,7 +9,7 @@ export default function RadioServicePage() {
return (
<>
<PageHero eyebrow="Funkgeräte-Service" title="Prüfung, Diagnose und Abgleich">
Funkgeräte zeigen Fehler oft erst im Zusammenspiel von Empfang, Sendeteil, Versorgung, Antennenanpassung und Bedienung. Der Service betrachtet diese Zusammenhänge strukturiert.
Funkgeräte zeigen Fehler oft erst im Zusammenspiel von Empfang, Sendeteil, Versorgung, Antennenanpassung, Bedienung und Abgleich. Der Service betrachtet diese Zusammenhänge strukturiert.
</PageHero>
<section className="section">
<div className="container split">
@ -19,13 +19,14 @@ export default function RadioServicePage() {
<li>Kein oder schwacher Empfang</li>
<li>Keine, leise oder verzerrte Modulation</li>
<li>Frequenzversatz, PLL-Rasten oder instabile Kanäle</li>
<li>Aussetzer durch Stromversorgung, Buchsen oder Bedienelemente</li>
<li>Unklare Vorarbeiten oder verbastelte Geräte</li>
<li>Sendeprobleme, schwankende Leistung oder auffällige Erwärmung</li>
<li>Audio-/NF-Probleme, Displayfehler oder Aussetzer durch Bedienelemente</li>
<li>Unklare Vorarbeiten, fehlende Serviceunterlagen oder bereits geöffnete Geräte</li>
</ul>
</div>
<div className="panel">
<h2>Serviceablauf</h2>
<p className="lead">Eine gute Reparatur beginnt mit vollständigen Angaben zu Gerät, Fehlerbild und Vorgeschichte. Danach folgt eine technische Einschätzung und die weitere Abstimmung.</p>
<h2>Messung und Einordnung</h2>
<p className="lead">Eine gute Reparatur beginnt mit vollständigen Angaben zu Gerät, Fehlerbild und Vorgeschichte. Danach folgen technische Einschätzung, Prüfung mit geeigneter Messtechnik und die weitere Abstimmung.</p>
<Link className="button" href="/reparatur">Reparatur anfragen</Link>
</div>
</div>

View file

@ -1,15 +1,16 @@
:root {
--bg: #f6f8fb;
--bg: #f4f6f8;
--surface: #ffffff;
--ink: #101827;
--muted: #5b677a;
--line: #d9e1ec;
--navy: #0b1728;
--navy-2: #13243a;
--cyan: #16b6d9;
--ink: #101722;
--muted: #566270;
--line: #d9dee6;
--navy: #082a60;
--navy-2: #0e3a78;
--steel: #666d76;
--cyan: #1e9fb8;
--orange: #f28c28;
--radius: 8px;
--shadow: 0 20px 50px rgba(10, 23, 40, 0.12);
--shadow: 0 18px 44px rgba(8, 42, 96, 0.12);
}
* {
@ -49,77 +50,102 @@ textarea {
position: sticky;
top: 0;
z-index: 20;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(11, 23, 40, 0.96);
color: #fff;
backdrop-filter: blur(14px);
border-bottom: 1px solid rgba(8, 42, 96, 0.12);
background: rgba(255, 255, 255, 0.96);
color: var(--ink);
box-shadow: 0 8px 24px rgba(8, 42, 96, 0.06);
backdrop-filter: blur(12px);
}
.header-inner {
display: flex;
min-height: 72px;
min-height: 78px;
align-items: center;
justify-content: space-between;
gap: 24px;
gap: 18px;
}
.brand {
display: inline-flex;
align-items: center;
gap: 12px;
font-weight: 800;
flex: 0 0 auto;
}
.brand-mark {
display: grid;
width: 38px;
height: 38px;
place-items: center;
border: 1px solid rgba(22, 182, 217, 0.45);
border-radius: 8px;
background: linear-gradient(135deg, rgba(22, 182, 217, 0.22), rgba(242, 140, 40, 0.18));
}
.brand-mark::before {
width: 16px;
height: 16px;
border: 3px solid var(--cyan);
border-left-color: transparent;
border-radius: 999px;
content: "";
.brand-logo {
width: 286px;
height: 68px;
object-fit: cover;
object-position: center;
display: block;
}
.nav {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
justify-content: center;
flex: 1 1 auto;
gap: 6px;
}
.nav a {
border-radius: 8px;
padding: 9px 11px;
color: rgba(255, 255, 255, 0.82);
color: var(--muted);
font-size: 14px;
font-weight: 700;
}
.nav a:hover {
background: rgba(255, 255, 255, 0.08);
background: rgba(8, 42, 96, 0.07);
color: var(--navy);
}
.nav a[aria-current="page"] {
background: rgba(8, 42, 96, 0.1);
color: var(--navy);
}
.header-cta {
display: inline-flex;
min-height: 40px;
align-items: center;
justify-content: center;
border-radius: 8px;
background: var(--navy);
color: #fff;
font-size: 14px;
font-weight: 800;
padding: 0 14px;
white-space: nowrap;
}
.header-cta:hover {
background: var(--navy-2);
}
.menu-toggle {
display: none;
min-height: 40px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
color: var(--navy);
font-weight: 800;
padding: 0 12px;
}
.hero {
position: relative;
overflow: hidden;
min-height: calc(100vh - 72px);
min-height: calc(100vh - 78px);
display: grid;
align-items: center;
color: #fff;
background:
linear-gradient(90deg, rgba(8, 18, 32, 0.94), rgba(8, 18, 32, 0.72), rgba(8, 18, 32, 0.58)),
linear-gradient(90deg, rgba(6, 24, 52, 0.96), rgba(8, 42, 96, 0.78), rgba(8, 42, 96, 0.58)),
url("/workbench-signal.svg"),
linear-gradient(135deg, #0b1728, #17324e);
linear-gradient(135deg, #07172d, #0b3778);
background-position: center;
background-size: cover;
}
@ -174,6 +200,30 @@ h3 {
font-size: 21px;
}
.hero-copy {
max-width: 720px;
color: rgba(255, 255, 255, 0.78);
font-size: 17px;
line-height: 1.65;
}
.hero-badges {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 24px;
}
.hero-badges span {
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 999px;
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.86);
font-size: 13px;
font-weight: 800;
padding: 7px 10px;
}
.hero-actions,
.actions {
display: flex;
@ -190,21 +240,29 @@ h3 {
border: 1px solid transparent;
border-radius: 8px;
padding: 0 18px;
background: var(--cyan);
color: #06111d;
background: var(--navy);
color: #fff;
font-weight: 800;
}
.button:hover {
background: var(--navy-2);
}
.button.secondary {
border-color: rgba(255, 255, 255, 0.22);
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.36);
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
.button.light {
border-color: var(--line);
border-color: var(--navy);
background: #fff;
color: var(--ink);
color: var(--navy);
}
.button.light:hover {
background: #eef3f8;
}
.section {
@ -244,12 +302,26 @@ h3 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.service-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.card {
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--surface);
padding: 24px;
box-shadow: 0 8px 26px rgba(12, 28, 48, 0.05);
box-shadow: 0 10px 26px rgba(8, 42, 96, 0.06);
}
.card h3::before {
display: block;
width: 34px;
height: 3px;
margin-bottom: 14px;
border-radius: 999px;
background: var(--orange);
content: "";
}
.dark .card {
@ -366,6 +438,20 @@ h3 {
color: #fff;
}
.footer-logo {
display: block;
width: 220px;
height: 52px;
margin-bottom: 14px;
object-fit: cover;
object-position: center;
}
.copyright {
color: rgba(255, 255, 255, 0.58);
font-size: 14px;
}
.legal {
max-width: 860px;
}
@ -375,16 +461,71 @@ h3 {
font-size: 26px;
}
@media (max-width: 860px) {
.header-inner,
.nav {
justify-content: flex-start;
@media (max-width: 1080px) and (min-width: 861px) {
.brand-logo {
width: 236px;
height: 56px;
}
.header-inner {
gap: 12px;
}
.nav a {
padding: 8px;
font-size: 13px;
}
.header-cta {
padding: 0 12px;
}
}
@media (max-width: 860px) {
.header-inner {
min-height: 68px;
flex-wrap: wrap;
gap: 10px;
padding: 10px 0;
}
.brand {
min-width: 0;
}
.brand-logo {
width: 194px;
height: 46px;
}
.menu-toggle {
display: inline-flex;
align-items: center;
margin-left: auto;
}
.header-cta {
min-height: 38px;
order: 3;
width: 100%;
}
.nav {
display: none;
order: 4;
width: 100%;
flex-direction: column;
align-items: flex-start;
padding: 14px 0;
align-items: stretch;
border-top: 1px solid var(--line);
padding-top: 10px;
}
.nav.is-open {
display: flex;
}
.nav a {
padding: 11px 12px;
}
.hero {
@ -397,6 +538,7 @@ h3 {
.grid.three,
.grid.two,
.service-grid,
.split,
.footer-grid {
grid-template-columns: 1fr;

View file

@ -6,7 +6,7 @@ import { createMetadata } from "./seo";
export const metadata: Metadata = createMetadata(
"Funktechnik Schubert",
"Service, Reparatur und technische Unterstützung für Funkgeräte und Kommunikationstechnik.",
"Service, Reparatur, Diagnose und Abgleich von Funktechnik, CB-Funk, Amateurfunk und Kommunikationstechnik.",
);
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {

View file

@ -6,25 +6,21 @@ import { createMetadata } from "../seo";
export const metadata: Metadata = createMetadata("Leistungen", "Funkgeräte-Service, Diagnose, Abgleich und Dokumentation für Kommunikationstechnik.", "/leistungen");
const services = [
["Funkgeräte-Service", "Prüfung, Wartung und technische Beurteilung von Funkgeräten mit Fokus auf nachvollziehbare Fehlerbilder."],
["CB-Funk", "Service für klassische und moderne CB-Funkgeräte, inklusive Empfangs-, Sende- und Modulationsproblemen."],
["Amateurfunk", "Unterstützung bei ausgewählter Amateurfunktechnik, Abgleichfragen und gerätespezifischen Fehlern."],
["Betriebsfunk", "Technische Einschätzung und Prüfung von betriebsnaher Kommunikationstechnik im Rahmen der Werkstattmöglichkeiten."],
["Fehlersuche", "Strukturierte Diagnose bei Aussetzern, Störungen, instabiler Versorgung oder auffälligem Verhalten."],
["Modulationsprobleme", "Analyse von leiser, verzerrter oder fehlender Modulation sowie Prüfung relevanter Baugruppen."],
["PLL-/Frequenzprobleme", "Prüfung von Frequenzstabilität, Rastung, Synthesizer- und Referenzproblemen."],
["Abgleich und Prüfung", "Sorgfältiger Abgleich nach technischen Unterlagen und dokumentierte Funktionsprüfung."],
["Dokumentation", "Einbindung von Serviceunterlagen, Schaltplänen und Reparaturhinweisen in den Prüfprozess."],
["Funkgeräte-Service", "Service für CB-Funk, Amateurfunk, Betriebsfunk sowie ältere und moderne Funkgeräte. Dazu gehören Sichtprüfung, Funktionsprüfung und eine technische Einschätzung des Gerätezustands."],
["Fehlersuche & Reparatur", "Strukturierte Analyse bei fehlender Modulation, Frequenzabweichung, PLL-Problemen, Empfangs- oder Sendeproblemen, Audio-/NF-Fehlern und Anzeige- oder Displayfehlern."],
["Abgleich & Prüfung", "Frequenzabgleich, Hub- und Modulationsprüfung, Sendeleistung, Empfindlichkeit und Funktionsprüfung nach technischen Unterlagen und sinnvoller Werkstattpraxis."],
["Messtechnik & Diagnose", "Systematische Fehlersuche mit geeigneter Messtechnik wie Oszilloskop, Frequenzzähler, Signalgenerator, RF-Messung und Modulationsmessung."],
["Serviceunterlagen", "Sorgfältige Einordnung von Schaltplänen, Service Manuals, Abgleichanleitungen, Dokumentation und Reparaturhinweisen für nachvollziehbare Arbeitsschritte."],
] as const;
export default function ServicesPage() {
return (
<>
<PageHero eyebrow="Leistungen" title="Service für Funkgeräte und Kommunikationstechnik">
Technische Unterstützung für Geräte, bei denen Diagnose, Erfahrung und saubere Dokumentation zählen.
Technische Unterstützung für Geräte, bei denen Diagnose, Messtechnik, Erfahrung und saubere Dokumentation zählen.
</PageHero>
<section className="section">
<div className="container grid three">
<div className="container grid service-grid">
{services.map(([title, text]) => <ServiceCard key={title} title={title}>{text}</ServiceCard>)}
</div>
</section>

View file

@ -6,9 +6,18 @@ export default function HomePage() {
<>
<section className="hero">
<div className="container hero-content">
<p className="eyebrow">Funktechnik, Elektronikservice, Werkstatt</p>
<p className="eyebrow">Funktechnik, Messtechnik, Werkstattservice</p>
<h1>Funktechnik Schubert</h1>
<p className="lead">Service, Reparatur und technische Unterstützung für Funkgeräte und Kommunikationstechnik.</p>
<p className="lead">Service, Reparatur und Diagnose für Funkgeräte, Messtechnik und Kommunikationstechnik.</p>
<p className="hero-copy">Von CB-Funk und Amateurfunk bis zur professionellen Funktechnik: Wir unterstützen bei Fehlersuche, Abgleich, Modulationsproblemen, Frequenzproblemen und technischer Dokumentation.</p>
<div className="hero-badges" aria-label="Technische Schwerpunkte">
<span>CB-Funk</span>
<span>Amateurfunk</span>
<span>Messtechnik</span>
<span>Abgleich</span>
<span>Diagnose</span>
<span>Service Manuals</span>
</div>
<div className="hero-actions">
<Link className="button" href="/reparatur">Reparatur anfragen</Link>
<Link className="button secondary" href="/leistungen">Leistungen ansehen</Link>
@ -20,13 +29,13 @@ export default function HomePage() {
<div className="container">
<div className="section-head">
<p className="eyebrow">Leistungsbereiche</p>
<h2>Technischer Service mit sauberer Diagnose</h2>
<p className="lead">Von der ersten Fehlerbeschreibung bis zur dokumentierten Prüfung: Funktechnik Schubert verbindet Werkstatterfahrung mit strukturierter Kommunikation.</p>
<h2>Werkstattservice für Funktechnik und Messtechnik</h2>
<p className="lead">Von der ersten Fehlerbeschreibung bis zur dokumentierten Prüfung: Funktechnik Schubert verbindet technische Erfahrung, geeignete Messmittel und strukturierte Kommunikation.</p>
</div>
<div className="grid three">
<ServiceCard title="Funkgeräte-Service">Prüfung, Abgleich und Service für CB-Funk, Amateurfunk und ausgewählte Kommunikationstechnik.</ServiceCard>
<ServiceCard title="Reparatur & Diagnose">Systematische Fehlersuche bei Empfang, Modulation, PLL, Frequenzstabilität und Stromversorgung.</ServiceCard>
<ServiceCard title="Serviceunterlagen">Sorgfältiger Umgang mit Schaltplänen, Service Manuals und gerätespezifischen Dokumentationen.</ServiceCard>
<ServiceCard title="Funkgeräte-Service">Sichtprüfung, Funktionsprüfung und technische Beurteilung für CB-Funk, Amateurfunk, Betriebsfunk sowie ältere und moderne Geräte.</ServiceCard>
<ServiceCard title="Fehlersuche & Reparatur">Systematische Diagnose bei Empfangsproblemen, Sendeproblemen, PLL-Fehlern, Frequenzabweichungen und Audio-/NF-Störungen.</ServiceCard>
<ServiceCard title="Abgleich & Messtechnik">Frequenzabgleich, Hub- und Modulationsprüfung, Sendeleistung, Empfindlichkeit und RF-Messung mit geeigneter Messtechnik.</ServiceCard>
</div>
</div>
</section>
@ -36,7 +45,7 @@ export default function HomePage() {
<div>
<p className="eyebrow">Persönlicher Support</p>
<h2>Direkte technische Einschätzung statt anonymer Abwicklung</h2>
<p className="lead">Viele Fehlerbilder lassen sich bereits mit einer klaren Beschreibung eingrenzen. Die Reparaturannahme fragt deshalb die wichtigsten technischen Details strukturiert ab.</p>
<p className="lead">Viele Fehlerbilder lassen sich bereits mit einer klaren Beschreibung und den richtigen Gerätedaten eingrenzen. Die Reparaturannahme fragt deshalb die wichtigsten technischen Details strukturiert ab.</p>
<div className="actions">
<Link className="button" href="/reparatur">Reparaturformular öffnen</Link>
</div>
@ -45,9 +54,9 @@ export default function HomePage() {
<h3>Warum Funktechnik Schubert?</h3>
<ul className="list">
<li>Technischer Fokus auf Funkgeräte und Kommunikationstechnik</li>
<li>Nachvollziehbare Diagnose statt pauschaler Austauschlogik</li>
<li>Klare Rückmeldung zu Aufwand, Zustand und nächsten Schritten</li>
<li>Vorbereitung für strukturierte Service- und Dokumentationsprozesse</li>
<li>Nachvollziehbare Diagnose mit Blick auf Messwerte und Fehlerbild</li>
<li>Sauberer Umgang mit Service Manuals, Schaltplänen und Abgleichanleitungen</li>
<li>Klare Rückmeldung zu Zustand, Aufwand und sinnvollen nächsten Schritten</li>
</ul>
</div>
</div>

View file

@ -9,18 +9,19 @@ export default function RepairPage() {
return (
<>
<PageHero eyebrow="Reparaturannahme" title="Reparatur anfragen">
Beschreiben Sie Gerät, Fehlerbild und bisherige Vorarbeiten. Die Anfrage wird strukturiert erfasst und für eine spätere technische Übergabe vorbereitet.
Beschreiben Sie Gerät, Fehlerbild, Zubehör und bisherige Vorarbeiten. Die Anfrage wird strukturiert erfasst und für eine spätere technische Bearbeitung vorbereitet.
</PageHero>
<section className="section">
<div className="container split">
<div>
<h2>Vor der Einsendung</h2>
<p className="lead">Bitte senden Sie Geräte erst nach Rückmeldung ein. Eine klare Fehlerbeschreibung hilft, den Aufwand besser einzuschätzen.</p>
<p className="lead">Bitte senden Sie Geräte erst nach Rückmeldung ein. Vollständige Gerätedaten und eine präzise Fehlerbeschreibung helfen, den Aufwand besser einzuschätzen.</p>
<ul className="list">
<li>Hersteller, Modell und Seriennummer bereithalten</li>
<li>Fehler möglichst reproduzierbar beschreiben</li>
<li>Vorarbeiten und geöffnete Geräte ehrlich angeben</li>
<li>Zubehör nur nach Absprache mitsenden</li>
<li>Hersteller, Modell, Geräteart und Seriennummer bereithalten, soweit vorhanden</li>
<li>Fehler möglichst konkret beschreiben: Empfang, Sendung, Modulation, Frequenz, Anzeige oder Versorgung</li>
<li>Zubehör wie Netzteil, Mikrofon, Antennenadapter oder Kabel angeben</li>
<li>Bereits geöffnete Geräte und durchgeführte Arbeiten ehrlich nennen</li>
<li>Fotos können später nach Rückmeldung ergänzt werden</li>
</ul>
</div>
<div className="panel">

View file

@ -1,15 +1,22 @@
import type { Metadata } from "next";
const siteName = "Funktechnik Schubert";
const defaultTitle = "Funktechnik Schubert | Funkgeräte-Service & Messtechnik";
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3010";
const keywords = [
"Funktechnik Schubert",
"Funkgeräte Reparatur",
"CB Funk Service",
"Amateurfunk Reparatur",
"Amateurfunk Service",
"Funkgeräte Abgleich",
"Funkgeräte Diagnose",
"Messtechnik",
"Funktechnik Service",
"Kommunikationstechnik",
"Service Manual",
"Schaltplan",
"Funkwerkstatt",
"Reparaturannahme",
];
export function createMetadata(title: string, description: string, path = "/"): Metadata {
@ -17,9 +24,19 @@ export function createMetadata(title: string, description: string, path = "/"):
const fullTitle = title === siteName ? title : `${title} | ${siteName}`;
return {
title: fullTitle,
metadataBase: new URL(siteUrl),
title: title === siteName ? { default: defaultTitle, template: `%s | ${siteName}` } : fullTitle,
applicationName: siteName,
description,
keywords,
icons: {
icon: [
{ url: "/favicon.ico", sizes: "any" },
{ url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" },
{ url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" },
],
apple: [{ url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" }],
},
alternates: {
canonical: url,
},
@ -30,8 +47,16 @@ export function createMetadata(title: string, description: string, path = "/"):
siteName,
title: fullTitle,
description,
images: [
{
url: "/funktechnik_schubert_logo.jpg",
width: 1672,
height: 941,
alt: siteName,
},
],
},
};
}
export { siteName, siteUrl };
export { defaultTitle, siteName, siteUrl };