<!doctype html>
<html lang="de" className="notranslate" translate="no">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>
      Campbert — Campingplatz Schladming | Stellplatz für Wohnmobil, Wohnwagen &amp; Vanlife
    </title>
    <meta
      name="description"
      content="Campingplatz Schladming auf 750 m Seehöhe. 23 Stellplätze mit Strom und WLAN für Wohnmobil, Wohnwagen, Camper-Van und Zelt. Panoramablick auf Dachstein und Planai. Ganzjährig geöffnet — jetzt online buchen."
    />
    <meta
      name="keywords"
      content="Campingplatz Schladming, Stellplatz Schladming, Camping Dachstein, Camping Steiermark, Wohnmobil Stellplatz Schladming, Camping Planai, Vanlife Österreich, Wohnwagen Stellplatz Steiermark, Camping Ennstal, Campingplatz ganzjährig offen, Stellplatz mit Strom Österreich, Camping mit Panoramablick Alpen"
    />
    <meta name="robots" content="index, follow" />
    <meta name="author" content="Herbert Campbert Thaler" />
    <link rel="canonical" href="https://campbert.at/" />

    <!-- Open Graph / Facebook -->
    <meta property="og:type" content="website" />
    <meta property="og:url" content="https://campbert.at/" />
    <meta
      property="og:title"
      content="Campbert — Campingplatz Schladming | Stellplatz für Wohnmobil, Wohnwagen &amp; Vanlife"
    />
    <meta
      property="og:description"
      content="23 Stellplätze am Fuß des Dachsteins — mit Strom, WLAN und Panoramablick auf Planai und Hauser Kaibling. Ganzjährig geöffnet, digital einchecken. Jetzt buchen."
    />
    <meta
      property="og:image"
      content="https://campbert.at/dachstein-johannes-absenger.png"
    />
    <meta property="og:site_name" content="Campbert" />
    <meta property="og:locale" content="de_AT" />

    <!-- Twitter -->
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:url" content="https://campbert.at/" />
    <meta
      name="twitter:title"
      content="Campbert — Campingplatz Schladming-Dachstein"
    />
    <meta
      name="twitter:description"
      content="23 Stellplätze für Wohnmobil, Wohnwagen & Vanlife am Fuß des Dachsteins. Mit Strom, WLAN, Panoramablick. Ganzjährig geöffnet."
    />
    <meta
      name="twitter:image"
      content="https://campbert.at/dachstein-johannes-absenger.png"
    />

    <!-- Local Business Schema -->
    <script type="application/ld+json">
      {
        "@context": "https://schema.org",
        "@type": "Campground",
        "name": "Campbert — Campingplatz Schladming",
        "description": "Campingplatz Schladming auf 750 m Seehöhe. 23 Stellplätze für Wohnmobil, Wohnwagen, Camper-Van und Zelt mit Panoramablick auf Dachstein und Planai. Mit Strom, WLAN und modernen Sanitäranlagen. Ganzjährig geöffnet.",
        "url": "https://campbert.at",
        "telephone": "+43 650 63 53 536",
        "email": "herbert.thaler@campbert.at",
        "address": {
          "@type": "PostalAddress",
          "streetAddress": "Alpineweg",
          "addressLocality": "Schladming",
          "postalCode": "8971",
          "addressCountry": "AT"
        },
        "geo": {
          "@type": "GeoCoordinates",
          "latitude": "47.3938",
          "longitude": "13.6873"
        },
        "amenityFeature": [
          {
            "@type": "LocationFeatureSpecification",
            "name": "WiFi",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "Electricity hookup",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "Shower Facilities",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "Motorhome pitches",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "Caravan pitches",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "Pets allowed",
            "value": true
          },
          {
            "@type": "LocationFeatureSpecification",
            "name": "24h digital access",
            "value": true
          }
        ],
        "aggregateRating": {
          "@type": "AggregateRating",
          "ratingValue": "5",
          "reviewCount": "200",
          "bestRating": "5"
        },
        "priceRange": "€€",
        "openingHours": "Mo-Su 00:00-24:00"
      }
    </script>

    <!-- Favicon -->
    <link rel="icon" type="image/x-icon" href="/favicon.ico" />
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />

    <!-- Web App Manifest -->
    <link rel="manifest" href="/manifest.json" />

    <!-- Font Awesome removed for performance - using Lucide Icons instead -->

    <!-- DNS prefetch for external services -->
    <link rel="dns-prefetch" href="//api.stripe.com" />
    <link rel="dns-prefetch" href="//js.stripe.com" />
    <link rel="dns-prefetch" href="//cdn.jsdelivr.net" />
    <link rel="dns-prefetch" href="//api.openweathermap.org" />

    <!-- Preconnect only for origins used on first paint (fonts). Stripe is not
         requested on the landing page — keep it as a cheaper dns-prefetch above
         so the booking flow still benefits without an unused preconnect. -->
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

    <!-- Font loading: non-blocking via media trick -->
    <link
      rel="stylesheet"
      media="print"
      onload="this.media='all'"
      href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&family=Inter+Tight:wght@200;300;400;500;600&display=swap"
    />
    <noscript
      ><link
        rel="stylesheet"
        href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&family=Inter+Tight:wght@200;300;400;500;600&display=swap"
    /></noscript>

    <!-- Error handling for browser extensions -->
    <script>
      // Filter out extension-related errors and runtime errors
      window.addEventListener("error", (event) => {
        // Block extension-related errors from being logged
        if (
          event.filename &&
          (event.filename.includes("chrome-extension://") ||
            event.filename.includes("moz-extension://") ||
            event.filename.includes("supabase.co") ||
            event.filename.includes("foreground.js"))
        ) {
          event.preventDefault();
          event.stopPropagation();
          return false;
        }
      });

      // Handle unhandled promise rejections from extensions
      window.addEventListener("unhandledrejection", (event) => {
        if (
          event.reason &&
          event.reason.message &&
          (event.reason.message.includes("chrome-extension://") ||
            event.reason.message.includes("supabase.co") ||
            event.reason.message.includes("message port closed"))
        ) {
          event.preventDefault();
          return false;
        }
      });
    </script>

    <style>
      /* Prevent font loading flicker */
      body {
        font-family:
          system-ui,
          -apple-system,
          sans-serif;
      }

      /* Full-screen branded loader shown until the React app has mounted and
         the web fonts are ready. Styled inline here so it paints instantly,
         before any external stylesheet or font loads — this is what prevents
         the brief flash of unstyled content / font swap on load and reload. */
      #initial-loader {
        position: fixed;
        inset: 0;
        z-index: 9999;
        display: flex;
        align-items: center;
        justify-content: center;
        background: #f8f5ef;
        opacity: 1;
        transition: opacity 0.4s ease;
      }
      #initial-loader.loaded {
        opacity: 0;
        pointer-events: none;
      }
      #initial-loader .spinner {
        width: 42px;
        height: 42px;
        border: 3px solid rgba(28, 21, 16, 0.12);
        border-radius: 50%;
        border-top-color: #fa3343;
        animation: spin 0.8s linear infinite;
      }
      @keyframes spin {
        to {
          transform: rotate(360deg);
        }
      }
    </style>
    <script type="module" crossorigin src="/assets/index-RBB7EdMe.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Cyuzqnbw.js">
    <link rel="modulepreload" crossorigin href="/assets/utils-C3j4OTPp.js">
    <link rel="modulepreload" crossorigin href="/assets/query-vendor-DcWpubCu.js">
    <link rel="modulepreload" crossorigin href="/assets/dist-BodaC8xg.js">
    <link rel="modulepreload" crossorigin href="/assets/dist-CsPgkpME.js">
    <link rel="modulepreload" crossorigin href="/assets/react-vendor-DqKeDNIA.js">
    <link rel="modulepreload" crossorigin href="/assets/dist-CVHDqBAT.js">
    <link rel="modulepreload" crossorigin href="/assets/es2015-C2udvorS.js">
    <link rel="modulepreload" crossorigin href="/assets/dist-BLMenlRA.js">
    <link rel="modulepreload" crossorigin href="/assets/constructFrom-BEy7zy7O.js">
    <link rel="modulepreload" crossorigin href="/assets/ui-vendor-CR7WgnSw.js">
    <link rel="modulepreload" crossorigin href="/assets/esm-WceBntsC.js">
    <link rel="stylesheet" crossorigin href="/assets/index-DG-g69aq.css">
  </head>
  <body>
    <div id="initial-loader" aria-hidden="true">
      <div class="spinner"></div>
    </div>
    <div id="root"></div>
  </body>
</html>
