+
PDF Datasheet
-
+
{t('downloadDatasheet')}
@@ -69,9 +69,9 @@ export default function DatasheetDownload({ datasheetPath, className }: Datashee
{/* Arrow Icon */}
-
+
+ );
+}
diff --git a/components/Footer.tsx b/components/Footer.tsx
index 53bf0c67..52b03b96 100644
--- a/components/Footer.tsx
+++ b/components/Footer.tsx
@@ -6,6 +6,7 @@ import { useTranslations, useLocale } from 'next-intl';
import { Container } from './ui';
import { useAnalytics } from './analytics/useAnalytics';
import { AnalyticsEvents } from './analytics/analytics-events';
+import BrochureCTA from './BrochureCTA';
export default function Footer() {
const t = useTranslations('Footer');
@@ -187,6 +188,9 @@ export default function Footer() {
{navT('contact')}
+
+
+
diff --git a/components/PayloadRichText.tsx b/components/PayloadRichText.tsx
index c3de9da9..9a1b928b 100644
--- a/components/PayloadRichText.tsx
+++ b/components/PayloadRichText.tsx
@@ -51,27 +51,74 @@ const jsxConverters: JSXConverters = {
heading: ({ node, nodesToJSX }: any) => {
const children = nodesToJSX({ nodes: node.children });
const tag = node?.tag;
+
+ // Extract text to generate an ID for the TOC
+ // Lexical children might contain various nodes; we need a plain text representation
+ const textContent = node.children ? node.children.map((c: any) => c.text || '').join('') : '';
+ const id = textContent
+ ? textContent
+ .toLowerCase()
+ .replace(/Γ€/g, 'ae')
+ .replace(/ΓΆ/g, 'oe')
+ .replace(/ΓΌ/g, 'ue')
+ .replace(/Γ/g, 'ss')
+ .replace(/[*_`]/g, '')
+ .replace(/[^\w\s-]/g, '')
+ .replace(/\s+/g, '-')
+ .replace(/-+/g, '-')
+ .replace(/^-+|-+$/g, '')
+ : undefined;
+
if (tag === 'h1')
return (
-
{children}
+
+ {children}
+
);
if (tag === 'h2')
return (
-
{children}
+
+ {children}
+
);
if (tag === 'h3')
return (
-
{children}
+
+ {children}
+
);
if (tag === 'h4')
return (
-
{children}
+
+ {children}
+
);
if (tag === 'h5')
return (
-
{children}
+
+ {children}
+
);
- return
{children}
;
+ return (
+
+ {children}
+
+ );
},
list: ({ node, nodesToJSX }: any) => {
const children = nodesToJSX({ nodes: node.children });
@@ -95,18 +142,18 @@ const jsxConverters: JSXConverters = {
const children = nodesToJSX({ nodes: node.children });
if (node?.checked != null) {
return (
-
+
- {children}
+ {children}
);
}
- return
{children};
+ return
{children};
},
quote: ({ node, nodesToJSX }: any) => {
const children = nodesToJSX({ nodes: node.children });
diff --git a/components/ProductSidebar.tsx b/components/ProductSidebar.tsx
index 14c8a0af..d8a32d39 100644
--- a/components/ProductSidebar.tsx
+++ b/components/ProductSidebar.tsx
@@ -4,6 +4,7 @@ import Image from 'next/image';
import { useTranslations } from 'next-intl';
import RequestQuoteForm from '@/components/RequestQuoteForm';
import DatasheetDownload from '@/components/DatasheetDownload';
+import ExcelDownload from '@/components/ExcelDownload';
import Scribble from '@/components/Scribble';
import { cn } from '@/components/ui/utils';
@@ -11,6 +12,7 @@ interface ProductSidebarProps {
productName: string;
productImage?: string;
datasheetPath?: string | null;
+ excelPath?: string | null;
className?: string;
}
@@ -18,6 +20,7 @@ export default function ProductSidebar({
productName,
productImage,
datasheetPath,
+ excelPath,
className,
}: ProductSidebarProps) {
const t = useTranslations('Products');
@@ -70,6 +73,9 @@ export default function ProductSidebar({
{/* Datasheet Download */}
{datasheetPath &&
}
+
+ {/* Excel Download β right below datasheet */}
+ {excelPath &&
}
);
}
diff --git a/components/ProductTechnicalData.tsx b/components/ProductTechnicalData.tsx
index d3672e87..dc4f2bfd 100644
--- a/components/ProductTechnicalData.tsx
+++ b/components/ProductTechnicalData.tsx
@@ -2,6 +2,7 @@
import React, { useState } from 'react';
import { useTranslations } from 'next-intl';
+import { formatTechnicalValue } from '@/lib/utils/technical';
interface KeyValueItem {
label: string;
@@ -45,22 +46,40 @@ export default function ProductTechnicalData({ data }: ProductTechnicalDataProps
General Data
-
- {technicalItems.map((item, idx) => (
-
-
-
- {item.label}
-
- -
- {item.value}{' '}
- {item.unit && (
-
- {item.unit}
-
- )}
-
-
- ))}
+
+ {technicalItems.map((item, idx) => {
+ const formatted = formatTechnicalValue(item.value);
+ return (
+
+
-
+ {item.label}
+
+
-
+ {formatted.isList ? (
+
+ {formatted.parts.map((p, pIdx) => (
+
+ {p}
+
+ ))}
+
+ ) : (
+ <>
+ {item.value}{' '}
+ {item.unit && (
+
+ {item.unit}
+
+ )}
+ >
+ )}
+
+
+ );
+ })}
)}
@@ -77,7 +96,7 @@ export default function ProductTechnicalData({ data }: ProductTechnicalDataProps