<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- Preconnect first (max 4): www.googleapis.com is on critical path for auth; then fonts and Firebase -->
    <link rel="preconnect" href="https://www.googleapis.com" crossorigin />
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link rel="preconnect" href="https://naplanmaster.firebaseapp.com" />
    <!-- Google Analytics 4 -->
    <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin />
    <link rel="preconnect" href="https://www.google-analytics.com" crossorigin />
    <script>
      // Initialize dataLayer immediately
      (function() {
        window.dataLayer = window.dataLayer || [];
        window.gtag = window.gtag || function() {
          window.dataLayer.push(arguments);
        };
        gtag('js', new Date());
        gtag('config', 'G-FS3WHT6C5G', {
          page_path: window.location.pathname,
          send_page_view: true
        });
      })();
    </script>
    <script async src="https://www.googletagmanager.com/gtag/js?id=G-FS3WHT6C5G"></script>
    <!-- SVG favicon: eduGrade icon on primary-600 (#0284c7), matches share header. PNG fallbacks for older browsers. -->
    <link rel="icon" type="image/svg+xml" href="/icons/favicon.svg" />
    <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png" />
    <link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png" />
    <link rel="icon" type="image/png" href="/icons/favicon-32x32.png" />
    <!-- Google Fonts async (non-blocking) -->
    <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&display=swap" />
    <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" media="print" onload="this.media='all'" />
    <noscript><link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet" /></noscript>
    
    <!-- Primary Meta Tags -->
    <title>Australian Curriculum Practice &amp; NAPLAN | From $4.99/mo | eduGrade</title>
    <meta name="title" content="Australian Curriculum Practice &amp; NAPLAN | From $4.99/mo | eduGrade" />
    <meta name="description" content="Australian Curriculum–aligned topic practice in Maths, English, Biology, Physics, Chemistry, and French from $4.99/mo, with explanations and AI Help. NAPLAN-style test bundles from $7.99/mo. Free plan includes 3 NAPLAN tests." />
    <meta name="author" content="eduGrade" />
    <meta name="robots" content="index, follow" />
    <meta name="language" content="English" />
    <meta name="theme-color" content="#3d348b" />
    
    <!-- Open Graph / Facebook -->
    <meta property="og:type" content="website" />
    <meta property="og:url" content="https://edugrade.com.au/" />
    <meta property="og:title" content="Australian Curriculum Practice &amp; NAPLAN | From $4.99/mo | eduGrade" />
    <meta property="og:description" content="Australian Curriculum–aligned topic practice in Maths, English, sciences, and French from $4.99/mo, with explanations and AI Help. NAPLAN-style test bundles from $7.99/mo. Free plan includes 3 NAPLAN tests." />
    <meta property="og:image" content="https://edugrade.com.au/og-image.jpg" />
    <meta property="og:site_name" content="eduGrade" />
    <meta property="og:locale" content="en_AU" />
    
    <!-- Twitter -->
    <meta property="twitter:card" content="summary_large_image" />
    <meta property="twitter:url" content="https://edugrade.com.au/" />
    <meta property="twitter:title" content="Australian Curriculum Practice &amp; NAPLAN | From $4.99/mo | eduGrade" />
    <meta property="twitter:description" content="Australian Curriculum–aligned topic practice in Maths, English, sciences, and French from $4.99/mo, with explanations and AI Help. NAPLAN-style test bundles from $7.99/mo. Free plan includes 3 NAPLAN tests." />
    <meta property="twitter:image" content="https://edugrade.com.au/og-image.jpg" />
    
    <!-- Structured Data (JSON-LD) -->
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "EducationalOrganization",
      "name": "eduGrade",
      "description": "Australian Curriculum–aligned topic practice across Maths, English, Biology, Physics, Chemistry, and French, with step-by-step explanations and AI Help (Practice from $4.99/month; Premium Practice from $9.99/month). Optional NAPLAN-style full test bundles for Years 3, 5, 7, and 9 (Basic from $7.99/month; Premium from $14.99/month).",
      "url": "https://edugrade.com.au",
      "logo": "https://edugrade.com.au/icons/logo.jpg",
      "sameAs": [],
      "address": {
        "@type": "PostalAddress",
        "addressCountry": "AU"
      },
      "educationalCredentialAwarded": "NAPLAN Practice Test Completion",
      "hasOfferCatalog": {
        "@type": "OfferCatalog",
        "name": "eduGrade Practice and NAPLAN",
        "itemListElement": [
          {
            "@type": "Course",
            "name": "Australian Curriculum topic practice",
            "description": "Topic-based practice with explanations across Maths, English, Biology, Physics, Chemistry, and French where available by grade.",
            "educationalLevel": "Primary and secondary",
            "teaches": ["Mathematics", "English", "Biology", "Physics", "Chemistry", "French"],
            "provider": {
              "@type": "EducationalOrganization",
              "name": "eduGrade"
            }
          },
          {
            "@type": "Course",
            "name": "Year 3 NAPLAN Practice Tests",
            "description": "Comprehensive NAPLAN-style practice tests for Year 3 students covering Conventions of Language, Reading, Numeracy, and Writing. Aligned with Australian Curriculum.",
            "educationalLevel": "Year 3",
            "teaches": ["Conventions of Language", "Reading Comprehension", "Numeracy", "Writing"],
            "provider": {
              "@type": "EducationalOrganization",
              "name": "eduGrade"
            }
          },
          {
            "@type": "Course",
            "name": "Year 5 NAPLAN Practice Tests",
            "description": "Comprehensive NAPLAN-style practice tests for Year 5 students covering Conventions of Language, Reading, Numeracy, and Writing. Aligned with Australian Curriculum.",
            "educationalLevel": "Year 5",
            "teaches": ["Conventions of Language", "Reading Comprehension", "Numeracy", "Writing"],
            "provider": {
              "@type": "EducationalOrganization",
              "name": "eduGrade"
            }
          },
          {
            "@type": "Course",
            "name": "Year 7 NAPLAN Practice Tests",
            "description": "Comprehensive NAPLAN-style practice tests for Year 7 students covering Conventions of Language, Reading, Numeracy, and Writing. Aligned with Australian Curriculum.",
            "educationalLevel": "Year 7",
            "teaches": ["Conventions of Language", "Reading Comprehension", "Numeracy", "Writing"],
            "provider": {
              "@type": "EducationalOrganization",
              "name": "eduGrade"
            }
          },
          {
            "@type": "Course",
            "name": "Year 9 NAPLAN Practice Tests",
            "description": "Comprehensive NAPLAN-style practice tests for Year 9 students covering Conventions of Language, Reading, Numeracy, and Writing. Aligned with Australian Curriculum.",
            "educationalLevel": "Year 9",
            "teaches": ["Conventions of Language", "Reading Comprehension", "Numeracy", "Writing"],
            "provider": {
              "@type": "EducationalOrganization",
              "name": "eduGrade"
            }
          }
        ]
      }
    }
    </script>
    
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "WebApplication",
      "name": "eduGrade",
      "description": "Australian Curriculum–aligned topic practice in Maths, English, sciences, and French, plus optional NAPLAN-style full test bundles for Years 3, 5, 7, and 9. Clear explanations and AI Help.",
      "url": "https://edugrade.com.au",
      "applicationCategory": "EducationalApplication",
      "operatingSystem": "Web Browser",
      "offers": [
        {
          "@type": "Offer",
          "name": "Free Plan",
          "price": "0",
          "priceCurrency": "AUD",
          "availability": "https://schema.org/InStock",
          "description": "3 full NAPLAN tests (1 Conventions, 1 Reading, 1 Numeracy), 120 practice questions"
        },
        {
          "@type": "Offer",
          "name": "Practice",
          "price": "4.99",
          "priceCurrency": "AUD",
          "availability": "https://schema.org/InStock",
          "description": "Australian Curriculum topic practice across Maths, English, Biology, Physics, Chemistry, and French where available by grade; step-by-step explanations; AI Help (monthly allowance applies)"
        },
        {
          "@type": "Offer",
          "name": "Premium Practice",
          "price": "9.99",
          "priceCurrency": "AUD",
          "availability": "https://schema.org/InStock",
          "description": "Full curriculum practice library across subjects with step-by-step explanations and higher AI Help allowance than Practice"
        },
        {
          "@type": "Offer",
          "name": "NAPLAN Basic",
          "price": "7.99",
          "priceCurrency": "AUD",
          "availability": "https://schema.org/InStock",
          "description": "33 full NAPLAN-style tests (10 Conventions, 10 Reading, 10 Numeracy, 3 Writing), 1,200 practice questions; includes Practice/Learn access per plan terms"
        },
        {
          "@type": "Offer",
          "name": "NAPLAN Premium",
          "price": "14.99",
          "priceCurrency": "AUD",
          "availability": "https://schema.org/InStock",
          "description": "66 full NAPLAN-style tests (20 Conventions, 20 Reading, 20 Numeracy, 6 Writing), 2,400 practice questions; includes Practice/Learn access per plan terms"
        }
      ],
      "aggregateRating": {
        "@type": "AggregateRating",
        "ratingValue": "4.8",
        "ratingCount": "150"
      }
    }
    </script>
    
    <link rel="manifest" href="/manifest.json" />
    <script type="module" crossorigin src="/assets/index-CpD7uldE.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/react-vendor-DRsqk_fT.js">
    <link rel="preload" as="style" crossorigin href="/assets/index-Dlcs1TpV.css" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" crossorigin href="/assets/index-Dlcs1TpV.css"></noscript>
  </head>
  <body>
    <div id="root"></div>
    <!-- Ensure dataLayer is initialized - Fallback -->
    <script>
      (function() {
        window.dataLayer = window.dataLayer || [];
        window.gtag = window.gtag || function() {
          window.dataLayer.push(arguments);
        };
      })();
    </script>
    <script>
      // Only register service worker in production (not in development)
      // In development, Vite serves files differently and service worker causes issues
      if ('serviceWorker' in navigator) {
        // Check if we're in development (localhost or 127.0.0.1)
        const isDevelopment = window.location.hostname === 'localhost' || 
                              window.location.hostname === '127.0.0.1' ||
                              window.location.hostname.includes('.local');
        
        if (isDevelopment) {
          // Unregister any existing service workers in development
          navigator.serviceWorker.getRegistrations().then((registrations) => {
            for (const registration of registrations) {
              registration.unregister();
            }
          });
        } else {
          // Register service worker in production
          window.addEventListener('load', () => {
            navigator.serviceWorker.register('/service-worker.js')
              .then((registration) => {
                // Reload when a new service worker takes control (e.g. after deploy)
                navigator.serviceWorker.addEventListener('controllerchange', () => {
                  window.location.reload();
                });
              })
              .catch(() => {
                // Service worker registration failed - silently fail
              });
          });
        }
      }
    </script>
  </body>
</html>
