feat: redesign page heroes, implement organic markers, and streamline contact flow
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 6s
Build & Deploy / 🧪 QA (push) Failing after 1m24s
Build & Deploy / 🏗️ Build (push) Failing after 4m3s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🩺 Health Check (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 5s

- Refined hero sections for About, Blog, Websites, and Case Studies for a bespoke industrial entry point.
- Redesigned Marker component using layered SVG paths for an organic, hand-drawn highlighter effect.
- Restored technical precision in ArchitectureVisualizer with refined line thickness.
- Streamlined contact page by removing generic headers and prioritizing the configurator/gateway.
- Updated technical references to reflect self-hosted Gitea infrastructure.
- Cleaned up unused imports and addressed linting warnings across modified pages.
This commit is contained in:
2026-02-16 19:34:08 +01:00
parent cb32b9d62f
commit 9cfe7ee9e5
58 changed files with 3231 additions and 1592 deletions

View File

@@ -0,0 +1,129 @@
"use client";
import * as React from "react";
import {
Page as PDFPage,
Document as PDFDocument,
Image as PDFImage,
StyleSheet,
View as PDFView,
Text as PDFText,
} from "@react-pdf/renderer";
import {
FrontPageModule,
SitemapModule,
EstimationModule,
TransparenzModule,
ClosingModule,
SimpleLayout,
pdfStyles,
calculatePositions,
} from "@mintel/pdf";
// Local styles for QR Code overlay
const styles = StyleSheet.create({
qrContainer: {
position: "absolute",
bottom: 40,
right: 40,
width: 60,
height: 60,
alignItems: "center",
justifyContent: "center",
},
qrImage: {
width: "100%",
height: "100%",
},
qrLabel: {
fontSize: 8,
color: "#94a3b8", // slate-400
marginTop: 4,
textAlign: "center",
},
});
interface PDFProps {
state: any;
totalPrice: number;
monthlyPrice?: number;
totalPagesCount?: number;
pricing: any;
headerIcon?: string;
footerLogo?: string;
qrCodeData?: string;
}
export const LocalEstimationPDF = ({
state,
totalPrice,
pricing,
headerIcon,
footerLogo,
qrCodeData,
}: PDFProps) => {
const date = new Date().toLocaleDateString("de-DE", {
year: "numeric",
month: "long",
day: "numeric",
});
const positions = calculatePositions(state, pricing);
const companyData = {
name: "Marc Mintel",
address1: "Georg-Meistermann-Straße 7",
address2: "54586 Schüller",
ustId: "DE367588065",
};
const commonProps = {
state,
date,
icon: headerIcon,
footerLogo,
companyData,
};
let pageCounter = 1;
const getPageNum = () => (pageCounter++).toString().padStart(2, "0");
return (
<PDFDocument title={`Angebot - ${state.companyName || "Projekt"}`}>
<PDFPage size="A4" style={pdfStyles.titlePage}>
<FrontPageModule state={state} headerIcon={headerIcon} date={date} />
{qrCodeData && (
<PDFView style={styles.qrContainer}>
<PDFImage src={qrCodeData} style={styles.qrImage} />
<PDFText style={styles.qrLabel}>Scan me</PDFText>
</PDFView>
)}
</PDFPage>
{/* BriefingModule Page REMOVED as per user request ("die zweite seite ist leer, weg damit") */}
{state.sitemap && state.sitemap.length > 0 && (
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
<SitemapModule state={state} />
</SimpleLayout>
)}
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
<EstimationModule
state={state}
positions={positions}
totalPrice={totalPrice}
date={date}
/>
</SimpleLayout>
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
<TransparenzModule pricing={pricing} />
</SimpleLayout>
<SimpleLayout {...commonProps} pageNumber={getPageNum()}>
<ClosingModule />
</SimpleLayout>
</PDFDocument>
);
};