diff --git a/data/pages/de/agbs.mdx b/data/pages/de/agbs.mdx index 764c9752..a4f50396 100644 --- a/data/pages/de/agbs.mdx +++ b/data/pages/de/agbs.mdx @@ -5,7 +5,7 @@ featuredImage: null locale: de --- -*Stand November 2024* +*Stand Januar 2026* ## 1. Allgemeines @@ -21,13 +21,12 @@ Sofern nicht ausdrücklich als bindend bezeichnet, sind unsere Angebote freiblei ## 3. Preise -Alle von uns genannten Preise verstehen sich zzgl. der jeweiligen gesetzlichen Mehrwertsteuer vor Metallzuschlag fracht- frei innerhalb der Bundesrepublik Deutschland (Festland), jedoch ohne Abladen. Die Verkaufspreise, soweit sie als Hohlpreis deklariert sind, enthalten keinerlei Metallwerte. Diese werden zusätzlich separat berechnet. +Die Preise gelten für den in unseren Angeboten und Auftragsbestätigungen aufgeführten Leistungs- und Lieferumfang. Mehrleistungen werden gesondert berechnet. Die Hohlpreise verstehen sich in Euro zuzüglich Metallzuschlag, gegebenenfalls Verpackung, auftragsspezifischer Schnittkosten und der gesetzlichen Mehrwertsteuer. ## 4. Metallnotierung -Basis zur Kupferabrechnung ist die Notierung "LME Copper official price cash offer", Durchschnitt des Liefervormonats zuzüglich der dann aktuellen von uns benannten Kupfer-Prämie. - -Basis zur Aluminiumabrechnung ist die Notierung "LME Aluminium official price cash offer", Durchschnitt des Liefervormonats zuzüglich der dann von uns benannten Aluminium-Prämie. USD werden auf Basis des EUR/USD LME-FX-Rate (MTLE) in EUR umgerechnet. Die entsprechenden Notierungen können Sie der Web-Seite [www.westmetall.com](https://www.westmetall.com) entnehmen. Die Prämienzuschläge können stark variieren und KLZ behält sich das Recht vor, diese fristgerecht anzupassen, ungeachtet der Angebotslegung. +Basis zur Kupferabrechnung ist die Notierung „LME Copper official price cash offer“, Durchschnitt des Liefervormonats zuzüglich der dann aktuellen von uns benannten Kupfer-Prämie. +Basis zur Aluminiumabrechnung ist die Notierung „LME Aluminium official price cash offer“, Durchschnitt des Liefervormonats zuzüglich der dann von uns benannten Aluminium-Prämie. USD werden auf Basis des EUR/USD LME-FX-Rate (MTLE) in EUR umgerechnet. Die entsprechenden Notierungen können Sie der Web-Seite [www.westmetall.com](https://www.westmetall.com) entnehmen. Die Prämienzuschläge können stark variieren und KLZ behält sich das Recht vor, diese fristgerecht anzupassen, ungeachtet der Angebotslegung. ## 5. Metallzahl @@ -43,7 +42,7 @@ Wir behalten uns an den von uns gelieferten Waren – nachfolgend: Vorbehaltswar ## 8. Zahlungsbedingungen | Aufrechnung | Zurückbehaltungsrechte -Unsere Rechnungen sind 14 Tage nach Rechnungsdatum ohne jeden Abzug zahlbar. Bei Nichteinhaltung der vereinbarten Zahlungsbedingungen sind wir berechtigt, Zinsen in Höhe von 7 %-Punkten über dem Basiszinssatz zu berechnen; das Recht zur Geltendmachung weitergehender Schäden, insbesondere nachgewiesener höherer Zinsen, bleibt hiervon unberührt. +Unsere Rechnungen sind 10 Tage nach Rechnungsdatum ohne jeden Abzug zahlbar. Rechnungsstellung bzw. Datum ist grundsätzlich der Tag der Übergabe an den Spediteur soweit wir aus unseren deutschen Lägern liefern. Ansonsten gilt bei Direktimporten der Tag der Verzollung, der zeitnah zum Anliefertag liegt. Bei Nichteinhaltung der vereinbarten Zahlungsbedingungen sind wir berechtigt, Zinsen in Höhe von 7 %-Punkten über dem Basiszinssatz zu berechnen; das Recht zur Geltendmachung weitergehender Schäden, insbesondere nachgewiesener höherer Zinsen, bleibt hiervon unberührt. ## 9. Liefervorbehalt | Teillieferungen @@ -69,13 +68,13 @@ Wird uns ein Abrufauftrag erteilt und werden über die Abruftermine keine gesond ## 12. Maß- und Gewichtsangaben -Alle Angaben über Durchmesser, Gewicht, technische Gestaltung, Herstellung und Umfang der von uns zu liefernden Ware stehen unter dem Vorbehalt der Abweichung innerhalb der handelsüblichen zulässigen Toleranzen. Darüber hinaus behalten wir uns Änderungen, die einer technischen Verbesserung dienen, jederzeit vor. Farbabweichungen und/oder Abweichungen in der äußeren Beschaffenheit der von uns zu liefernden Ware, die jedoch deren Qualität und technische Wirksamkeit unbeeinflusst lassen, begründen keine Mängelhaftungsansprüche des Bestellers. +Alle Angaben über Durchmesser, Gewicht, technische Gestaltung, Herstellung und Umfang der von uns zu liefernden Ware stehen unter dem Vorbehalt der Abweichung innerhalb der handelsüblichen zulässigen Toleranzen. Darüber hinaus behalten wir uns Änderungen, die einer technischen Verbesserung dienen, jederzeit vor. Farbabweichungen und/oder Abweichungen in der äußeren Beschaffenheit der von uns zu liefernden Ware, die jedoch deren Qualität und technische Wirksamkeit unbeeinflusst lässt, begründen keine Mängelhaftungsansprüche des Bestellers. ## 13. Gefahrübergang und -tragung Die Lieferung erfolgt DAP frei Bestimmungsort Deutschland, wo auch der Erfüllungsort für die Lieferung und eine etwaige Nacherfüllung ist. -Wird die bestellte Ware von uns versandbereit gestellt und/oder verzögert sich die Versendung und/oder der Abruf aus Gründen, die vom Besteller zu vertreten sind, sind wir berechtigt, Ersatz des hieraus entstehenden Schadens einschließlich Mehraufwendungen zu verlangen. Hierfür berechnen wir eine pauschale Entschädigung i.H.v 2% des Rechnungsbetrages für jeden angefangenen Monat, maximal jedoch 10 % insgesamt beginnend mit der Lieferfrist bzw. – mangels einer Lieferfrist – mit der Mitteilung der Versandbereitschaft der Ware. +Wird die bestellte Ware von uns versandbereit gestellt und/oder verzögert sich die Versendung und/oder der Abruf aus Gründen, die vom Besteller zu vertreten sind, sind wir berechtigt, Ersatz des hieraus entstehenden Schadens einschließlich Mehraufwendungen für Einlagerungen zu verlangen. Hierfür berechnen wir eine pauschale Entschädigung i.H. von 2% des Rechnungsbetrages für jeden angefangenen Monat, maximal jedoch 10 % insgesamt beginnend mit der Lieferfrist bzw. – mangels einer Lieferfrist – mit der Mitteilung der Versandbereitschaft der Ware. Der Nachweis eines höheren Schadens und unsere gesetzlichen Ansprüche (insbesondere Ersatz von Mehraufwendungen, angemessene Entschädigung, Kündigung) bleiben unberührt; die Pauschale ist aber auf weitergehende Geldansprüche anzurechnen. Dem Besteller bleibt der Nachweis gestattet, dass uns überhaupt kein oder nur ein wesentlich geringerer Schaden als vorstehende Pauschale entstanden ist. Rücksendungen an uns, die nicht vorher von uns schriftlich bestätigt worden sind, erfolgen auf alleinige Gefahr des Bestellers. @@ -93,7 +92,9 @@ Weitergehende Ansprüche des Bestellers, gleich aus welchem Rechtsgrund, sind na Die Verjährungsfristen für Mängelhaftungsansprüche beträgt 24 Monate ab Übergabe der Ware. -Sollte es bei einer Mängelrüge zu unterschiedlichen Meinungen bezüglich des Kabelschaden kommen, gilt hier im Zweifelsfall nur die Expertise des VDE-Instituts selbst. Andere, auch akkreditierte Testlabore, akzeptieren wir nicht. Wir weisen ausdrücklich daraufhin, dass beim Verlegen des Kabels in den Graben oder in Rohren, bzw. in Bauwerke eine ständige Sichtkontrolle durch den Kabelverleger vorzunehmen ist, ob Auffälligkeiten zu vermerken sind. Eine spätere Reklamation, die fahrlässiges Verhalten vermuten lässt, schränkt sich damit ein. +Sollte es bei einer Mängelrüge zu unterschiedlichen Meinungen bezüglich des Kabelschaden kommen, gilt hier im Zweifelsfall nur die Expertise des VDE-Instituts selbst. Andere, auch akkreditierte Testlabore, akzeptieren wir nicht. + +Wir weisen ausdrücklich daraufhin, dass beim Verlegen des Kabels in den Gräben oder in Rohren, bzw. in Bauwerke eine ständige Sichtkontrolle durch den Kabelverleger vorzunehmen ist, ob Auffälligkeiten zu vermerken sind. Eine spätere Reklamation, die fahrlässiges Verhalten vermuten lässt, schränkt sich damit ein. Dies gilt auch bei der Annahme der Ware, wo offensichtliche Beschädigungen direkt zu kommunizieren sind. Spätere Ansprüche nach Akzeptanz einer einwandfreien Belieferung sind detailliert zu beweisen. ## 15. Schadenersatz | Gesamthaftung @@ -109,4 +110,6 @@ Es gilt ausschließlich das Recht der Bundesrepublik Deutschland unter Ausschlus Mit der Veröffentlichung der vorliegenden L&Z im Internet werden alle von uns früher verwendeten Bedingungen gegenstandslos. +Remshalden, 28.1.2026 + [Download als PDF](/AGB-KLZ-1-2026.pdf) diff --git a/data/pages/en/terms.mdx b/data/pages/en/terms.mdx index 48020289..41fed081 100644 --- a/data/pages/en/terms.mdx +++ b/data/pages/en/terms.mdx @@ -5,7 +5,7 @@ featuredImage: null locale: en --- -*Status November 2024* +*Status January 2026* ## 1. General @@ -21,7 +21,7 @@ Unless expressly designated as binding, our offers are non-binding; the customer ## 3. Prices -All prices stated by us are understood plus the respective statutory value-added tax, before metal surcharge, freight-free within the Federal Republic of Germany (mainland), however without unloading. The sales prices, insofar as they are declared as hollow prices, contain no metal values whatsoever. These are additionally calculated separately. +The prices apply to the scope of services and deliveries listed in our offers and order confirmations. Additional services will be charged separately. The hollow prices are in Euro plus metal surcharge, if applicable packaging, order-specific cutting costs and the statutory value-added tax. ## 4. Metal quotation @@ -43,7 +43,7 @@ We retain title to the goods delivered by us – hereinafter: reserved goods – ## 8. Payment terms | Offsetting | Right of retention -Our invoices are payable 14 days after invoice date without any deduction. In case of non-compliance with the agreed payment terms, we are entitled to calculate interest at a rate of 7 percentage points above the base interest rate; the right to assert further damages, in particular proven higher interest, remains unaffected by this. +Our invoices are payable 10 days after invoice date without any deduction. Invoicing or date is basically the day of handover to the forwarder as far as we deliver from our German warehouses. Otherwise, in the case of direct imports, the day of customs clearance, which is close to the delivery day, applies. In case of non-compliance with the agreed payment terms, we are entitled to calculate interest at a rate of 7 percentage points above the base interest rate; the right to assert further damages, in particular proven higher interest, remains unaffected by this. ## 9. Delivery reservation | Partial deliveries @@ -69,13 +69,13 @@ If a call-off order is issued to us and no separate written agreements are made ## 12. Dimension and weight specifications -All information about diameter, weight, technical design, manufacture and scope of the goods to be delivered by us are subject to the reservation of deviation within the commercially usual permissible tolerances. Darüber hinaus behalten wir uns Änderungen, die einer technischen Verbesserung dienen, jederzeit vor. Color deviations and/or deviations in the external characteristics of the goods to be delivered by us, which however leave their quality and technical effectiveness unaffected, do not give rise to any claims for defects by the orderer. +All information about diameter, weight, technical design, manufacture and scope of the goods to be delivered by us are subject to the reservation of deviation within the commercially usual permissible tolerances. Furthermore, we reserve the right to make changes that serve technical improvement at any time. Color deviations and/or deviations in the external characteristics of the goods to be delivered by us, which however leave their quality and technical effectiveness unaffected, do not give rise to any claims for defects by the orderer. ## 13. Transfer of risk and burden Delivery is made DAP free destination Germany, where the place of performance for delivery and any subsequent performance is also located. -If the ordered goods are made ready for shipment by us and/or the dispatch and/or the call-off is delayed for reasons for which the orderer is responsible, we are entitled to demand compensation for the damage resulting therefrom including additional expenses. For this, we calculate a flat-rate compensation of 2% of the invoice amount for each month started, however maximum 10% in total, starting with the delivery period or – lacking a delivery period – with the notification of readiness for shipment of the goods. +If the ordered goods are made ready for shipment by us and/or the dispatch and/or the call-off is delayed for reasons for which the orderer is responsible, we are entitled to demand compensation for the damage resulting therefrom including additional expenses for storage. For this, we calculate a flat-rate compensation of 2% of the invoice amount for each month started, however maximum 10% in total, starting with the delivery period or – lacking a delivery period – with the notification of readiness for shipment of the goods. Proof of higher damage and our legal claims (in particular compensation for additional expenses, reasonable compensation, termination) remain unaffected; the flat-rate is however to be credited against further monetary claims. The orderer is permitted to prove that no damage or only a substantially lower damage than the aforementioned flat-rate has arisen for us. Returns to us, which have not been confirmed by us in writing beforehand, are at the sole risk of the orderer. @@ -93,7 +93,9 @@ Further claims of the orderer, regardless of the legal basis, are excluded or li The limitation periods for claims for defects are 24 months from delivery of the goods. -If there are different opinions regarding cable damage in the event of a defect notification, only the expertise of the VDE Institute itself applies in case of doubt. We do not accept other, even accredited test laboratories. We expressly point out that when laying the cable in the trench or in pipes, or in buildings, a constant visual inspection must be carried out by the cable layer to check for any noticeable features. A later complaint that suggests negligent behavior is thus restricted. +If there are different opinions regarding cable damage in the event of a defect notification, only the expertise of the VDE Institute itself applies in case of doubt. We do not accept other, even accredited test laboratories. + +We expressly point out that when laying the cable in the trench or in pipes, or in buildings, a constant visual inspection must be carried out by the cable layer to check for any noticeable features. A later complaint that suggests negligent behavior is thus restricted. This also applies to the acceptance of the goods, where obvious damage must be communicated directly. Subsequent claims after acceptance of a faultless delivery must be proven in detail. ## 15. Damages | Total liability @@ -109,4 +111,6 @@ Only the law of the Federal Republic of Germany applies, excluding the UN Conven With the publication of these DPT on the Internet, all previously used conditions of ours become void. +Remshalden, January 28, 2026 + [Download as PDF](/AGB-KLZ-1-2026.pdf) diff --git a/lib/pdf-datasheet.tsx b/lib/pdf-datasheet.tsx index 13a11e9a..58b43a88 100644 --- a/lib/pdf-datasheet.tsx +++ b/lib/pdf-datasheet.tsx @@ -21,234 +21,149 @@ Font.register({ // Industrial/technical/restrained design - STYLEGUIDE.md compliant const styles = StyleSheet.create({ page: { - // Large margins for engineering documentation feel. - // Extra bottom padding reserves space for the fixed footer so content - // (esp. long descriptions) doesn't render underneath it. - paddingTop: 72, - paddingLeft: 72, - paddingRight: 72, - paddingBottom: 140, + color: '#111827', // Text Primary + lineHeight: 1.5, + backgroundColor: '#FFFFFF', + paddingTop: 0, + paddingBottom: 100, fontFamily: 'Helvetica', - fontSize: 10, - color: '#1F2933', // Dark gray text - lineHeight: 1.5, // Generous line height - backgroundColor: '#F8F9FA', // Almost white background }, - // Engineering documentation header + // Hero-style header + hero: { + backgroundColor: '#FFFFFF', + paddingTop: 24, + paddingBottom: 0, + paddingHorizontal: 72, + marginBottom: 20, + position: 'relative', + borderBottomWidth: 0, + borderBottomColor: '#e5e7eb', + }, + header: { flexDirection: 'row', justifyContent: 'space-between', - alignItems: 'flex-start', - marginBottom: 48, // Large spacing - paddingBottom: 24, - borderBottom: '2px solid #E6E9ED', // Light gray separator - }, - - // Logo area - industrial style - logoArea: { - flexDirection: 'column', - alignItems: 'flex-start', - }, - - // Optional image logo container (keeps header height stable) - logoContainer: { - width: 120, - height: 32, - justifyContent: 'center', - }, - - // Image logo (preferred when available) - logo: { - width: 110, - height: 28, - objectFit: 'contain', + alignItems: 'center', + marginBottom: 16, }, logoText: { - fontSize: 20, + fontSize: 24, fontWeight: 700, - color: '#0E2A47', // Dark navy + color: '#000d26', letterSpacing: 1, textTransform: 'uppercase', }, - logoSubtext: { - fontSize: 10, - fontWeight: 400, - color: '#6B7280', // Medium gray - letterSpacing: 0.5, - marginTop: 2, - }, - - // Document info - technical style - docInfo: { - textAlign: 'right', - alignItems: 'flex-end', - }, - docTitle: { - fontSize: 16, + fontSize: 10, fontWeight: 700, - color: '#0E2A47', // Dark navy - marginBottom: 8, - letterSpacing: 0.5, + color: '#001a4d', + letterSpacing: 2, textTransform: 'uppercase', }, - skuContainer: { - backgroundColor: '#E6E9ED', // Light gray background - paddingHorizontal: 16, - paddingVertical: 8, - border: '1px solid #E6E9ED', + productRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 20, + }, + productInfoCol: { + flex: 1, + justifyContent: 'center', + }, + productImageCol: { + flex: 1, + height: 120, + justifyContent: 'center', + alignItems: 'center', + borderRadius: 8, + borderWidth: 1, + borderColor: '#e5e7eb', + backgroundColor: '#FFFFFF', + overflow: 'hidden', }, - skuLabel: { - fontSize: 8, - color: '#6B7280', // Medium gray - textTransform: 'uppercase', - letterSpacing: 0.5, - marginBottom: 4, - }, - - skuValue: { - fontSize: 14, - fontWeight: 700, - color: '#0E2A47', // Dark navy - }, - - // Product section - technical specification style - productSection: { - marginBottom: 40, - backgroundColor: '#FFFFFF', // White background for content blocks - padding: 24, - border: '1px solid #E6E9ED', + // Product Hero Info + productHero: { + marginTop: 0, }, productName: { fontSize: 24, fontWeight: 700, - color: '#0E2A47', // Dark navy - marginBottom: 12, - lineHeight: 1.2, + color: '#000d26', + marginBottom: 0, textTransform: 'uppercase', - letterSpacing: 0.5, + letterSpacing: -0.5, }, productMeta: { - fontSize: 12, - color: '#6B7280', // Medium gray - fontWeight: 500, + fontSize: 10, + color: '#4b5563', + fontWeight: 700, + textTransform: 'uppercase', + letterSpacing: 1, }, - // Content sections - rectangular blocks + heroImage: { + width: '100%', + height: '100%', + objectFit: 'contain', + }, + + noImage: { + fontSize: 8, + color: '#9ca3af', + textAlign: 'center', + }, + + // Content Area + content: { + paddingHorizontal: 72, + }, + + // Content sections section: { - marginBottom: 32, - backgroundColor: '#FFFFFF', - padding: 24, - border: '1px solid #E6E9ED', + marginBottom: 20, }, sectionTitle: { fontSize: 14, fontWeight: 700, - color: '#0E2A47', // Dark navy - marginBottom: 16, - letterSpacing: 0.5, + color: '#000d26', // Primary Dark + marginBottom: 8, textTransform: 'uppercase', - borderBottom: '1px solid #E6E9ED', - paddingBottom: 8, + letterSpacing: -0.2, + }, + + sectionAccent: { + width: 30, + height: 3, + backgroundColor: '#82ed20', // Accent Green + marginBottom: 8, + borderRadius: 1.5, }, - // Description - technical documentation style description: { - fontSize: 10, - lineHeight: 1.6, - color: '#1F2933', // Dark gray text - marginBottom: 0, + fontSize: 11, + lineHeight: 1.7, + color: '#4b5563', // Text Secondary }, - // Cross-section table - engineering specification style - table: { - marginTop: 16, - borderWidth: 1, - borderColor: '#E6E9ED', - }, - - tableHeader: { - flexDirection: 'row', - backgroundColor: '#E6E9ED', - borderBottomWidth: 1, - borderBottomColor: '#E6E9ED', - }, - - tableHeaderCell: { - flex: 1, - padding: 8, - fontSize: 10, - fontWeight: 700, - color: '#0E2A47', - textTransform: 'uppercase', - letterSpacing: 0.3, - }, - - tableHeaderCellLast: { - borderRightWidth: 0, - }, - - tableHeaderCellWithDivider: { - borderRightWidth: 1, - borderRightColor: '#E6E9ED', - }, - - tableRow: { - flexDirection: 'row', - borderBottomWidth: 1, - borderBottomColor: '#E6E9ED', - }, - - tableCell: { - flex: 1, - padding: 8, - fontSize: 10, - color: '#1F2933', - }, - - tableCellLast: { - borderRightWidth: 0, - }, - - tableCellWithDivider: { - borderRightWidth: 1, - borderRightColor: '#E6E9ED', - }, - - tableRowAlt: { - backgroundColor: '#F8F9FA', - }, - - // Specifications - technical data style - specsContainer: { - flexDirection: 'row', - flexWrap: 'wrap', - }, - - // Backwards-compatible alias used by the component markup - specsGrid: { - flexDirection: 'row', - flexWrap: 'wrap', - }, - - // Technical data table (used for the metagrid) + // Technical data table specsTable: { - borderWidth: 1, - borderColor: '#E6E9ED', + marginTop: 8, + border: '1px solid #e5e7eb', + borderRadius: 8, + overflow: 'hidden', }, specsTableRow: { flexDirection: 'row', borderBottomWidth: 1, - borderBottomColor: '#E6E9ED', + borderBottomColor: '#e5e7eb', }, specsTableRowLast: { @@ -256,63 +171,35 @@ const styles = StyleSheet.create({ }, specsTableLabelCell: { - flex: 3, - paddingVertical: 8, - paddingHorizontal: 8, - backgroundColor: '#F8F9FA', + flex: 1, + paddingVertical: 4, + paddingHorizontal: 16, + backgroundColor: '#f8f9fa', borderRightWidth: 1, - borderRightColor: '#E6E9ED', - justifyContent: 'center', + borderRightColor: '#e5e7eb', }, specsTableValueCell: { - flex: 4, - paddingVertical: 8, - paddingHorizontal: 8, - justifyContent: 'center', + flex: 1, + paddingVertical: 4, + paddingHorizontal: 16, }, specsTableLabelText: { fontSize: 9, fontWeight: 700, - color: '#0E2A47', + color: '#000d26', textTransform: 'uppercase', - letterSpacing: 0.3, - lineHeight: 1.2, + letterSpacing: 0.5, }, specsTableValueText: { fontSize: 10, - color: '#1F2933', - lineHeight: 1.4, + color: '#111827', + fontWeight: 500, }, - specColumn: { - width: '48%', - marginRight: '4%', - marginBottom: 16, - }, - - specItem: { - marginBottom: 12, - }, - - specLabel: { - fontSize: 9, - fontWeight: 700, - color: '#0E2A47', - marginBottom: 4, - textTransform: 'uppercase', - letterSpacing: 0.3, - }, - - specValue: { - fontSize: 10, - color: '#1F2933', - lineHeight: 1.4, - }, - - // Categories - technical classification + // Categories categories: { flexDirection: 'row', flexWrap: 'wrap', @@ -320,42 +207,48 @@ const styles = StyleSheet.create({ }, categoryTag: { - backgroundColor: '#E6E9ED', + backgroundColor: '#f8f9fa', paddingHorizontal: 12, paddingVertical: 6, - border: '1px solid #E6E9ED', + border: '1px solid #e5e7eb', + borderRadius: 100, }, categoryText: { - fontSize: 9, - color: '#6B7280', - fontWeight: 500, + fontSize: 8, + color: '#4b5563', + fontWeight: 700, textTransform: 'uppercase', - letterSpacing: 0.3, + letterSpacing: 0.5, }, - // Engineering documentation footer + // Footer footer: { position: 'absolute', - bottom: 48, + bottom: 40, left: 72, right: 72, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingTop: 24, - borderTop: '2px solid #E6E9ED', - fontSize: 9, - color: '#6B7280', + borderTop: '1px solid #e5e7eb', }, - footerLeft: { + footerText: { + fontSize: 8, + color: '#9ca3af', + fontWeight: 500, + textTransform: 'uppercase', + letterSpacing: 1, + }, + + footerBrand: { + fontSize: 10, fontWeight: 700, - color: '#0E2A47', - }, - - footerRight: { - color: '#6B7280', + color: '#000d26', + textTransform: 'uppercase', + letterSpacing: 1, }, }); @@ -364,6 +257,7 @@ interface ProductData { name: string; shortDescriptionHtml: string; descriptionHtml: string; + applicationHtml?: string; images: string[]; featuredImage: string | null; sku: string; @@ -389,19 +283,19 @@ const stripHtml = (html: string): string => { const getLabels = (locale: 'en' | 'de') => { const labels = { en: { - productDatasheet: 'Product Datasheet', - description: 'Description', - specifications: 'Technical Specifications', - categories: 'Categories', + productDatasheet: 'Technical Datasheet', + description: 'APPLICATION', + specifications: 'TECHNICAL DATA', + categories: 'CATEGORIES', sku: 'SKU', noImage: 'No image available', }, de: { - productDatasheet: 'Produktdatenblatt', - description: 'Beschreibung', - specifications: 'Technische Spezifikationen', - categories: 'Kategorien', - sku: 'Artikelnummer', + productDatasheet: 'Technisches Datenblatt', + description: 'ANWENDUNG', + specifications: 'TECHNISCHE DATEN', + categories: 'KATEGORIEN', + sku: 'ARTIKELNUMMER', noImage: 'Kein Bild verfügbar', }, }; @@ -418,99 +312,101 @@ export const PDFDatasheet: React.FC = ({ return ( - {/* Clean, minimal header */} - - - - {logoUrl ? ( - /* eslint-disable-next-line jsx-a11y/alt-text */ - - ) : ( - - KLZ - Cables + {/* Hero Header */} + + + + KLZ + + + {labels.productDatasheet} + + + + + + + + {product.categories.map((cat, index) => ( + + {cat.name}{index < product.categories.length - 1 ? ' • ' : ''} + + ))} + {product.name} + + + + {product.featuredImage ? ( + + ) : ( + {labels.noImage} )} - - - - {locale === 'en' ? 'Product Datasheet' : 'Produktdatenblatt'} - - - {labels.sku} - {product.sku} - - - {/* Product section - clean and prominent */} - - {product.name} - - {product.categories.map(cat => cat.name).join(' • ')} - + + {/* Description section */} + {(product.applicationHtml || product.shortDescriptionHtml || product.descriptionHtml) && ( + + {labels.description} + + + {stripHtml(product.applicationHtml || product.shortDescriptionHtml || product.descriptionHtml)} + + + )} + + {/* Technical specifications */} + {product.attributes && product.attributes.length > 0 && ( + + {labels.specifications} + + + {product.attributes.map((attr, index) => ( + + + {attr.name} + + + + {attr.options.join(', ')} + + + + ))} + + + )} + + {/* Categories as clean tags */} + {product.categories && product.categories.length > 0 && ( + + {labels.categories} + + + {product.categories.map((cat, index) => ( + + {cat.name} + + ))} + + + )} - {/* Description section */} - {(product.shortDescriptionHtml || product.descriptionHtml) && ( - - {labels.description} - - {stripHtml(product.shortDescriptionHtml || product.descriptionHtml)} - - - )} - - {/* Technical specifications */} - {product.attributes && product.attributes.length > 0 && ( - - {labels.specifications} - - {product.attributes.map((attr, index) => ( - - - {attr.name} - - - - {attr.options.join(', ')} - - - - ))} - - - )} - - {/* Categories as clean tags */} - {product.categories && product.categories.length > 0 && ( - - {labels.categories} - - {product.categories.map((cat, index) => ( - - {cat.name} - - ))} - - - )} - {/* Minimal footer */} - - {labels.sku}: {product.sku} - - + KLZ CABLES + {new Date().toLocaleDateString(locale === 'en' ? 'en-US' : 'de-DE', { year: 'numeric', month: 'long', diff --git a/public/AGB-KLZ-1-2026.pdf b/public/AGB-KLZ-1-2026.pdf index c149e17e..e6984b63 100644 Binary files a/public/AGB-KLZ-1-2026.pdf and b/public/AGB-KLZ-1-2026.pdf differ diff --git a/public/datasheets/h1z2z2-k-de.pdf b/public/datasheets/h1z2z2-k-de.pdf deleted file mode 100644 index e79a5520..00000000 Binary files a/public/datasheets/h1z2z2-k-de.pdf and /dev/null differ diff --git a/public/datasheets/h1z2z2-k-en.pdf b/public/datasheets/h1z2z2-k-en.pdf deleted file mode 100644 index 80d37c46..00000000 Binary files a/public/datasheets/h1z2z2-k-en.pdf and /dev/null differ diff --git a/public/datasheets/high-voltage/n2xfk2y-de.pdf b/public/datasheets/high-voltage/n2xfk2y-de.pdf index f8534eac..6db9ba2f 100644 Binary files a/public/datasheets/high-voltage/n2xfk2y-de.pdf and b/public/datasheets/high-voltage/n2xfk2y-de.pdf differ diff --git a/public/datasheets/high-voltage/n2xfk2y-en.pdf b/public/datasheets/high-voltage/n2xfk2y-en.pdf index f3e01425..22df457e 100644 Binary files a/public/datasheets/high-voltage/n2xfk2y-en.pdf and b/public/datasheets/high-voltage/n2xfk2y-en.pdf differ diff --git a/public/datasheets/high-voltage/n2xfkld2y-de.pdf b/public/datasheets/high-voltage/n2xfkld2y-de.pdf index 08129ba5..06f68580 100644 Binary files a/public/datasheets/high-voltage/n2xfkld2y-de.pdf and b/public/datasheets/high-voltage/n2xfkld2y-de.pdf differ diff --git a/public/datasheets/high-voltage/n2xfkld2y-en.pdf b/public/datasheets/high-voltage/n2xfkld2y-en.pdf index 8ee5ad13..3f9e7b77 100644 Binary files a/public/datasheets/high-voltage/n2xfkld2y-en.pdf and b/public/datasheets/high-voltage/n2xfkld2y-en.pdf differ diff --git a/public/datasheets/high-voltage/n2xsfl2y-mv-de.pdf b/public/datasheets/high-voltage/n2xsfl2y-mv-de.pdf index d61eb0a6..ae961718 100644 Binary files a/public/datasheets/high-voltage/n2xsfl2y-mv-de.pdf and b/public/datasheets/high-voltage/n2xsfl2y-mv-de.pdf differ diff --git a/public/datasheets/high-voltage/n2xsfl2y-mv-en.pdf b/public/datasheets/high-voltage/n2xsfl2y-mv-en.pdf index 963f96b9..802ff708 100644 Binary files a/public/datasheets/high-voltage/n2xsfl2y-mv-en.pdf and b/public/datasheets/high-voltage/n2xsfl2y-mv-en.pdf differ diff --git a/public/datasheets/high-voltage/na2xfk2y-de.pdf b/public/datasheets/high-voltage/na2xfk2y-de.pdf index a5fbf958..d141c504 100644 Binary files a/public/datasheets/high-voltage/na2xfk2y-de.pdf and b/public/datasheets/high-voltage/na2xfk2y-de.pdf differ diff --git a/public/datasheets/high-voltage/na2xfk2y-en.pdf b/public/datasheets/high-voltage/na2xfk2y-en.pdf index e261763d..8733e575 100644 Binary files a/public/datasheets/high-voltage/na2xfk2y-en.pdf and b/public/datasheets/high-voltage/na2xfk2y-en.pdf differ diff --git a/public/datasheets/high-voltage/na2xfkld2y-de.pdf b/public/datasheets/high-voltage/na2xfkld2y-de.pdf index 5530aed0..044b8d71 100644 Binary files a/public/datasheets/high-voltage/na2xfkld2y-de.pdf and b/public/datasheets/high-voltage/na2xfkld2y-de.pdf differ diff --git a/public/datasheets/high-voltage/na2xfkld2y-en.pdf b/public/datasheets/high-voltage/na2xfkld2y-en.pdf index 7cbd00c8..96a122a3 100644 Binary files a/public/datasheets/high-voltage/na2xfkld2y-en.pdf and b/public/datasheets/high-voltage/na2xfkld2y-en.pdf differ diff --git a/public/datasheets/high-voltage/na2xsfl2y-mv-de.pdf b/public/datasheets/high-voltage/na2xsfl2y-mv-de.pdf index 9f7153ae..2569a544 100644 Binary files a/public/datasheets/high-voltage/na2xsfl2y-mv-de.pdf and b/public/datasheets/high-voltage/na2xsfl2y-mv-de.pdf differ diff --git a/public/datasheets/high-voltage/na2xsfl2y-mv-en.pdf b/public/datasheets/high-voltage/na2xsfl2y-mv-en.pdf index 930be6f4..f69570f7 100644 Binary files a/public/datasheets/high-voltage/na2xsfl2y-mv-en.pdf and b/public/datasheets/high-voltage/na2xsfl2y-mv-en.pdf differ diff --git a/public/datasheets/low-voltage/n2x2y-de.pdf b/public/datasheets/low-voltage/n2x2y-de.pdf index 42776001..44f77096 100644 Binary files a/public/datasheets/low-voltage/n2x2y-de.pdf and b/public/datasheets/low-voltage/n2x2y-de.pdf differ diff --git a/public/datasheets/low-voltage/n2x2y-en.pdf b/public/datasheets/low-voltage/n2x2y-en.pdf index f0028f8c..399ca231 100644 Binary files a/public/datasheets/low-voltage/n2x2y-en.pdf and b/public/datasheets/low-voltage/n2x2y-en.pdf differ diff --git a/public/datasheets/low-voltage/n2xy-de.pdf b/public/datasheets/low-voltage/n2xy-de.pdf index 98efdb1c..caa490ba 100644 Binary files a/public/datasheets/low-voltage/n2xy-de.pdf and b/public/datasheets/low-voltage/n2xy-de.pdf differ diff --git a/public/datasheets/low-voltage/n2xy-en.pdf b/public/datasheets/low-voltage/n2xy-en.pdf index 27b04d4d..4de0d0b0 100644 Binary files a/public/datasheets/low-voltage/n2xy-en.pdf and b/public/datasheets/low-voltage/n2xy-en.pdf differ diff --git a/public/datasheets/low-voltage/na2x2y-de.pdf b/public/datasheets/low-voltage/na2x2y-de.pdf index fb932d93..cde0cd65 100644 Binary files a/public/datasheets/low-voltage/na2x2y-de.pdf and b/public/datasheets/low-voltage/na2x2y-de.pdf differ diff --git a/public/datasheets/low-voltage/na2x2y-en.pdf b/public/datasheets/low-voltage/na2x2y-en.pdf index 14d86a0e..98db771e 100644 Binary files a/public/datasheets/low-voltage/na2x2y-en.pdf and b/public/datasheets/low-voltage/na2x2y-en.pdf differ diff --git a/public/datasheets/low-voltage/na2xy-de.pdf b/public/datasheets/low-voltage/na2xy-de.pdf index b01d7700..8b8e1889 100644 Binary files a/public/datasheets/low-voltage/na2xy-de.pdf and b/public/datasheets/low-voltage/na2xy-de.pdf differ diff --git a/public/datasheets/low-voltage/na2xy-en.pdf b/public/datasheets/low-voltage/na2xy-en.pdf index b0e30a53..3cf49840 100644 Binary files a/public/datasheets/low-voltage/na2xy-en.pdf and b/public/datasheets/low-voltage/na2xy-en.pdf differ diff --git a/public/datasheets/low-voltage/nay2y-de.pdf b/public/datasheets/low-voltage/nay2y-de.pdf index ec50dfe8..80f2afca 100644 Binary files a/public/datasheets/low-voltage/nay2y-de.pdf and b/public/datasheets/low-voltage/nay2y-de.pdf differ diff --git a/public/datasheets/low-voltage/nay2y-en.pdf b/public/datasheets/low-voltage/nay2y-en.pdf index 63d7ef06..c806c3d0 100644 Binary files a/public/datasheets/low-voltage/nay2y-en.pdf and b/public/datasheets/low-voltage/nay2y-en.pdf differ diff --git a/public/datasheets/low-voltage/naycwy-de.pdf b/public/datasheets/low-voltage/naycwy-de.pdf index e7087845..a810c499 100644 Binary files a/public/datasheets/low-voltage/naycwy-de.pdf and b/public/datasheets/low-voltage/naycwy-de.pdf differ diff --git a/public/datasheets/low-voltage/naycwy-en.pdf b/public/datasheets/low-voltage/naycwy-en.pdf index 5cf33a3a..073790fd 100644 Binary files a/public/datasheets/low-voltage/naycwy-en.pdf and b/public/datasheets/low-voltage/naycwy-en.pdf differ diff --git a/public/datasheets/low-voltage/nayy-de.pdf b/public/datasheets/low-voltage/nayy-de.pdf index 8da037d1..c434a951 100644 Binary files a/public/datasheets/low-voltage/nayy-de.pdf and b/public/datasheets/low-voltage/nayy-de.pdf differ diff --git a/public/datasheets/low-voltage/nayy-en.pdf b/public/datasheets/low-voltage/nayy-en.pdf index bec2e1e8..bff17814 100644 Binary files a/public/datasheets/low-voltage/nayy-en.pdf and b/public/datasheets/low-voltage/nayy-en.pdf differ diff --git a/public/datasheets/low-voltage/ny2y-de.pdf b/public/datasheets/low-voltage/ny2y-de.pdf index 9d96ca8d..6917bea5 100644 Binary files a/public/datasheets/low-voltage/ny2y-de.pdf and b/public/datasheets/low-voltage/ny2y-de.pdf differ diff --git a/public/datasheets/low-voltage/ny2y-en.pdf b/public/datasheets/low-voltage/ny2y-en.pdf index 1b64e386..ab0b6bfc 100644 Binary files a/public/datasheets/low-voltage/ny2y-en.pdf and b/public/datasheets/low-voltage/ny2y-en.pdf differ diff --git a/public/datasheets/low-voltage/nycwy-de.pdf b/public/datasheets/low-voltage/nycwy-de.pdf index 06f69f38..1eeebf5b 100644 Binary files a/public/datasheets/low-voltage/nycwy-de.pdf and b/public/datasheets/low-voltage/nycwy-de.pdf differ diff --git a/public/datasheets/low-voltage/nycwy-en.pdf b/public/datasheets/low-voltage/nycwy-en.pdf index 7b8244be..80ecd807 100644 Binary files a/public/datasheets/low-voltage/nycwy-en.pdf and b/public/datasheets/low-voltage/nycwy-en.pdf differ diff --git a/public/datasheets/low-voltage/nyy-de.pdf b/public/datasheets/low-voltage/nyy-de.pdf index d69610da..4c9a0dda 100644 Binary files a/public/datasheets/low-voltage/nyy-de.pdf and b/public/datasheets/low-voltage/nyy-de.pdf differ diff --git a/public/datasheets/low-voltage/nyy-en.pdf b/public/datasheets/low-voltage/nyy-en.pdf index 928e4c57..1c7b7253 100644 Binary files a/public/datasheets/low-voltage/nyy-en.pdf and b/public/datasheets/low-voltage/nyy-en.pdf differ diff --git a/public/datasheets/medium-voltage/n2xs2y-de.pdf b/public/datasheets/medium-voltage/n2xs2y-de.pdf index 3a6c8f35..453e0c86 100644 Binary files a/public/datasheets/medium-voltage/n2xs2y-de.pdf and b/public/datasheets/medium-voltage/n2xs2y-de.pdf differ diff --git a/public/datasheets/medium-voltage/n2xs2y-en.pdf b/public/datasheets/medium-voltage/n2xs2y-en.pdf index 4b9ff540..b6ec3050 100644 Binary files a/public/datasheets/medium-voltage/n2xs2y-en.pdf and b/public/datasheets/medium-voltage/n2xs2y-en.pdf differ diff --git a/public/datasheets/medium-voltage/n2xsf2y-de.pdf b/public/datasheets/medium-voltage/n2xsf2y-de.pdf index 68b1945d..21800df7 100644 Binary files a/public/datasheets/medium-voltage/n2xsf2y-de.pdf and b/public/datasheets/medium-voltage/n2xsf2y-de.pdf differ diff --git a/public/datasheets/medium-voltage/n2xsf2y-en.pdf b/public/datasheets/medium-voltage/n2xsf2y-en.pdf index 7cdf88eb..7b3498cd 100644 Binary files a/public/datasheets/medium-voltage/n2xsf2y-en.pdf and b/public/datasheets/medium-voltage/n2xsf2y-en.pdf differ diff --git a/public/datasheets/n2xsfl2y-mv-de.pdf b/public/datasheets/medium-voltage/n2xsfl2y-mv-de.pdf similarity index 95% rename from public/datasheets/n2xsfl2y-mv-de.pdf rename to public/datasheets/medium-voltage/n2xsfl2y-mv-de.pdf index 6716764c..9ebfb737 100644 Binary files a/public/datasheets/n2xsfl2y-mv-de.pdf and b/public/datasheets/medium-voltage/n2xsfl2y-mv-de.pdf differ diff --git a/public/datasheets/n2xsfl2y-mv-en.pdf b/public/datasheets/medium-voltage/n2xsfl2y-mv-en.pdf similarity index 95% rename from public/datasheets/n2xsfl2y-mv-en.pdf rename to public/datasheets/medium-voltage/n2xsfl2y-mv-en.pdf index f16a72a3..c50d3935 100644 Binary files a/public/datasheets/n2xsfl2y-mv-en.pdf and b/public/datasheets/medium-voltage/n2xsfl2y-mv-en.pdf differ diff --git a/public/datasheets/medium-voltage/n2xsy-de.pdf b/public/datasheets/medium-voltage/n2xsy-de.pdf index 0a319a3c..42beb951 100644 Binary files a/public/datasheets/medium-voltage/n2xsy-de.pdf and b/public/datasheets/medium-voltage/n2xsy-de.pdf differ diff --git a/public/datasheets/medium-voltage/n2xsy-en.pdf b/public/datasheets/medium-voltage/n2xsy-en.pdf index 9aa2cbbe..a28dde7f 100644 Binary files a/public/datasheets/medium-voltage/n2xsy-en.pdf and b/public/datasheets/medium-voltage/n2xsy-en.pdf differ diff --git a/public/datasheets/medium-voltage/na2xs2y-de.pdf b/public/datasheets/medium-voltage/na2xs2y-de.pdf index 20f00a54..d93983eb 100644 Binary files a/public/datasheets/medium-voltage/na2xs2y-de.pdf and b/public/datasheets/medium-voltage/na2xs2y-de.pdf differ diff --git a/public/datasheets/medium-voltage/na2xs2y-en.pdf b/public/datasheets/medium-voltage/na2xs2y-en.pdf index 11826dff..3fd1ad27 100644 Binary files a/public/datasheets/medium-voltage/na2xs2y-en.pdf and b/public/datasheets/medium-voltage/na2xs2y-en.pdf differ diff --git a/public/datasheets/medium-voltage/na2xsf2y-de.pdf b/public/datasheets/medium-voltage/na2xsf2y-de.pdf index ea41e857..d51a275a 100644 Binary files a/public/datasheets/medium-voltage/na2xsf2y-de.pdf and b/public/datasheets/medium-voltage/na2xsf2y-de.pdf differ diff --git a/public/datasheets/medium-voltage/na2xsf2y-en.pdf b/public/datasheets/medium-voltage/na2xsf2y-en.pdf index 13bf41de..d5a79431 100644 Binary files a/public/datasheets/medium-voltage/na2xsf2y-en.pdf and b/public/datasheets/medium-voltage/na2xsf2y-en.pdf differ diff --git a/public/datasheets/na2xsfl2y-mv-de.pdf b/public/datasheets/medium-voltage/na2xsfl2y-mv-de.pdf similarity index 95% rename from public/datasheets/na2xsfl2y-mv-de.pdf rename to public/datasheets/medium-voltage/na2xsfl2y-mv-de.pdf index 10035a4c..4d949c01 100644 Binary files a/public/datasheets/na2xsfl2y-mv-de.pdf and b/public/datasheets/medium-voltage/na2xsfl2y-mv-de.pdf differ diff --git a/public/datasheets/na2xsfl2y-mv-en.pdf b/public/datasheets/medium-voltage/na2xsfl2y-mv-en.pdf similarity index 95% rename from public/datasheets/na2xsfl2y-mv-en.pdf rename to public/datasheets/medium-voltage/na2xsfl2y-mv-en.pdf index 7f9343bf..9d0024ed 100644 Binary files a/public/datasheets/na2xsfl2y-mv-en.pdf and b/public/datasheets/medium-voltage/na2xsfl2y-mv-en.pdf differ diff --git a/public/datasheets/medium-voltage/na2xsy-de.pdf b/public/datasheets/medium-voltage/na2xsy-de.pdf index f8dc403d..0c1d2c82 100644 Binary files a/public/datasheets/medium-voltage/na2xsy-de.pdf and b/public/datasheets/medium-voltage/na2xsy-de.pdf differ diff --git a/public/datasheets/medium-voltage/na2xsy-en.pdf b/public/datasheets/medium-voltage/na2xsy-en.pdf index 0989b314..9e9ae55e 100644 Binary files a/public/datasheets/medium-voltage/na2xsy-en.pdf and b/public/datasheets/medium-voltage/na2xsy-en.pdf differ diff --git a/public/datasheets/n2x2y-2-de.pdf b/public/datasheets/n2x2y-2-de.pdf deleted file mode 100644 index b1dfcef6..00000000 Binary files a/public/datasheets/n2x2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2x2y-de.pdf b/public/datasheets/n2x2y-de.pdf deleted file mode 100644 index a8cc9866..00000000 Binary files a/public/datasheets/n2x2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2x2y-en.pdf b/public/datasheets/n2x2y-en.pdf deleted file mode 100644 index 5d0ba9bf..00000000 Binary files a/public/datasheets/n2x2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xfk2y-de.pdf b/public/datasheets/n2xfk2y-de.pdf deleted file mode 100644 index 7532174c..00000000 Binary files a/public/datasheets/n2xfk2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xfk2y-en.pdf b/public/datasheets/n2xfk2y-en.pdf deleted file mode 100644 index a84eaf99..00000000 Binary files a/public/datasheets/n2xfk2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xfkld2y-de.pdf b/public/datasheets/n2xfkld2y-de.pdf deleted file mode 100644 index 3e865e46..00000000 Binary files a/public/datasheets/n2xfkld2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xfkld2y-en.pdf b/public/datasheets/n2xfkld2y-en.pdf deleted file mode 100644 index 10e0d222..00000000 Binary files a/public/datasheets/n2xfkld2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xs2y-2-de.pdf b/public/datasheets/n2xs2y-2-de.pdf deleted file mode 100644 index c95ef4e4..00000000 Binary files a/public/datasheets/n2xs2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xs2y-de.pdf b/public/datasheets/n2xs2y-de.pdf deleted file mode 100644 index aed1e9ee..00000000 Binary files a/public/datasheets/n2xs2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xs2y-en.pdf b/public/datasheets/n2xs2y-en.pdf deleted file mode 100644 index 1a76a1d5..00000000 Binary files a/public/datasheets/n2xs2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xsf2y-2-de.pdf b/public/datasheets/n2xsf2y-2-de.pdf deleted file mode 100644 index 730a2620..00000000 Binary files a/public/datasheets/n2xsf2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsf2y-de.pdf b/public/datasheets/n2xsf2y-de.pdf deleted file mode 100644 index 39970090..00000000 Binary files a/public/datasheets/n2xsf2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsf2y-en.pdf b/public/datasheets/n2xsf2y-en.pdf deleted file mode 100644 index b2ed0626..00000000 Binary files a/public/datasheets/n2xsf2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xsfl2y-2-de.pdf b/public/datasheets/n2xsfl2y-2-de.pdf deleted file mode 100644 index 5f084c99..00000000 Binary files a/public/datasheets/n2xsfl2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsfl2y-3-en.pdf b/public/datasheets/n2xsfl2y-3-en.pdf deleted file mode 100644 index c526636c..00000000 Binary files a/public/datasheets/n2xsfl2y-3-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xsfl2y-de.pdf b/public/datasheets/n2xsfl2y-de.pdf deleted file mode 100644 index 97bd1178..00000000 Binary files a/public/datasheets/n2xsfl2y-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsfl2y-en.pdf b/public/datasheets/n2xsfl2y-en.pdf deleted file mode 100644 index c8717d41..00000000 Binary files a/public/datasheets/n2xsfl2y-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xsy-2-de.pdf b/public/datasheets/n2xsy-2-de.pdf deleted file mode 100644 index f45d6f70..00000000 Binary files a/public/datasheets/n2xsy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsy-de.pdf b/public/datasheets/n2xsy-de.pdf deleted file mode 100644 index bcc68967..00000000 Binary files a/public/datasheets/n2xsy-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xsy-en.pdf b/public/datasheets/n2xsy-en.pdf deleted file mode 100644 index 87df9401..00000000 Binary files a/public/datasheets/n2xsy-en.pdf and /dev/null differ diff --git a/public/datasheets/n2xy-2-de.pdf b/public/datasheets/n2xy-2-de.pdf deleted file mode 100644 index 74ce05cd..00000000 Binary files a/public/datasheets/n2xy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xy-de.pdf b/public/datasheets/n2xy-de.pdf deleted file mode 100644 index 0314905f..00000000 Binary files a/public/datasheets/n2xy-de.pdf and /dev/null differ diff --git a/public/datasheets/n2xy-en.pdf b/public/datasheets/n2xy-en.pdf deleted file mode 100644 index ef7d629d..00000000 Binary files a/public/datasheets/n2xy-en.pdf and /dev/null differ diff --git a/public/datasheets/na2x2y-2-de.pdf b/public/datasheets/na2x2y-2-de.pdf deleted file mode 100644 index f7c213f4..00000000 Binary files a/public/datasheets/na2x2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2x2y-de.pdf b/public/datasheets/na2x2y-de.pdf deleted file mode 100644 index 2fdc339e..00000000 Binary files a/public/datasheets/na2x2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2x2y-en.pdf b/public/datasheets/na2x2y-en.pdf deleted file mode 100644 index 4e838546..00000000 Binary files a/public/datasheets/na2x2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xfk2y-de.pdf b/public/datasheets/na2xfk2y-de.pdf deleted file mode 100644 index c4a0b78f..00000000 Binary files a/public/datasheets/na2xfk2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xfk2y-en.pdf b/public/datasheets/na2xfk2y-en.pdf deleted file mode 100644 index 3d4d47f5..00000000 Binary files a/public/datasheets/na2xfk2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xfkld2y-de.pdf b/public/datasheets/na2xfkld2y-de.pdf deleted file mode 100644 index aed94307..00000000 Binary files a/public/datasheets/na2xfkld2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xfkld2y-en.pdf b/public/datasheets/na2xfkld2y-en.pdf deleted file mode 100644 index 2d831957..00000000 Binary files a/public/datasheets/na2xfkld2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xs2y-2-de.pdf b/public/datasheets/na2xs2y-2-de.pdf deleted file mode 100644 index 8d29a662..00000000 Binary files a/public/datasheets/na2xs2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xs2y-de.pdf b/public/datasheets/na2xs2y-de.pdf deleted file mode 100644 index 0a055c22..00000000 Binary files a/public/datasheets/na2xs2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xs2y-en.pdf b/public/datasheets/na2xs2y-en.pdf deleted file mode 100644 index 2bfd81e5..00000000 Binary files a/public/datasheets/na2xs2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xsf2y-2-de.pdf b/public/datasheets/na2xsf2y-2-de.pdf deleted file mode 100644 index 6c41c21c..00000000 Binary files a/public/datasheets/na2xsf2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsf2y-de.pdf b/public/datasheets/na2xsf2y-de.pdf deleted file mode 100644 index 4ea263f0..00000000 Binary files a/public/datasheets/na2xsf2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsf2y-en.pdf b/public/datasheets/na2xsf2y-en.pdf deleted file mode 100644 index aeabaa13..00000000 Binary files a/public/datasheets/na2xsf2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xsfl2y-2-de.pdf b/public/datasheets/na2xsfl2y-2-de.pdf deleted file mode 100644 index ac9d8012..00000000 Binary files a/public/datasheets/na2xsfl2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsfl2y-3-en.pdf b/public/datasheets/na2xsfl2y-3-en.pdf deleted file mode 100644 index 8c02c6df..00000000 Binary files a/public/datasheets/na2xsfl2y-3-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xsfl2y-de.pdf b/public/datasheets/na2xsfl2y-de.pdf deleted file mode 100644 index 2f6244cc..00000000 Binary files a/public/datasheets/na2xsfl2y-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsfl2y-en.pdf b/public/datasheets/na2xsfl2y-en.pdf deleted file mode 100644 index 86de0000..00000000 Binary files a/public/datasheets/na2xsfl2y-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xsy-2-de.pdf b/public/datasheets/na2xsy-2-de.pdf deleted file mode 100644 index d49eea5c..00000000 Binary files a/public/datasheets/na2xsy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsy-de.pdf b/public/datasheets/na2xsy-de.pdf deleted file mode 100644 index 059639bd..00000000 Binary files a/public/datasheets/na2xsy-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xsy-en.pdf b/public/datasheets/na2xsy-en.pdf deleted file mode 100644 index 7c4da6d3..00000000 Binary files a/public/datasheets/na2xsy-en.pdf and /dev/null differ diff --git a/public/datasheets/na2xy-2-de.pdf b/public/datasheets/na2xy-2-de.pdf deleted file mode 100644 index acc5c60a..00000000 Binary files a/public/datasheets/na2xy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xy-de.pdf b/public/datasheets/na2xy-de.pdf deleted file mode 100644 index ee6f4aad..00000000 Binary files a/public/datasheets/na2xy-de.pdf and /dev/null differ diff --git a/public/datasheets/na2xy-en.pdf b/public/datasheets/na2xy-en.pdf deleted file mode 100644 index a6bd1798..00000000 Binary files a/public/datasheets/na2xy-en.pdf and /dev/null differ diff --git a/public/datasheets/nay2y-2-de.pdf b/public/datasheets/nay2y-2-de.pdf deleted file mode 100644 index 74d17176..00000000 Binary files a/public/datasheets/nay2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/nay2y-de.pdf b/public/datasheets/nay2y-de.pdf deleted file mode 100644 index 04cf57cf..00000000 Binary files a/public/datasheets/nay2y-de.pdf and /dev/null differ diff --git a/public/datasheets/nay2y-en.pdf b/public/datasheets/nay2y-en.pdf deleted file mode 100644 index 8381067e..00000000 Binary files a/public/datasheets/nay2y-en.pdf and /dev/null differ diff --git a/public/datasheets/naycwy-2-de.pdf b/public/datasheets/naycwy-2-de.pdf deleted file mode 100644 index ff32443d..00000000 Binary files a/public/datasheets/naycwy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/naycwy-de.pdf b/public/datasheets/naycwy-de.pdf deleted file mode 100644 index 670fd67f..00000000 Binary files a/public/datasheets/naycwy-de.pdf and /dev/null differ diff --git a/public/datasheets/naycwy-en.pdf b/public/datasheets/naycwy-en.pdf deleted file mode 100644 index 882da9ff..00000000 Binary files a/public/datasheets/naycwy-en.pdf and /dev/null differ diff --git a/public/datasheets/nayy-2-de.pdf b/public/datasheets/nayy-2-de.pdf deleted file mode 100644 index 80e03d2d..00000000 Binary files a/public/datasheets/nayy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/nayy-de.pdf b/public/datasheets/nayy-de.pdf deleted file mode 100644 index c9d68fea..00000000 Binary files a/public/datasheets/nayy-de.pdf and /dev/null differ diff --git a/public/datasheets/nayy-en.pdf b/public/datasheets/nayy-en.pdf deleted file mode 100644 index 75a670e6..00000000 Binary files a/public/datasheets/nayy-en.pdf and /dev/null differ diff --git a/public/datasheets/ny2y-2-de.pdf b/public/datasheets/ny2y-2-de.pdf deleted file mode 100644 index fb9a3111..00000000 Binary files a/public/datasheets/ny2y-2-de.pdf and /dev/null differ diff --git a/public/datasheets/ny2y-de.pdf b/public/datasheets/ny2y-de.pdf deleted file mode 100644 index 212fe0d1..00000000 Binary files a/public/datasheets/ny2y-de.pdf and /dev/null differ diff --git a/public/datasheets/ny2y-en.pdf b/public/datasheets/ny2y-en.pdf deleted file mode 100644 index b37d841e..00000000 Binary files a/public/datasheets/ny2y-en.pdf and /dev/null differ diff --git a/public/datasheets/nycwy-2-de.pdf b/public/datasheets/nycwy-2-de.pdf deleted file mode 100644 index 920d1076..00000000 Binary files a/public/datasheets/nycwy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/nycwy-de.pdf b/public/datasheets/nycwy-de.pdf deleted file mode 100644 index 38a69aa9..00000000 Binary files a/public/datasheets/nycwy-de.pdf and /dev/null differ diff --git a/public/datasheets/nycwy-en.pdf b/public/datasheets/nycwy-en.pdf deleted file mode 100644 index c2c5e636..00000000 Binary files a/public/datasheets/nycwy-en.pdf and /dev/null differ diff --git a/public/datasheets/nyy-2-de.pdf b/public/datasheets/nyy-2-de.pdf deleted file mode 100644 index e1a50f6a..00000000 Binary files a/public/datasheets/nyy-2-de.pdf and /dev/null differ diff --git a/public/datasheets/nyy-de.pdf b/public/datasheets/nyy-de.pdf deleted file mode 100644 index 21bbdff1..00000000 Binary files a/public/datasheets/nyy-de.pdf and /dev/null differ diff --git a/public/datasheets/nyy-en.pdf b/public/datasheets/nyy-en.pdf deleted file mode 100644 index 1c6b7a3b..00000000 Binary files a/public/datasheets/nyy-en.pdf and /dev/null differ diff --git a/public/datasheets/solar/h1z2z2-k-de.pdf b/public/datasheets/solar/h1z2z2-k-de.pdf index 18ae97c1..406c38a9 100644 Binary files a/public/datasheets/solar/h1z2z2-k-de.pdf and b/public/datasheets/solar/h1z2z2-k-de.pdf differ diff --git a/public/datasheets/solar/h1z2z2-k-en.pdf b/public/datasheets/solar/h1z2z2-k-en.pdf index e7e622ba..5461801f 100644 Binary files a/public/datasheets/solar/h1z2z2-k-en.pdf and b/public/datasheets/solar/h1z2z2-k-en.pdf differ diff --git a/scripts/generate-pdf-datasheets.ts b/scripts/generate-pdf-datasheets.ts index 5d90dbbd..f20448e8 100644 --- a/scripts/generate-pdf-datasheets.ts +++ b/scripts/generate-pdf-datasheets.ts @@ -39,6 +39,7 @@ type MdxProduct = { categories: string[]; images: string[]; descriptionHtml: string; + applicationHtml: string; }; type MdxIndex = Map; // key: normalized designation/title @@ -85,9 +86,10 @@ function buildMdxIndex(locale: 'en' | 'de'): MdxIndex { const images = Array.isArray(data.images) ? data.images.map((i: any) => normalizeValue(String(i))).filter(Boolean) : []; const descriptionHtml = extractDescriptionFromMdxFrontmatter(data); + const applicationHtml = normalizeValue(String(data?.application || '')); const slug = path.basename(file, '.mdx'); - idx.set(normalizeExcelKey(title), { slug, title, sku, categories, images, descriptionHtml }); + idx.set(normalizeExcelKey(title), { slug, title, sku, categories, images, descriptionHtml, applicationHtml }); } return idx; @@ -183,6 +185,7 @@ async function loadProductsFromExcelAndMdx(locale: 'en' | 'de'): Promise ({ name })), attributes: [], - voltageType: data.voltageType, + voltageType: (() => { + const cats = (mdx?.categories || []).map(c => String(c)); + const isMV = cats.some(c => /medium[-\s]?voltage|mittelspannung/i.test(c)); + if (isMV && data.voltageType === 'high-voltage') return 'medium-voltage'; + return data.voltageType; + })(), }); }); diff --git a/scripts/pdf/model/build-datasheet-model.ts b/scripts/pdf/model/build-datasheet-model.ts index 2af3e7da..9b714de6 100644 --- a/scripts/pdf/model/build-datasheet-model.ts +++ b/scripts/pdf/model/build-datasheet-model.ts @@ -159,83 +159,121 @@ function guessColumnKey(row: ExcelRow, patterns: RegExp[]): string | null { } function technicalFullLabel(args: { key: string; excelKey: string; locale: 'en' | 'de' }): string { + const key = args.key; + if (args.locale === 'de') { + switch (key) { + case 'cond_mat': return 'Leitermaterial'; + case 'cond_class': return 'Leiterklasse'; + case 'core_ins': return 'Aderisolation'; + case 'field_ctrl': return 'Feldsteuerung'; + case 'screen': return 'Schirm'; + case 'long_water': return 'Längswasserdichtigkeit'; + case 'trans_water': return 'Querwasserdichtigkeit'; + case 'sheath_mat': return 'Mantelmaterial'; + case 'sheath_color': return 'Mantelfarbe'; + case 'flame_ret': return 'Flammwidrigkeit'; + case 'uv_res': return 'UV-beständig'; + case 'max_cond_temp': return 'Max. zulässige Leitertemperatur'; + case 'out_temp_fixed': return 'Zul. Kabelaußentemperatur, fest verlegt'; + case 'out_temp_motion': return 'Zul. Kabelaußentemperatur, in Bewegung'; + case 'max_sc_temp_val': return 'Maximale Kurzschlußtemperatur'; + case 'max_sc_temp': return 'Maximale Kurzschlußtemperatur'; + case 'max_op_temp': return 'Max. zulässige Leitertemperatur'; + case 'min_store_temp': return 'Minimale Lagertemperatur'; + case 'min_lay_temp': return 'Mindesttemperatur Verlegung'; + case 'min_bend_fixed': return 'Min. Biegeradius, fest verlegt'; + case 'min_lay_temp_val': return 'Mindesttemperatur Verlegung'; + case 'meter_mark': return 'Metermarkierung'; + case 'partial_dis': return 'Teilentladung'; + case 'cap': return 'Kapazität'; + case 'X': return 'Reaktanz'; + case 'test_volt': return 'Prüfspannung'; + case 'rated_volt': return 'Nennspannung'; + case 'temp_range': return 'Temperaturbereich'; + case 'Wm': return 'Manteldicke'; + case 'Wi': return 'Isolationsdicke'; + case 'RI': return 'DC-Leiterwiderstand (20 °C)'; + case 'Ø': return 'Außen-Ø'; + case 'Rbv': return 'Biegeradius'; + case 'cpr': return 'CPR-Klasse'; + case 'flame': return 'Flammhemmend'; + case 'G': return 'Gewicht'; + case 'Fzv': return 'Zugkraft'; + case 'DI': return 'Durchmesser über Isolation'; + case 'Ik_cond': return 'Kurzschlussstrom Leiter'; + case 'Ik_screen': return 'Kurzschlussstrom Schirm'; + case 'D_screen': return 'Durchmesser über Schirm'; + case 'S_screen': return 'Metallischer Schirm'; + case 'cross_section': return 'Querschnitt'; + case 'shape': return 'Leiterform'; + case 'Ibl': return 'Strombelastbarkeit (Luft)'; + case 'Ibe': return 'Strombelastbarkeit (Erde)'; + case 'Cond': return 'Leitermaterial'; + } + } else { + switch (key) { + case 'cond_mat': return 'Conductor material'; + case 'cond_class': return 'Conductor class'; + case 'core_ins': return 'Core insulation'; + case 'field_ctrl': return 'Field control'; + case 'screen': return 'Screen'; + case 'long_water': return 'Longitudinal water tightness'; + case 'trans_water': return 'Transverse water tightness'; + case 'sheath_mat': return 'Sheath material'; + case 'sheath_color': return 'Sheath color'; + case 'flame_ret': return 'Flame retardancy'; + case 'uv_res': return 'UV resistant'; + case 'max_cond_temp': return 'Max. permissible conductor temperature'; + case 'out_temp_fixed': return 'Permissible cable outer temperature, fixed'; + case 'out_temp_motion': return 'Permissible cable outer temperature, in motion'; + case 'max_sc_temp_val': return 'Maximum short-circuit temperature'; + case 'max_sc_temp': return 'Maximum short-circuit temperature'; + case 'max_op_temp': return 'Max. permissible conductor temperature'; + case 'min_store_temp': return 'Minimum storage temperature'; + case 'min_lay_temp': return 'Minimum laying temperature'; + case 'min_bend_fixed': return 'Min. bending radius, fixed'; + case 'min_lay_temp_val': return 'Minimum laying temperature'; + case 'meter_mark': return 'Meter marking'; + case 'partial_dis': return 'Partial discharge'; + case 'cap': return 'Capacitance'; + case 'X': return 'Reactance'; + case 'test_volt': return 'Test voltage'; + case 'rated_volt': return 'Rated voltage'; + case 'temp_range': return 'Operating temperature range'; + case 'Wm': return 'Sheath thickness'; + case 'Wi': return 'Insulation thickness'; + case 'RI': return 'DC resistance (20 °C)'; + case 'Ø': return 'Outer diameter'; + case 'Rbv': return 'Bending radius'; + case 'cpr': return 'CPR class'; + case 'flame': return 'Flame retardant'; + case 'G': return 'Weight'; + case 'Fzv': return 'Pulling force'; + case 'DI': return 'Diameter over insulation'; + case 'Ik_cond': return 'Short-circuit current conductor'; + case 'Ik_screen': return 'Short-circuit current screen'; + case 'D_screen': return 'Diameter over screen'; + case 'S_screen': return 'Metallic screen'; + case 'cross_section': return 'Cross-section'; + case 'shape': return 'Conductor shape'; + case 'Ibl': return 'Current rating (air)'; + case 'Ibe': return 'Current rating (ground)'; + case 'Cond': return 'Conductor material'; + } + } + + // Fallback for unmapped keys (should be rare if columnMapping is comprehensive) const raw = normalizeValue(args.excelKey); if (!raw) return ''; - + if (args.locale === 'de') { return raw .replace(/\(approx\.?\)/gi, '(ca.)') - .replace(/\bconductor material\b/gi, 'Leitermaterial') - .replace(/\bconductor class\b/gi, 'Leiterklasse') - .replace(/\bcore insulation\b/gi, 'Aderisolation') - .replace(/\binsulation\b/gi, 'Aderisolation') - .replace(/\bfield control\b/gi, 'Feldsteuerung') - .replace(/\bscreen\b/gi, 'Schirm') - .replace(/\blongitudinal water tightness\b/gi, 'Längswasserdichtigkeit') - .replace(/\btransverse water tightness\b/gi, 'Querwasserdichtigkeit') - .replace(/\bsheath material\b/gi, 'Mantelmaterial') - .replace(/\bsheath color\b/gi, 'Mantelfarbe') - .replace(/\bflame retardancy\b/gi, 'Flammwidrigkeit') - .replace(/\buv resistant\b/gi, 'UV-bestandig') - .replace(/\bmax\.? permissible conductor temperature\b/gi, 'Max. zulässige Leitertemperatur') - .replace(/\bpermissible cable outer temperature, fixed\b/gi, 'Zul. Kabelaußentemperatur, fest verlegt') - .replace(/\bpermissible cable outer temperature, in motion\b/gi, 'Zul. Kabelaußentemperatur, in Bewegung') - .replace(/\bmaximum short-circuit temperature\b/gi, 'Maximale Kurzschlußtemperatur') - .replace(/\bmin\.? bending radius, fixed\b/gi, 'Min. Biegeradius, fest verlegt') - .replace(/\bminimum laying temperature\b/gi, 'Mindesttemperatur Verlegung') - .replace(/\bmeter marking\b/gi, 'Metermarkierung') - .replace(/\bpartial discharge\b/gi, 'Teilentladung') - .replace(/\bcapacitance\b/gi, 'Kapazität') - .replace(/\binductance\b/gi, 'Induktivität') - .replace(/\breactance\b/gi, 'Reaktanz') - .replace(/\btest voltage\b/gi, 'Prüfspannung') - .replace(/\brated voltage\b/gi, 'Nennspannung') - .replace(/\boperating temperature range\b/gi, 'Temperaturbereich') - .replace(/\bminimum sheath thickness\b/gi, 'Manteldicke (min.)') - .replace(/\bsheath thickness\b/gi, 'Manteldicke') - .replace(/\bnominal insulation thickness\b/gi, 'Isolationsdicke (nom.)') - .replace(/\binsulation thickness\b/gi, 'Isolationsdicke') - .replace(/\bdc resistance at 20\s*°?c\b/gi, 'DC-Leiterwiderstand (20 °C)') - .replace(/\bouter diameter(?: of cable)?\b/gi, 'Außen-Ø') - .replace(/\bbending radius\b/gi, 'Biegeradius') .replace(/\bpackaging\b/gi, 'Verpackung') .replace(/\bce\s*-?conformity\b/gi, 'CE-Konformität'); } return raw - .replace(/\bconductor material\b/gi, 'Conductor material') - .replace(/\bconductor class\b/gi, 'Conductor class') - .replace(/\bcore insulation\b/gi, 'Core insulation') - .replace(/\binsulation\b/gi, 'Core insulation') - .replace(/\bfield control\b/gi, 'Field control') - .replace(/\bscreen\b/gi, 'Screen') - .replace(/\blongitudinal water tightness\b/gi, 'Longitudinal water tightness') - .replace(/\btransverse water tightness\b/gi, 'Transverse water tightness') - .replace(/\bsheath material\b/gi, 'Sheath material') - .replace(/\bsheath color\b/gi, 'Sheath color') - .replace(/\bflame retardancy\b/gi, 'Flame retardancy') - .replace(/\buv resistant\b/gi, 'UV resistant') - .replace(/\bmax\.? permissible conductor temperature\b/gi, 'Max. permissible conductor temperature') - .replace(/\bpermissible cable outer temperature, fixed\b/gi, 'Permissible cable outer temperature, fixed') - .replace(/\bpermissible cable outer temperature, in motion\b/gi, 'Permissible cable outer temperature, in motion') - .replace(/\bmaximum short-circuit temperature\b/gi, 'Maximum short-circuit temperature') - .replace(/\bmin\.? bending radius, fixed\b/gi, 'Min. bending radius, fixed') - .replace(/\bminimum laying temperature\b/gi, 'Minimum laying temperature') - .replace(/\bmeter marking\b/gi, 'Meter marking') - .replace(/\bpartial discharge\b/gi, 'Partial discharge') - .replace(/\bcapacitance\b/gi, 'Capacitance') - .replace(/\binductance\b/gi, 'Inductance') - .replace(/\breactance\b/gi, 'Reactance') - .replace(/\btest voltage\b/gi, 'Test voltage') - .replace(/\brated voltage\b/gi, 'Rated voltage') - .replace(/\boperating temperature range\b/gi, 'Operating temperature range') - .replace(/\bminimum sheath thickness\b/gi, 'Sheath thickness (min.)') - .replace(/\bsheath thickness\b/gi, 'Sheath thickness') - .replace(/\bnominal insulation thickness\b/gi, 'Insulation thickness (nom.)') - .replace(/\binsulation thickness\b/gi, 'Insulation thickness') - .replace(/\bdc resistance at 20\s*°?c\b/gi, 'DC resistance (20 °C)') - .replace(/\bouter diameter(?: of cable)?\b/gi, 'Outer diameter') - .replace(/\bbending radius\b/gi, 'Bending radius') .replace(/\bpackaging\b/gi, 'Packaging') .replace(/\bce\s*-?conformity\b/gi, 'CE conformity'); } @@ -253,17 +291,58 @@ function technicalValueTranslation(args: { label: string; value: string; locale: if (/^stranded$/i.test(v)) return 'mehrdrähtig'; if (/^(\d+)xD$/i.test(v)) return v.replace(/^(\d+)xD$/i, '$1 facher Durchmesser'); if (/^XLPE/i.test(v)) return v.replace(/^XLPE/i, 'VPE'); - return v; + if (/^yes, with swelling tape$/i.test(v)) return 'ja, mit Quellvliess'; + if (/^yes, Al-tape$/i.test(v)) return 'ja, Al-Band'; + if (/^Polyethylene/i.test(v)) return v.replace(/^Polyethylene/i, 'Polyethylen'); + if (/^Class 2 stranded$/i.test(v)) return 'Klasse 2 mehrdrähtig'; + if (/^VPE DIX8$/i.test(v)) return 'VPE DIX8'; + if (/^inner and outer semiconducting layer made of semiconducting plastic - 3-fold extruded$/i.test(v)) return 'innere und äußere Leitschicht aus halbleitendem Kunststoff - 3-fach-extrudiert'; + if (/^copper wires \+ transverse conductive helix$/i.test(v)) return 'Kupferdrähte + Querleitwendel'; + if (/^Polyethylene DMP2$/i.test(v)) return 'Polyethylen DMP2'; + if (/^15 times diameter$/i.test(v)) return '15 facher Durchmesser'; + + // Fallback for partial matches or common terms + return v + .replace(/\bcopper\b/gi, 'Kupfer') + .replace(/\baluminum\b/gi, 'Aluminium') + .replace(/\bblack\b/gi, 'schwarz') + .replace(/\bstranded\b/gi, 'mehrdrähtig') + .replace(/\byes\b/gi, 'ja') + .replace(/\bno\b/gi, 'nein') + .replace(/\bPolyethylene\b/gi, 'Polyethylen') + .replace(/\bXLPE\b/gi, 'VPE'); + } + + if (args.locale === 'en') { + if (/^ja$/i.test(v)) return 'yes'; + if (/^nein$/i.test(v)) return 'no'; + if (/^kupfer$/i.test(v)) return 'Copper'; + if (/^aluminium$/i.test(v)) return 'Aluminum'; + if (/^schwarz$/i.test(v)) return 'black'; + if (/^mehrdrähtig$/i.test(v)) return 'stranded'; + if (/^(\d+)xD$/i.test(v)) return v.replace(/^(\d+)xD$/i, '$1 times diameter'); + if (/^VPE/i.test(v)) return v.replace(/^VPE/i, 'XLPE'); + if (/^ja, mit Quellvliess$/i.test(v)) return 'yes, with swelling tape'; + if (/^ja, Al-Band$/i.test(v)) return 'yes, Al-tape'; + if (/^Polyethylen/i.test(v)) return v.replace(/^Polyethylen/i, 'Polyethylene'); + if (/^Klasse 2 mehrdrähtig$/i.test(v)) return 'Class 2 stranded'; + if (/^innere und äußere Leitschicht aus halbleitendem Kunststoff - 3-fach-extrudiert$/i.test(v)) return 'inner and outer semiconducting layer made of semiconducting plastic - 3-fold extruded'; + if (/^Kupferdrähte \+ Querleitwendel$/i.test(v)) return 'copper wires + transverse conductive helix'; + if (/^Polyethylen DMP2$/i.test(v)) return 'Polyethylene DMP2'; + if (/^15 facher Durchmesser$/i.test(v)) return '15 times diameter'; + + // Fallback for partial matches or common terms + return v + .replace(/\bkupfer\b/gi, 'Copper') + .replace(/\baluminium\b/gi, 'Aluminum') + .replace(/\bschwarz\b/gi, 'black') + .replace(/\bmehrdrähtig\b/gi, 'stranded') + .replace(/\bja\b/gi, 'yes') + .replace(/\bnein\b/gi, 'no') + .replace(/\bPolyethylen\b/gi, 'Polyethylene') + .replace(/\bVPE\b/gi, 'XLPE'); } - if (/^ja$/i.test(v)) return 'yes'; - if (/^nein$/i.test(v)) return 'no'; - if (/^kupfer$/i.test(v)) return 'Copper'; - if (/^aluminium$/i.test(v)) return 'Aluminum'; - if (/^schwarz$/i.test(v)) return 'black'; - if (/^mehrdrähtig$/i.test(v)) return 'stranded'; - if (/^(\d+)xD$/i.test(v)) return v.replace(/^(\d+)xD$/i, '$1 times diameter'); - if (/^VPE/i.test(v)) return v.replace(/^VPE/i, 'XLPE'); return v; } @@ -287,6 +366,26 @@ function metaFullLabel(args: { key: string; excelKey: string; locale: 'en' | 'de return 'CPR-Klasse'; case 'flame': return 'Flammhemmend'; + case 'DI': return 'Durchmesser über Isolation'; + case 'RI': return 'DC-Leiterwiderstand (20 °C)'; + case 'Wi': return 'Isolationsdicke'; + case 'Wm': return 'Manteldicke'; + case 'Rbv': return 'Biegeradius'; + case 'Fzv': return 'Zugkraft'; + case 'G': return 'Gewicht'; + case 'Ik_cond': return 'Kurzschlussstrom Leiter'; + case 'Ik_screen': return 'Kurzschlussstrom Schirm'; + case 'Ø': return 'Außen-Ø'; + case 'cap': return 'Kapazität'; + case 'X': return 'Reaktanz'; + case 'rated_volt': return 'Nennspannung'; + case 'D_screen': return 'Durchmesser über Schirm'; + case 'S_screen': return 'Metallischer Schirm'; + case 'cross_section': return 'Querschnitt'; + case 'shape': return 'Leiterform'; + case 'Ibl': return 'Strombelastbarkeit (Luft)'; + case 'Ibe': return 'Strombelastbarkeit (Erde)'; + case 'Cond': return 'Leitermaterial'; default: return formatExcelHeaderLabel(args.excelKey); } @@ -309,6 +408,26 @@ function metaFullLabel(args: { key: string; excelKey: string; locale: 'en' | 'de return 'CPR class'; case 'flame': return 'Flame retardant'; + case 'DI': return 'Diameter over insulation'; + case 'RI': return 'DC resistance (20 °C)'; + case 'Wi': return 'Insulation thickness'; + case 'Wm': return 'Sheath thickness'; + case 'Rbv': return 'Bending radius'; + case 'Fzv': return 'Pulling force'; + case 'G': return 'Weight'; + case 'Ik_cond': return 'Short-circuit current conductor'; + case 'Ik_screen': return 'Short-circuit current screen'; + case 'Ø': return 'Outer diameter'; + case 'cap': return 'Capacitance'; + case 'X': return 'Reactance'; + case 'rated_volt': return 'Rated voltage'; + case 'D_screen': return 'Diameter over screen'; + case 'S_screen': return 'Metallic screen'; + case 'cross_section': return 'Cross-section'; + case 'shape': return 'Conductor shape'; + case 'Ibl': return 'Current rating (air)'; + case 'Ibe': return 'Current rating (ground)'; + case 'Cond': return 'Conductor material'; default: return formatExcelHeaderLabel(args.excelKey); } @@ -403,7 +522,7 @@ function translateAbbreviation(abbrev: string, description: string, locale: 'en' case 'Cond': return 'Leiter'; case 'shape': - return 'Form'; + return 'Leiterform'; case 'cap': return 'Kapazität'; case 'X': @@ -701,7 +820,7 @@ function buildExcelModel(args: { product: ProductData; locale: 'en' | 'de' }): B 'Mantelmaterial', 'Mantelfarbe', 'Flammwidrigkeit', - 'UV-bestandig', + 'UV-beständig', 'Max. zulässige Leitertemperatur', 'Zul. Kabelaußentemperatur, fest verlegt', 'Zul. Kabelaußentemperatur, in Bewegung', @@ -871,6 +990,7 @@ function buildExcelModel(args: { product: ProductData; locale: 'en' | 'de' }): B } function isMediumVoltageProduct(product: ProductData): boolean { + if (product.voltageType === 'medium-voltage') return true; const hay = [product.slug, product.path, product.translationKey, ...(product.categories || []).map(c => c.name)] .filter(Boolean) .join(' '); @@ -991,7 +1111,7 @@ function buildMediumVoltageCrossSectionTableFromNewExcel(args: { return { key: col.colKey, // Use the abbreviated title from the first row as the table header. - label: normalizeValue(col.colKey), + label: denseAbbrevLabel({ key: col.colKey, locale: args.locale, unit: col.unit }) || normalizeValue(col.colKey), get: (rowIndex: number) => { const srcRowIndex = indices[rowIndex]; const raw = normalizeValue(String((mv.rows[srcRowIndex] as Record)?.[col.colKey] ?? '')); @@ -1009,7 +1129,7 @@ function buildMediumVoltageCrossSectionTableFromNewExcel(args: { export function buildDatasheetModel(args: { product: ProductData; locale: 'en' | 'de' }): DatasheetModel { const labels = getLabels(args.locale); const categoriesLine = (args.product.categories || []).map(c => stripHtml(c.name)).join(' • '); - const descriptionText = stripHtml(args.product.shortDescriptionHtml || args.product.descriptionHtml || ''); + const descriptionText = stripHtml(args.product.applicationHtml || ''); const heroSrc = resolveMediaToLocalPath(args.product.featuredImage || args.product.images?.[0] || null); const productUrl = getProductUrl(args.product); @@ -1053,22 +1173,71 @@ export function buildDatasheetModel(args: { product: ProductData; locale: 'en' | productUrl, }, labels, - technicalItems: [ - ...(excelModel.ok ? excelModel.technicalItems : []), - ...(isMediumVoltageProduct(args.product) - ? args.locale === 'de' - ? [ - { label: 'Prüfspannung 6/10 kV', value: '21 kV' }, - { label: 'Prüfspannung 12/20 kV', value: '42 kV' }, - { label: 'Prüfspannung 18/30 kV', value: '63 kV' }, - ] - : [ - { label: 'Test voltage 6/10 kV', value: '21 kV' }, - { label: 'Test voltage 12/20 kV', value: '42 kV' }, - { label: 'Test voltage 18/30 kV', value: '63 kV' }, - ] - : []), - ], + technicalItems: (() => { + if (!isMediumVoltageProduct(args.product)) { + return excelModel.ok ? excelModel.technicalItems : []; + } + + const pn = normalizeDesignation(args.product.name || ''); + const isAl = /^NA/.test(pn); + const isFL = pn.includes('FL'); + const isF = !isFL && pn.includes('F'); + + const findExcelVal = (labelPart: string) => { + const found = excelModel.technicalItems.find(it => it.label.toLowerCase().includes(labelPart.toLowerCase())); + return found ? found.value : null; + }; + + const items: KeyValueItem[] = []; + if (args.locale === 'de') { + items.push({ label: 'Leitermaterial', value: isAl ? 'Aluminium' : 'Kupfer' }); + items.push({ label: 'Leiterklasse', value: isAl ? 'Klasse 1' : 'Klasse 2 mehrdrähtig' }); + items.push({ label: 'Aderisolation', value: 'VPE DIX8' }); + items.push({ label: 'Feldsteuerung', value: 'innere und äußere Leitschicht aus halbleitendem Kunststoff - 3-fach-extrudiert' }); + items.push({ label: 'Schirm', value: 'Kupferdrähte + Querleitwendel' }); + items.push({ label: 'Längswasserdichtigkeit', value: (isF || isFL) ? 'ja, mit Quellvliess' : 'nein' }); + items.push({ label: 'Querwasserdichtigkeit', value: isFL ? 'ja, Al-Band' : 'nein' }); + items.push({ label: 'Mantelmaterial', value: 'Polyethylen DMP2' }); + items.push({ label: 'Mantelfarbe', value: 'schwarz' }); + items.push({ label: 'Flammwidrigkeit', value: 'nein' }); + items.push({ label: 'UV-beständig', value: 'ja' }); + items.push({ label: 'Max. zulässige Leitertemperatur', value: findExcelVal('Leitertemperatur') || '90°C' }); + items.push({ label: 'Zul. Kabelaußentemperatur, fest verlegt', value: findExcelVal('fest verlegt') || '70°C' }); + items.push({ label: 'Zul. Kabelaußentemperatur, in Bewegung', value: findExcelVal('in Bewegung') || '-20 °C bis +70 °C' }); + items.push({ label: 'Maximale Kurzschlußtemperatur', value: findExcelVal('Kurzschlußtemperatur') || '+250 °C' }); + items.push({ label: 'Min. Biegeradius, fest verlegt', value: findExcelVal('Biegeradius') || '15 facher Durchmesser' }); + items.push({ label: 'Mindesttemperatur Verlegung', value: findExcelVal('Verlegung') || '-5 °C' }); + items.push({ label: 'Metermarkierung', value: 'ja' }); + items.push({ label: 'Teilentladung', value: findExcelVal('Teilentladung') || '2 pC' }); + items.push({ label: 'Prüfspannung 6/10 kV', value: '21 kV' }); + items.push({ label: 'Prüfspannung 12/20 kV', value: '42 kV' }); + items.push({ label: 'Prüfspannung 18/30 kV', value: '63 kV' }); + } else { + items.push({ label: 'Conductor material', value: isAl ? 'Aluminum' : 'Copper' }); + items.push({ label: 'Conductor class', value: isAl ? 'Class 1' : 'Class 2 stranded' }); + items.push({ label: 'Core insulation', value: 'XLPE DIX8' }); + items.push({ label: 'Field control', value: 'inner and outer semiconducting layer made of semiconducting plastic - 3-fold extruded' }); + items.push({ label: 'Screen', value: 'copper wires + transverse conductive helix' }); + items.push({ label: 'Longitudinal water tightness', value: (isF || isFL) ? 'yes, with swelling tape' : 'no' }); + items.push({ label: 'Transverse water tightness', value: isFL ? 'yes, Al-tape' : 'no' }); + items.push({ label: 'Sheath material', value: 'Polyethylene DMP2' }); + items.push({ label: 'Sheath color', value: 'black' }); + items.push({ label: 'Flame retardancy', value: 'no' }); + items.push({ label: 'UV resistant', value: 'yes' }); + items.push({ label: 'Max. permissible conductor temperature', value: findExcelVal('conductor temperature') || '90°C' }); + items.push({ label: 'Permissible cable outer temperature, fixed', value: findExcelVal('fixed') || '70°C' }); + items.push({ label: 'Permissible cable outer temperature, in motion', value: findExcelVal('in motion') || '-20 °C to +70 °C' }); + items.push({ label: 'Maximum short-circuit temperature', value: findExcelVal('short-circuit temperature') || '+250 °C' }); + items.push({ label: 'Min. bending radius, fixed', value: findExcelVal('bending radius') || '15 times diameter' }); + items.push({ label: 'Minimum laying temperature', value: findExcelVal('laying temperature') || '-5 °C' }); + items.push({ label: 'Meter marking', value: 'yes' }); + items.push({ label: 'Partial discharge', value: findExcelVal('Partial discharge') || '2 pC' }); + items.push({ label: 'Test voltage 6/10 kV', value: '21 kV' }); + items.push({ label: 'Test voltage 12/20 kV', value: '42 kV' }); + items.push({ label: 'Test voltage 18/30 kV', value: '63 kV' }); + } + return items; + })(), voltageTables, legendItems: crossSectionModel.legendItems || [], }; diff --git a/scripts/pdf/model/types.ts b/scripts/pdf/model/types.ts index 5919a1d8..c35b737e 100644 --- a/scripts/pdf/model/types.ts +++ b/scripts/pdf/model/types.ts @@ -3,6 +3,7 @@ export interface ProductData { name: string; shortDescriptionHtml: string; descriptionHtml: string; + applicationHtml: string; images: string[]; featuredImage: string | null; sku: string; diff --git a/scripts/pdf/model/utils.ts b/scripts/pdf/model/utils.ts index 6992436e..37a7e7cc 100644 --- a/scripts/pdf/model/utils.ts +++ b/scripts/pdf/model/utils.ts @@ -54,7 +54,7 @@ export function getLabels(locale: 'en' | 'de') { return { en: { datasheet: 'Technical Datasheet', - description: 'DESCRIPTION', + description: 'APPLICATION', technicalData: 'TECHNICAL DATA', crossSection: 'Cross-sections/Voltage', sku: 'SKU', @@ -62,7 +62,7 @@ export function getLabels(locale: 'en' | 'de') { }, de: { datasheet: 'Technisches Datenblatt', - description: 'BESCHREIBUNG', + description: 'ANWENDUNG', technicalData: 'TECHNISCHE DATEN', crossSection: 'Querschnitte/Spannung', sku: 'ARTIKELNUMMER', diff --git a/scripts/pdf/react-pdf/DatasheetDocument.tsx b/scripts/pdf/react-pdf/DatasheetDocument.tsx index 36f271c2..c2291540 100644 --- a/scripts/pdf/react-pdf/DatasheetDocument.tsx +++ b/scripts/pdf/react-pdf/DatasheetDocument.tsx @@ -21,61 +21,67 @@ export function DatasheetDocument(props: { model: DatasheetModel; assets: Assets const headerTitle = model.labels.datasheet; // Dense tables require compact headers (no wrapping). Use standard abbreviations. - const firstColLabel = model.locale === 'de' ? 'Adern & QS' : 'Cores & CS'; + const firstColLabel = model.locale === 'de' ? 'Adern & Querschnitt' : 'Cores & Cross-section'; return ( -
-