<!doctype html>
<html lang="nl">
<head>
<meta charset="UTF-8" />
<!-- Favicon for all browsers -->
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="icon" type="image/x-icon" href="/assets/images/maxsusico-DfJ4YSKo.ico" />
<link rel="shortcut icon" type="image/x-icon" href="/assets/images/maxsusico-DfJ4YSKo.ico" />
<!-- PNG favicons for different sizes -->
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" />
<!-- Apple Touch Icon for iOS devices -->
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<!-- Web App Manifest -->
<link rel="manifest" href="/manifest.json" />
<!-- Enhanced viewport for better mobile performance -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes" />
<meta name="google-site-verification" content="B3myXTBnWH0kvxnzcGfwfX1ftX4_2RRnvZxTOFrn8Qw" />
<!-- Performance optimizations -->
<meta http-equiv="Accept-CH" content="DPR, Viewport-Width, Width" />
<meta name="color-scheme" content="light" />
<!-- Primary Meta Tags - Will be overridden by React for specific pages -->
<title>Maatwerk Kasten & Garderobes Rotterdam | Inbouwkasten & Schuifdeurkasten | MaxSus</title>
<meta name="title" content="Maatwerk Kasten & Garderobes Rotterdam | Inbouwkasten & Schuifdeurkasten | MaxSus">
<meta name="description" content="✓ Specialist in maatwerk kasten, garderobes en opbergmeubels in Rotterdam ✓ Inbouwkasten, schuifdeurkasten, TV-meubels ✓ Gratis 3D ontwerp ✓ 20+ jaar ervaring ✓ Eigen productie">
<meta name="keywords" content="maatwerk kasten Rotterdam, garderobekasten op maat, inbouwkasten Den Haag, kast op maat Gouda, schuifdeurkasten Leiden, TV meubels maatwerk, opbergkasten Spijkenisse, MaxSus meubels ontwerp">
<meta name="author" content="MaxSus">
<meta name="theme-color" content="#B38B6D" />
<!-- Enhanced SEO Meta Tags -->
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta name="language" content="Dutch">
<meta name="revisit-after" content="7 days">
<meta name="geo.region" content="NL">
<meta name="geo.placename" content="Rotterdam">
<meta name="geo.position" content="51.9244;4.4777">
<meta name="ICBM" content="51.9244, 4.4777">
<!-- Open Graph / Facebook - Will be overridden by React for specific pages -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://maxsus.nl/">
<meta property="og:title" content="Maatwerk Kasten & Garderobes Rotterdam | Inbouwkasten & Schuifdeurkasten">
<meta property="og:description" content="Specialist in maatwerk kasten, garderobes en opbergmeubels in Rotterdam. Inbouwkasten, schuifdeurkasten, TV-meubels en meer op maat. Gratis 3D ontwerp en advies.">
<meta property="og:image" content="https://maxsus.nl/images/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:site_name" content="MaxSus Interieurbouw">
<meta property="og:locale" content="nl_NL">
<!-- Twitter - Will be overridden by React for specific pages -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://maxsus.nl/">
<meta property="twitter:title" content="Maatwerk Kasten Rotterdam | Garderobes & Inbouwkasten op Maat">
<meta property="twitter:description" content="Specialist in maatwerk kasten, garderobes en opbergmeubels. Inbouwkasten, schuifdeurkasten, TV-meubels op maat. Gratis 3D ontwerp en adviesgesprek.">
<meta property="twitter:image" content="https://maxsus.nl/images/og-image.png">
<!-- Canonical Link will be set by individual pages -->
<link rel="canonical" href="https://maxsus.nl/kasten-op-maat-rotterdam" id="canonical-link" />
<!-- Enhanced canonical URL script to prevent crawlers from getting wrong canonical -->
<script>
(function() {
// Immediately set canonical URL based on current path to prevent SEO issues
var canonicalLink = document.getElementById('canonical-link');
if (canonicalLink) {
var currentPath = window.location.pathname;
var cleanPath = currentPath === '/' ? '/' : currentPath.replace(/\/$/, '');
// Remove query parameters and fragments for clean canonical URLs
var canonicalUrl = 'https://maxsus.nl' + cleanPath;
// Set canonical URL immediately and force DOM update
canonicalLink.href = canonicalUrl;
// Add additional meta to strengthen canonical signal
var existingRobots = document.querySelector('meta[name="robots"]');
if (!existingRobots) {
var robotsMeta = document.createElement('meta');
robotsMeta.name = 'robots';
robotsMeta.content = 'index, follow, max-snippet:-1, max-image-preview:large';
document.head.appendChild(robotsMeta);
}
// Ensure no conflicting canonical tags exist
var allCanonicals = document.querySelectorAll('link[rel="canonical"]');
for (var i = 1; i < allCanonicals.length; i++) {
allCanonicals[i].remove();
}
}
})();
</script>
<!-- Additional Meta -->
<meta name="format-detection" content="telephone=no">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<!-- Enhanced preconnect for performance - ordered by priority -->
<link rel="preconnect" href="https://tvzgptbkofpbsidsyted.supabase.co" crossorigin>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://www.googletagmanager.com">
<link rel="preconnect" href="https://analytics.tiktok.com">
<link rel="preconnect" href="https://images.unsplash.com">
<link rel="preconnect" href="https://cdn.hoog.design">
<!-- DNS prefetch for external domains -->
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="dns-prefetch" href="//www.googletagmanager.com">
<link rel="dns-prefetch" href="//analytics.google.com">
<link rel="dns-prefetch" href="//analytics.tiktok.com">
<!-- Resource hints for better loading -->
<!-- Note: modulepreload hints for specific chunks will be added by Vite during build -->
<!-- Critical CSS inline placeholder (will be filled by build process) -->
<style id="critical-css">
/* Critical above-the-fold CSS will be inlined here during build */
body {
font-family: Inter, system-ui, -apple-system, sans-serif;
margin: 0;
background: #fff;
font-display: swap; /* Improve font loading performance */
}
.loading-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 9999;
background: #fff;
}
.loading-spinner {
width: 40px;
height: 40px;
border: 3px solid #f3f3f3;
border-top: 3px solid #B38B6D;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
/* Prevent layout shift for common elements */
img { max-width: 100%; height: auto; }
.hero-section { min-height: 60vh; }
.nav-container { height: 80px; }
/* Font display optimization */
@font-face {
font-family: 'Inter';
font-display: swap;
}
@font-face {
font-family: 'Playfair Display';
font-display: swap;
}
</style>
<!-- Optimized font loading to eliminate render-blocking -->
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Playfair+Display:wght@400;600&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Playfair+Display:wght@400;600&display=swap" media="print" onload="this.media='all'; this.onload=null;">
<noscript>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Playfair+Display:wght@400;600&display=swap">
</noscript>
<!-- Schema.org structured data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "MaxSus Interieurbouw",
"url": "https://maxsus.nl",
"logo": "https://maxsus.nl/images/logo-structured-data.svg",
"description": "Specialist in maatwerk kasten, garderobes en opbergmeubels in Rotterdam en omgeving. Inbouwkasten, schuifdeurkasten, TV-meubels en boekenkasten. 20+ jaar ervaring.",
"address": {
"@type": "PostalAddress",
"streetAddress": "Schuttevaerweg 79",
"addressLocality": "Rotterdam",
"postalCode": "3044 BA",
"addressRegion": "Zuid-Holland",
"addressCountry": "NL"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:30",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"description": "Op afspraak"
}
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"telephone": "+31103161999",
"email": "info@maxsus.nl"
},
"sameAs": [
"https://instagram.com/maxsus.nl"
]
}
</script>
<!-- Performance monitoring script -->
<script>
// Track Core Web Vitals (Updated for 2025 - INP replaces FID)
function trackWebVitals() {
if ('PerformanceObserver' in window) {
// LCP - Largest Contentful Paint
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'largest-contentful-paint') {
console.log('LCP:', entry.startTime);
// Send to analytics if needed
if (window.gtag) {
gtag('event', 'web_vitals', {
event_category: 'Web Vitals',
event_label: 'LCP',
value: Math.round(entry.startTime)
});
}
}
}
}).observe({entryTypes: ['largest-contentful-paint']});
// INP - Interaction to Next Paint (replaces FID as of March 2024)
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'event') {
const inp = entry.processingStart - entry.startTime;
console.log('INP:', inp);
if (window.gtag) {
gtag('event', 'web_vitals', {
event_category: 'Web Vitals',
event_label: 'INP',
value: Math.round(inp)
});
}
}
}
}).observe({entryTypes: ['event']});
// TTFB - Time to First Byte
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (entry.entryType === 'navigation') {
const ttfb = entry.responseStart - entry.fetchStart;
console.log('TTFB:', ttfb);
if (window.gtag) {
gtag('event', 'web_vitals', {
event_category: 'Web Vitals',
event_label: 'TTFB',
value: Math.round(ttfb)
});
}
}
}
}).observe({entryTypes: ['navigation']});
// CLS - Cumulative Layout Shift
let clsValue = 0;
new PerformanceObserver((entryList) => {
for (const entry of entryList.getEntries()) {
if (!entry.hadRecentInput) {
clsValue += entry.value;
console.log('CLS:', clsValue);
if (window.gtag) {
gtag('event', 'web_vitals', {
event_category: 'Web Vitals',
event_label: 'CLS',
value: Math.round(clsValue * 1000) / 1000
});
}
}
}
}).observe({entryTypes: ['layout-shift']});
}
}
// Initialize when page is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', trackWebVitals);
} else {
trackWebVitals();
}
</script>
<!-- Google Analytics - Ultra-optimized loading -->
<script>
// Initialize dataLayer immediately
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
// Defer Google Analytics loading until after page is interactive
if ('requestIdleCallback' in window) {
requestIdleCallback(() => {
// Only load after 5 seconds to ensure zero impact on initial load
setTimeout(() => {
const script = document.createElement('script');
script.src = 'https://www.googletagmanager.com/gtag/js?id=G-YQ6DPYCBL6';
script.async = true;
document.head.appendChild(script);
script.onload = () => {
gtag('js', new Date());
gtag('config', 'G-YQ6DPYCBL6', {
'transport_type': 'beacon',
'custom_map.dimension1': 'page_performance'
});
};
}, 5000);
});
} else {
// Fallback: load after 8 seconds
setTimeout(() => {
const script = document.createElement('script');
script.src = 'https://www.googletagmanager.com/gtag/js?id=G-YQ6DPYCBL6';
script.async = true;
document.head.appendChild(script);
script.onload = () => {
gtag('js', new Date());
gtag('config', 'G-YQ6DPYCBL6');
};
}, 8000);
}
</script>
<!-- TikTok Pixel - Performance optimized loading -->
<script>
// Initialize TikTok Analytics Object immediately
window.TiktokAnalyticsObject = 'ttq';
var ttq = window.ttq = window.ttq || [];
ttq.methods = ["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"];
ttq.setAndDefer = function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};
for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);
ttq.instance = function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};
ttq.load = function(e,n){var r="https://analytics.tiktok.com/i18n/pixel/events.js",o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src=r+"?sdkid="+e+"&lib="+window.TiktokAnalyticsObject;e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(n,e)};
// Defer TikTok Pixel loading to not impact initial page performance
if ('requestIdleCallback' in window) {
requestIdleCallback(() => {
// Load after 6 seconds to ensure zero impact on Core Web Vitals
setTimeout(() => {
ttq.load('D20CGORC77UBOJ7PMJQ0');
ttq.page();
}, 6000);
});
} else {
// Fallback: load after 9 seconds
setTimeout(() => {
ttq.load('D20CGORC77UBOJ7PMJQ0');
ttq.page();
}, 9000);
}
</script>
<script type="module" crossorigin src="/assets/index-CNUfeMj3.js"></script>
<link rel="modulepreload" crossorigin href="/assets/js/react-core-Cayfs_la.js">
<link rel="modulepreload" crossorigin href="/assets/js/icons-BxvSF1aW.js">
<link rel="modulepreload" crossorigin href="/assets/js/react-router-B67dAfWM.js">
<link rel="modulepreload" crossorigin href="/assets/js/vendor-D-ifBknL.js">
<link rel="modulepreload" crossorigin href="/assets/js/image-utils-DW5hxR7W.js">
<link rel="modulepreload" crossorigin href="/assets/js/supabase-jktUei09.js">
<link rel="modulepreload" crossorigin href="/assets/js/admin-DuasPIH3.js">
<link rel="modulepreload" crossorigin href="/assets/js/forms-D1II83gM.js">
<link rel="stylesheet" crossorigin href="/assets/index-CwDLNAR1.css">
</head>
<body>
<!-- Initial loading indicator for better perceived performance -->
<div id="initial-loader" class="loading-container">
<div class="loading-spinner"></div>
</div>
<!-- SEO-friendly content for crawlers -->
<noscript>
<p><strong>MaxSus - Maatwerk Kasten Kasten & Garderobes Rotterdam en Omgeving</strong></p>
<nav>
<a href="/kasten-op-maat-rotterdam">Kasten op Maat</a>
<a href="/inbouwkasten">Inbouwkasten</a>
<a href="/schuifdeurkasten">Schuifdeurkasten</a>
<a href="/kledingkasten">Kledingkasten</a>
<a href="/contact">Contact</a>
<a href="/showroom">Showroom</a>
<a href="/portfolio">Portfolio</a>
</nav>
</noscript>
<!-- Static H1 for SEO crawlers - will be hidden when React loads -->
<h1 id="static-h1" style="position: absolute; left: -9999px; top: -9999px;">
Maatwerk Kasten & Garderobes Rotterdam - Inbouwkasten & Schuifdeurkasten
</h1>
<!-- Hidden SEO content that crawlers can see -->
<div style="position: absolute; left: -9999px; top: -9999px;">
<p><strong>MaxSus - Maatwerk Kasten & Inbouwkasten in Rotterdam en omgeving (70km)</strong></p>
<h2>Kasten op Maat in deze steden:</h2>
<nav>
<a href="/kasten-rotterdam">Maatwerk Kasten Rotterdam</a>
<a href="/inbouwkasten-den-haag">Inbouwkasten Den Haag</a>
<a href="/kast-op-maat-gouda">Kast op Maat Gouda</a>
<a href="/schuifdeurkasten-leiden">Schuifdeurkasten Leiden</a>
<a href="/kasten-showroom-dordrecht">Kasten Showroom Dordrecht</a>
<a href="/contact">Gratis Adviesgesprek</a>
<a href="/showroom">Showroom Bezoeken</a>
<a href="/portfolio">Portfolio Projecten</a>
</nav>
</div>
<div id="root"></div>
</body>
</html>