- /pricing: full price list, no-fix-no-fee terms, travel and payments - /about: first-person page from confirmed facts, links to area pages - /areas/[suburb]: Te Atatū Peninsula, Te Atatū South, Henderson and Massey, generated from src/lib/areas.js with suburb-specific copy - /windows-10: options page with free Windows 11 check; October 2028 used for business Extended Security Updates - /business: $65/month plan (2 hours, no lock-in, no rollover) - Nav gains Pricing/About and Business/Windows 10 links; footer rebuilt with address, hours and links; homepage links areas, /business and a Windows 10 banner; sitemap includes all new routes - Mobile menu hides by its own height (fixes overflow with more links); hamburger now used below 900px so the link row never overlaps Co-Authored-By: Claude Opus 5.5 <[email protected]>
234 lines
6.5 KiB
JavaScript
234 lines
6.5 KiB
JavaScript
// 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",
|
||
],
|
||
prices: {
|
||
diagnostic: "$35",
|
||
hourly: "$35",
|
||
},
|
||
rating: { value: "4.8", count: 4 },
|
||
testimonials: [
|
||
{
|
||
name: "Irwin",
|
||
quote:
|
||
"John is a super star! He fixed my laptop for a reasonable price. I highly recommend him!",
|
||
},
|
||
{
|
||
name: "Marlies",
|
||
quote:
|
||
"Very happy with the service provided. Very prompt response to my online query and further questions. John knew what he was doing, was professional and helpful. Thank you!",
|
||
},
|
||
],
|
||
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`;
|
||
|
||
export const links = {
|
||
tel: `tel:${business.phoneE164}`,
|
||
sms: `sms:${business.phoneE164}`,
|
||
whatsapp: `https://wa.me/${business.phoneE164.slice(1)}`,
|
||
email: `mailto:${business.email}`,
|
||
};
|
||
|
||
// 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: "/pricing", priority: 0.8 },
|
||
{ path: "/business", priority: 0.7 },
|
||
{ path: "/windows-10", priority: 0.7 },
|
||
{ path: "/about", priority: 0.6 },
|
||
{ path: "/contact", priority: 0.6 },
|
||
];
|
||
|
||
// Full price list, shown on /pricing. Labour prices; parts are extra.
|
||
export const priceList = [
|
||
{
|
||
group: "Repairs",
|
||
items: [
|
||
{ item: "Diagnosis", price: "$35" },
|
||
{ item: "Laptop screen replacement", price: "from $35 + the screen" },
|
||
{ item: "Battery, charging port or keyboard", price: "from $35 + parts" },
|
||
{ item: "Other repairs (labour)", price: "$35 an hour" },
|
||
],
|
||
},
|
||
{
|
||
group: "Upgrades & Windows",
|
||
items: [
|
||
{ item: "SSD upgrade", price: "from $45 + the drive" },
|
||
{ item: "Windows reinstall", price: "from $45" },
|
||
{ item: "Windows 11 compatibility check", price: "Free" },
|
||
{ item: "RAM, graphics card and Windows 11 upgrades", price: "from $35 + parts" },
|
||
{ item: "Custom PC build (labour)", price: "from $35" },
|
||
],
|
||
},
|
||
{
|
||
group: "Viruses, data & support",
|
||
items: [
|
||
{ item: "Virus and malware removal", price: "from $35" },
|
||
{ item: "Moving files to a new computer", price: "from $45" },
|
||
{ item: "New computer setup", price: "from $35" },
|
||
{ item: "Remote support", price: "$35 an hour" },
|
||
{ item: "Onsite support", price: "$35 an hour + travel" },
|
||
{ item: "Small business IT plan", price: "$65 a month" },
|
||
],
|
||
},
|
||
];
|
||
|
||
export const businessPlan = {
|
||
price: "$65",
|
||
hours: 2,
|
||
includes: [
|
||
"2 hours of remote or onsite support every month",
|
||
"Extra time at the normal $35 an hour",
|
||
"No lock-in contract. Cancel any time.",
|
||
],
|
||
terms:
|
||
"Unused hours don't roll over to the next month. Onsite visits have a travel fee based on distance.",
|
||
};
|
||
|
||
// 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,
|
||
areas = business.serviceArea,
|
||
}) {
|
||
return {
|
||
"@context": "https://schema.org",
|
||
"@type": "Service",
|
||
name,
|
||
serviceType: name,
|
||
description,
|
||
url: `${SITE_URL}${path}`,
|
||
provider: { "@id": BUSINESS_ID },
|
||
areaServed: areas.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,
|
||
},
|
||
})),
|
||
};
|
||
}
|