diff --git a/backstop.config.cjs b/backstop.config.cjs index 38a9fa6b..d5988997 100644 --- a/backstop.config.cjs +++ b/backstop.config.cjs @@ -1,4 +1,6 @@ -/* eslint-disable */ +const BASE_URL = process.env.TEST_URL || 'http://localhost:3000'; +const REFERENCE_URL = process.env.REFERENCE_URL || 'https://klz-cables.com'; + module.exports = { id: 'klz-cables', viewports: [ @@ -18,13 +20,13 @@ module.exports = { height: 900, }, ], - onBeforeScript: 'puppet/onBefore.js', - onReadyScript: 'puppet/onReady.js', + onBeforeScript: 'puppet/onBefore.cjs', + onReadyScript: 'puppet/onReady.cjs', scenarios: [ { label: 'Homepage', - url: `${process.env.TEST_URL || 'http://host.docker.internal:3000'}/`, - referenceUrl: '', + url: `${BASE_URL}/`, + referenceUrl: `${REFERENCE_URL}/`, readyEvent: '', readySelector: '', delay: 500, @@ -41,7 +43,8 @@ module.exports = { }, { label: '404 Error Page', - url: `${process.env.TEST_URL || 'http://host.docker.internal:3000'}/this-page-does-not-exist`, + url: `${BASE_URL}/this-page-does-not-exist`, + referenceUrl: `${REFERENCE_URL}/this-page-does-not-exist`, delay: 500, misMatchThreshold: 0.1, }, @@ -53,7 +56,7 @@ module.exports = { html_report: 'backstop_data/html_report', ci_report: 'backstop_data/ci_report', }, - report: process.env.CI ? ['CI'] : ['browser'], + report: process.env.CI ? ['CI', 'json'] : ['browser'], engine: 'puppeteer', engineOptions: { args: ['--no-sandbox', '--disable-setuid-sandbox'], diff --git a/backstop_data/engine_scripts/puppet/onBefore.js b/backstop_data/engine_scripts/puppet/onBefore.cjs similarity index 100% rename from backstop_data/engine_scripts/puppet/onBefore.js rename to backstop_data/engine_scripts/puppet/onBefore.cjs diff --git a/backstop_data/engine_scripts/puppet/onReady.js b/backstop_data/engine_scripts/puppet/onReady.cjs similarity index 100% rename from backstop_data/engine_scripts/puppet/onReady.js rename to backstop_data/engine_scripts/puppet/onReady.cjs diff --git a/components/ContactForm.tsx b/components/ContactForm.tsx index c9e6d130..47116404 100644 --- a/components/ContactForm.tsx +++ b/components/ContactForm.tsx @@ -148,7 +148,6 @@ export default function ContactForm() { autoComplete="name" enterKeyHint="next" onFocus={() => handleFocus('contact-name')} - aria-label={t('form.name')} required /> @@ -163,7 +162,6 @@ export default function ContactForm() { enterKeyHint="next" placeholder={t('form.emailPlaceholder')} onFocus={() => handleFocus('contact-email')} - aria-label={t('form.email')} required /> @@ -176,7 +174,6 @@ export default function ContactForm() { enterKeyHint="send" placeholder={t('form.messagePlaceholder')} onFocus={() => handleFocus('contact-message')} - aria-label={t('form.message')} required /> diff --git a/components/Footer.tsx b/components/Footer.tsx index 294c67b5..1a5082df 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -19,6 +19,7 @@ export default function Footer() {
+

Footer Navigation

{/* Brand Column */}
diff --git a/components/RequestQuoteForm.tsx b/components/RequestQuoteForm.tsx index 3db863da..1efffbc8 100644 --- a/components/RequestQuoteForm.tsx +++ b/components/RequestQuoteForm.tsx @@ -172,7 +172,6 @@ export default function RequestQuoteForm({ productName }: RequestQuoteFormProps) onChange={(e) => setEmail(e.target.value)} onFocus={() => handleFocus('quote-email')} placeholder={t('email')} - aria-label={t('email')} className="h-9 text-xs !mt-0" />
@@ -186,7 +185,6 @@ export default function RequestQuoteForm({ productName }: RequestQuoteFormProps) onChange={(e) => setRequest(e.target.value)} onFocus={() => handleFocus('quote-request')} placeholder={t('message')} - aria-label={t('message')} className="text-xs !mt-0" />
diff --git a/components/home/ProductCategories.tsx b/components/home/ProductCategories.tsx index 03ecfa47..f3e495a7 100644 --- a/components/home/ProductCategories.tsx +++ b/components/home/ProductCategories.tsx @@ -43,7 +43,7 @@ export default function ProductCategories() { return (
-

{t('title')}

+ {t('title') &&

{t('title')}

}
{categories.map((category, idx) => ( -## ### Materialien und ihre Wiederverwertung Kabeltrommeln bestehen aus unterschiedlichen Materialien, die jeweils verschiedene Recyclingmöglichkeiten bieten. Eine gezielte Rückführung hängt davon ab, ob das Material wiederverwertet oder weiterverarbeitet werden kann. diff --git a/data/blog/de/zukunft-sichern-mit-h1z2z2-k-unser-solarkabel-zur-intersolar-2025.mdx b/data/blog/de/zukunft-sichern-mit-h1z2z2-k-unser-solarkabel-zur-intersolar-2025.mdx index c1e7f696..5849c900 100644 --- a/data/blog/de/zukunft-sichern-mit-h1z2z2-k-unser-solarkabel-zur-intersolar-2025.mdx +++ b/data/blog/de/zukunft-sichern-mit-h1z2z2-k-unser-solarkabel-zur-intersolar-2025.mdx @@ -94,7 +94,6 @@ Ein Pluspunkt des H1Z2Z2-K ist seine Eignung zur direkten Erdverlegung – ohne **Wichtig:** Für Projekte ab mehreren hundert Metern lohnt sich eine Spannungsfallberechnung – 6mm² ist nicht immer automatisch die optimale Wahl.
-## ## FAQ: Die häufigsten Fragen rund um H1Z2Z2-K Solarkabel **Was bedeutet H1Z2Z2-K?**
Die Bezeichnung steht für einen Kabeltyp mit bestimmten Isoliermaterialien und Eigenschaften laut EN 50618, geeignet für DC-Strom bis 1500 V. **Ist das Kabel für Erdverlegung zugelassen?**
Ja, inklusive direkter Erdverlegung ohne zusätzliche Schutzrohre. diff --git a/data/blog/en/securing-the-future-with-h1z2z2-k-our-solar-cable-for-intersolar-2025.mdx b/data/blog/en/securing-the-future-with-h1z2z2-k-our-solar-cable-for-intersolar-2025.mdx index 97458d39..861cd01b 100644 --- a/data/blog/en/securing-the-future-with-h1z2z2-k-our-solar-cable-for-intersolar-2025.mdx +++ b/data/blog/en/securing-the-future-with-h1z2z2-k-our-solar-cable-for-intersolar-2025.mdx @@ -94,7 +94,6 @@ One major advantage of the H1Z2Z2-K is its suitability for direct burial – wit **Important:** For projects spanning several hundred meters, a voltage drop calculation is worthwhile – 6mm² isn’t always the best fit by default.
-## ## FAQ: The most frequently asked questions about H1Z2Z2-K solar cables **What does H1Z2Z2-K mean?**
This designation refers to a cable type with specific insulation materials and properties according to EN 50618, suitable for DC voltage up to 1500 V. **Is the cable approved for underground installation?**
Yes, including direct burial without additional protective conduits. diff --git a/data/products/de/n2xfk2y.mdx b/data/products/de/hochspannungskabel/n2xfk2y.mdx similarity index 100% rename from data/products/de/n2xfk2y.mdx rename to data/products/de/hochspannungskabel/n2xfk2y.mdx diff --git a/data/products/de/n2xfkld2y.mdx b/data/products/de/hochspannungskabel/n2xfkld2y.mdx similarity index 100% rename from data/products/de/n2xfkld2y.mdx rename to data/products/de/hochspannungskabel/n2xfkld2y.mdx diff --git a/data/products/de/n2xsfl2y-hv.mdx b/data/products/de/hochspannungskabel/n2xsfl2y-hv.mdx similarity index 100% rename from data/products/de/n2xsfl2y-hv.mdx rename to data/products/de/hochspannungskabel/n2xsfl2y-hv.mdx diff --git a/data/products/de/na2xfk2y.mdx b/data/products/de/hochspannungskabel/na2xfk2y.mdx similarity index 100% rename from data/products/de/na2xfk2y.mdx rename to data/products/de/hochspannungskabel/na2xfk2y.mdx diff --git a/data/products/de/na2xfkld2y.mdx b/data/products/de/hochspannungskabel/na2xfkld2y.mdx similarity index 100% rename from data/products/de/na2xfkld2y.mdx rename to data/products/de/hochspannungskabel/na2xfkld2y.mdx diff --git a/data/products/de/na2xsfl2y-hv.mdx b/data/products/de/hochspannungskabel/na2xsfl2y-hv.mdx similarity index 100% rename from data/products/de/na2xsfl2y-hv.mdx rename to data/products/de/hochspannungskabel/na2xsfl2y-hv.mdx diff --git a/data/products/de/n2xs2y.mdx b/data/products/de/mittelspannungskabel/n2xs2y.mdx similarity index 100% rename from data/products/de/n2xs2y.mdx rename to data/products/de/mittelspannungskabel/n2xs2y.mdx diff --git a/data/products/de/n2xsf2y.mdx b/data/products/de/mittelspannungskabel/n2xsf2y.mdx similarity index 100% rename from data/products/de/n2xsf2y.mdx rename to data/products/de/mittelspannungskabel/n2xsf2y.mdx diff --git a/data/products/de/n2xsfl2y-mv.mdx b/data/products/de/mittelspannungskabel/n2xsfl2y-mv.mdx similarity index 100% rename from data/products/de/n2xsfl2y-mv.mdx rename to data/products/de/mittelspannungskabel/n2xsfl2y-mv.mdx diff --git a/data/products/de/n2xsy.mdx b/data/products/de/mittelspannungskabel/n2xsy.mdx similarity index 100% rename from data/products/de/n2xsy.mdx rename to data/products/de/mittelspannungskabel/n2xsy.mdx diff --git a/data/products/de/na2xs2y.mdx b/data/products/de/mittelspannungskabel/na2xs2y.mdx similarity index 100% rename from data/products/de/na2xs2y.mdx rename to data/products/de/mittelspannungskabel/na2xs2y.mdx diff --git a/data/products/de/na2xsf2y.mdx b/data/products/de/mittelspannungskabel/na2xsf2y.mdx similarity index 100% rename from data/products/de/na2xsf2y.mdx rename to data/products/de/mittelspannungskabel/na2xsf2y.mdx diff --git a/data/products/de/na2xsfl2y-mv.mdx b/data/products/de/mittelspannungskabel/na2xsfl2y-mv.mdx similarity index 100% rename from data/products/de/na2xsfl2y-mv.mdx rename to data/products/de/mittelspannungskabel/na2xsfl2y-mv.mdx diff --git a/data/products/de/na2xsy.mdx b/data/products/de/mittelspannungskabel/na2xsy.mdx similarity index 100% rename from data/products/de/na2xsy.mdx rename to data/products/de/mittelspannungskabel/na2xsy.mdx diff --git a/data/products/de/n2x2y.mdx b/data/products/de/niederspannungskabel/n2x2y.mdx similarity index 100% rename from data/products/de/n2x2y.mdx rename to data/products/de/niederspannungskabel/n2x2y.mdx diff --git a/data/products/de/n2xy.mdx b/data/products/de/niederspannungskabel/n2xy.mdx similarity index 100% rename from data/products/de/n2xy.mdx rename to data/products/de/niederspannungskabel/n2xy.mdx diff --git a/data/products/de/na2x2y.mdx b/data/products/de/niederspannungskabel/na2x2y.mdx similarity index 100% rename from data/products/de/na2x2y.mdx rename to data/products/de/niederspannungskabel/na2x2y.mdx diff --git a/data/products/de/na2xy.mdx b/data/products/de/niederspannungskabel/na2xy.mdx similarity index 100% rename from data/products/de/na2xy.mdx rename to data/products/de/niederspannungskabel/na2xy.mdx diff --git a/data/products/de/nay2y.mdx b/data/products/de/niederspannungskabel/nay2y.mdx similarity index 100% rename from data/products/de/nay2y.mdx rename to data/products/de/niederspannungskabel/nay2y.mdx diff --git a/data/products/de/naycwy.mdx b/data/products/de/niederspannungskabel/naycwy.mdx similarity index 100% rename from data/products/de/naycwy.mdx rename to data/products/de/niederspannungskabel/naycwy.mdx diff --git a/data/products/de/nayy.mdx b/data/products/de/niederspannungskabel/nayy.mdx similarity index 100% rename from data/products/de/nayy.mdx rename to data/products/de/niederspannungskabel/nayy.mdx diff --git a/data/products/de/ny2y.mdx b/data/products/de/niederspannungskabel/ny2y.mdx similarity index 100% rename from data/products/de/ny2y.mdx rename to data/products/de/niederspannungskabel/ny2y.mdx diff --git a/data/products/de/nycwy.mdx b/data/products/de/niederspannungskabel/nycwy.mdx similarity index 100% rename from data/products/de/nycwy.mdx rename to data/products/de/niederspannungskabel/nycwy.mdx diff --git a/data/products/de/nyy.mdx b/data/products/de/niederspannungskabel/nyy.mdx similarity index 100% rename from data/products/de/nyy.mdx rename to data/products/de/niederspannungskabel/nyy.mdx diff --git a/data/products/de/h1z2z2-k.mdx b/data/products/de/solarkabel/h1z2z2-k.mdx similarity index 100% rename from data/products/de/h1z2z2-k.mdx rename to data/products/de/solarkabel/h1z2z2-k.mdx diff --git a/data/products/en/n2xfk2y.mdx b/data/products/en/high-voltage-cables/n2xfk2y.mdx similarity index 100% rename from data/products/en/n2xfk2y.mdx rename to data/products/en/high-voltage-cables/n2xfk2y.mdx diff --git a/data/products/en/n2xfkld2y.mdx b/data/products/en/high-voltage-cables/n2xfkld2y.mdx similarity index 100% rename from data/products/en/n2xfkld2y.mdx rename to data/products/en/high-voltage-cables/n2xfkld2y.mdx diff --git a/data/products/en/n2xsfl2y-hv.mdx b/data/products/en/high-voltage-cables/n2xsfl2y-hv.mdx similarity index 100% rename from data/products/en/n2xsfl2y-hv.mdx rename to data/products/en/high-voltage-cables/n2xsfl2y-hv.mdx diff --git a/data/products/en/na2xfk2y.mdx b/data/products/en/high-voltage-cables/na2xfk2y.mdx similarity index 100% rename from data/products/en/na2xfk2y.mdx rename to data/products/en/high-voltage-cables/na2xfk2y.mdx diff --git a/data/products/en/na2xfkld2y.mdx b/data/products/en/high-voltage-cables/na2xfkld2y.mdx similarity index 100% rename from data/products/en/na2xfkld2y.mdx rename to data/products/en/high-voltage-cables/na2xfkld2y.mdx diff --git a/data/products/en/na2xsfl2y-hv.mdx b/data/products/en/high-voltage-cables/na2xsfl2y-hv.mdx similarity index 100% rename from data/products/en/na2xsfl2y-hv.mdx rename to data/products/en/high-voltage-cables/na2xsfl2y-hv.mdx diff --git a/data/products/en/n2x2y.mdx b/data/products/en/low-voltage-cables/n2x2y.mdx similarity index 100% rename from data/products/en/n2x2y.mdx rename to data/products/en/low-voltage-cables/n2x2y.mdx diff --git a/data/products/en/n2xy.mdx b/data/products/en/low-voltage-cables/n2xy.mdx similarity index 100% rename from data/products/en/n2xy.mdx rename to data/products/en/low-voltage-cables/n2xy.mdx diff --git a/data/products/en/na2x2y.mdx b/data/products/en/low-voltage-cables/na2x2y.mdx similarity index 100% rename from data/products/en/na2x2y.mdx rename to data/products/en/low-voltage-cables/na2x2y.mdx diff --git a/data/products/en/na2xy.mdx b/data/products/en/low-voltage-cables/na2xy.mdx similarity index 100% rename from data/products/en/na2xy.mdx rename to data/products/en/low-voltage-cables/na2xy.mdx diff --git a/data/products/en/nay2y.mdx b/data/products/en/low-voltage-cables/nay2y.mdx similarity index 100% rename from data/products/en/nay2y.mdx rename to data/products/en/low-voltage-cables/nay2y.mdx diff --git a/data/products/en/naycwy.mdx b/data/products/en/low-voltage-cables/naycwy.mdx similarity index 100% rename from data/products/en/naycwy.mdx rename to data/products/en/low-voltage-cables/naycwy.mdx diff --git a/data/products/en/nayy.mdx b/data/products/en/low-voltage-cables/nayy.mdx similarity index 100% rename from data/products/en/nayy.mdx rename to data/products/en/low-voltage-cables/nayy.mdx diff --git a/data/products/en/ny2y.mdx b/data/products/en/low-voltage-cables/ny2y.mdx similarity index 100% rename from data/products/en/ny2y.mdx rename to data/products/en/low-voltage-cables/ny2y.mdx diff --git a/data/products/en/nycwy.mdx b/data/products/en/low-voltage-cables/nycwy.mdx similarity index 100% rename from data/products/en/nycwy.mdx rename to data/products/en/low-voltage-cables/nycwy.mdx diff --git a/data/products/en/nyy.mdx b/data/products/en/low-voltage-cables/nyy.mdx similarity index 100% rename from data/products/en/nyy.mdx rename to data/products/en/low-voltage-cables/nyy.mdx diff --git a/data/products/en/n2xs2y.mdx b/data/products/en/medium-voltage-cables/n2xs2y.mdx similarity index 100% rename from data/products/en/n2xs2y.mdx rename to data/products/en/medium-voltage-cables/n2xs2y.mdx diff --git a/data/products/en/n2xsf2y.mdx b/data/products/en/medium-voltage-cables/n2xsf2y.mdx similarity index 100% rename from data/products/en/n2xsf2y.mdx rename to data/products/en/medium-voltage-cables/n2xsf2y.mdx diff --git a/data/products/en/n2xsfl2y-mv.mdx b/data/products/en/medium-voltage-cables/n2xsfl2y-mv.mdx similarity index 100% rename from data/products/en/n2xsfl2y-mv.mdx rename to data/products/en/medium-voltage-cables/n2xsfl2y-mv.mdx diff --git a/data/products/en/n2xsy.mdx b/data/products/en/medium-voltage-cables/n2xsy.mdx similarity index 100% rename from data/products/en/n2xsy.mdx rename to data/products/en/medium-voltage-cables/n2xsy.mdx diff --git a/data/products/en/na2xs2y.mdx b/data/products/en/medium-voltage-cables/na2xs2y.mdx similarity index 100% rename from data/products/en/na2xs2y.mdx rename to data/products/en/medium-voltage-cables/na2xs2y.mdx diff --git a/data/products/en/na2xsf2y.mdx b/data/products/en/medium-voltage-cables/na2xsf2y.mdx similarity index 100% rename from data/products/en/na2xsf2y.mdx rename to data/products/en/medium-voltage-cables/na2xsf2y.mdx diff --git a/data/products/en/na2xsfl2y-mv.mdx b/data/products/en/medium-voltage-cables/na2xsfl2y-mv.mdx similarity index 100% rename from data/products/en/na2xsfl2y-mv.mdx rename to data/products/en/medium-voltage-cables/na2xsfl2y-mv.mdx diff --git a/data/products/en/na2xsy.mdx b/data/products/en/medium-voltage-cables/na2xsy.mdx similarity index 100% rename from data/products/en/na2xsy.mdx rename to data/products/en/medium-voltage-cables/na2xsy.mdx diff --git a/data/products/en/h1z2z2-k.mdx b/data/products/en/solar-cables/h1z2z2-k.mdx similarity index 100% rename from data/products/en/h1z2z2-k.mdx rename to data/products/en/solar-cables/h1z2z2-k.mdx diff --git a/next.config.mjs b/next.config.mjs index f0b00fc3..95ba8e14 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -348,6 +348,10 @@ const nextConfig = { } return [ + { + source: '/de/produkte', + destination: '/de/products', + }, { source: '/cms/:path*', destination: `${directusUrl}/:path*`, diff --git a/organize-products.js b/organize-products.js new file mode 100644 index 00000000..9391573d --- /dev/null +++ b/organize-products.js @@ -0,0 +1,35 @@ +const fs = require('fs'); +const path = require('path'); +const matter = require('gray-matter'); + +const locales = ['de', 'en']; + +function slugify(text) { + return text.toLowerCase().replace(/\s+/g, '-'); +} + +for (const locale of locales) { + const dir = path.join('data', 'products', locale); + const files = fs.readdirSync(dir).filter((f) => f.endsWith('.mdx')); + + for (const file of files) { + const filePath = path.join(dir, file); + const content = fs.readFileSync(filePath, 'utf8'); + const { data } = matter(content); + + if (data.categories && data.categories.length > 0) { + const category = slugify(data.categories[0]); + const targetDir = path.join(dir, category); + + if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + } + + const targetPath = path.join(targetDir, file); + fs.renameSync(filePath, targetPath); + console.log(`Moved ${file} -> ${category}/`); + } else { + console.warn(`Warning: No category found for ${file}`); + } + } +} diff --git a/scripts/check-html.ts b/scripts/check-html.ts index edad8959..8529b664 100644 --- a/scripts/check-html.ts +++ b/scripts/check-html.ts @@ -5,12 +5,12 @@ import * as path from 'path'; import { execSync } from 'child_process'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const limit = process.env.PAGESPEED_LIMIT ? parseInt(process.env.PAGESPEED_LIMIT) : 20; +const limit = process.env.PAGESPEED_LIMIT ? parseInt(process.env.PAGESPEED_LIMIT) : 0; // 0 means no limit const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; async function main() { console.log(`\n🚀 Starting HTML Validation for: ${targetUrl}`); - console.log(`📊 Limit: ${limit} pages\n`); + console.log(`📊 Limit: ${limit ? limit : 'None (Full Sitemap)'} pages\n`); try { const sitemapUrl = `${targetUrl.replace(/\/$/, '')}/sitemap.xml`; @@ -39,7 +39,7 @@ async function main() { process.exit(1); } - if (urls.length > limit) { + if (limit && urls.length > limit) { console.log( `⚠️ Too many pages (${urls.length}). Limiting to ${limit} representative pages.`, ); @@ -55,11 +55,16 @@ async function main() { console.log(`📥 Fetching HTML for ${urls.length} pages...`); for (let i = 0; i < urls.length; i++) { const u = urls[i]; - const res = await axios.get(u, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, - }); - const filename = `page-${i}.html`; - fs.writeFileSync(path.join(outputDir, filename), res.data); + try { + const res = await axios.get(u, { + headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + }); + const filename = `page-${i}.html`; + fs.writeFileSync(path.join(outputDir, filename), res.data); + } catch (err: any) { + console.error(`❌ HTTP Error fetching ${u}: ${err.message}`); + throw err; + } } console.log(`\n💻 Executing html-validate...`);