Phase 1: technical SEO foundations

- Per-page titles, descriptions, canonicals, Open Graph/Twitter tags
  via a shared pageMetadata() helper; metadataBase on the root layout
- Sitemap generated from a route list on the canonical non-www host;
  robots.txt points to it; /services removed
- One H1 per page; decorative images get empty alt text
- JSON-LD: site-wide ComputerRepairService, FAQPage on the homepage,
  Service on each service page
- FAQ answers are now server-rendered (forceMount) so the schema matches
  the HTML; fixed the nested payment FAQ item
- Drop web design (page, nav link, homepage card and FAQs); 301 the old URL
- Remove GA, Facebook Pixel and Vercel Analytics/Speed Insights
- Fix tel: links (+640211... -> +64211...)
- Add og-image.png and logo.png

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
asownerytandClaude Opus 5.5 committed 2026-09-30 20:24:29 +13:00
1 parent 0478ab65e5
commit c085e2b031
23 files changed
+368 -379

No files matched your search

+17
View File
@@ -4,6 +4,23 @@ const nextConfig = {
images: {
qualities: [75, 100],
},
async redirects() {
return [
// Cloudflare already does this; kept here as a fallback.
{
source: "/:path*",
has: [{ type: "host", value: "www.teatatucomputers.com" }],
destination: "https://teatatucomputers.com/:path*",
permanent: true,
},
// Web design is no longer offered.
{
source: "/services/web-design",
destination: "/",
permanent: true,
},
];
},
};
export default nextConfig;
-75
View File
@@ -11,8 +11,6 @@
"@next/env": "^16.2.10",
"@next/third-parties": "^16.2.10",
"@radix-ui/react-accordion": "^1.2.3",
"@vercel/analytics": "^1.4.1",
"@vercel/speed-insights": "^1.1.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.487.0",
@@ -2652,79 +2650,6 @@
"win32"
]
},
"node_modules/@vercel/analytics": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz",
"integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==",
"license": "MPL-2.0",
"peerDependencies": {
"@remix-run/react": "^2",
"@sveltejs/kit": "^1 || ^2",
"next": ">= 13",
"react": "^18 || ^19 || ^19.0.0-rc",
"svelte": ">= 4",
"vue": "^3",
"vue-router": "^4"
},
"peerDependenciesMeta": {
"@remix-run/react": {
"optional": true
},
"@sveltejs/kit": {
"optional": true
},
"next": {
"optional": true
},
"react": {
"optional": true
},
"svelte": {
"optional": true
},
"vue": {
"optional": true
},
"vue-router": {
"optional": true
}
}
},
"node_modules/@vercel/speed-insights": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.2.0.tgz",
"integrity": "sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw==",
"hasInstallScript": true,
"license": "Apache-2.0",
"peerDependencies": {
"@sveltejs/kit": "^1 || ^2",
"next": ">= 13",
"react": "^18 || ^19 || ^19.0.0-rc",
"svelte": ">= 4",
"vue": "^3",
"vue-router": "^4"
},
"peerDependenciesMeta": {
"@sveltejs/kit": {
"optional": true
},
"next": {
"optional": true
},
"react": {
"optional": true
},
"svelte": {
"optional": true
},
"vue": {
"optional": true
},
"vue-router": {
"optional": true
}
}
},
"node_modules/acorn": {
"version": "8.17.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
-2
View File
@@ -12,8 +12,6 @@
"@next/env": "^16.2.10",
"@next/third-parties": "^16.2.10",
"@radix-ui/react-accordion": "^1.2.3",
"@vercel/analytics": "^1.4.1",
"@vercel/speed-insights": "^1.1.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.487.0",
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

+1 -1
View File
@@ -18,7 +18,7 @@ export default function ContactForm() {
clipRule="evenodd"
/>
</svg>
<a href="tel:+640211077483">021 107 7483</a>
<a href="tel:+64211077483">021 107 7483</a>
</h3>
<h3 className="text-lg font-bold hover:underline">
<svg
+1 -1
View File
@@ -15,7 +15,7 @@ export default function Footer() {
clipRule="evenodd"
/>
</svg>
<a href="tel:+640211077483">
<a href="tel:+64211077483">
021 107 7483
</a>
</h3>
+1 -1
View File
@@ -8,7 +8,7 @@ export default function HeaderSm({ text }) {
<div className={styles.header}>
<Image
src={bgimage}
alt="Header Background"
alt=""
placeholder="blur"
quality={100}
fill
+11
View File
@@ -0,0 +1,11 @@
export default function JsonLd({ data }) {
return (
<script
type="application/ld+json"
// Escape "<" so the JSON can't close the script tag early.
dangerouslySetInnerHTML={{
__html: JSON.stringify(data).replace(/</g, "\\u003c"),
}}
/>
);
}
+2 -12
View File
@@ -49,7 +49,7 @@ export default function Navbar() {
<div className={styles.header}>
<div>
<Link href="/" className={styles.logo}>
<Image src={logo} width="32" height="32" alt="Logo" />
<Image src={logo} width="32" height="32" alt="" />
<p>Te Atatu Computers</p>
</Link>
</div>
@@ -62,7 +62,7 @@ export default function Navbar() {
src={isActive ? menu : close}
width="32"
height="32"
alt="Menu"
alt=""
/>
</button>
</div>
@@ -131,16 +131,6 @@ export default function Navbar() {
IT Support
</Link>
</li>
<li>
<Link
href="/services/web-design"
className={`link ${
pathname === "/services/web-design" ? styles.active : ""
}`}
>
Web Design
</Link>
</li>
<li>
<Link
href="/services/virus-removal"
+8
View File
@@ -1,5 +1,13 @@
import HeaderSm from "../components/HeaderSm";
import ContactForm from "../components/ContactForm";
import { pageMetadata } from "@/lib/site";
export const metadata = pageMetadata({
title: "Contact & Book a Repair | Te Atatu Computers",
description:
"Call or text 021 107 7483, or send your device and problem details. Based on Te Atatū Peninsula, serving Henderson and West Auckland.",
path: "/contact",
});
export default function Home() {
return (
+7 -27
View File
@@ -3,12 +3,8 @@ import "./globals.css";
import Navbar from "./components/Navbar";
import Footer from "./components/Footer";
import ChatwootWidget from "./components/ChatwootWidget";
// Add spyware
import { Analytics } from "@vercel/analytics/react";
import { GoogleAnalytics } from "@next/third-parties/google";
import { SpeedInsights } from "@vercel/speed-insights/next";
import Script from "next/script";
import JsonLd from "./components/JsonLd";
import { SITE_URL, business, localBusinessSchema } from "@/lib/site";
const geistSans = localFont({
src: "./fonts/GeistVF.woff",
@@ -21,37 +17,21 @@ const geistMono = localFont({
weight: "100 900",
});
// Pages set their own title, description and canonical via pageMetadata().
export const metadata = {
title: "Te Atatu Computer Repair & Web Design",
description:
"Your Local Experts for PCs, Laptops, Web Design, IT Support & More.",
metadataBase: new URL(SITE_URL),
title: business.name,
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<html lang="en-NZ">
<body className={`${geistSans.variable} ${geistMono.variable}`}>
<JsonLd data={localBusinessSchema()} />
<ChatwootWidget />
<Navbar />
{children}
<Footer />
<Analytics />
<SpeedInsights />
<GoogleAnalytics gaId="G-TN7ZL1Y4CC" />
<Script id="facebook-pixel">
{`
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '1370044511045020');
fbq('track', 'PageView');
`}
</Script>
</body>
</html>
);
+32 -197
View File
@@ -5,6 +5,9 @@ import Button from "./components/Button";
import Link from "next/link";
import { GoogleMapsEmbed } from "@next/third-parties/google";
import ContactForm from "./components/ContactForm";
import JsonLd from "./components/JsonLd";
import { pageMetadata, faqSchema } from "@/lib/site";
import { homeFaqs } from "@/lib/faqs";
import {
Accordion,
AccordionContent,
@@ -12,6 +15,13 @@ import {
AccordionTrigger,
} from "@/components/ui/accordion";
export const metadata = pageMetadata({
title: "Computer & Laptop Repair Te Atatū | Te Atatu Computers",
description:
"Local laptop & PC repairs, upgrades and virus removal in Te Atatū and West Auckland. $35 diagnosis, no fix no fee. Call or text 021 107 7483.",
path: "/",
});
export default function Home() {
return (
<div className={styles.page}>
@@ -20,7 +30,7 @@ export default function Home() {
<div className={styles.header}>
<Image
src={bgimage}
alt="Header Background"
alt=""
placeholder="blur"
quality={100}
fill
@@ -38,8 +48,8 @@ export default function Home() {
</h1>
<p className={styles.p}>
<strong>
Your Local Experts for PCs, Laptops, Web Design, IT
Support & More.
Your Local Experts for PCs, Laptops, IT Support &
More.
</strong>
<br />
From hardware fixes to software solutions, we&apos;re here
@@ -69,9 +79,9 @@ export default function Home() {
</section>
<section className="container mx-auto mb-32">
<h1 className="text-center text-3xl font-bold mb-4">
<h2 className="text-center text-3xl font-bold mb-4">
Services we Offer
</h1>
</h2>
<div className="text-center mb-4 flex flex-row flex-wrap justify-center">
<div className="max-w-xs p-4 text-center justify-center">
<svg
@@ -89,9 +99,9 @@ export default function Home() {
d="M9 17.25v1.007a3 3 0 0 1-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0 1 15 18.257V17.25m6-12V15a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 15V5.25m18 0A2.25 2.25 0 0 0 18.75 3H5.25A2.25 2.25 0 0 0 3 5.25m18 0V12a2.25 2.25 0 0 1-2.25 2.25H5.25A2.25 2.25 0 0 1 3 12V5.25"
/>
</svg>
<h2 className="text-xl font-bold mb-2">
<h3 className="text-xl font-bold mb-2">
Computer Repair/Upgrades
</h2>
</h3>
<p>
We can fix anything from a broken screen to a software issue, or
upgrade your computer&apos;s parts and optimise Windows to get
@@ -115,7 +125,7 @@ export default function Home() {
/>
</svg>
<h2 className="text-xl font-bold mb-2">Desktop PC Building</h2>
<h3 className="text-xl font-bold mb-2">Desktop PC Building</h3>
<p>
We&apos;ll help you pick the parts and build a custom gaming or
workstation PC for you.
@@ -138,36 +148,13 @@ export default function Home() {
/>
</svg>
<h2 className="text-xl font-bold mb-2">Remote Access Support</h2>
<h3 className="text-xl font-bold mb-2">Remote Access Support</h3>
<p>
We can remotely connect to your computer and fix
software/operating system related issues from the comfort of
your own home.
</p>
</div>
<div className="max-w-xs p-4 text-center justify-center">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={1.5}
stroke="currentColor"
width="6rem"
className="mx-auto mb-4"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0 1 12 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 0 1 3 12c0-1.605.42-3.113 1.157-4.418"
/>
</svg>
<h2 className="text-xl font-bold mb-2">Web Development</h2>
<p>
We can develop a fast, modern and secure website for your
business using Wordpress or custom React/NextJS code.
</p>
</div>
</div>
</section>
<section className="container mx-auto flex flex-col gap-8 lg:flex-row mb-32">
@@ -183,178 +170,26 @@ export default function Home() {
</div>
</section>
<section className="container mx-auto mb-16 max-w-3xl mb-32 scroll-mt-20" id="faq">
<h1 className="text-center text-3xl font-bold mb-8">
<JsonLd data={faqSchema(homeFaqs)} />
<h2 className="text-center text-3xl font-bold mb-8">
Frequently Asked Questions
</h1>
<h3 className="text-lg font-bold text-slate-900">
Computer Repair and IT Support
</h3>
</h2>
<Accordion className="mb-8">
<AccordionItem value="item-1">
<AccordionTrigger>
What types of devices do you repair?
</AccordionTrigger>
{homeFaqs.map(({ question, answer, list }, i) => (
<AccordionItem key={question} value={`item-${i + 1}`}>
<AccordionTrigger>{question}</AccordionTrigger>
<AccordionContent>
We repair desktops, laptops, chromebooks and PCs. We also handle
custom-built systems and some tablets, depending on the issue.
Currently we do not repair Apple devices.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>
What kinds of issues can you fix?
</AccordionTrigger>
<AccordionContent>
We handle a wide range of problems, including (but not limited
to):
{answer}
{list && (
<ul className="list-disc pl-6 my-2">
<li>
Software issues (e.g. Windows errors, slow performance)
</li>
<li>Virus removal and protection</li>
<li>Data recovery and backup solutions</li>
<li>Network setup and troubleshooting</li>
<li>Hardware upgrades (e.g. RAM, SSD, graphics card)</li>
<li>Custom PC builds</li>
<li>Web development and design</li>
<li>Remote support for software issues</li>
<li>General IT support and consulting</li>
<li>Printer setup and troubleshooting</li>
<li>Software installation and configuration</li>
<li>Operating system installation and upgrades</li>
<li>Data migration from old devices to new ones</li>
{list.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
)}
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-3">
<AccordionTrigger>
Do I need an appointment, or can I just walk in?
</AccordionTrigger>
<AccordionContent>
Currently we are operating by appointment only. Please contact
us to schedule a time that works for you. We can also arrange
remote support for certain issues.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-4">
<AccordionTrigger>
How long will the repair take?
</AccordionTrigger>
<AccordionContent>
Most basic repairs are completed within 24-48 hours. Some issues
may take longer, depending on parts availability and complexity.
We’ll give you an estimated turnaround time when we diagnose the
problem. Most parts take about a week to arrive.
</AccordionContent>
<AccordionItem value="item-5">
<AccordionTrigger>
What payment methods do you accept?
</AccordionTrigger>
<AccordionContent>
We accept cash, card (contactless ONLY), bank transfer and Bitcoin. Currently we do not accept Eftpos payments, only contactless payment methods such as Visa, Mastercard, American Express, Apple Pay, Google Pay and Samsung Pay.
</AccordionContent>
</AccordionItem>
</AccordionItem>
</Accordion>
<h3 className="text-lg font-bold text-slate-900">
Web Design and Development
</h3>
<Accordion>
<AccordionItem value="item-1">
<AccordionTrigger>
What platforms do you build websites with?
</AccordionTrigger>
<AccordionContent>
We specialize in modern web development using WordPress for
content-driven sites and React/Next.js for high-performance,
custom web applications. We also offer support for almost any
website builder, whether it&apos;s Wix, Oddo, Squarespace, or
anything else. Whether you need a blog, business site,
portfolio, or a fully custom web app—we&apos;ve got you covered.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>
How do I choose between WordPress and React/Next.js?
</AccordionTrigger>
<AccordionContent>
It depends on your needs:
<ul className="list-disc pl-6 my-2">
<li>
<strong>WordPress</strong> is best for content-heavy
websites like blogs, portfolios, and marketing sites.
</li>
<li>
<strong>React/Next.js</strong> is ideal for fast, scalable,
custom web applications or interactive user interfaces.
</li>
</ul>
We’ll help you decide what works best based on your goals and
budget.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-3">
<AccordionTrigger>
Do you design the website too, or just build it?
</AccordionTrigger>
<AccordionContent>
We do both! We offer full-service web design and development.
This includes UX/UI design, branding, responsive layouts, and
mobile-first design—all tailored to your needs.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-4">
<AccordionTrigger>
Can you redesign or improve my existing site?
</AccordionTrigger>
<AccordionContent>
Absolutely. We can modernize your design, improve performance,
migrate platforms, or fully rebuild your site with a better
structure and codebase.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-5">
<AccordionTrigger>
Do you offer SEO and performance optimization?
</AccordionTrigger>
<AccordionContent>
Yes! All our builds include basic SEO best practices and speed
optimization. We also offer advanced technical SEO, Core Web
Vitals tuning, and image/code optimization.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-6">
<AccordionTrigger>
Do you provide ongoing maintenance and support?
</AccordionTrigger>
<AccordionContent>
Yes, we offer monthly maintenance plans for updates, backups,
security checks, and minor edits. We can also provide on-demand
support when needed.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-7">
<AccordionTrigger>
Will my site work on mobile devices?
</AccordionTrigger>
<AccordionContent>
Definitely. Every site we build is fully responsive and tested
on a variety of devices to ensure it looks great and works well
on phones, tablets, and desktops.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-8">
<AccordionTrigger>
What do you need from me to get started?
</AccordionTrigger>
<AccordionContent>
We’ll need some info about your goals, brand, content (text,
images, logo), and examples of sites you like. Don’t worry—we’ll
guide you through the process!
</AccordionContent>
</AccordionItem>
))}
</Accordion>
</section>
</main>
+3 -2
View File
@@ -1,10 +1,11 @@
import { SITE_URL } from "@/lib/site";
export default function robots() {
return {
rules: {
userAgent: "*",
allow: "/",
disallow: "/private/",
},
sitemap: "https://www.teatatucomputers.com/sitemap.xml",
sitemap: `${SITE_URL}/sitemap.xml`,
};
}
+19 -1
View File
@@ -1,11 +1,29 @@
import HeaderSm from "../../components/HeaderSm";
import JsonLd from "../../components/JsonLd";
import { pageMetadata, serviceSchema } from "@/lib/site";
const page = {
title: "Laptop & PC Repair Te Atatū & West Auckland",
description:
"Cracked screens, dead laptops, PCs that won't boot and Windows faults. Upfront pricing and honest advice from your local tech in Te Atatū.",
path: "/services/computer-repair",
};
export const metadata = pageMetadata(page);
export default function Home() {
return (
<div style={{ marginBottom: "30em" }}>
<JsonLd
data={serviceSchema({
name: "Computer & Laptop Repair",
description: page.description,
path: page.path,
})}
/>
<HeaderSm text="Computer & Laptop Repairs" />
<section className="container mx-auto mb">
<h1 className="text-2xl mb-4">Profesional Computer Repairs</h1>
<h2 className="text-2xl mb-4">Professional Computer Repairs</h2>
<p>
Te Atatu Computers is your trusted destination for expert laptop repairs
in Auckland. We specialize in providing top-quality repair services,
+19 -1
View File
@@ -1,11 +1,29 @@
import HeaderSm from "../../components/HeaderSm";
import JsonLd from "../../components/JsonLd";
import { pageMetadata, serviceSchema } from "@/lib/site";
const page = {
title: "SSD Upgrades & PC Speed-Up | Te Atatu Computers",
description:
"Slow computer? An SSD and RAM upgrade can make it feel new for a fraction of the cost of a new PC. Local upgrades in Te Atatū, West Auckland.",
path: "/services/computer-upgrades",
};
export const metadata = pageMetadata(page);
export default function Home() {
return (
<div style={{ marginBottom: "30em" }}>
<JsonLd
data={serviceSchema({
name: "Computer Upgrades & Speed-Up",
description: page.description,
path: page.path,
})}
/>
<HeaderSm text="Computer & Laptop Upgrades/Speedup" />
<section className="container mx-auto mb">
<h1 className="text-2xl mb-4">Computer & Laptop Upgrades/Speedup</h1>
<h2 className="text-2xl mb-4">Computer & Laptop Upgrades/Speedup</h2>
<p>
Upgrading a slow computer can significantly improve its performance or
storage capacity and extend its lifespan. At Te Atatu Computers, we do
+19 -1
View File
@@ -1,11 +1,29 @@
import HeaderSm from "../../components/HeaderSm";
import JsonLd from "../../components/JsonLd";
import { pageMetadata, serviceSchema } from "@/lib/site";
const page = {
title: "Home & Small Business IT Support West Auckland",
description:
"Onsite and remote IT support for homes and small businesses: Wi-Fi, email, backups, security and new-PC setup.",
path: "/services/it-support",
};
export const metadata = pageMetadata(page);
export default function Home() {
return (
<div style={{ marginBottom: "30em" }}>
<JsonLd
data={serviceSchema({
name: "IT Support",
description: page.description,
path: page.path,
})}
/>
<HeaderSm text="IT Support" />
<section className="container mx-auto mb">
<h1 className="text-2xl mb-4">IT Support</h1>
<h2 className="text-2xl mb-4">IT Support</h2>
<p>
At Te Atatu Computers, we specialize in providing personalized IT
support tailored to the needs of individuals and small businesses.
+19 -1
View File
@@ -1,11 +1,29 @@
import HeaderSm from "../../components/HeaderSm";
import JsonLd from "../../components/JsonLd";
import { pageMetadata, serviceSchema } from "@/lib/site";
const page = {
title: "Virus & Malware Removal West Auckland",
description:
"Pop-ups, scams, slow or hacked PC? I'll clean it up, keep your files safe and help stop it happening again. Based in Te Atatū.",
path: "/services/virus-removal",
};
export const metadata = pageMetadata(page);
export default function Home() {
return (
<div style={{ marginBottom: "30em" }}>
<JsonLd
data={serviceSchema({
name: "Virus & Malware Removal",
description: page.description,
path: page.path,
})}
/>
<HeaderSm text="Virus Removal" />
<section className="container mx-auto mb">
<h1 className="text-2xl mb-4">Virus & Malware Removal</h1>
<h2 className="text-2xl mb-4">Virus & Malware Removal</h2>
<p>
Te Atatu Computers specializes in efficient and thorough virus removal
services for Windows devices, ensuring your computer is free from
-37
View File
@@ -1,37 +0,0 @@
import HeaderSm from "../../components/HeaderSm";
export default function Home() {
return (
<div style={{ marginBottom: "30em" }}>
<HeaderSm text="Web Design" />
<section className="container mx-auto mb">
<h1 className="text-2xl mb-4">Profesional Web Design</h1>
<p>
Te Atatu Computers offers comprehensive web design and development
services tailored to meet the unique needs of individuals and
businesses. Whether you&apos;re creating a brand-new website or need expert
assistance maintaining an existing one, we are here to help. Our team
works with popular platforms like WordPress, Wix, and Odoo to build
visually appealing and user-friendly websites. These platforms offer a
flexible and robust foundation for creating sites that are easy to
manage and designed to showcase your brand effectively. We ensure your
website is responsive, functional, and optimized for both desktop and
mobile users, giving you the edge in today&apos;s competitive online
landscape. <br /><br />
For those who require custom solutions, Te Atatu Computers
specializes in advanced web development using modern frameworks such
as React, NextJS, and Vue. We also leverage tools like Tailwind CSS
and standard coding languages like HTML, CSS, and JavaScript to create
fully customized, high-performance websites tailored to your specific
requirements. Whether you need e-commerce functionality, seamless
integrations, or custom features, we can deliver. Additionally, we
provide ongoing maintenance services to ensure your website remains
secure, up-to-date, and operating at peak performance. With Te Atatu
Computers, you gain a reliable partner dedicated to bringing your
online vision to life.
</p>
</section>
</div>
);
}
+7 -19
View File
@@ -1,22 +1,10 @@
import { SITE_URL, routes } from "@/lib/site";
export default function sitemap() {
return [
{
url: 'https://www.teatatucomputers.com/',
return routes.map(({ path, priority }) => ({
url: `${SITE_URL}${path}`,
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 1,
},
{
url: 'https://www.teatatucomputers.com/services',
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.5,
},
{
url: 'https://www.teatatucomputers.com/contact',
lastModified: new Date(),
changeFrequency: 'monthly',
priority: 0.5,
},
]
changeFrequency: "monthly",
priority,
}));
}
+4 -1
View File
@@ -52,9 +52,12 @@ function AccordionContent({
...props
}) {
return (
// forceMount keeps closed answers in the server-rendered HTML (needed for
// FAQPage schema); data-[state=closed]:hidden keeps them visually collapsed.
<AccordionPrimitive.Content
data-slot="accordion-content"
className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
forceMount
className="data-[state=closed]:hidden data-[state=open]:animate-accordion-down overflow-hidden text-sm"
{...props}>
<div className={cn("pt-0 pb-4", className)}>{children}</div>
</AccordionPrimitive.Content>
+44
View File
@@ -0,0 +1,44 @@
// Homepage FAQs. Rendered in the accordion and in FAQPage JSON-LD, so keep
// answers as plain text (plus an optional bullet list).
export const homeFaqs = [
{
question: "What types of devices do you repair?",
answer:
"We repair desktops, laptops, chromebooks and PCs. We also handle custom-built systems and some tablets, depending on the issue. We do not repair Apple devices.",
},
{
question: "What kinds of issues can you fix?",
answer:
"We handle a wide range of problems, including (but not limited to):",
list: [
"Software issues (e.g. Windows errors, slow performance)",
"Virus removal and protection",
"Data recovery and backup solutions",
"Network setup and troubleshooting",
"Hardware upgrades (e.g. RAM, SSD, graphics card)",
"Custom PC builds",
"Remote support for software issues",
"General IT support and consulting",
"Printer setup and troubleshooting",
"Software installation and configuration",
"Operating system installation and upgrades",
"Data migration from old devices to new ones",
],
},
{
question: "Do I need an appointment, or can I just walk in?",
answer:
"Currently we are operating by appointment only. Please contact us to schedule a time that works for you. We can also arrange remote support for certain issues.",
},
{
question: "How long will the repair take?",
answer:
"Most basic repairs are completed within 24–48 hours, although this isn't guaranteed. Some issues may take longer, depending on parts availability and complexity. We'll give you an estimated turnaround time when we diagnose the problem. Most parts take about a week to arrive.",
},
{
question: "What payment methods do you accept?",
answer:
"We accept cash, NZ bank transfer and Bitcoin, plus contactless card payments: Visa, Mastercard, American Express, Apple Pay, Google Pay and Samsung Pay. We don't accept EFTPOS.",
},
];
+154
View File
@@ -0,0 +1,154 @@
// Single source of truth for business facts (from the owner inputs in PLAN.md).
// Update values here rather than hard-coding them in pages.
export const SITE_URL = "https://teatatucomputers.com";
export const business = {
name: "Te Atatu Computers",
ownerName: "John",
phone: "021 107 7483",
phoneE164: "+64211077483",
email: "[email protected]",
address: {
street: "34 Graham Avenue",
suburb: "Te Atatū Peninsula",
city: "Auckland",
postcode: "0610",
country: "NZ",
},
hours: "Mon–Fri 9am–6pm. Weekends by appointment.",
serviceArea: [
"Te Atatū Peninsula",
"Te Atatū South",
"Henderson",
"Massey",
"Lincoln",
"Glendene",
"Westgate",
"Auckland CBD",
],
paymentMethods: [
"Cash",
"NZ bank transfer",
"Contactless Visa, Mastercard and American Express",
"Apple Pay, Google Pay and Samsung Pay",
"Bitcoin",
],
googleBusinessProfileUrl: "https://share.google/APzXLRzyrqAUldl4Y",
googleReviewUrl: "https://g.page/r/CYkJobPXq4IpEAE/review",
facebookUrl: "https://www.facebook.com/profile.php?id=61571509018351",
};
export const BUSINESS_ID = `${SITE_URL}/#business`;
// Every public route. Used by the sitemap; add new pages here.
export const routes = [
{ path: "/", priority: 1 },
{ path: "/services/computer-repair", priority: 0.8 },
{ path: "/services/computer-upgrades", priority: 0.8 },
{ path: "/services/virus-removal", priority: 0.8 },
{ path: "/services/it-support", priority: 0.8 },
{ path: "/contact", priority: 0.6 },
];
// Builds per-page metadata: title, description, canonical, Open Graph and Twitter.
export function pageMetadata({ title, description, path }) {
return {
title,
description,
alternates: { canonical: path },
openGraph: {
title,
description,
url: path,
siteName: business.name,
locale: "en_NZ",
type: "website",
images: [
{
url: "/og-image.png",
width: 1200,
height: 630,
alt: business.name,
},
],
},
twitter: {
card: "summary_large_image",
title,
description,
images: ["/og-image.png"],
},
};
}
export function localBusinessSchema() {
const { address } = business;
return {
"@context": "https://schema.org",
"@type": "ComputerRepairService",
"@id": BUSINESS_ID,
name: business.name,
url: `${SITE_URL}/`,
telephone: business.phoneE164,
email: business.email,
logo: `${SITE_URL}/logo.png`,
image: `${SITE_URL}/og-image.png`,
address: {
"@type": "PostalAddress",
streetAddress: address.street,
addressLocality: address.suburb,
addressRegion: address.city,
postalCode: address.postcode,
addressCountry: address.country,
},
areaServed: business.serviceArea.map((name) => ({
"@type": "Place",
name: `${name}, Auckland`,
})),
openingHoursSpecification: [
{
"@type": "OpeningHoursSpecification",
dayOfWeek: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
opens: "09:00",
closes: "18:00",
},
],
priceRange: "$",
currenciesAccepted: "NZD",
paymentAccepted: business.paymentMethods.join(", "),
hasMap: business.googleBusinessProfileUrl,
sameAs: [business.googleBusinessProfileUrl, business.facebookUrl],
};
}
export function serviceSchema({ name, description, path }) {
return {
"@context": "https://schema.org",
"@type": "Service",
name,
serviceType: name,
description,
url: `${SITE_URL}${path}`,
provider: { "@id": BUSINESS_ID },
areaServed: business.serviceArea.map((area) => ({
"@type": "Place",
name: `${area}, Auckland`,
})),
};
}
export function faqSchema(faqs) {
return {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: faqs.map(({ question, answer, list }) => ({
"@type": "Question",
name: question,
acceptedAnswer: {
"@type": "Answer",
text: list ? `${answer} ${list.join("; ")}.` : answer,
},
})),
};
}