From 40d3a080503e42bd88ba03fb4c252787bbabf3f5 Mon Sep 17 00:00:00 2001 From: asowneryt Date: Wed, 30 Sep 2026 20:37:42 +1300 Subject: [PATCH] Phase 3: service pages on a shared template - ServicePage template: H1 with service + area, intro with Call/Text above the fold, What I fix, Pricing, How it works, Why choose me, a testimonial, FAQs (with FAQPage schema), CTA band, related services - Service copy moved to src/lib/services.js, rewritten in first person with owner-confirmed jobs and prices only; removes the "team of technicians", "preferred choice", Mac and motherboard claims - FaqList and CtaBand extracted and shared with the homepage - Button gains primary/outlineDark variants; responsive page-header H1 - Compact Chatwoot bubble on phones so it doesn't cover CTAs Co-Authored-By: Claude Opus 5.5 --- src/app/components/Button.js | 2 +- src/app/components/Button.module.css | 11 ++ src/app/components/ChatwootWidget.js | 3 +- src/app/components/CtaBand.js | 34 ++++ src/app/components/FaqList.js | 34 ++++ src/app/components/HeaderSm.js | 2 +- src/app/components/ServicePage.js | 182 +++++++++++++++++ src/app/page.js | 60 +----- src/app/services/computer-repair/page.js | 52 +---- src/app/services/computer-upgrades/page.js | 46 +---- src/app/services/it-support/page.js | 52 +---- src/app/services/virus-removal/page.js | 44 +---- src/lib/services.js | 216 +++++++++++++++++++++ 13 files changed, 502 insertions(+), 236 deletions(-) create mode 100644 src/app/components/CtaBand.js create mode 100644 src/app/components/FaqList.js create mode 100644 src/app/components/ServicePage.js create mode 100644 src/lib/services.js diff --git a/src/app/components/Button.js b/src/app/components/Button.js index c011c16..2b88e66 100644 --- a/src/app/components/Button.js +++ b/src/app/components/Button.js @@ -3,7 +3,7 @@ import styles from "./Button.module.css"; // Renders a link when given href (internal paths use next/link), otherwise a button. export default function Button({ children, onClick, href, variant }) { - const className = `${styles.button} ${variant === "outline" ? styles.outline : ""}`; + const className = `${styles.button} ${variant ? styles[variant] : ""}`; if (href?.startsWith("/")) { return {children}; } diff --git a/src/app/components/Button.module.css b/src/app/components/Button.module.css index cda2502..523e7c8 100644 --- a/src/app/components/Button.module.css +++ b/src/app/components/Button.module.css @@ -24,3 +24,14 @@ color: white; box-shadow: inset 0 0 0 2px white; } + +.primary { + background-color: var(--color-sky-800); + color: white; +} + +.outlineDark { + background-color: transparent; + color: var(--color-sky-800); + box-shadow: inset 0 0 0 2px var(--color-sky-800); +} diff --git a/src/app/components/ChatwootWidget.js b/src/app/components/ChatwootWidget.js index 5404b2f..067289e 100644 --- a/src/app/components/ChatwootWidget.js +++ b/src/app/components/ChatwootWidget.js @@ -9,7 +9,8 @@ class ChatwootWidget extends React.Component { hideMessageBubble: false, position: "right", // This can be left or right locale: "en", // Language to be set - type: "expanded_bubble", // [standard, expanded_bubble] + // Small round bubble on phones so it doesn't cover the page's buttons. + type: window.innerWidth < 768 ? "standard" : "expanded_bubble", // [standard, expanded_bubble] }; // Paste the script from inbox settings except the