"use client"; import * as React from "react"; import { View as PDFView, Text as PDFText, StyleSheet, Image as PDFImage, } from "@react-pdf/renderer"; // INDUSTRIAL DESIGN SYSTEM TOKENS export const COLORS = { CHARCOAL: "#0f172a", // Slate 900 TEXT_MAIN: "#334155", // Slate 700 TEXT_DIM: "#64748b", // Slate 500 TEXT_LIGHT: "#94a3b8", // Slate 400 DIVIDER: "#cbd5e1", // Slate 300 GRID: "#f1f5f9", // Slate 100 BLUEPRINT: "#e2e8f0", // Slate 200 WHITE: "#ffffff", }; export const FONT_SIZES = { HERO: 24, // Main Page Titles HEADING: 14, // Section Headers BODY: 11, // Standard Content LABEL: 10, // Bold Labels / Keys SMALL: 9, // Descriptions / Footnotes TINY: 8, // Metadata / Unit prices }; // Mintel Industrial Glyphs (strictly 1px stroke, 12x12px grid) export const IndustrialGlyph = ({ type, color = COLORS.TEXT_LIGHT, size = 12, }: { type: string; color?: string; size?: number; }) => { const stroke = 1; const scale = size / 12; switch (type) { case "base": // Skeletal cube base return ( ); case "pages": // Layered rectangles return ( ); case "modules": // Four small squares grid return ( ); case "logic": // Diamond with center point return ( ); case "interface": // Three horizontal lines of varying length return ( ); case "management": // Framed grid return ( ); case "reveal": // Ascending bars return ( ); case "maintenance": // Circle with vertical notch return ( ); default: return ( ); } }; export const pdfStyles = StyleSheet.create({ page: { paddingTop: 45, // DIN 5008 paddingLeft: 70, // ~25mm paddingRight: 57, // ~20mm paddingBottom: 80, // Safe buffer for absolute footer backgroundColor: COLORS.WHITE, fontFamily: "Helvetica", fontSize: FONT_SIZES.BODY, color: COLORS.CHARCOAL, }, titlePage: { width: "100%", height: "100%", backgroundColor: COLORS.WHITE, fontFamily: "Helvetica", color: COLORS.CHARCOAL, padding: 0, }, header: { flexDirection: "row", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 20, minHeight: 120, }, addressBlock: { width: "55%", marginTop: 45, }, senderLine: { fontSize: FONT_SIZES.TINY, textDecoration: "underline", color: COLORS.TEXT_DIM, marginBottom: 8, }, recipientAddress: { fontSize: FONT_SIZES.BODY, lineHeight: 1.4, }, brandLogoContainer: { width: "40%", alignItems: "flex-end", }, brandIconContainer: { width: 40, height: 40, backgroundColor: "#0f172a", borderRadius: 8, alignItems: "center", justifyContent: "center", marginBottom: 12, }, brandIconText: { color: COLORS.WHITE, fontSize: 20, fontWeight: "bold", }, titleInfo: { marginBottom: 24, }, mainTitle: { fontSize: FONT_SIZES.HEADING, fontWeight: "bold", marginBottom: 4, color: COLORS.CHARCOAL, letterSpacing: 0.5, }, subTitle: { fontSize: FONT_SIZES.BODY, color: COLORS.TEXT_DIM, marginTop: 2, lineHeight: 1.4, }, section: { marginBottom: 32, }, sectionTitle: { fontSize: FONT_SIZES.LABEL, fontWeight: "bold", textTransform: "uppercase", letterSpacing: 1, color: COLORS.TEXT_LIGHT, marginBottom: 8, }, footer: { position: "absolute", bottom: 32, left: 70, right: 57, borderTopWidth: 1, borderTopColor: COLORS.GRID, paddingTop: 16, flexDirection: "row", justifyContent: "space-between", alignItems: "flex-start", }, footerColumn: { flex: 1, alignItems: "flex-start", }, footerLogo: { height: 20, width: "auto", objectFit: "contain", marginBottom: 8, }, footerText: { fontSize: FONT_SIZES.TINY, color: COLORS.TEXT_LIGHT, lineHeight: 1.4, }, asymmetryContainer: { flexDirection: "row", gap: 32, }, asymmetryLeft: { width: "32%", }, asymmetryRight: { width: "63%", }, specRow: { flexDirection: "row", justifyContent: "space-between", paddingVertical: 6, borderBottomWidth: 1, borderBottomColor: COLORS.GRID, }, specLabel: { fontSize: FONT_SIZES.TINY, fontWeight: "bold", color: COLORS.TEXT_LIGHT, textTransform: "uppercase", letterSpacing: 0.5, }, specValue: { fontSize: FONT_SIZES.SMALL, color: COLORS.CHARCOAL, fontWeight: "bold", }, blueprintBox: { borderWidth: 1, borderColor: COLORS.GRID, padding: 16, backgroundColor: "#fafafa", }, footerLabel: { fontWeight: "bold", color: COLORS.TEXT_DIM, }, pageNumber: { fontSize: FONT_SIZES.TINY, color: COLORS.DIVIDER, fontWeight: "bold", marginTop: 8, textAlign: "right", }, foldingMark: { position: "absolute", left: 20, width: 10, borderTopWidth: 0.5, borderTopColor: COLORS.DIVIDER, }, divider: { width: "100%", height: 1, backgroundColor: COLORS.DIVIDER, marginVertical: 12, }, industrialListItem: { flexDirection: "row", alignItems: "flex-start", marginBottom: 6, }, industrialBulletBox: { width: 6, height: 6, backgroundColor: COLORS.DIVIDER, marginRight: 8, marginTop: 5, }, industrialTitle: { fontSize: FONT_SIZES.HERO, fontWeight: "bold", color: COLORS.CHARCOAL, marginBottom: 6, letterSpacing: 0, }, }); export const IndustrialListItem = ({ children, }: { children: React.ReactNode; }) => ( {children} ); export const Divider = ({ style = {} }: { style?: any }) => ( ); export const FoldingMarks = () => ( <> ); export const Footer = ({ logo, companyData, bankData, showDetails = true, showPageNumber = true, }: { logo?: string; companyData: any; bankData?: any; showDetails?: boolean; showPageNumber?: boolean; }) => ( {logo ? ( ) : ( marc mintel )} {showDetails && ( <> {companyData.name} {"\n"} {companyData.address1} {"\n"} {companyData.address2} {"\n"}UST: {companyData.ustId} {showPageNumber && ( `${pageNumber} / ${totalPages}` } fixed /> )} )} {!showDetails && ( {showPageNumber && ( `${pageNumber} / ${totalPages}` } fixed /> )} )} ); export const Header = ({ sender, recipient, icon, showAddress = true, }: { sender?: string; recipient?: { title: string; subtitle?: string; email?: string; address?: string; phone?: string; taxId?: string; }; icon?: string; showAddress?: boolean; }) => ( {showAddress && sender && ( <> {sender} {recipient && ( {recipient.title} {recipient.subtitle && {recipient.subtitle}} {recipient.address && {recipient.address}} {recipient.phone && {recipient.phone}} {recipient.email && {recipient.email}} {recipient.taxId && USt-ID: {recipient.taxId}} )} )} {icon ? ( ) : ( M )} ); export const DocumentTitle = ({ title, subLines, isHero = false, }: { title: string; subLines?: string[]; isHero?: boolean; }) => ( {title} {subLines?.map((line, i) => ( {line} ))} ); export const TechnicalSpec = ({ label, value, }: { label: string; value: string; }) => ( {label} {value} ); export const AsymmetryView = ({ left, right, style = {}, }: { left: React.ReactNode; right: React.ReactNode; style?: any; }) => ( {left} {right} ); export const IndustrialCard = ({ title, children, style = {}, }: { title: string; children: React.ReactNode; style?: any; }) => ( {title} {children} );