diff --git a/next.config.ts b/next.config.ts index 4437880..755c42f 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,7 +2,11 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { output: "standalone", - staticPageGenerationTimeout: 120, + staticPageGenerationTimeout: 300, + experimental: { + staticGenerationMaxConcurrency: 8, + staticGenerationMinPagesPerWorker: 25, + }, }; export default nextConfig; diff --git a/src/app/contact/ContactForm.tsx b/src/app/contact/ContactForm.tsx index f508aae..c4e322a 100644 --- a/src/app/contact/ContactForm.tsx +++ b/src/app/contact/ContactForm.tsx @@ -1,6 +1,7 @@ "use client"; import { useState, useRef, useEffect } from "react"; +import Image from "next/image"; import { Container } from "@/components/layout/Container"; import { Button } from "@/components/ui/Button"; import { FormField } from "@/components/ui/FormField"; @@ -34,7 +35,7 @@ export default function ContactForm() { if (submitted) { return ( -
+

@@ -53,113 +54,150 @@ export default function ContactForm() { "w-full rounded-lg border border-border bg-white px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-brand focus:outline-none focus:ring-2 focus:ring-brand/20"; return ( -
+
-
-
-

- Contact us. -

-

- Email:{" "} - - contact@micromelon.com.au - -

+
+

+ Contact us. +

+

+ Have a question or need a quote? Fill in the form and we'll get back to you. +

+
+ +
+ {/* Form */} +
+
+
+ setName(e.target.value)} + /> + setEmail(e.target.value)} + /> + setPhone(e.target.value)} + /> + + {/* School search combobox */} +
+ + { + setInstitution(e.target.value); + setInstitutionOpen(true); + }} + onFocus={() => setInstitutionOpen(true)} + placeholder="Search or type your school name" + className={inputClasses} + autoComplete="off" + /> + {institutionOpen && institution.length > 0 && (() => { + const query = institution.toLowerCase(); + const matches = KNOWN_SCHOOLS.filter((s) => s.toLowerCase().includes(query)); + const exactMatch = KNOWN_SCHOOLS.some((s) => s.toLowerCase() === query); + if (matches.length === 0 && !exactMatch) return null; + if (matches.length === 1 && matches[0].toLowerCase() === query) return null; + return ( +
    + {matches.map((school) => ( +
  • + +
  • + ))} +
+ ); + })()} +
+ + setMessage(e.target.value)} + /> + +
+ +
+ +
-
- setName(e.target.value)} - /> - setEmail(e.target.value)} - /> - setPhone(e.target.value)} - /> + {/* Sidebar */} +
+
+
+ Micromelon Rover +
- {/* School search combobox */} -
- - { - setInstitution(e.target.value); - setInstitutionOpen(true); - }} - onFocus={() => setInstitutionOpen(true)} - placeholder="Search or type your school name" - className={inputClasses} - autoComplete="off" - /> - {institutionOpen && institution.length > 0 && (() => { - const query = institution.toLowerCase(); - const matches = KNOWN_SCHOOLS.filter((s) => s.toLowerCase().includes(query)); - const exactMatch = KNOWN_SCHOOLS.some((s) => s.toLowerCase() === query); - if (matches.length === 0 && !exactMatch) return null; - if (matches.length === 1 && matches[0].toLowerCase() === query) return null; - return ( -
    - {matches.map((school) => ( -
  • - -
  • - ))} -
- ); - })()} +
+
+
+ + + +
+ +
+
+ +

+ We typically respond within 1 business day. +

- - setMessage(e.target.value)} - /> - -
- -
- +
diff --git a/src/app/rover-repair-request/RepairRequestForm.tsx b/src/app/rover-repair-request/RepairRequestForm.tsx index 7534026..e43fb88 100644 --- a/src/app/rover-repair-request/RepairRequestForm.tsx +++ b/src/app/rover-repair-request/RepairRequestForm.tsx @@ -1,9 +1,9 @@ "use client"; import { useState, useRef, useEffect } from "react"; +import Image from "next/image"; import { Container } from "@/components/layout/Container"; import { Button } from "@/components/ui/Button"; -import { SectionHeading } from "@/components/ui/SectionHeading"; import { KNOWN_SCHOOLS } from "@/data/schools"; interface RoverEntry { @@ -23,6 +23,8 @@ export default function RepairRequestForm() { const [rovers, setRovers] = useState([ { id: nextId++, serialNumber: "", issue: "" }, ]); + const [returnAddress, setReturnAddress] = useState(""); + const [agreedToCharges, setAgreedToCharges] = useState(false); const [submitting, setSubmitting] = useState(false); const [submitted, setSubmitted] = useState(false); const institutionRef = useRef(null); @@ -63,6 +65,7 @@ export default function RepairRequestForm() { email, phone, institution, + returnAddress, rovers: rovers.map((r) => ({ serialNumber: r.serialNumber, issue: r.issue, @@ -79,7 +82,7 @@ export default function RepairRequestForm() { if (submitted) { return ( -
+

@@ -97,183 +100,267 @@ export default function RepairRequestForm() { const inputClasses = "w-full rounded-lg border border-border bg-white px-4 py-3 text-sm text-foreground placeholder:text-muted-foreground focus:border-brand focus:outline-none focus:ring-2 focus:ring-brand/20"; + const steps = [ + { number: 1, title: "Submit your request", description: "Fill in the form with your rover details and the issues you're experiencing." }, + { number: 2, title: "Receive confirmation", description: "You'll receive a confirmation email acknowledging your repair request." }, + { number: 3, title: "Return Order PDF", description: "We'll email you a Return Order PDF with instructions on how and where to ship your rover." }, + { number: 4, title: "We repair your rovers", description: "Repairs normally take 1–2 weeks. If your rovers are out of warranty, you'll receive a quote before we proceed." }, + { number: 5, title: "Repaired & on its way", description: "Once repairs are complete, you'll receive an email letting you know your rover is on its way back." }, + ]; + return ( -
- -
- - -
+ <> + {/* Hero section */} +
+ +
- - setName(e.target.value)} - className={inputClasses} +

+ Rover Repair Request +

+

+ Let us know which rovers need repair and we'll organise getting them fixed. +

+
+
+ Micromelon Rover
+
+
+
+ {/* Form + sidebar */} +
+ +
+ {/* Form */}
- - setEmail(e.target.value)} - className={inputClasses} - /> -
+ +
+ + setName(e.target.value)} + className={inputClasses} + /> +
-
- - setPhone(e.target.value)} - className={inputClasses} - /> -
+
+ + setEmail(e.target.value)} + className={inputClasses} + /> +
- {/* School search combobox */} -
- - { - setInstitution(e.target.value); - setInstitutionOpen(true); - }} - onFocus={() => setInstitutionOpen(true)} - placeholder="Search or type your school name" - className={inputClasses} - autoComplete="off" - /> - {institutionOpen && institution.length > 0 && (() => { - const query = institution.toLowerCase(); - const matches = KNOWN_SCHOOLS.filter((s) => s.toLowerCase().includes(query)); - const exactMatch = KNOWN_SCHOOLS.some((s) => s.toLowerCase() === query); - if (matches.length === 0 && !exactMatch) return null; - if (matches.length === 1 && matches[0].toLowerCase() === query) return null; - return ( -
    - {matches.map((school) => ( -
  • - -
  • +
    + + setPhone(e.target.value)} + className={inputClasses} + /> +
    + + {/* School search combobox */} +
    + + { + setInstitution(e.target.value); + setInstitutionOpen(true); + }} + onFocus={() => setInstitutionOpen(true)} + placeholder="Search or type your school name" + className={inputClasses} + autoComplete="off" + /> + {institutionOpen && institution.length > 0 && (() => { + const query = institution.toLowerCase(); + const matches = KNOWN_SCHOOLS.filter((s) => s.toLowerCase().includes(query)); + const exactMatch = KNOWN_SCHOOLS.some((s) => s.toLowerCase() === query); + if (matches.length === 0 && !exactMatch) return null; + if (matches.length === 1 && matches[0].toLowerCase() === query) return null; + return ( +
      + {matches.map((school) => ( +
    • + +
    • + ))} +
    + ); + })()} +
    + + {/* Rovers */} +
    + +
    + {rovers.map((rover, index) => ( +
    +
    + + Rover {index + 1} + + {rovers.length > 1 && ( + + )} +
    +
    +
    + + updateRover(rover.id, "serialNumber", e.target.value)} + className={inputClasses} + /> +
    +
    + +