commit 75ece13f80569dbed06aa72f1df9217da1dbbde7 Author: Timo Knuth Date: Thu May 28 18:49:39 2026 +0200 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..426b214 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Dependencies +node_modules/ + +# Next.js +.next/ +out/ + +# Production builds +dist/ +build/ + +# TypeScript +tsconfig.tsbuildinfo + +# Environment variables +.env +.env.* +!.env.example + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# OS files +.DS_Store +Thumbs.db + +# Editor files +.vscode/ +.idea/ diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..dabfa6f --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,167 @@ +# Bay Area Email Services Design Mockups + +Purpose: visual direction probes for a dedicated marketing landing page for Bay Area Email Services, based on the current project brief, landing page plan, and research handovers. + +## Direction 1: Local Trust + +![Local Trust](design-mockups/01-local-trust.png) + +Positioning: bright, local, service-led, and human. This direction should make the visitor feel that a real Corpus Christi IT team will handle email setup, migration, and support. + +Carry forward: +- Light interface with deep navy, muted coastal blue, and small green status accents. +- Strong hero with service, location, price, and assessment CTA visible immediately. +- Local service area and phone number as trust elements, not footer afterthoughts. +- A simple dashboard-style email panel instead of generic SaaS illustration. + +## Direction 2: Infrastructure Credibility + +![Infrastructure Credibility](design-mockups/02-infrastructure-credibility.png) + +Positioning: serious, technical, and resilient. This direction is strongest if the page should emphasize AWS, Amazon S3 buffering, Amazon SES, DNS authentication, and failover. + +Carry forward: +- Dark hero for operational credibility, paired with lighter lower sections for readability. +- Mail-flow diagram as the main visual object: inbound, S3 buffer, mailbox delivery, outbound SES, standby failover. +- Status labels for SPF, DKIM, DMARC, and continuity. +- Careful claims like "designed for continuity" and "helps reduce spam-folder risk." + +## Direction 3: Product Pricing + +![Product Pricing](design-mockups/03-product-pricing.png) + +Positioning: productized, transparent, and easy to compare. This direction makes the $5 per inbox offer the main conversion hook. + +Carry forward: +- Strict grid and pricing-forward hero. +- Inclusion table instead of repeated feature cards. +- Fit-based comparison against Google Workspace, Microsoft 365, shared hosting, and Bay Area Email Services. +- Transparent caveat area for setup, migration, support scope, minimums, taxes, and add-ons. + +## Direction 4: Migration Onboarding + +![Migration Onboarding](design-mockups/04-migration-onboarding.png) + +Positioning: reduces switching anxiety. This direction is best if the buyer is worried about moving email, downtime, DNS access, and device setup. + +Carry forward: +- Four-step onboarding flow: assess, configure DNS, migrate mail, set up devices. +- Device visuals for Outlook, iPhone, and iPad. +- DNS audit checklist and migration checklist as conversion tools. +- CTA framed around a low-risk 20-minute assessment. + +## Selected Direction + +The preferred direction is closest to Direction 2: Infrastructure Credibility. + +![Selected Infrastructure Shape](design-mockups/05-selected-infrastructure-shape.png) + +Use a dark, operational, infrastructure-led landing page with a large mail-flow diagram as the main first-viewport visual. The page should feel like a local managed email platform, not a generic SaaS template. + +Carry forward from the selected mockup: + +- Dark navy page shell with crisp blue linework and green operational status accents. +- Large left-aligned hero: "Business Email Hosting in Corpus Christi." +- Primary CTA and phone CTA visible above the fold. +- Large technical architecture panel: inbound email, S3 buffering, mailbox delivery, outbound SES, standby failover. +- Compact lower modules for DNS authentication, migration process, pricing, and plan comparison. +- Local support proof strip at the bottom of the first landing-page section. +- Status-bar component showing inbound, delivery, and outbound as operational. + +The resulting site should feel technically credible first, local and human second, and product-priced third: + +- Above the fold: "Business Email Hosting in Corpus Christi", "$5 / inbox / month", "25 GB mailbox included", local phone, and assessment CTA. +- First scroll: concrete included services and migration/onboarding path. +- Middle: DNS deliverability and AWS-backed continuity explained in plain English. +- Later: pricing caveats, comparison, service area, FAQ, and final CTA. + +## Stitch Prompt + +Create a high-fidelity responsive landing page mockup for "Bay Area Email Services", a local business email hosting service by Bay Area IT in Corpus Christi, Texas. + +Design direction: +Dark infrastructure-led marketing page. The page should look like a serious managed email platform operated by a local IT team. It should feel precise, technical, trustworthy, and buildable. Avoid generic SaaS gradients, glassmorphism, decorative blobs, cartoon illustrations, and over-rounded icon cards. + +Visual style: +- Background: deep navy / near-black blue, not pure black. +- Surfaces: slightly lighter navy panels with thin blue-gray borders. +- Accents: electric-but-restrained blue for CTAs and connection lines, green for operational checks/status, off-white text. +- Typography: confident modern sans-serif, strong H1, compact technical labels, excellent hierarchy. +- Layout: asymmetric hero, left copy column and right large architecture diagram. +- Components should be dense, crisp, and operational, like a premium infrastructure/status dashboard. + +Hero content: +- Logo: Bay Area Email Services, with a simple outlined envelope mark. +- Navigation: Services, Infrastructure, Pricing, Migration, About, Resources, Support. +- Header phone CTA: "Call (361) 765-8400". +- Header button: "Book a 20-minute email assessment". +- H1: "Business Email Hosting in Corpus Christi". +- Subcopy: "Infrastructure and support from a local team that understands how business gets done." +- Bullets: + - "AWS-built architecture" + - "Configured to improve deliverability" + - "Real people. Local support." +- Primary CTA: "Book a 20-minute email assessment". +- Secondary phone CTA: "Call (361) 765-8400". + +Main hero visual: +Create a large architecture panel showing the email flow: +1. Inbound Email: Internet, remote mail server, other providers. +2. Buffer & Process: Amazon S3 buffering, virus and malware scanning, policy and content filtering, message validation, logging and monitoring. +3. Mailbox Delivery: mailbox delivery with laptop and phone icons. +4. Outbound Email: Amazon SES outbound to internet. +5. Standby: AWS standby environment / hot standby. + +Include a bottom status strip inside the panel: +"System Status", "All Systems Operational", "Inbound Operational", "Delivery Operational", "Outbound Operational", "View status". + +Below hero: +Create four compact modules in one row on desktop: +1. DNS Authentication: + "We configure and validate the records that help protect your domain." + Checklist: SPF, DKIM, DMARC. +2. Migration Process: + Four steps: Discover, Plan, Migrate, Validate. +3. Pricing: + "$5 / inbox / month" + Includes: Business email on your domain, AWS-backed infrastructure, web/mobile/desktop access, local support from real people. + Button: "Book a 20-minute email assessment". +4. Compare Plans: + Table columns: Feature, BES Basic, BES Pro, Other Providers. + Rows: Business email, Custom domain, AWS infrastructure, Local support, Transparent pricing. + +Local support strip: +Title: "Local Support. Real People." +Use compact proof items: +- Local team in Corpus Christi +- U.S.-based support +- Responsive during business hours +- Small business focused +- Part of the Bay Area IT Services family + +Claim safety: +Do not use "guaranteed inbox placement", "zero downtime", "spam-proof", "hack-proof", or "no email ever lost". +Use careful phrases like "configured to improve deliverability", "helps reduce spam-folder risk", "designed for continuity", "standby failover", and "AWS-backed infrastructure". + +Responsive behavior: +Desktop: dense dashboard-style hero and modules. +Tablet: architecture diagram stacks below hero copy. +Mobile: hero copy first, CTA buttons full width, architecture diagram simplified into vertical flow cards, lower modules stacked. + +Make the output look like a polished real website mockup, not a wireframe. + +## Claim Rules + +Use: +- "Configured to improve deliverability" +- "Helps reduce spam-folder risk" +- "Designed for continuity" +- "Standby failover" +- "Built on AWS services including Amazon S3 and Amazon SES" + +Avoid: +- "Guaranteed inbox placement" +- "Zero downtime" +- "Spam-proof" +- "Hack-proof" +- "No email ever lost" diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..64bcbfe --- /dev/null +++ b/PLAN.md @@ -0,0 +1,174 @@ +# Landingpage Plan + +```yaml +goal: > + Eine separate Marketing-/Landingpage fuer Bay Area Email Services planen, die lokal in Corpus Christi verkauft und spaeter SaaS-nahe erweitert werden kann. +current_phase: > + plan +owner: > + swarm-planner +context: + - "Projektordner: C:\\Users\\a931627\\Documents\\gitea\\bayarea\\E-Mail Webseite Marketing" + - "Produkt: lokale Business-E-Mail-Loesung mit 25 GB Mailboxen fuer $5 pro Inbox, Domain-E-Mail, DNS-Setup, Migration, Outlook/iPhone/iPad Setup und laufendem Support." + - "Technische Positionierung: AWS-basierte Infrastruktur, inbound Amazon S3 Buffering, outbound Amazon SES, Hot-Standby/Failover, SPF/DKIM/DMARC." + - "SEO-Chance: dedizierte Email-only-Landingpage fuer Corpus Christi, weil lokale Wettbewerber E-Mail meist nur als Unterpunkt breiter Managed-IT-Angebote behandeln." +constraints: + - "Keine Implementierung in dieser Phase." + - "Die Seite muss lokale Service-Nachfrage bedienen und spaeter als Produkt-/SaaS-Landingpage erweiterbar bleiben." + - "Keine garantierten Deliverability-, Uptime-, Security- oder 'no email lost'-Claims ohne belegbares SLA und technische Nachweise." + - "Preisclaim '$5 per inbox' nur mit Abrechnungszeitraum, Leistungsumfang, Setup-/Migrationskosten und eventuellen Mindestmengen verwenden." +assumptions: + - "Primaere Zielgruppe sind kleine lokale Unternehmen in Corpus Christi und Coastal Bend." + - "Bay Area Email Services bleibt vorerst der Produktname." + - "Assessment-CTA, Telefonnummer (361) 765-8400 und Service Area aus dem bestehenden Material bleiben gueltig." +open_questions: + - "Ist $5 pro Inbox monatlich oder anders abgerechnet?" + - "Sind DNS-Setup, Migration, Device-Setup und laufender Support im Preis enthalten oder Add-ons?" + - "Welche SLA-, Uptime-, Failover- und S3-Retention-Aussagen sind belegbar?" + - "Gibt es Testimonials, Review-Sterne, Case Studies, Kundenlogos oder Uptime-Historie?" + - "Welche Domain-Struktur ist geplant: bestehende Website, Subdomain oder eigenstaendige Produktdomain?" +requested_output: + - "Eine erste Landingpage mit klarer lokaler Positionierung, transparenter Preis-/Leistungsdarstellung, technischer Glaubwuerdigkeit und Assessment-CTA." +done_definition: + - "Seitenstruktur, SEO-Ziele, Copy-Positionierung, CTAs, Claim-Regeln und offene Produktentscheidungen sind dokumentiert." + - "Ein Implementer kann danach Wireframe, Copy und Frontend-Prototyp erstellen, ohne die Grundlagen erneut zu recherchieren." +verification: + - "Research-Handover der drei gestarteten Research-Stränge gelesen." + - "swarm-plan Skill und Handover-Contract angewendet." + - "Plan-Datei erstellt; keine App-Dateien implementiert." +``` + +## Seitenstruktur + +1. Hero + - H1: `Business Email Hosting in Corpus Christi` + - Subcopy: Domain-E-Mail, 25 GB Mailboxen, lokale Einrichtung, DNS-Authentifizierung, Migration und Support. + - Primaerer CTA: `Book a 20-minute email assessment` + - Sekundaerer CTA: `See what is included` + - Preisanker: `$5 per inbox` sichtbar machen, sobald die Preisbedingungen bestaetigt sind. + +2. Problem + - Kostenlose Gmail/Yahoo-Adressen wirken unprofessionell. + - Webhost-Mail und falsch konfigurierte DNS-Eintraege fuehren zu Spam-Folder-Problemen. + - E-Mail-Ausfaelle kosten Leads, Freigaben und Vertrauen. + - Kleine Teams wollen keinen anonymen Self-Service-Support. + +3. Angebot + - 25 GB Mailboxen + - Domain-Adressen und Aliases + - Outlook, iPhone und iPad Setup + - SPF, DKIM, DMARC und MX-Konfiguration + - Migration von Gmail, Yahoo, Webhost-Mail oder altem Provider + - Forwards, Auto-Replies, Custom Spam Filtering + - Lokaler Support + +4. Deliverability und Sicherheit + - SPF/DKIM/DMARC in einfacher Sprache erklaeren. + - Amazon SES als technische Grundlage fuer authentifiziertes Senden darstellen. + - Formulierung: `helps reduce spam-folder risk`, nicht `guaranteed inbox placement`. + +5. Reliability + - AWS, S3-Inbound-Buffering und Hot Standby erklaeren. + - Formulierung: `designed for continuity` und `standby failover`, nicht `zero downtime`. + - Optional spaeter: Status-/Uptime-Block, wenn echte Daten vorhanden sind. + +6. Migration und Onboarding + - Was benoetigt wird: Domain-Zugang, Mailboxliste, aktueller Provider. + - Prozess: Audit, DNS-Plan, Mailbox-Erstellung, Migration, Device Setup, Go-live Check. + - Kaufangst reduzieren: klare Migrationsfenster und realistische Downtime-Erwartungen. + +7. Pricing + - Basiszeile: `$5 per inbox / month`, falls bestaetigt. + - Direkt darunter: `25 GB mailbox included`. + - Separat ausweisen: Setup, Migration, Support, Minimums, Add-ons, Taxes/Fees. + +8. Comparison + - Google Workspace: passend fuer Teams, die die volle Google-Suite brauchen. + - Microsoft 365: passend fuer Office/Teams/OneDrive-orientierte Teams. + - Shared hosting email: guenstig, aber oft schwaecher bei Support, Deliverability und Resilienz. + - Bay Area Email Services: passend fuer lokale kleine Unternehmen, die professionelle E-Mail, Migration, DNS-Korrektheit und lokalen Support wollen. + +9. Local Trust + - Corpus Christi und Coastal Bend sichtbar nennen. + - Orte: Corpus Christi, Portland, Rockport, Aransas Pass, Kingsville. + - Trust Proofs: 30+ Jahre IT-Erfahrung, 30+ lokale Unternehmen, Telefonnummer, echte Reviews oder Testimonials sobald verfuegbar. + +10. FAQ + - What is a professional business email address? + - Why are my business emails going to spam? + - Can you migrate our existing emails? + - Does this work with Outlook, iPhone, and iPad? + - What does $5 per inbox include? + - Is this Microsoft 365 or Google Workspace? + - What happens if the mail server is down? + - Do you support aliases, forwards, shared inboxes, and auto-replies? + +11. Final CTA + - `Book a 20-minute email assessment` + - `Get a mailbox count quote` + - `Call (361) 765-8400` + +## SEO Targets + +Primaerer Suchintent: + +- `business email hosting Corpus Christi` +- `business email services Corpus Christi` +- `professional business email Corpus Christi` +- `small business email setup Corpus Christi` + +Sekundaere Cluster: + +- `business email Coastal Bend` +- `Outlook email setup Corpus Christi` +- `iPhone business email setup` +- `email migration services Corpus Christi` +- `SPF DKIM DMARC setup Corpus Christi` +- `why business emails go to spam` +- `affordable business email hosting` + +Empfohlene URL: + +- `/business-email-hosting-corpus-christi/` + +Title/Meta Startpunkt: + +- Title: `Business Email Hosting Corpus Christi | $5/Inbox Local Support` +- Meta: `Professional domain email hosting for Corpus Christi businesses. 25 GB mailboxes, Outlook and iPhone setup, SPF/DKIM/DMARC, migration, and local support.` + +Schema: + +- `LocalBusiness` oder `ProfessionalService` fuer lokale Firma +- `Service` fuer Business Email Services +- `Offer` nur, wenn Preis und Bedingungen final sind +- FAQ-Inhalte fuer Nutzer einbauen; FAQ Rich Results nicht als Haupt-SEO-Hebel einplanen + +## Claim-Safety Regeln + +- Deliverability: `configured to improve deliverability`, `helps reduce spam-folder risk`. +- Nicht verwenden: `guaranteed inbox placement`, `spam-proof`. +- Reliability: `designed for continuity`, `redundant infrastructure`, `standby failover`. +- Nicht verwenden: `zero downtime`, `no email ever lost`. +- Security: `email security hardening`, `SPF/DKIM/DMARC setup`, `spam filtering`. +- Nicht verwenden: `fully secure`, `hack-proof`. +- AWS: `built on AWS services including Amazon S3 and Amazon SES`. +- Nicht verwenden: Formulierungen, die AWS-Partnerschaft oder Zertifizierung implizieren, falls nicht belegt. + +## Naechste Entscheidungen + +- Preis finalisieren: monatlich, jaehrlich, Mindestanzahl, Taxes, Add-ons. +- Supportumfang klaeren: was ist pro Inbox enthalten, was laeuft ueber Helpdesk/Retainer? +- Setup/Migration klaeren: kostenlos, pauschal, individuell oder Paketpreise. +- Technische Claims pruefen: SLA, Failover-Test, S3-Retention, Monitoring, Backup. +- Brand/Domain entscheiden: bestehende Bay Area IT Website, Subdomain oder eigenstaendige Produktdomain. +- Proof sammeln: Reviews, Testimonials, Case Studies, Screenshots, Uptime-/Monitoring-Daten. + +## Implementierungs-Akzeptanzkriterien + +- Die erste Ansicht macht Service, Ort, Preisanker und CTA ohne Scrollen klar. +- Die Seite erklaert technische Vorteile in Business-Sprache und kann Details fuer technische Kaeufer ausklappen. +- Pricing ist transparent genug, dass ein kleiner Betrieb eine Anfrage mit realistischer Erwartung stellen kann. +- Die Seite enthaelt keine unhaltbaren Guarantees. +- Local SEO ist sauber: Ort, Service Area, Telefonnummer, Services und strukturierte Daten stimmen zusammen. +- Mobile Layout ist voll nutzbar; CTA, Pricing und FAQ sind ohne Textueberlauf scanbar. +- Spaetere Erweiterung zu SaaS ist moeglich, ohne die komplette Informationsarchitektur neu zu bauen. diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..c3b51fd --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,45 @@ +# Product + +## Register + +brand + +## Users + +Small business owners, office managers, and local operators in Corpus Christi and the Coastal Bend who rely on email for leads, approvals, scheduling, documents, and customer communication. They may currently use Gmail, Yahoo, shared hosting email, old providers, or poorly configured Microsoft/Outlook setups. + +Their context is practical and often anxious: email feels essential, DNS feels confusing, migration feels risky, and support queues feel too remote. They want professional email on their own domain, correct setup, reliable migration, Outlook and mobile support, and a local person to call when something breaks. + +## Product Purpose + +Bay Area Email Services is a dedicated marketing landing page for Bay Area IT's managed business email hosting offer. It must explain the offer, build trust in the infrastructure, clarify pricing, and convert qualified local businesses into assessment or quote requests. + +Success means a visitor quickly understands: this is business email hosting for Corpus Christi, it costs $5 per inbox per month with 25 GB mailboxes, DNS authentication and migration are handled, the infrastructure is AWS-backed, and local support is available. + +## Brand Personality + +Precise, local, operational. + +The brand should feel technically competent without becoming cold, local without becoming folksy, and productized without pretending to be a generic self-serve SaaS company. Copy should be plain-English, specific, and careful with claims. + +## Anti-references + +Avoid generic SaaS landing pages with purple gradients, glassmorphism, floating blobs, identical icon-card grids, vague AI-style copy, or oversized hero metrics. Avoid enterprise cybersecurity fear marketing, neon hacker aesthetics, and stock-photo-heavy IT support pages. + +Avoid unsupported claims such as guaranteed inbox placement, zero downtime, spam-proof, hack-proof, or no email ever lost. + +## Design Principles + +Show the system, not just the promise. The page should make email flow, DNS authentication, buffering, outbound sending, standby infrastructure, and local support visible. + +Make the first viewport do the sales work. Service, location, price, core infrastructure proof, CTA, and phone number must be visible without scrolling on desktop. + +Translate technical depth into buyer confidence. SPF, DKIM, DMARC, Amazon S3, Amazon SES, and failover should be explained in business language, with technical labels available for credibility. + +Keep pricing clear but scoped. The $5 per inbox price should be easy to find, while setup, migration, support scope, minimums, taxes, and add-ons must not be implied as free unless confirmed. + +Build for local trust first, future SaaS expansion second. The site can feel product-led, but the strongest differentiator is managed local support from Bay Area IT. + +## Accessibility & Inclusion + +Target WCAG AA. The dark visual direction needs strong text contrast, visible focus states, non-color-only status indicators, reduced-motion support, and responsive layouts that preserve reading order. Technical diagrams must have textual summaries so the core message is not trapped inside imagery. diff --git a/PROJECT_BRIEF.md b/PROJECT_BRIEF.md new file mode 100644 index 0000000..e7dc379 --- /dev/null +++ b/PROJECT_BRIEF.md @@ -0,0 +1,59 @@ +# E-Mail Webseite Marketing + +## Projektziel + +Separate Marketing-Webseite fuer die E-Mail-Webloesung von Bay Area Email Services. Die Seite soll zunaechst als Landingpage/Marketingseite funktionieren und spaeter zu einer SaaS-Produkt-Landingpage ausgebaut werden koennen. + +## Ausgangsangebot + +Bay Area Email Services bietet Business-E-Mail-Hosting fuer kleine Unternehmen in Corpus Christi und der Coastal Bend Region. + +Kernangebot: + +- 25 GB Business-Mailbox fuer $5 pro Inbox +- Domain-basierte E-Mail-Adressen wie `info@`, `contact@` und persoenliche Adressen +- Microsoft Outlook Setup und Lizenzierung +- iPhone- und iPad-Konfiguration +- DNS-Konfiguration fuer MX, SPF, DKIM und DMARC +- Spamfilter-Konfiguration und E-Mail-Security-Hardening +- Migration von Gmail, Yahoo, vorherigem Hosting oder alten Providern +- Shared Inboxes, Aliases, Weiterleitungen und Auto-Replies +- Lokaler technischer Support in Corpus Christi + +## Infrastruktur-Positionierung + +Die Loesung ist als resiliente E-Mail-Plattform positioniert: + +- AWS-basierte Infrastruktur +- Eingehende Nachrichten werden vor der Zustellung in Amazon S3 gepuffert +- Ausgehende E-Mail laeuft ueber Amazon SES +- Hot-Standby-Server fuer Failover innerhalb weniger Minuten +- DNS, Migration und laufende Verwaltung werden lokal betreut + +## Aktuelle Problem-/Value-Proposition + +Freie Gmail- oder Yahoo-Adressen wirken unprofessionell und koennen Vertrauen kosten. Viele E-Mails landen nicht wegen des Inhalts im Spam, sondern wegen fehlender oder falsch konfigurierter DNS-Eintraege. Die Loesung richtet professionelle Domain-E-Mail korrekt ein, verbessert Zustellbarkeit, reduziert Ausfallrisiko und gibt lokalen Unternehmen schnellen Support. + +## Vertrauenssignale aus bestehendem Material + +- 30+ Jahre IT-Erfahrung +- 30+ lokale Unternehmen unterstuetzt +- Klare, jargonfreie Erklaerung technischer Themen +- Schnelle lokale Reaktion statt anonymem Support-Queue +- Erfahrung mit Outlook, mobilen Geraeten, DNS, Migration und Security + +## Erste Zielgruppen + +- Kleine Unternehmen in Corpus Christi und Coastal Bend +- Unternehmen, die noch kostenlose Gmail/Yahoo-Adressen nutzen +- Unternehmen mit Problemen bei Spam-Zustellung oder DNS-Konfiguration +- Unternehmen, die von Shared-Hosting-Mail oder alten Providern migrieren +- Teams, die lokale Einrichtung und laufenden Support statt Self-Service-only wollen + +## Offene strategische Fragen + +- Soll die Seite primaer lokal-serviceorientiert bleiben oder staerker als Produkt/SaaS auftreten? +- Soll der Preis `$5 per inbox` als Hauptanker im Hero stehen oder erst im Pricing-Abschnitt? +- Welche Claims zur Deliverability duerfen rechtlich und faktisch sicher genutzt werden? +- Welche Domain/Brand-Struktur ist geplant: eigene Produktdomain, Subdomain oder Unterseite? +- Gibt es echte Testimonials, Case Studies, SLA-Angaben oder Uptime-Historie? diff --git a/SHAPE_BRIEF.md b/SHAPE_BRIEF.md new file mode 100644 index 0000000..eeda815 --- /dev/null +++ b/SHAPE_BRIEF.md @@ -0,0 +1,174 @@ +# Impeccable Shape Brief: Bay Area Email Services Landing Page + +## Visual Probe + +![Selected Infrastructure Shape](design-mockups/05-selected-infrastructure-shape.png) + +## 1. Feature Summary + +This is a dedicated marketing landing page for Bay Area Email Services, a managed business email hosting offer for small businesses in Corpus Christi and the Coastal Bend. + +The page must sell professional domain email by making the infrastructure visible, the local support credible, and the price easy to understand. It should feel like a local managed email platform operated by serious IT people, not a generic SaaS landing page. + +## 2. Primary User Action + +The primary action is to book a 20-minute email assessment. + +The secondary action is to call `(361) 765-8400`. Pricing, DNS, migration, and infrastructure content should all support one decision: "This team can assess and fix our business email setup." + +## 3. Design Direction + +Color strategy: Committed. + +The page is mostly carried by a dark operational navy environment, with electric-but-restrained blue for action and connection lines, green for operational status, and off-white for copy. This color system is load-bearing and should not be softened into a generic light SaaS page. + +Theme scene sentence: A small business owner or office manager reviews email risk and pricing on a desktop during work hours while a local IT team monitors the mail platform in the background, so the interface should feel like a readable operations console rather than a decorative marketing page. + +Anchor references: + +- AWS architecture diagrams, for serious mail-flow explanation. +- Stripe-style product clarity, for pricing and conversion discipline. +- Linear-style operational polish, for dark UI precision and status feedback. + +Winning visual probe: selected dark infrastructure-led direction. The final brief carries forward the large architecture panel, system status strip, compact lower modules, and local support proof band. + +## 4. Scope + +Fidelity: production-ready visual plan. + +Breadth: full landing page, with extra emphasis on the first viewport and first scroll. + +Interactivity: static marketing page with interactive-feeling components. Accordions, hover states, CTA feedback, table hover states, and status/tooltips can be implemented later, but the core experience should not depend on heavy interactivity. + +Time intent: polish until it can be built as the first real version of the page. + +## 5. Layout Strategy + +The first viewport should be a dense dashboard-like marketing composition: + +- Top nav with logo, core anchors, phone CTA, and assessment CTA. +- Left hero column with H1, short subcopy, trust bullets, CTA, and phone. +- Right hero column dominated by a mail-flow architecture panel. +- Status strip inside the architecture panel to make reliability legible. +- First-scroll module row: DNS Authentication, Migration Process, Pricing, Compare Plans. +- Local support proof strip below those modules. + +The rest of the page should open up slightly after the dense hero: + +1. Problem and buyer pain: free Gmail/Yahoo, spam-folder issues, shared-hosting mail, support queues. +2. What is included: 25 GB mailboxes, domain email, Outlook, iPhone/iPad setup, migration, aliases, forwards, shared inboxes, auto-replies. +3. Deliverability section: SPF, DKIM, DMARC explained in plain English. +4. Reliability section: AWS, Amazon S3 buffering, Amazon SES outbound, standby failover. +5. Migration section: assessment, DNS plan, mailbox creation, migration window, device setup, go-live check. +6. Pricing and caveats: $5 per inbox per month, 25 GB included, setup/migration/support terms clearly scoped. +7. Comparison: Google Workspace, Microsoft 365, shared hosting, Bay Area Email Services by fit. +8. Local trust: Corpus Christi, Coastal Bend, 30+ years IT experience, 30+ local businesses if confirmed. +9. FAQ and final CTA. + +## 6. Key States + +Default: The page loads into the full dark infrastructure hero. User immediately sees service, location, CTA, price, phone, and operational proof. + +Mobile: Hero copy appears first, CTAs become full-width or stacked, architecture diagram converts into vertical flow cards, comparison table becomes horizontally scrollable or turns into grouped rows. + +Loading: Avoid skeleton noise. If implemented as a static landing page, load primary copy and CTA first, then animate diagram lines/status labels with reduced-motion fallback. + +Error: Contact form errors should be inline and plain-English. Do not use modals. Phone CTA remains available if form submission fails. + +Success: After assessment request, show a concise confirmation inline: "Thanks. We’ll review your mailbox count and current provider before we reply." Keep phone CTA visible. + +Reduced motion: Disable animated connector-line tracing and section reveal motion. Keep status and flow readable without animation. + +Long content: FAQ, pricing caveats, and comparison copy must wrap cleanly without overflowing cards or buttons. + +## 7. Interaction Model + +Primary CTA buttons scroll or route to the assessment/contact form. + +Phone CTAs use `tel:+13617658400`. + +Navigation anchors scroll to Infrastructure, Pricing, Migration, FAQ, and Contact sections. + +Architecture panel can have subtle hover tooltips or captions for Amazon S3 buffering, Amazon SES outbound, SPF, DKIM, DMARC, and standby failover. These explanations must also exist as visible text elsewhere for accessibility. + +FAQ uses inline accordions. Only one answer may open at a time on mobile to preserve page length. + +Comparison table should be readable without interaction on desktop. On mobile, use stacked comparison rows rather than a cramped table if needed. + +## 8. Content Requirements + +Hero: + +- H1: "Business Email Hosting in Corpus Christi" +- Subcopy: "Infrastructure and support from a local team that understands how business gets done." +- Bullets: + - "AWS-built architecture" + - "Configured to improve deliverability" + - "Real people. Local support." +- Primary CTA: "Book a 20-minute email assessment" +- Secondary CTA: "Call (361) 765-8400" + +Architecture labels: + +- Inbound Email +- Buffer & Process +- Mailbox Delivery +- Outbound Email +- Standby Environment +- Amazon S3 buffering +- Amazon SES outbound +- Virus & Malware Scanning +- Policy & Content Filtering +- Message Validation +- Logging & Monitoring + +Status strip: + +- System Status +- All Systems Operational +- Inbound Operational +- Delivery Operational +- Outbound Operational +- View status + +Module copy: + +- DNS Authentication: "We configure and validate the records that help protect your domain." +- Migration Process: Discover, Plan, Migrate, Validate. +- Pricing: "$5 / inbox / month", "25 GB mailbox included." +- Compare Plans: Business email, Custom domain, AWS infrastructure, Local support, Transparent pricing. + +Claim-safe language: + +- Use "configured to improve deliverability." +- Use "helps reduce spam-folder risk." +- Use "designed for continuity." +- Use "standby failover." +- Use "built on AWS services including Amazon S3 and Amazon SES." + +Avoid: + +- "Guaranteed inbox placement" +- "Zero downtime" +- "Spam-proof" +- "Hack-proof" +- "No email ever lost" + +## 9. Recommended References + +- `reference/brand.md`, for the landing page register and visual ambition. +- `reference/layout.md`, for dense first-viewport hierarchy and responsive rhythm. +- `reference/typeset.md`, for strong dark-surface typography. +- `reference/clarify.md`, for plain-English technical copy. +- `reference/adapt.md`, for mobile conversion and diagram simplification. +- `reference/harden.md`, before shipping, for edge cases, accessibility, long text, and form states. + +## 10. Open Questions + +- Confirm whether `$5 / inbox / month` is final and whether minimums, taxes, setup, migration, or support fees apply. +- Confirm whether the site should use an assessment form, a booking link, a contact form, or all three. +- Confirm exact support hours before using "responsive during business hours." +- Confirm whether "30+ local businesses supported" and "30+ years IT experience" can be used on the final page. +- Confirm whether there is a real status page. If not, "View status" should either be removed or replaced with "How continuity works." +- Confirm whether the final build lives inside the existing Bay Area IT site, a subdomain, or a standalone domain. + diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..2131f50 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,4027 @@ +:root { + color-scheme: dark; + --bg: oklch(13% 0.035 245); + --bg-deep: oklch(9% 0.028 245); + --surface: oklch(18% 0.04 245); + --surface-2: oklch(22% 0.045 245); + --surface-3: oklch(26% 0.05 245); + --line: oklch(42% 0.06 245 / 0.78); + --line-soft: oklch(34% 0.05 245 / 0.58); + --text: oklch(94% 0.012 245); + --text-muted: oklch(77% 0.027 245); + --text-dim: oklch(64% 0.035 245); + --blue: oklch(68% 0.18 246); + --blue-soft: oklch(58% 0.16 246); + --green: oklch(76% 0.18 147); + --amber: oklch(76% 0.15 76); + --danger: oklch(70% 0.17 25); + --shadow: 0 28px 80px oklch(4% 0.02 245 / 0.36); + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 18px; + --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1); + --ease-out-quint: cubic-bezier(0.22, 1, 0.36, 1); + --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); + --font: Aptos, "Segoe UI", system-ui, -apple-system, sans-serif; + --step--1: 0.875rem; + --step-0: 1rem; + --step-1: 1.25rem; + --step-2: clamp(1.55rem, 1.2rem + 1.3vw, 2.25rem); + --step-3: clamp(2.2rem, 1.35rem + 3.4vw, 4.65rem); + --space-1: 0.25rem; + --space-2: 0.5rem; + --space-3: 0.75rem; + --space-4: 1rem; + --space-5: 1.5rem; + --space-6: 2rem; + --space-7: 3rem; + --space-8: 4rem; + --page-gutter: clamp(1.5rem, 7vw, 8.5rem); + --page-max: 100rem; +} + +:root[data-theme="light"] { + color-scheme: light; + --bg: oklch(95% 0.015 245); + --bg-deep: oklch(98% 0.008 245); + --surface: oklch(99% 0.006 245); + --surface-2: oklch(95% 0.018 245); + --surface-3: oklch(91% 0.025 245); + --line: oklch(72% 0.045 245 / 0.72); + --line-soft: oklch(80% 0.035 245 / 0.62); + --text: oklch(22% 0.045 245); + --text-muted: oklch(38% 0.045 245); + --text-dim: oklch(50% 0.04 245); + --blue: oklch(55% 0.18 246); + --blue-soft: oklch(61% 0.15 246); + --green: oklch(58% 0.16 147); + --shadow: 0 24px 70px oklch(30% 0.05 245 / 0.14); +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + min-width: 320px; + background: + radial-gradient(circle at 72% 8%, oklch(31% 0.09 246 / 0.42), transparent 31rem), + linear-gradient(180deg, var(--bg-deep), var(--bg) 38rem, oklch(15% 0.038 245)); + color: var(--text); + font-family: var(--font); + font-size: var(--step-0); + line-height: 1.6; + font-kerning: normal; + text-rendering: optimizeLegibility; + overflow-x: clip; +} + +:root[data-theme="light"] body { + background: + radial-gradient(circle at 74% 10%, oklch(86% 0.06 246 / 0.24), transparent 32rem), + linear-gradient(180deg, oklch(98% 0.008 245), oklch(96% 0.012 245) 36rem, oklch(98% 0.006 245)); +} + +body.menu-open { + overflow: hidden; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +input, +select { + font: inherit; +} + +svg { + display: block; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.skip-link { + position: fixed; + top: 1rem; + left: 1rem; + z-index: 20; + padding: 0.75rem 1rem; + border-radius: var(--radius-sm); + background: var(--blue); + color: oklch(11% 0.03 245); + transform: translateY(-150%); +} + +.skip-link:focus { + transform: translateY(0); +} + +.scroll-progress { + position: fixed; + top: 0; + left: 0; + z-index: 30; + width: 100%; + height: 2px; + background: linear-gradient(90deg, var(--blue), var(--green)); + transform: scaleX(var(--scroll-progress, 0)); + transform-origin: left; + opacity: 0.92; + box-shadow: 0 0 16px oklch(65% 0.16 246 / 0.32); + pointer-events: none; +} + +:focus-visible { + outline: 3px solid var(--green); + outline-offset: 4px; +} + +.site-header { + position: sticky; + top: 0; + z-index: 10; + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + column-gap: clamp(1.25rem, 2.4vw, 2.75rem); + row-gap: var(--space-3); + padding: max(0.85rem, env(safe-area-inset-top)) clamp(1.25rem, 4.6vw, 6.25rem) 0.85rem; + border-bottom: 1px solid var(--line-soft); + background: oklch(10.5% 0.032 245 / 0.94); + backdrop-filter: blur(16px); +} + +.site-header, +.hero-section, +.content-section, +.site-footer { + width: 100%; +} + +.hero-section, +.content-section { + scroll-margin-top: 5rem; +} + +:root[data-theme="light"] .site-header { + background: oklch(98% 0.008 245 / 0.94); +} + +:root[data-theme="light"] .eyebrow, +:root[data-theme="light"] .brand span span, +:root[data-theme="light"] .phone-link, +:root[data-theme="light"] .call-inline { + color: oklch(56% 0.16 246); +} + +.brand { + display: inline-grid; + grid-template-columns: 2.7rem auto; + align-items: center; + gap: var(--space-3); + min-height: 44px; + min-width: max-content; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.brand-mark { + display: grid; + place-items: center; + width: 2.5rem; + height: 2.5rem; + color: var(--blue); +} + +.brand-mark svg { + width: 100%; + height: auto; + fill: none; + stroke: currentColor; + stroke-width: 2.2; +} + +.brand strong { + display: block; + font-size: 1rem; + line-height: 1; +} + +.brand span span { + display: block; + color: oklch(74% 0.07 246); + font-size: 0.66rem; + font-weight: 700; + line-height: 1.4; +} + +.menu-toggle { + grid-column: 3; + justify-self: end; + display: inline-grid; + place-items: center; + gap: 0; + width: 44px; + height: 44px; + padding: 0; + border: 1px solid var(--line); + border-radius: var(--radius-sm); + background: oklch(20% 0.055 245); + color: var(--text); + z-index: 30; + cursor: pointer; +} + +.menu-toggle span:not(.sr-only) { + grid-area: 1 / 1; + display: block; + width: 18px; + height: 2px; + border-radius: 999px; + background: currentColor; + transition: + transform 220ms var(--ease-out-quint), + opacity 160ms ease; +} + +.menu-toggle span:not(.sr-only):nth-child(1) { + transform: translateY(-6px); +} + +.menu-toggle span:not(.sr-only):nth-child(3) { + transform: translateY(6px); +} + +.menu-toggle[aria-expanded="true"] span:not(.sr-only):nth-child(1) { + transform: rotate(45deg); +} + +.menu-toggle[aria-expanded="true"] span:not(.sr-only):nth-child(2) { + opacity: 0; +} + +.menu-toggle[aria-expanded="true"] span:not(.sr-only):nth-child(3) { + transform: rotate(-45deg); +} + +.menu-toggle b { + display: none; +} + +:root[data-theme="light"] .menu-toggle { + background: oklch(99% 0.006 245); + color: var(--text); +} + +.nav-menu, +.header-actions { + display: none; +} + +.nav-menu { + min-width: 0; +} + +.theme-toggle { + display: inline-grid; + place-items: center; + order: 10; + flex: 0 0 auto; + width: 44px; + min-height: 44px; + padding: 0; + border: 1px solid var(--line); + border-radius: 999px; + background: var(--surface); + color: var(--text-muted); + cursor: pointer; +} + +.theme-toggle:hover { + color: var(--text); + border-color: var(--blue); +} + +.theme-icon { + width: 1.25rem; + height: 1.25rem; + fill: none; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.theme-icon-moon { + display: none; +} + +:root[data-theme="light"] .theme-icon-sun { + display: none; +} + +:root[data-theme="light"] .theme-icon-moon { + display: block; +} + +.nav-menu.is-open { + position: fixed; + inset: 4.5rem 1rem auto; + display: grid; + gap: var(--space-2); + padding: var(--space-4); + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); + box-shadow: var(--shadow); +} + +.nav-menu a { + position: relative; + min-height: 44px; + padding: 0.65rem 0.75rem; + border-radius: var(--radius-sm); + color: var(--text-muted); +} + +.nav-menu a::after { + content: ""; + position: absolute; + left: 0.75rem; + right: 0.75rem; + bottom: 0.35rem; + height: 2px; + border-radius: 999px; + background: var(--blue); + transform: scaleX(0); + transform-origin: left; + transition: transform 220ms cubic-bezier(.22, 1, .36, 1); +} + +.nav-menu a:hover, +.nav-menu a:focus-visible { + color: var(--text); +} + +.nav-menu a:hover::after, +.nav-menu a:focus-visible::after { + transform: scaleX(1); +} + +.button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + min-height: 44px; + border: 1px solid transparent; + border-radius: var(--radius-sm); + padding: 0.72rem 1rem; + font-weight: 750; + line-height: 1.1; + text-align: center; + transition: + transform 180ms var(--ease-out-quint), + border-color 180ms ease, + background 180ms ease, + box-shadow 220ms ease, + filter 220ms ease; +} + +.button:hover { + transform: translateY(-2px); +} + +.button:active { + transform: translateY(0) scale(0.985); +} + +.button-primary { + background: linear-gradient(180deg, oklch(68% 0.18 246), oklch(58% 0.18 246)); + color: oklch(98% 0.01 245); + box-shadow: 0 14px 36px oklch(58% 0.18 246 / 0.28); +} + +.button-primary:hover { + filter: saturate(1.06) brightness(1.05); + box-shadow: 0 18px 46px oklch(58% 0.18 246 / 0.38); +} + +.button-outline { + width: 100%; + border-color: var(--blue); + color: var(--text); + background: oklch(16% 0.04 245); +} + +:root[data-theme="light"] .button-outline { + color: var(--blue); + background: oklch(99% 0.006 245); +} + +.button-large { + min-height: 48px; + padding-inline: 1.25rem; + white-space: normal; +} + +.phone-link, +.call-inline { + display: inline-flex; + align-items: center; + gap: var(--space-2); + min-height: 44px; + color: oklch(78% 0.12 246); + font-weight: 700; + letter-spacing: 0.02em; + white-space: nowrap; +} + +.call-inline { + min-height: 32px; +} + +.phone-link svg { + width: 1.1rem; + height: 1.1rem; + fill: none; + stroke: currentColor; + stroke-width: 2; +} + +.hero-section { + padding: clamp(1.8rem, 2.8vw, 3rem) var(--page-gutter) clamp(3rem, 4.2vw, 5rem); + overflow: clip; +} + +:root[data-theme="light"] .hero-section { + background: + radial-gradient(circle at 76% 8%, oklch(86% 0.06 246 / 0.26), transparent 34rem), + linear-gradient(180deg, oklch(98% 0.008 245), oklch(96% 0.014 245)); +} + +.hero-grid { + display: grid; + gap: clamp(2rem, 3vw, 4rem); + align-items: start; + max-width: var(--page-max); + margin-inline: auto; + min-width: 0; +} + +.hero-copy { + display: grid; + align-content: start; + gap: var(--space-3); + padding-block: clamp(0.4rem, 2vw, 1rem); + min-width: 0; +} + +.eyebrow { + margin: 0; + color: oklch(80% 0.1 246); + font-size: 0.74rem; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +h1, +h2, +h3, +p { + margin-top: 0; +} + +h1 { + max-width: 12ch; + margin-bottom: 0; + font-size: clamp(2.75rem, 2.1vw + 1.35rem, 4.25rem); + line-height: 0.94; + letter-spacing: 0; + text-wrap: balance; +} + +h2 { + margin-bottom: var(--space-3); + font-size: var(--step-2); + line-height: 1.05; + letter-spacing: 0; + text-wrap: balance; +} + +h3 { + margin-bottom: var(--space-2); + font-size: 0.93rem; + line-height: 1.25; +} + +.hero-lede { + max-width: 32rem; + margin-bottom: 0; + color: var(--text-muted); + font-size: clamp(1rem, 0.45vw + 0.93rem, 1.15rem); + line-height: 1.38; +} + +.trust-list, +.check-stack, +.local-strip ul { + list-style: none; + padding: 0; + margin: 0; +} + +.trust-list { + display: grid; + gap: 0.45rem; + color: var(--text-muted); +} + +.trust-list li, +.check-stack li { + display: flex; + align-items: center; + gap: var(--space-3); +} + +.trust-list li { + font-size: 0.95rem; +} + +.check-icon, +.chart-icon, +.people-icon, +.shield-icon, +.building-icon, +.headset-icon, +.clock-icon, +.people-outline-icon, +.shield-outline-icon { + display: inline-grid; + place-items: center; + flex: 0 0 auto; + color: var(--green); +} + +.check-icon, +.chart-icon, +.people-icon { + width: 1.5rem; + height: 1.5rem; + border: 1px solid currentColor; + border-radius: 0.45rem; +} + +.check-icon::before, +.check-stack li::before { + content: "✓"; + color: var(--green); + font-weight: 900; +} + +.chart-icon::before { + content: "↗"; + font-size: 1.1rem; +} + +.people-icon::before { + content: "◎"; + font-size: 1.1rem; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: var(--space-3); + align-items: center; + margin-top: var(--space-1); +} + +.architecture-panel, +.module-card, +.local-strip, +.pricing-panel, +.assessment-form { + border: 1px solid var(--line); + background: + linear-gradient(180deg, oklch(19% 0.045 245 / 0.92), oklch(14% 0.035 245 / 0.92)), + var(--surface); + box-shadow: inset 0 1px 0 oklch(80% 0.04 245 / 0.08); +} + +:root[data-theme="light"] .architecture-panel, +:root[data-theme="light"] .module-card, +:root[data-theme="light"] .local-strip, +:root[data-theme="light"] .pricing-panel, +:root[data-theme="light"] details, +:root[data-theme="light"] .record-stack article, +:root[data-theme="light"] .migration-checklist, +:root[data-theme="light"] .timeline li, +:root[data-theme="light"] .continuity-rail article, +:root[data-theme="light"] .feature-tabs button, +:root[data-theme="light"] .feature-panel, +:root[data-theme="light"] .support-rail article { + background: linear-gradient(180deg, oklch(99% 0.006 245), oklch(96% 0.012 245)); +} + +.architecture-panel { + position: relative; + min-width: 0; + overflow: hidden; + border-radius: var(--radius-lg); + padding: 0; + transition: + border-color 260ms ease, + box-shadow 320ms ease, + transform 420ms var(--ease-out-quint); + will-change: transform; +} + +.architecture-panel:hover { + border-color: oklch(60% 0.14 246 / 0.9); + box-shadow: + inset 0 1px 0 oklch(80% 0.04 245 / 0.12), + 0 22px 70px oklch(38% 0.12 246 / 0.18); + transform: translateY(-2px); +} + +.architecture-panel::before { + display: none; +} + +.architecture-image { + display: block; + width: 100%; + height: auto; + border-radius: var(--radius-lg); + transition: transform 700ms var(--ease-out-expo), filter 360ms ease; +} + +.architecture-panel:hover .architecture-image { + transform: scale(1.008); +} + +.architecture-image-light { + display: none; +} + +:root[data-theme="light"] .architecture-image { + filter: none; + box-shadow: var(--shadow); +} + +:root[data-theme="light"] .architecture-image-dark { + display: none; +} + +:root[data-theme="light"] .architecture-image-light { + display: block; +} + +.panel-head { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + gap: var(--space-4); + margin-bottom: var(--space-4); +} + +.panel-head h2 { + max-width: 22rem; + margin: 0; + font-size: clamp(1.05rem, 1rem + 0.8vw, 1.65rem); + text-align: right; +} + +.mail-flow { + position: relative; + z-index: 1; + display: grid; + gap: var(--space-4); + min-width: 0; +} + +.flow-lane { + position: relative; + display: grid; + gap: var(--space-3); + align-content: start; + min-height: 8.5rem; + padding: var(--space-3); + border: 1px solid var(--line-soft); + border-radius: var(--radius-md); + background: oklch(14% 0.035 245 / 0.68); +} + +.flow-lane h3, +.module-card h2 { + margin: 0; + color: oklch(90% 0.02 245); + font-size: 0.78rem; + font-weight: 850; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +:root[data-theme="light"] .flow-lane h3, +:root[data-theme="light"] .module-card h2, +:root[data-theme="light"] .local-strip h2, +:root[data-theme="light"] .table-head span { + color: oklch(27% 0.055 245); +} + +:root[data-theme="light"] .module-card p, +:root[data-theme="light"] .compare-table span, +:root[data-theme="light"] .local-strip li, +:root[data-theme="light"] .local-strip p { + color: oklch(36% 0.045 245); +} + +.source-list { + display: grid; + gap: var(--space-3); + color: var(--text-muted); + font-size: var(--step--1); +} + +.source-list span { + display: flex; + align-items: center; + gap: var(--space-2); +} + +.source-icon { + position: relative; + display: inline-block; + width: 1.9rem; + height: 1.4rem; + border: 2px solid currentColor; + color: oklch(91% 0.02 245); +} + +.source-icon.mail::before, +.source-icon.large::before { + content: ""; + position: absolute; + inset: 2px; + border-top: 2px solid currentColor; + transform: skewY(-34deg); +} + +.source-icon.server { + height: 1.8rem; + border-radius: 0.25rem; +} + +.source-icon.server::before, +.source-icon.server::after { + content: ""; + position: absolute; + left: 0.25rem; + right: 0.25rem; + height: 2px; + background: currentColor; +} + +.source-icon.server::before { + top: 0.55rem; +} + +.source-icon.server::after { + bottom: 0.55rem; +} + +.source-icon.cloud { + height: 1.1rem; + border-radius: 999px; + border-top-color: transparent; +} + +.source-icon.large { + width: 2.5rem; + height: 1.8rem; + margin-inline: auto; +} + +.aws-box { + display: grid; + gap: var(--space-2); + place-items: center; + min-height: 8.2rem; + padding: var(--space-3); + border: 1px solid var(--line); + border-radius: var(--radius-sm); + background: oklch(17% 0.04 245 / 0.84); + text-align: center; +} + +.aws-label { + color: var(--text); + font-weight: 850; + letter-spacing: 0.04em; +} + +.bucket-icon, +.database-icon { + display: block; + width: 2.6rem; + height: 2rem; + border: 3px solid var(--green); + border-top-width: 5px; + border-radius: 50% / 22%; +} + +.database-icon { + border-color: var(--text); +} + +.plane-icon { + width: 3rem; + height: 2.6rem; + clip-path: polygon(4% 51%, 95% 4%, 60% 96%, 47% 60%); + background: var(--text); +} + +.process-list { + display: grid; + gap: var(--space-2); + margin: 0; + padding: var(--space-3); + border: 1px solid var(--line-soft); + border-radius: var(--radius-sm); + list-style: none; + color: var(--text-muted); + font-size: var(--step--1); +} + +.process-list li::before { + content: "✓"; + margin-right: var(--space-2); + color: var(--green); +} + +.device-row { + display: flex; + justify-content: center; + gap: var(--space-5); +} + +.laptop, +.phone { + display: inline-block; + border: 2px solid var(--text); + border-radius: 0.25rem; +} + +.laptop { + width: 3.5rem; + height: 2.3rem; +} + +.phone { + width: 1.5rem; + height: 2.8rem; +} + +.flow-lines { + display: none; +} + +.status-strip { + position: relative; + z-index: 1; + display: grid; + gap: var(--space-3); + margin-top: var(--space-4); + padding: var(--space-3); + border: 1px solid var(--line); + border-radius: var(--radius-sm); + color: var(--text-muted); + font-size: var(--step--1); + min-width: 0; +} + +.status-strip strong { + color: var(--text); + font-size: 0.72rem; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.status-strip span { + display: flex; + align-items: center; + gap: var(--space-2); +} + +.status-strip i { + width: 1rem; + height: 1rem; + border: 1px solid var(--green); + border-radius: 50%; +} + +.status-strip em { + color: var(--green); + font-style: normal; +} + +.status-strip a, +.module-card a:not(.button) { + color: oklch(76% 0.13 246); + font-weight: 700; +} + +.module-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: clamp(2.25rem, 3.4vw, 4rem); + max-width: min(72rem, var(--page-max)); + margin-inline: auto; + padding: 0.55rem; + overflow: hidden; + border: 1px solid oklch(58% 0.09 246 / 0.38); + border-radius: var(--radius-lg); + background: + radial-gradient(circle at 50% 0%, oklch(58% 0.16 246 / 0.12), transparent 24rem), + linear-gradient(90deg, oklch(58% 0.09 246 / 0.22), oklch(70% 0.16 147 / 0.18)); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.08), + 0 18px 54px oklch(0% 0 0 / 0.14); +} + +.module-card { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: var(--space-3); + align-items: center; + min-height: 0; + padding: clamp(1rem, 1.5vw, 1.2rem); + border: 0; + border-radius: calc(var(--radius-lg) - 0.55rem); + background: + linear-gradient(180deg, oklch(19% 0.042 245 / 0.94), oklch(13% 0.032 245 / 0.94)); + min-width: 0; + transition: + transform 260ms var(--ease-out-quint), + border-color 220ms ease, + box-shadow 260ms ease, + background 260ms ease; +} + +:root[data-theme="light"] .module-grid { + border-color: oklch(74% 0.045 245 / 0.62); + background: + radial-gradient(circle at 50% 0%, oklch(84% 0.07 246 / 0.26), transparent 24rem), + linear-gradient(90deg, oklch(78% 0.045 245 / 0.48), oklch(72% 0.1 147 / 0.26)); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.9), + 0 18px 54px oklch(48% 0.05 245 / 0.12); +} + +:root[data-theme="light"] .module-card { + background: + linear-gradient(180deg, oklch(100% 0 0 / 0.84), oklch(96% 0.012 245 / 0.86)); +} + +.module-card.compare-card { + display: none; +} + +.module-card .check-stack, +.module-card .process-steps, +.module-card .price, +.module-card .included, +.module-card .button, +.module-card a:not(.button) { + display: none; +} + +.module-card:hover { + transform: translateY(-1px); + border-color: transparent; + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.08), + 0 12px 28px oklch(4% 0.02 245 / 0.18); +} + +:root[data-theme="light"] .module-card:hover { + box-shadow: 0 18px 54px oklch(45% 0.07 245 / 0.16); +} + +.price-card { + position: relative; + box-shadow: none; +} + +:root[data-theme="light"] .price-card { + border-color: transparent; +} + +.compare-card { + gap: var(--space-4); + overflow: hidden; +} + +.module-card p { + margin: 0; + color: var(--text-muted); + font-size: 0.9rem; + line-height: 1.35; +} + +.module-title { + display: contents; +} + +.shield-icon { + grid-row: 1 / span 2; + display: grid; + place-items: center; + width: 3rem; + height: 3rem; + border: 1px solid oklch(70% 0.16 147 / 0.44); + border-radius: var(--radius-md); + background: + radial-gradient(circle at 50% 0%, oklch(70% 0.16 147 / 0.18), transparent 70%), + oklch(70% 0.16 147 / 0.08); +} + +.shield-icon svg, +.module-icon svg { + width: 1.3rem; + height: 1.3rem; + fill: none; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.module-icon { + grid-row: 1 / span 2; + display: grid; + place-items: center; + width: 3rem; + height: 3rem; + border: 1px solid oklch(70% 0.16 147 / 0.42); + border-radius: var(--radius-md); + color: var(--green); + background: oklch(70% 0.16 147 / 0.08); +} + +.migration-icon { + color: var(--blue); + border-color: oklch(68% 0.18 246 / 0.45); + background: + radial-gradient(circle at 50% 0%, oklch(68% 0.18 246 / 0.16), transparent 70%), + oklch(68% 0.18 246 / 0.08); +} + +.hosting-icon { + color: var(--green); + border-color: oklch(70% 0.16 147 / 0.45); + background: + radial-gradient(circle at 50% 0%, oklch(70% 0.16 147 / 0.18), transparent 70%), + oklch(70% 0.16 147 / 0.08); +} + +.module-card h2 { + align-self: end; + font-size: 0.82rem; + letter-spacing: 0.13em; +} + +.module-card#migration::after, +.module-card#pricing::after { + align-self: start; + color: var(--text-muted); + font-size: 0.92rem; + line-height: 1.35; +} + +.module-card#migration::after { + content: "Provider move, devices, and handoff support."; +} + +.module-card#pricing::after { + content: "25 GB mailboxes with managed infrastructure."; +} + +.check-stack { + display: grid; + gap: var(--space-3); + color: var(--text); +} + +.check-stack.compact { + gap: var(--space-2); + color: var(--text-muted); + font-size: var(--step--1); +} + +.process-steps { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-3); + margin: 0; + padding: 0; + list-style: none; +} + +.process-steps li { + display: grid; + gap: var(--space-2); +} + +.process-steps span { + display: grid; + place-items: center; + width: 2rem; + height: 2rem; + border: 1px solid var(--blue); + border-radius: 50%; + color: var(--text); + font-size: var(--step--1); + font-weight: 800; + transition: + transform 220ms var(--ease-out-quint), + border-color 220ms ease, + color 220ms ease, + box-shadow 220ms ease; +} + +.process-steps li:hover span { + transform: translateY(-2px) scale(1.04); + border-color: var(--green); + color: var(--green); + box-shadow: 0 0 0 5px oklch(76% 0.18 147 / 0.1); +} + +.process-steps p { + font-size: 0.82rem; +} + +.price { + display: flex; + align-items: baseline; + gap: var(--space-2); + color: var(--text); +} + +.price span { + font-size: clamp(3rem, 2.4rem + 2vw, 4.4rem); + font-weight: 850; + line-height: 0.9; + font-variant-numeric: tabular-nums; +} + +.included { + color: var(--green) !important; +} + +.compare-table { + overflow-x: hidden; + overflow-y: hidden; + border: 1px solid var(--line); + border-radius: var(--radius-sm); + font-size: 0.72rem; + scrollbar-width: thin; +} + +.compare-table [role="row"] { + display: grid; + grid-template-columns: 1.28fr repeat(3, minmax(2.7rem, 0.72fr)); + border-bottom: 1px solid var(--line-soft); +} + +.compare-table [role="row"]:last-child { + border-bottom: 0; +} + +.compare-table span { + min-width: 0; + padding: 0.55rem 0.45rem; + border-right: 1px solid var(--line-soft); + color: var(--text-muted); + text-align: center; +} + +.compare-table span:first-child { + text-align: left; +} + +.compare-table span:last-child { + border-right: 0; +} + +.table-head span { + color: var(--text); + font-weight: 800; +} + +.local-strip { + display: grid; + gap: clamp(1.25rem, 3vw, 2.5rem); + margin-top: clamp(4rem, 6vw, 6.5rem); + margin-inline: auto; + padding: clamp(1.4rem, 2.6vw, 2.25rem); + border: 1px solid oklch(95% 0.01 245 / 0.12); + border-radius: var(--radius-lg); + background: + radial-gradient(circle at 12% 0%, oklch(58% 0.16 246 / 0.12), transparent 24rem), + linear-gradient(180deg, oklch(18% 0.042 245 / 0.94), oklch(12% 0.032 245 / 0.95)); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.05), + 0 22px 64px oklch(0% 0 0 / 0.18); + max-width: var(--page-max); +} + +.local-strip h2 { + max-width: 18rem; + margin: 0; + color: oklch(95% 0.012 245); + font-size: clamp(1.35rem, 1rem + 1.1vw, 2rem); + line-height: 1.05; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.local-strip p { + max-width: 28rem; + margin: var(--space-3) 0 0; + color: oklch(78% 0.024 245); + line-height: 1.45; +} + +.local-strip ul { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: var(--space-3); +} + +.local-strip li { + display: grid; + gap: var(--space-3); + align-content: start; + min-width: 0; + min-height: 8rem; + padding: var(--space-4); + border: 1px solid oklch(95% 0.01 245 / 0.11); + border-radius: var(--radius-md); + background: oklch(100% 0 0 / 0.035); + color: oklch(84% 0.02 245); + transition: + transform 240ms var(--ease-out-quint), + border-color 220ms ease, + background 220ms ease, + box-shadow 220ms ease; +} + +.local-strip li strong { + display: block; + color: inherit; + font-size: 0.92rem; + line-height: 1.25; +} + +.local-strip li span { + display: grid; + place-items: center; + width: 2.5rem; + height: 2.5rem; + border: 1px solid oklch(70% 0.16 147 / 0.42); + border-radius: var(--radius-sm); + color: var(--green); + background: oklch(70% 0.16 147 / 0.08); + transition: + transform 240ms var(--ease-out-quint), + color 220ms ease, + box-shadow 220ms ease; +} + +.local-strip li span svg { + width: 1.15rem; + height: 1.15rem; + fill: none; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.local-strip li:hover { + transform: translateY(-2px); + border-color: oklch(70% 0.16 147 / 0.36); + background: oklch(100% 0 0 / 0.055); + box-shadow: 0 18px 42px oklch(0% 0 0 / 0.14); +} + +.local-strip li:hover span { + box-shadow: 0 0 0 6px oklch(76% 0.18 147 / 0.09); +} + +:root[data-theme="light"] .local-strip { + border-color: oklch(76% 0.045 245 / 0.64); + background: + radial-gradient(circle at 12% 0%, oklch(86% 0.06 246 / 0.2), transparent 24rem), + linear-gradient(180deg, oklch(99% 0.004 245 / 0.92), oklch(96% 0.012 245 / 0.94)); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.88), + 0 22px 64px oklch(48% 0.05 245 / 0.1); +} + +:root[data-theme="light"] .local-strip h2 { + color: var(--text); +} + +:root[data-theme="light"] .local-strip p { + color: var(--text-muted); +} + +:root[data-theme="light"] .local-strip li { + border-color: oklch(76% 0.045 245 / 0.54); + background: oklch(100% 0 0 / 0.58); + color: var(--text); +} + +:root[data-theme="light"] .local-strip li span { + border-color: oklch(68% 0.16 147 / 0.45); + background: oklch(92% 0.05 147 / 0.45); +} + +:root[data-theme="light"] .local-strip li:hover { + border-color: oklch(68% 0.16 147 / 0.44); + background: oklch(100% 0 0 / 0.82); +} + +.motion-ready .reveal-item { + opacity: 0; + transform: translateY(22px); + transition: + opacity 620ms var(--ease-out-quint), + transform 620ms var(--ease-out-quint); + transition-delay: var(--reveal-delay, 0ms); +} + +.motion-ready .reveal-item.is-revealed { + opacity: 1; + transform: translateY(0); +} + +.motion-ready .hero-copy.reveal-item { + transform: translateX(-18px); +} + +.motion-ready .architecture-panel.reveal-item { + transform: translateX(22px) scale(0.985); +} + +.motion-ready .hero-copy.reveal-item.is-revealed, +.motion-ready .architecture-panel.reveal-item.is-revealed { + transform: translateX(0) scale(1); +} + +.motion-ready .architecture-panel.reveal-item.is-revealed:hover { + transform: translateY(-2px) scale(1.008); +} + +.motion-ready .module-card.reveal-item.is-revealed:hover { + transform: translateY(-4px); +} + +.motion-ready .local-strip.reveal-item { + opacity: 1; + transform: none; +} + +.motion-ready .module-card.reveal-item { + opacity: 1; + transform: none; +} + +@keyframes statusPulse { + 0%, 100% { + box-shadow: 0 0 0 0 oklch(76% 0.18 147 / 0); + } + 45% { + box-shadow: 0 0 0 7px oklch(76% 0.18 147 / 0.12); + } +} + +.status-strip i { + animation: statusPulse 2.8s var(--ease-out-quart) infinite; +} + +.headset-icon, +.clock-icon, +.people-outline-icon { + border-radius: 50% !important; +} + +.content-section { + padding: clamp(4rem, 8vw, 7rem) var(--page-gutter); +} + +:root[data-theme="light"] .content-section { + background: + radial-gradient(circle at 82% 0%, oklch(88% 0.045 246 / 0.14), transparent 30rem), + linear-gradient(180deg, oklch(99% 0.004 245), oklch(97% 0.008 245)); +} + +:root[data-theme="light"] .problem-section, +:root[data-theme="light"] .process-section, +:root[data-theme="light"] .migration-detail, +:root[data-theme="light"] .faq-section { + background: + radial-gradient(circle at 18% 0%, oklch(90% 0.04 246 / 0.12), transparent 28rem), + linear-gradient(180deg, oklch(99% 0.004 245), oklch(98% 0.006 245)); +} + +:root[data-theme="light"] .continuity-section, +:root[data-theme="light"] .pricing-detail { + background: + radial-gradient(circle at 78% 0%, oklch(86% 0.055 246 / 0.16), transparent 32rem), + linear-gradient(180deg, oklch(96% 0.012 245), oklch(98% 0.006 245)); +} + +.section-heading { + display: grid; + gap: var(--space-3); + max-width: 56rem; + margin-bottom: var(--space-6); +} + +.section-heading.narrow { + max-width: 44rem; + margin-inline: auto; + text-align: center; +} + +.section-heading p, +.split-section > div > p, +.assessment-copy p, +.pricing-panel p { + color: var(--text-muted); + font-size: var(--step-1); +} + +.pain-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: var(--space-4); +} + +.pain-grid article { + padding-block: var(--space-4); + border-top: 1px solid var(--line); +} + +.pain-grid strong { + display: block; + margin-bottom: var(--space-2); + color: var(--text); + font-size: var(--step-1); +} + +.pain-grid p, +.record-stack p, +.continuity-rail p, +.timeline span, +.faq-list p { + color: var(--text-muted); +} + +.process-section { + background: + radial-gradient(circle at 50% 0%, oklch(24% 0.07 246 / 0.22), transparent 36rem), + linear-gradient(180deg, oklch(8.5% 0.024 245), oklch(6% 0.018 245)); + color: oklch(94% 0.012 245); +} + +.process-inner { + max-width: var(--page-max); + margin-inline: auto; +} + +.process-heading { + margin-bottom: clamp(2.5rem, 5vw, 4rem); +} + +.process-heading h2 { + margin-bottom: 0; + color: oklch(95% 0.012 245); + font-size: clamp(2.4rem, 1.35rem + 4.4vw, 5rem); + font-weight: 650; +} + +.process-heading p { + color: oklch(78% 0.025 245); + font-weight: 450; +} + +.process-kicker { + display: inline-flex; + justify-self: center; + align-items: center; + min-height: 1.7rem; + margin: 0; + padding: 0.25rem 0.75rem; + border: 1px solid oklch(95% 0.01 245 / 0.14); + background: oklch(100% 0 0 / 0.04); + color: oklch(72% 0.03 245); + font-size: 0.72rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; + backdrop-filter: blur(8px); +} + +.process-card-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--space-4); +} + +.process-card { + position: relative; + overflow: hidden; + min-height: 18rem; + padding: clamp(1.5rem, 2.4vw, 2rem); + border: 1px solid oklch(95% 0.01 245 / 0.13); + background: + linear-gradient(180deg, oklch(24% 0.035 245 / 0.72), oklch(16% 0.028 245 / 0.72)), + oklch(14% 0.028 245); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.06), + 0 18px 48px oklch(0% 0 0 / 0.28); + backdrop-filter: blur(18px); +} + +.process-card::before { + content: ""; + position: absolute; + inset: 0; + background: + radial-gradient(circle at 50% 0%, oklch(82% 0.12 246 / 0.08), transparent 18rem), + oklch(100% 0 0 / 0.035); + pointer-events: none; +} + +.process-card-content { + position: relative; + z-index: 1; + display: grid; + justify-items: center; + align-content: start; + min-height: 100%; + text-align: center; +} + +.process-step-label { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.process-step-label::before, +.process-step-label::after { + content: ""; + position: absolute; + width: 1px; + height: 2rem; + background: linear-gradient(180deg, oklch(95% 0.01 245 / 0.66), oklch(95% 0.01 245 / 0.1)); +} + +.process-step-label::before { + left: -0.55rem; +} + +.process-step-label::after { + right: -0.55rem; +} + +.process-step-label span { + display: inline-flex; + align-items: center; + min-height: 2rem; + padding: 0.25rem 0.85rem; + border: 1px solid oklch(95% 0.01 245 / 0.14); + background: oklch(100% 0 0 / 0.08); + color: oklch(91% 0.012 245); + font-size: 0.78rem; + font-weight: 850; + text-transform: uppercase; +} + +.process-card h3 { + max-width: 11ch; + margin: clamp(1.75rem, 3vw, 2.4rem) 0 0; + color: oklch(93% 0.012 245); + font-size: clamp(1.65rem, 1rem + 1.7vw, 2.75rem); + font-weight: 650; + line-height: 1.08; +} + +.process-card p { + max-width: 23rem; + margin: var(--space-5) auto 0; + color: oklch(73% 0.024 245); + font-size: clamp(1rem, 0.3vw + 0.95rem, 1.12rem); + line-height: 1.45; +} + +.process-corner { + position: absolute; + z-index: 1; + width: 0.85rem; + height: 0.85rem; + pointer-events: none; +} + +.process-corner-tl { + top: 0.32rem; + left: 0.32rem; + border-top: 1px solid oklch(95% 0.01 245 / 0.28); + border-left: 1px solid oklch(95% 0.01 245 / 0.28); +} + +.process-corner-tr { + top: 0.32rem; + right: 0.32rem; + border-top: 1px solid oklch(95% 0.01 245 / 0.28); + border-right: 1px solid oklch(95% 0.01 245 / 0.28); +} + +.process-corner-bl { + bottom: 0.32rem; + left: 0.32rem; + border-bottom: 1px solid oklch(95% 0.01 245 / 0.28); + border-left: 1px solid oklch(95% 0.01 245 / 0.28); +} + +.process-corner-br { + right: 0.32rem; + bottom: 0.32rem; + border-right: 1px solid oklch(95% 0.01 245 / 0.28); + border-bottom: 1px solid oklch(95% 0.01 245 / 0.28); +} + +.process-cta { + display: flex; + justify-content: space-between; + align-items: center; + gap: var(--space-4); + max-width: 74rem; + margin: clamp(2.5rem, 5vw, 4rem) auto 0; + padding-top: var(--space-6); + border-top: 1px solid oklch(95% 0.01 245 / 0.11); +} + +.process-cta p { + margin: 0; + color: oklch(88% 0.014 245); + font-size: var(--step-1); +} + +.process-cta .button { + border-color: oklch(68% 0.18 246 / 0.7); + background: oklch(58% 0.18 246 / 0.08); + color: oklch(76% 0.14 246); +} + +:root[data-theme="light"] .process-section { + background: + radial-gradient(circle at 50% 0%, oklch(86% 0.06 246 / 0.2), transparent 34rem), + linear-gradient(180deg, oklch(99% 0.004 245), oklch(96% 0.012 245)); + color: var(--text); +} + +:root[data-theme="light"] .process-heading h2 { + color: var(--text); +} + +:root[data-theme="light"] .process-heading p { + color: var(--text-muted); +} + +:root[data-theme="light"] .process-kicker { + border-color: oklch(74% 0.045 245 / 0.5); + background: oklch(100% 0 0 / 0.72); + color: var(--blue); +} + +:root[data-theme="light"] .process-card { + border-color: oklch(75% 0.045 245 / 0.62); + background: + linear-gradient(180deg, oklch(100% 0 0 / 0.88), oklch(96% 0.012 245 / 0.9)), + var(--surface); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.86), + 0 20px 54px oklch(42% 0.05 245 / 0.12); +} + +:root[data-theme="light"] .process-card::before { + background: + radial-gradient(circle at 50% 0%, oklch(82% 0.09 246 / 0.15), transparent 18rem), + oklch(100% 0 0 / 0.26); +} + +:root[data-theme="light"] .process-step-label::before, +:root[data-theme="light"] .process-step-label::after { + background: linear-gradient(180deg, oklch(58% 0.16 246 / 0.58), oklch(58% 0.16 246 / 0.08)); +} + +:root[data-theme="light"] .process-step-label span { + border-color: oklch(73% 0.045 245 / 0.58); + background: oklch(95% 0.018 245 / 0.86); + color: var(--text); +} + +:root[data-theme="light"] .process-card h3 { + color: var(--text); +} + +:root[data-theme="light"] .process-card p { + color: var(--text-muted); +} + +:root[data-theme="light"] .process-corner-tl, +:root[data-theme="light"] .process-corner-tr, +:root[data-theme="light"] .process-corner-bl, +:root[data-theme="light"] .process-corner-br { + border-color: oklch(58% 0.16 246 / 0.34); +} + +:root[data-theme="light"] .process-cta { + border-top-color: oklch(78% 0.045 245 / 0.5); +} + +:root[data-theme="light"] .process-cta p { + color: var(--text); +} + +:root[data-theme="light"] .process-cta .button { + background: oklch(99% 0.006 245); + color: var(--blue); +} + +.split-section { + display: grid; + gap: var(--space-6); + align-items: center; + background: oklch(16% 0.035 245); +} + +:root[data-theme="light"] .split-section { + background: + radial-gradient(circle at 82% 12%, oklch(84% 0.065 246 / 0.28), transparent 26rem), + linear-gradient(180deg, oklch(97% 0.012 245), oklch(93% 0.024 245)); +} + +.record-stack { + display: grid; + gap: var(--space-4); +} + +.record-stack article { + display: grid; + grid-template-columns: 5rem 1fr; + gap: var(--space-4); + align-items: center; + padding: var(--space-4); + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); +} + +.record-stack span { + display: grid; + place-items: center; + min-height: 4rem; + border: 1px solid var(--blue); + border-radius: var(--radius-sm); + color: var(--green); + font-weight: 850; + letter-spacing: 0.08em; +} + +.record-stack p { + margin: 0; +} + +.deliverability-section { + background: + radial-gradient(circle at 84% 6%, oklch(24% 0.07 178 / 0.28), transparent 34rem), + linear-gradient(180deg, oklch(9% 0.026 245), oklch(6% 0.018 245)); +} + +:root[data-theme="light"] .deliverability-section { + background: + radial-gradient(circle at 80% 0%, oklch(86% 0.06 246 / 0.22), transparent 34rem), + linear-gradient(180deg, oklch(97% 0.012 245), oklch(95% 0.018 245)); +} + +.deliverability-panel { + position: relative; + max-width: var(--page-max); + margin-inline: auto; + overflow: visible; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.deliverability-bg { + display: none; + position: absolute; + inset: 0; + background: + radial-gradient(62rem 30rem at 0% -10%, oklch(58% 0.16 246 / 0.11), transparent 62%), + radial-gradient(42rem 28rem at 100% 0%, oklch(70% 0.16 147 / 0.1), transparent 64%), + linear-gradient(to right, oklch(100% 0 0 / 0.035) 1px, transparent 1px), + linear-gradient(to bottom, oklch(100% 0 0 / 0.035) 1px, transparent 1px); + background-size: auto, auto, 48px 48px, 48px 48px; + mask-image: radial-gradient(78rem 38rem at 50% 10%, black, transparent 82%); + pointer-events: none; +} + +.deliverability-head, +.deliverability-card-grid { + position: relative; + z-index: 1; +} + +.deliverability-head { + display: grid; + grid-template-columns: minmax(0, 56rem); + gap: var(--space-4); + align-items: start; + margin-bottom: clamp(2.5rem, 5vw, 4.5rem); +} + +.deliverability-head h2 { + max-width: 14ch; + margin: 0; + color: oklch(96% 0.012 245); + font-size: clamp(2.2rem, 1.35rem + 3.8vw, 4.6rem); + line-height: 1.03; +} + +.deliverability-head > p { + max-width: 44rem; + margin: 0; + color: oklch(82% 0.02 245); + font-size: clamp(1rem, 0.35vw + 0.95rem, 1.15rem); + line-height: 1.55; +} + +.deliverability-card-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: var(--space-5); +} + +.deliverability-card { + position: relative; + overflow: hidden; + min-height: 24rem; + padding: clamp(1.25rem, 2vw, 1.6rem); + border: 1px solid oklch(95% 0.01 245 / 0.12); + border-radius: var(--radius-lg); + background: + linear-gradient(180deg, oklch(100% 0 0 / 0.055), oklch(100% 0 0 / 0.018)), + oklch(8.5% 0.022 245 / 0.82); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.04), + 0 18px 42px oklch(0% 0 0 / 0.28); +} + +.deliverability-card::before { + content: ""; + position: absolute; + inset: 0; + background: + linear-gradient(to right, oklch(100% 0 0 / 0.04) 1px, transparent 1px), + linear-gradient(to bottom, oklch(100% 0 0 / 0.04) 1px, transparent 1px); + background-size: 40px 40px; + opacity: 0.24; + mask-image: radial-gradient(120% 80% at 50% 0%, black, transparent); + pointer-events: none; +} + +.record-visual, +.deliverability-card > div:last-child { + position: relative; + z-index: 1; +} + +.record-visual { + display: grid; + place-items: center; + min-height: 14rem; + margin-bottom: var(--space-5); + color: oklch(92% 0.012 245); +} + +.deliverability-card h3 { + margin: 0; + color: oklch(96% 0.012 245); + font-size: clamp(1.25rem, 0.7rem + 1vw, 1.75rem); +} + +.deliverability-card p { + margin: var(--space-2) 0 0; + color: oklch(78% 0.024 245); + font-size: 0.98rem; + line-height: 1.5; +} + +.record-code, +.signature-card, +.policy-meter, +.report-line { + border: 1px solid oklch(95% 0.01 245 / 0.13); + background: linear-gradient(180deg, oklch(100% 0 0 / 0.07), oklch(100% 0 0 / 0.025)); + box-shadow: 0 14px 34px oklch(0% 0 0 / 0.22); + backdrop-filter: blur(10px); +} + +.record-code { + width: min(100%, 18rem); + border-radius: var(--radius-md); + overflow: hidden; +} + +.record-code span { + display: block; + padding: 0.65rem 0.85rem; + border-bottom: 1px solid oklch(95% 0.01 245 / 0.1); + color: var(--green); + font-size: 0.72rem; + font-weight: 900; + letter-spacing: 0.08em; +} + +.record-code code { + display: block; + padding: 0.9rem; + color: oklch(88% 0.02 245); + font-family: "Cascadia Mono", "SFMono-Regular", Consolas, monospace; + font-size: 0.78rem; + line-height: 1.45; + white-space: normal; +} + +.record-route { + display: flex; + align-items: center; + gap: var(--space-2); + width: min(100%, 18rem); + margin-top: var(--space-4); + color: oklch(76% 0.024 245); + font-size: 0.74rem; + font-weight: 800; +} + +.record-route i { + flex: 1; + height: 1px; + background: linear-gradient(90deg, var(--blue), var(--green)); +} + +.signature-card { + width: min(100%, 17rem); + padding: var(--space-4); + border-radius: var(--radius-md); +} + +.signature-card span { + display: block; + color: oklch(74% 0.024 245); + font-size: 0.76rem; +} + +.signature-card strong { + display: block; + margin-top: var(--space-2); + color: oklch(91% 0.012 245); + font-size: 1.2rem; +} + +.key-row { + display: flex; + gap: var(--space-2); + width: min(100%, 17rem); + margin-top: var(--space-4); +} + +.key-row span { + flex: 1; + height: 2.8rem; + border: 1px solid oklch(95% 0.01 245 / 0.1); + border-radius: var(--radius-sm); + background: oklch(100% 0 0 / 0.045); +} + +.policy-meter { + display: grid; + grid-template-columns: repeat(3, 1fr); + width: min(100%, 18rem); + overflow: hidden; + border-radius: 999px; +} + +.policy-meter span { + padding: 0.75rem 0.45rem; + color: oklch(74% 0.024 245); + font-size: 0.68rem; + font-weight: 850; + text-align: center; + text-transform: uppercase; +} + +.policy-meter span:last-child { + background: oklch(70% 0.16 147 / 0.22); + color: oklch(83% 0.15 147); +} + +.report-line { + display: flex; + justify-content: space-between; + align-items: center; + width: min(100%, 18rem); + margin-top: var(--space-4); + padding: 0.85rem 1rem; + border-radius: var(--radius-md); + color: oklch(76% 0.024 245); +} + +.report-line strong { + color: var(--green); +} + +:root[data-theme="light"] .deliverability-panel { + background: transparent; + box-shadow: none; +} + +:root[data-theme="light"] .deliverability-bg { + background: + radial-gradient(62rem 30rem at 0% -10%, oklch(84% 0.07 246 / 0.2), transparent 62%), + radial-gradient(42rem 28rem at 100% 0%, oklch(84% 0.08 147 / 0.16), transparent 64%), + linear-gradient(to right, oklch(62% 0.04 245 / 0.08) 1px, transparent 1px), + linear-gradient(to bottom, oklch(62% 0.04 245 / 0.08) 1px, transparent 1px); + background-size: auto, auto, 48px 48px, 48px 48px; +} + +:root[data-theme="light"] .deliverability-head h2, +:root[data-theme="light"] .deliverability-card h3 { + color: var(--text); +} + +:root[data-theme="light"] .deliverability-head > p, +:root[data-theme="light"] .deliverability-card p { + color: var(--text-muted); +} + +:root[data-theme="light"] .deliverability-card { + border-color: oklch(76% 0.045 245 / 0.64); + background: + linear-gradient(180deg, oklch(100% 0 0 / 0.9), oklch(96% 0.012 245 / 0.86)), + var(--surface); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.9), + 0 18px 44px oklch(44% 0.05 245 / 0.1); +} + +:root[data-theme="light"] .deliverability-card::before { + background: + linear-gradient(to right, oklch(62% 0.04 245 / 0.08) 1px, transparent 1px), + linear-gradient(to bottom, oklch(62% 0.04 245 / 0.08) 1px, transparent 1px); + opacity: 0.48; +} + +:root[data-theme="light"] .record-code, +:root[data-theme="light"] .signature-card, +:root[data-theme="light"] .policy-meter, +:root[data-theme="light"] .report-line { + border-color: oklch(76% 0.045 245 / 0.58); + background: linear-gradient(180deg, oklch(100% 0 0 / 0.9), oklch(96% 0.012 245 / 0.9)); + box-shadow: 0 12px 28px oklch(44% 0.05 245 / 0.1); +} + +:root[data-theme="light"] .record-code code, +:root[data-theme="light"] .signature-card strong { + color: var(--text); +} + +:root[data-theme="light"] .record-route, +:root[data-theme="light"] .signature-card span, +:root[data-theme="light"] .policy-meter span, +:root[data-theme="light"] .report-line { + color: var(--text-muted); +} + +:root[data-theme="light"] .key-row span { + border-color: oklch(76% 0.045 245 / 0.48); + background: oklch(100% 0 0 / 0.58); +} + +.continuity-rail { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); + gap: 1px; + overflow: hidden; + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--line); +} + +.continuity-rail article { + display: grid; + gap: var(--space-3); + padding: var(--space-5); + background: oklch(17% 0.04 245); +} + +.continuity-rail span { + color: var(--blue); + font-size: 0.78rem; + font-weight: 850; + letter-spacing: 0.12em; +} + +.feature-showcase { + display: grid; + gap: var(--space-4); + max-width: var(--page-max); + margin-inline: auto; + padding: 0; +} + +:root[data-theme="light"] .feature-showcase { + background: transparent; + box-shadow: none; +} + +.feature-tabs { + display: grid; + gap: var(--space-3); +} + +.feature-tabs button { + position: relative; + display: grid; + grid-template-columns: auto 1fr; + gap: var(--space-1) var(--space-3); + align-items: start; + min-height: 6rem; + padding: var(--space-4); + border: 1px solid var(--line-soft); + border-radius: var(--radius-md); + background: oklch(13% 0.035 245 / 0.72); + color: var(--text); + text-align: left; + cursor: pointer; + overflow: hidden; + transition: + transform 220ms var(--ease-out-quint), + border-color 220ms ease, + background 220ms ease, + box-shadow 260ms ease; +} + +.feature-tabs button::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 3px; + background: linear-gradient(180deg, var(--blue), var(--green)); + transform: scaleY(0); + transform-origin: bottom; + transition: transform 240ms var(--ease-out-quint); +} + +.feature-tabs button:hover, +.feature-tabs button.is-active { + border-color: oklch(61% 0.16 246 / 0.85); + transform: translateY(-2px); + box-shadow: 0 18px 42px oklch(4% 0.02 245 / 0.18); +} + +:root[data-theme="light"] .feature-tabs button:hover, +:root[data-theme="light"] .feature-tabs button.is-active { + box-shadow: 0 18px 42px oklch(45% 0.07 245 / 0.14); +} + +.feature-tabs button.is-active::before { + transform: scaleY(1); +} + +.feature-tabs button span { + grid-row: span 2; + display: grid; + place-items: center; + width: 2.35rem; + height: 2.35rem; + border: 1px solid var(--blue); + border-radius: 999px; + color: var(--blue); + font-size: 0.75rem; + font-weight: 850; +} + +.feature-tabs button strong { + color: var(--text); + font-size: 1.02rem; + line-height: 1.2; +} + +.feature-tabs button small { + color: var(--text-muted); + line-height: 1.45; +} + +.feature-panel { + display: grid; + align-content: start; + gap: var(--space-4); + min-height: 100%; + padding: clamp(1.25rem, 2.6vw, 2.25rem); + border: 1px solid var(--line-soft); + border-radius: var(--radius-md); + background: + linear-gradient(180deg, oklch(20% 0.05 245 / 0.8), oklch(13% 0.035 245 / 0.9)); + transition: + border-color 220ms ease, + transform 260ms var(--ease-out-quint); +} + +.feature-panel.is-switching { + transform: translateY(5px); +} + +.feature-panel-top { + display: flex; + justify-content: space-between; + gap: var(--space-3); + align-items: start; +} + +.feature-panel h3 { + margin: 0; + font-size: clamp(1.8rem, 1.2rem + 2vw, 3.2rem); + line-height: 1; + text-wrap: balance; +} + +.feature-panel-copy { + max-width: 42rem; + margin: 0; + color: var(--text-muted); + font-size: var(--step-1); +} + +.feature-proof-list { + display: grid; + gap: var(--space-3); + margin: 0; + padding: 0; + list-style: none; +} + +.feature-proof-list li { + display: flex; + gap: var(--space-3); + align-items: center; + color: var(--text-muted); +} + +.feature-proof-list li::before { + content: ""; + flex: 0 0 auto; + width: 0.72rem; + height: 0.72rem; + border: 1px solid var(--green); + border-radius: 999px; + box-shadow: 0 0 0 4px oklch(76% 0.18 147 / 0.08); +} + +.migration-board { + display: grid; + gap: var(--space-5); + align-items: start; +} + +.migration-checklist { + padding: var(--space-5); + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); +} + +.timeline { + position: relative; + display: grid; + gap: var(--space-3); + margin: 0; + padding: 0; + list-style: none; +} + +.timeline::before { + content: ""; + position: absolute; + left: 1.38rem; + top: 1.25rem; + bottom: 1.25rem; + width: 1px; + background: linear-gradient(180deg, var(--blue), var(--green)); + opacity: 0.55; +} + +.timeline li { + position: relative; + display: grid; + grid-template-columns: auto 1fr; + gap: var(--space-4); + align-items: start; + padding: var(--space-4); + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: oklch(17% 0.04 245); + transition: + transform 220ms var(--ease-out-quint), + border-color 220ms ease, + box-shadow 260ms ease; +} + +.timeline li:hover { + transform: translateX(4px); + border-color: oklch(61% 0.16 246 / 0.82); + box-shadow: 0 16px 44px oklch(4% 0.02 245 / 0.2); +} + +:root[data-theme="light"] .timeline li:hover { + box-shadow: 0 16px 44px oklch(45% 0.07 245 / 0.14); +} + +.timeline-step { + position: relative; + z-index: 1; + display: grid; + place-items: center; + width: 2.8rem; + height: 2.8rem; + border: 1px solid var(--blue); + border-radius: 999px; + background: var(--surface); + color: var(--blue); + font-size: 0.76rem; + font-weight: 850; + letter-spacing: 0.08em; +} + +.timeline strong { + display: block; + margin-bottom: var(--space-1); + color: var(--text); + font-size: var(--step-1); +} + +.migration-process-panel { + max-width: var(--page-max); + margin-inline: auto; + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +.migration-process-head { + display: flex; + gap: var(--space-4); + align-items: center; +} + +.migration-process-head h2 { + margin: 0; + color: oklch(96% 0.012 245); + font-size: clamp(2rem, 1.2rem + 2.4vw, 3.2rem); +} + +.migration-process-head .eyebrow { + margin-bottom: var(--space-2); +} + +.migration-process-head > span { + width: 1px; + height: 3rem; + background: oklch(95% 0.01 245 / 0.12); +} + +.migration-process-head > p { + margin: 0; + color: oklch(78% 0.024 245); + font-size: 0.98rem; +} + +.migration-process-line { + height: 1px; + margin: var(--space-4) 0 clamp(1.6rem, 3vw, 2.2rem); + background: linear-gradient(90deg, oklch(95% 0.01 245 / 0.14), oklch(95% 0.01 245 / 0.04)); +} + +.migration-process-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: clamp(1.25rem, 2.4vw, 2.5rem); + padding: 0; + margin: 0; + list-style: none; +} + +.migration-process-grid li { + position: relative; + min-width: 0; +} + +.migration-process-grid li:not(:last-child)::after { + content: ""; + position: absolute; + top: 1.5rem; + left: 4.4rem; + right: -1.4rem; + height: 1px; + background: linear-gradient(90deg, oklch(95% 0.01 245 / 0.12), transparent); +} + +.migration-step-badge { + display: grid; + place-items: center; + width: 3rem; + height: 3rem; + margin-bottom: var(--space-4); + border-radius: var(--radius-sm); + font-weight: 900; + letter-spacing: 0.04em; +} + +.badge-blue { + border: 1px solid oklch(68% 0.18 246 / 0.34); + background: oklch(58% 0.18 246 / 0.12); + color: oklch(76% 0.14 246); +} + +.badge-purple { + border: 1px solid oklch(62% 0.18 300 / 0.32); + background: oklch(52% 0.15 300 / 0.12); + color: oklch(78% 0.12 300); +} + +.badge-green { + border: 1px solid oklch(70% 0.16 147 / 0.34); + background: oklch(60% 0.15 147 / 0.12); + color: oklch(78% 0.16 147); +} + +.badge-amber { + border: 1px solid oklch(76% 0.15 76 / 0.34); + background: oklch(70% 0.14 76 / 0.12); + color: oklch(82% 0.14 76); +} + +.migration-process-grid h3 { + margin: 0 0 var(--space-2); + color: oklch(96% 0.012 245); + font-size: 1.1rem; +} + +.migration-process-grid p { + margin: 0; + color: oklch(75% 0.024 245); + font-size: 0.95rem; + line-height: 1.5; +} + +.migration-needs { + display: flex; + flex-wrap: wrap; + gap: var(--space-3) var(--space-5); + align-items: center; + margin-top: clamp(1.8rem, 4vw, 3rem); + padding-top: var(--space-5); + border-top: 1px solid oklch(95% 0.01 245 / 0.1); +} + +.migration-needs strong { + color: oklch(95% 0.012 245); +} + +.migration-needs ul { + display: flex; + flex-wrap: wrap; + gap: var(--space-2) var(--space-4); + padding: 0; + margin: 0; + list-style: none; +} + +.migration-needs li { + color: oklch(78% 0.024 245); + font-size: 0.92rem; +} + +.migration-needs li::before { + content: ""; + display: inline-block; + width: 0.42rem; + height: 0.42rem; + margin-right: var(--space-2); + border-radius: 50%; + background: var(--green); + vertical-align: 0.08em; +} + +:root[data-theme="light"] .migration-process-panel { + background: transparent; + box-shadow: none; +} + +:root[data-theme="light"] .migration-process-head h2, +:root[data-theme="light"] .migration-process-grid h3, +:root[data-theme="light"] .migration-needs strong { + color: var(--text); +} + +:root[data-theme="light"] .migration-process-head > p, +:root[data-theme="light"] .migration-process-grid p, +:root[data-theme="light"] .migration-needs li { + color: var(--text-muted); +} + +:root[data-theme="light"] .migration-process-head > span, +:root[data-theme="light"] .migration-process-line, +:root[data-theme="light"] .migration-needs { + border-color: oklch(76% 0.045 245 / 0.46); +} + +:root[data-theme="light"] .migration-process-head > span { + background: oklch(76% 0.045 245 / 0.46); +} + +:root[data-theme="light"] .migration-process-line { + background: linear-gradient(90deg, oklch(76% 0.045 245 / 0.54), transparent); +} + +:root[data-theme="light"] .migration-process-grid li:not(:last-child)::after { + background: linear-gradient(90deg, oklch(76% 0.045 245 / 0.5), transparent); +} + +.pricing-panel { + display: grid; + gap: var(--space-5); + align-items: center; + max-width: 72rem; + margin-inline: auto; + padding: clamp(1.5rem, 4vw, 2.5rem); + border-radius: var(--radius-lg); +} + +.pricing-panel h2 { + font-size: clamp(2.4rem, 1.5rem + 3vw, 5rem); +} + +.pricing-builder { + display: grid; + gap: var(--space-4); + max-width: var(--page-max); + margin-inline: auto; + padding: 0; +} + +:root[data-theme="light"] .pricing-builder { + background: transparent; + box-shadow: none; +} + +.pricing-control-panel, +.pricing-comparison-panel { + min-width: 0; + border: 1px solid var(--line-soft); + border-radius: var(--radius-md); + background: oklch(12% 0.034 245 / 0.62); +} + +:root[data-theme="light"] .pricing-control-panel, +:root[data-theme="light"] .pricing-comparison-panel { + background: oklch(99% 0.006 245 / 0.86); +} + +.pricing-control-panel { + display: grid; + gap: var(--space-5); + align-content: start; + padding: clamp(1.25rem, 2vw, 2rem); +} + +.pricing-comparison-panel { + display: grid; + gap: var(--space-5); + padding: clamp(1.25rem, 2vw, 2rem); +} + +.panel-label { + display: block; + margin-bottom: var(--space-2); + color: var(--blue); + font-size: 0.72rem; + font-weight: 850; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.pricing-segmented, +.mailbox-options { + display: grid; + gap: var(--space-2); +} + +.pricing-segmented { + position: relative; + grid-template-columns: repeat(2, 1fr); + padding: 0.28rem; + border: 1px solid var(--line); + border-radius: 999px; + background: oklch(9% 0.028 245 / 0.72); + overflow: hidden; +} + +:root[data-theme="light"] .pricing-segmented { + background: oklch(93% 0.018 245); +} + +.pricing-segmented::before { + content: ""; + position: absolute; + inset: 0.28rem auto 0.28rem 0.28rem; + width: calc(50% - 0.28rem); + border-radius: 999px; + background: linear-gradient(180deg, var(--blue), var(--blue-soft)); + box-shadow: 0 10px 28px oklch(58% 0.18 246 / 0.26); + transform: translateX(0); + transition: transform 260ms var(--ease-out-quint); +} + +.pricing-segmented[data-active="managed"]::before { + transform: translateX(100%); +} + +.pricing-segmented button, +.mailbox-options button { + position: relative; + z-index: 1; + min-height: 42px; + border: 0; + border-radius: 999px; + background: transparent; + color: var(--text-muted); + cursor: pointer; + font-weight: 800; + transition: + color 180ms ease, + transform 180ms var(--ease-out-quint), + border-color 180ms ease, + background 180ms ease; +} + +.pricing-segmented button.is-active { + color: oklch(98% 0.01 245); +} + +.mailbox-options { + grid-template-columns: repeat(3, 1fr); +} + +.mailbox-options button { + border: 1px solid var(--line); + color: var(--text); + background: oklch(14% 0.035 245 / 0.72); +} + +:root[data-theme="light"] .mailbox-options button { + background: oklch(96% 0.012 245); +} + +.mailbox-options button:hover, +.mailbox-options button.is-active { + border-color: var(--blue); + background: oklch(24% 0.075 246 / 0.72); + color: var(--text); + transform: translateY(-1px); +} + +:root[data-theme="light"] .mailbox-options button:hover, +:root[data-theme="light"] .mailbox-options button.is-active { + background: oklch(88% 0.055 246); +} + +.price-estimate { + padding: var(--space-4); + border: 1px solid var(--line-soft); + border-radius: var(--radius-md); + background: + linear-gradient(180deg, oklch(20% 0.05 245 / 0.86), oklch(13% 0.035 245 / 0.86)); +} + +:root[data-theme="light"] .price-estimate { + background: linear-gradient(180deg, oklch(99% 0.006 245), oklch(94% 0.018 245)); +} + +.price-estimate p { + display: flex; + align-items: baseline; + gap: var(--space-2); + margin: 0; + color: var(--text); +} + +.plan-total { + font-size: clamp(3rem, 2.1rem + 3vw, 5rem); + font-weight: 850; + line-height: 0.92; + font-variant-numeric: tabular-nums; +} + +.price-estimate small, +.plan-summary, +.pricing-note { + color: var(--text-muted); +} + +.price-estimate small strong { + color: var(--green); +} + +.plan-summary, +.pricing-note { + margin: 0; +} + +.comparison-head { + display: flex; + justify-content: space-between; + gap: var(--space-4); + align-items: start; +} + +.comparison-head h3 { + max-width: 34rem; + margin: 0; + color: var(--text); + font-size: clamp(1.3rem, 1rem + 1vw, 2rem); +} + +.status-pill { + flex: 0 0 auto; + padding: 0.45rem 0.7rem; + border: 1px solid oklch(67% 0.16 147 / 0.62); + border-radius: 999px; + color: var(--green); + font-size: 0.76rem; + font-weight: 800; +} + +.plan-feature-grid { + overflow-x: auto; + border: 1px solid var(--line); + border-radius: var(--radius-md); + scrollbar-width: thin; +} + +.plan-feature-row { + display: grid; + grid-template-columns: minmax(11rem, 1.2fr) minmax(7rem, 0.8fr) minmax(10rem, 1fr); + min-width: 34rem; + border-bottom: 1px solid var(--line-soft); +} + +.plan-feature-row:last-child { + border-bottom: 0; +} + +.plan-feature-row span { + min-width: 0; + padding: 0.85rem 0.9rem; + border-right: 1px solid var(--line-soft); + color: var(--text-muted); +} + +.plan-feature-row span:last-child { + border-right: 0; +} + +.plan-feature-row span:nth-child(2), +.plan-feature-row span:nth-child(3) { + color: var(--text); +} + +.pricing-builder[data-plan="hosting"] .plan-feature-row span:nth-child(2), +.pricing-builder[data-plan="managed"] .plan-feature-row span:nth-child(3) { + background: oklch(24% 0.075 246 / 0.42); + color: oklch(92% 0.03 245); +} + +:root[data-theme="light"] .pricing-builder[data-plan="hosting"] .plan-feature-row span:nth-child(2), +:root[data-theme="light"] .pricing-builder[data-plan="managed"] .plan-feature-row span:nth-child(3) { + background: oklch(91% 0.05 246); + color: var(--text); +} + +.faq-list { + display: grid; + gap: var(--space-3); + max-width: 56rem; + margin-inline: auto; +} + +details { + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); +} + +summary { + min-height: 56px; + padding: var(--space-4); + cursor: pointer; + color: var(--text); + font-weight: 800; +} + +details p { + margin: 0; + padding: 0 var(--space-4) var(--space-4); +} + +.assessment-section { + position: relative; + display: block; + width: calc(100% - (var(--page-gutter) * 2)); + max-width: var(--page-max); + margin: clamp(3.5rem, 7vw, 6rem) auto; + padding: clamp(1.25rem, 3vw, 3rem); + overflow: hidden; + border: 1px solid oklch(58% 0.09 246 / 0.45); + border-radius: clamp(1.25rem, 2vw, 1.75rem); + background: oklch(12% 0.034 245); + box-shadow: + inset 0 1px 0 oklch(95% 0.01 245 / 0.08), + 0 30px 90px oklch(4% 0.02 245 / 0.36); +} + +.assessment-bg { + position: absolute; + inset: 0; + background: + linear-gradient(64deg, oklch(5% 0.018 245 / 0.92), oklch(15% 0.04 178 / 0.76) 52%, oklch(31% 0.04 183 / 0.48)), + url("https://hoirqrkdgbmvpwutwuwj.supabase.co/storage/v1/object/public/assets/assets/60668e31-2150-424e-b292-05bfdda254e0_1600w.jpg") center / cover; + opacity: 0.98; +} + +.assessment-bg::after { + content: ""; + position: absolute; + inset: 0; + background: + radial-gradient(circle at 78% 18%, oklch(66% 0.14 246 / 0.18), transparent 23rem), + linear-gradient(180deg, transparent, oklch(4% 0.015 245 / 0.62)); +} + +:root[data-theme="light"] .assessment-section { + border-color: oklch(76% 0.045 245 / 0.72); + background: oklch(97% 0.01 245); + box-shadow: + inset 0 1px 0 oklch(100% 0 0 / 0.78), + 0 30px 90px oklch(50% 0.05 245 / 0.16); +} + +:root[data-theme="light"] .assessment-bg { + background: + linear-gradient(64deg, oklch(98% 0.006 245 / 0.92), oklch(93% 0.03 180 / 0.82) 54%, oklch(86% 0.055 205 / 0.62)), + url("https://hoirqrkdgbmvpwutwuwj.supabase.co/storage/v1/object/public/assets/assets/60668e31-2150-424e-b292-05bfdda254e0_1600w.jpg") center / cover; + opacity: 1; +} + +:root[data-theme="light"] .assessment-bg::after { + background: + radial-gradient(circle at 78% 16%, oklch(82% 0.095 246 / 0.26), transparent 24rem), + linear-gradient(180deg, oklch(100% 0 0 / 0.2), oklch(95% 0.018 245 / 0.82)); +} + +.assessment-layout { + position: relative; + z-index: 1; + display: grid; + gap: clamp(2rem, 4vw, 4rem); + align-items: start; +} + +.assessment-form-card { + padding: clamp(1rem, 2vw, 1.35rem); + border: 1px solid oklch(35% 0.02 245 / 0.25); + border-radius: var(--radius-lg); + background: oklch(97% 0.006 245 / 0.92); + color: oklch(18% 0.03 245); + box-shadow: 0 24px 62px oklch(4% 0.02 245 / 0.28); + backdrop-filter: blur(14px); +} + +.assessment-form-head { + display: flex; + justify-content: space-between; + gap: var(--space-4); + align-items: start; + margin-bottom: var(--space-4); +} + +.assessment-form-head p { + margin: 0 0 var(--space-1); + color: oklch(45% 0.025 245); + font-size: 0.72rem; +} + +.assessment-form-head h3 { + margin: 0; + color: oklch(17% 0.03 245); + font-size: clamp(1.65rem, 1.2rem + 1.4vw, 2.25rem); + line-height: 1.04; +} + +.form-head-icon { + display: grid; + place-items: center; + flex: 0 0 auto; + width: 2.35rem; + height: 2.35rem; + border-radius: var(--radius-sm); + background: oklch(13% 0.03 245); + color: white; +} + +.form-head-icon svg, +.assessment-highlights svg, +.contact-avatar svg { + width: 1rem; + height: 1rem; + fill: none; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +.assessment-form { + display: grid; + gap: var(--space-3); + padding: 0; + border: 0; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +:root[data-theme="light"] .assessment-form { + border: 0; + background: transparent; + box-shadow: none; +} + +.form-row { + display: grid; + gap: var(--space-2); +} + +.split-form-row { + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--space-3); +} + +label { + color: var(--text); + font-weight: 800; +} + +.assessment-form label { + color: oklch(38% 0.03 245); + font-size: 0.78rem; + font-weight: 650; +} + +.assessment-form label span { + color: oklch(58% 0.025 245); +} + +input, +select, +textarea { + width: 100%; + min-height: 50px; + border: 1px solid var(--line); + border-radius: var(--radius-sm); + padding: 0.72rem 0.85rem; + background: oklch(12% 0.034 245); + color: var(--text); +} + +textarea { + min-height: 6rem; + resize: vertical; +} + +input::placeholder, +textarea::placeholder { + color: oklch(68% 0.03 245); +} + +.assessment-form input, +.assessment-form select, +.assessment-form textarea { + border-color: oklch(73% 0.025 245); + border-radius: 0.85rem; + background: white; + color: oklch(18% 0.03 245); + font-size: 0.95rem; + outline: none; +} + +.assessment-form input:focus, +.assessment-form select:focus, +.assessment-form textarea:focus { + border-color: oklch(55% 0.18 246); + box-shadow: 0 0 0 3px oklch(68% 0.18 246 / 0.18); +} + +.assessment-form input::placeholder, +.assessment-form textarea::placeholder { + color: oklch(63% 0.025 245); +} + +:root[data-theme="light"] input, +:root[data-theme="light"] select, +:root[data-theme="light"] textarea { + background: oklch(99% 0.006 245); + color: var(--text); + border-color: var(--line); +} + +:root[data-theme="light"] input::placeholder, +:root[data-theme="light"] textarea::placeholder { + color: var(--text-dim); +} + +:root[data-theme="light"] .assessment-form input, +:root[data-theme="light"] .assessment-form select, +:root[data-theme="light"] .assessment-form textarea { + background: white; + color: oklch(18% 0.03 245); + border-color: oklch(73% 0.025 245); +} + +.assessment-copy { + display: grid; + gap: var(--space-4); + align-content: start; + padding-block: clamp(0.5rem, 1.8vw, 1rem); + color: white; +} + +.assessment-copy .eyebrow { + color: oklch(78% 0.12 246); +} + +.assessment-copy h2 { + max-width: 11ch; + margin: 0; + color: white; + font-size: clamp(2.9rem, 2.2rem + 3vw, 5.25rem); + line-height: 0.96; +} + +.assessment-copy > p { + max-width: 46rem; + margin: 0; + color: oklch(92% 0.018 245); + font-size: clamp(1.03rem, 0.75rem + 0.9vw, 1.35rem); + line-height: 1.45; +} + +:root[data-theme="light"] .assessment-copy { + color: var(--text); +} + +:root[data-theme="light"] .assessment-copy h2, +:root[data-theme="light"] .assessment-highlights strong { + color: var(--text); +} + +:root[data-theme="light"] .assessment-copy > p, +:root[data-theme="light"] .assessment-highlights p { + color: var(--text-muted); +} + +.assessment-highlights { + display: grid; + gap: var(--space-4); + margin-top: var(--space-2); +} + +.assessment-highlights article { + display: flex; + gap: var(--space-3); + align-items: start; + min-width: 0; +} + +.assessment-highlights span { + display: grid; + place-items: center; + flex: 0 0 auto; + width: 2.3rem; + height: 2.3rem; + border: 1px solid oklch(96% 0.01 245 / 0.18); + border-radius: var(--radius-sm); + background: oklch(100% 0 0 / 0.1); + color: oklch(77% 0.18 147); + backdrop-filter: blur(10px); +} + +.assessment-highlights strong { + display: block; + color: white; + line-height: 1.2; +} + +.assessment-highlights p { + margin: var(--space-1) 0 0; + color: oklch(84% 0.02 245); + font-size: 0.9rem; + line-height: 1.4; +} + +:root[data-theme="light"] .assessment-highlights span { + border-color: oklch(78% 0.045 245 / 0.66); + background: oklch(99% 0.006 245 / 0.72); + color: var(--green); +} + +.direct-contact-card { + display: inline-flex; + flex-wrap: wrap; + align-items: center; + gap: var(--space-3); + justify-self: start; + margin-top: var(--space-2); + padding: var(--space-3); + border: 1px solid oklch(20% 0.025 245 / 0.18); + border-radius: var(--radius-lg); + background: oklch(97% 0.006 245 / 0.94); + color: oklch(18% 0.03 245); + box-shadow: 0 20px 52px oklch(4% 0.02 245 / 0.22); + backdrop-filter: blur(14px); +} + +.contact-avatar { + display: grid; + place-items: center; + width: 3rem; + height: 3rem; + border-radius: var(--radius-md); + background: oklch(94% 0.025 246); + color: var(--blue); +} + +.contact-avatar svg { + width: 2rem; + height: auto; +} + +.direct-contact-card p { + margin: 0; + color: oklch(45% 0.025 245); + font-size: 0.72rem; + line-height: 1.2; +} + +.direct-contact-card strong { + display: block; + color: oklch(18% 0.03 245); + line-height: 1.2; +} + +.direct-contact-card a { + display: inline-flex; + align-items: center; + min-height: 2.5rem; + padding: 0.65rem 0.85rem; + border-radius: 0.85rem; + background: oklch(13% 0.03 245); + color: white; + font-size: 0.83rem; + font-weight: 800; +} + +.field-error { + min-height: 1.1rem; + margin: 0; + color: var(--danger); + font-size: var(--step--1); +} + +.form-status { + min-height: 1.5rem; + margin: 0; + color: oklch(42% 0.16 147); + font-weight: 750; +} + +.site-footer { + padding: 0 var(--page-gutter) clamp(2rem, 4vw, 3rem); + border-top: 1px solid oklch(95% 0.01 245 / 0.1); + background: linear-gradient(180deg, oklch(7% 0.02 245), oklch(3% 0.012 245)); + color: oklch(94% 0.012 245); +} + +:root[data-theme="light"] .site-footer { + border-top-color: oklch(72% 0.045 245 / 0.46); + background: linear-gradient(180deg, oklch(15% 0.034 245), oklch(8% 0.024 245)); + color: oklch(96% 0.012 245); +} + +.footer-inner { + max-width: var(--page-max); + margin-inline: auto; + padding-top: clamp(3rem, 6vw, 5rem); +} + +.footer-main { + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(10rem, 0.7fr) minmax(14rem, 0.8fr); + gap: clamp(2rem, 6vw, 6rem); +} + +.footer-brand { + display: grid; + gap: var(--space-4); + align-content: start; +} + +.footer-logo { + display: inline-grid; + grid-template-columns: 2.55rem auto; + gap: var(--space-3); + align-items: center; + width: fit-content; + color: oklch(98% 0.006 245); +} + +.footer-logo .brand-mark { + width: 2.55rem; + height: 2.05rem; + color: var(--blue); +} + +.footer-logo strong, +.footer-logo span span { + display: block; + line-height: 1; + text-transform: uppercase; +} + +.footer-logo strong { + font-size: 1rem; + letter-spacing: 0.08em; +} + +.footer-logo span span { + margin-top: 0.18rem; + color: oklch(70% 0.16 246); + font-size: 0.68rem; + font-weight: 850; + letter-spacing: 0.16em; +} + +.footer-brand p { + max-width: 34rem; + margin: 0; + color: oklch(75% 0.025 245); + font-size: var(--step-0); +} + +.footer-links h2, +.footer-contact h2 { + margin: 0; + color: oklch(98% 0.006 245); + font-size: 0.92rem; +} + +.footer-links ul, +.footer-contact ul { + display: grid; + gap: var(--space-2); + margin: var(--space-4) 0 0; + padding: 0; + list-style: none; +} + +.footer-links a, +.footer-contact a, +.footer-bottom a { + color: oklch(75% 0.025 245); + transition: color 180ms ease; +} + +.footer-links a:hover, +.footer-contact a:hover, +.footer-bottom a:hover { + color: oklch(96% 0.012 245); +} + +.footer-contact li { + color: oklch(65% 0.028 245); +} + +.footer-bottom { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: var(--space-4); + align-items: center; + margin-top: clamp(3rem, 6vw, 5rem); + padding-top: var(--space-5); + border-top: 1px solid oklch(95% 0.01 245 / 0.1); + color: oklch(58% 0.03 245); + font-size: 0.86rem; +} + +.footer-bottom p { + margin: 0; +} + +.footer-bottom > div { + display: flex; + flex-wrap: wrap; + gap: var(--space-4); + align-items: center; +} + +.back-to-top { + display: inline-flex; + gap: var(--space-1); + align-items: center; +} + +.back-to-top svg { + width: 0.95rem; + height: 0.95rem; + fill: none; + stroke: currentColor; + stroke-width: 1.8; + stroke-linecap: round; + stroke-linejoin: round; +} + +@media (min-width: 760px) { + .site-header { + grid-template-columns: auto 1fr auto; + } + + .menu-toggle { + display: none; + } + + .nav-menu { + display: flex; + justify-content: start; + gap: clamp(0.35rem, 1.35vw, 1.2rem); + margin-inline: var(--space-3); + } + + .nav-menu a { + padding-inline: 0.3rem; + } + + .header-actions { + display: flex; + align-items: center; + gap: clamp(0.6rem, 1vw, var(--space-3)); + min-width: 0; + margin-left: var(--space-2); + } + + .header-actions .button { + display: none; + } + + .mail-flow { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .status-strip { + grid-template-columns: 1.1fr repeat(2, 1fr); + align-items: center; + } + + .split-section, + .migration-board { + grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); + } + + .assessment-layout { + grid-template-columns: minmax(19rem, 0.78fr) minmax(0, 1.22fr); + } + + .assessment-highlights { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .pricing-panel { + grid-template-columns: 1fr auto; + } + + .pricing-builder { + grid-template-columns: minmax(19rem, 0.78fr) minmax(0, 1.22fr); + } + + .feature-showcase { + grid-template-columns: minmax(18rem, 0.78fr) minmax(0, 1.22fr); + align-items: stretch; + } + + .feature-tabs { + grid-template-columns: 1fr; + } + + .support-rail { + max-width: 34rem; + } +} + +@media (min-width: 1060px) { + .site-header { + grid-template-columns: auto minmax(22rem, 1fr) auto; + } + + .header-actions .button { + display: inline-flex; + } + + .hero-grid { + grid-template-columns: minmax(18rem, 0.55fr) minmax(43rem, 1.65fr); + gap: clamp(2.5rem, 4vw, 5rem); + } + + .module-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .mail-flow { + position: relative; + min-height: 0; + grid-template-columns: minmax(10rem, 1fr) 2.8rem minmax(13rem, 1.28fr) 2.8rem minmax(11rem, 1.05fr) 2.8rem minmax(11rem, 1.05fr); + align-items: start; + padding: var(--space-2); + padding-bottom: 8rem; + column-gap: 0; + } + + .flow-lane { + min-height: 0; + border: 0; + background: transparent; + } + + .flow-lane.inbound, + .flow-lane.buffer, + .flow-lane.delivery, + .flow-lane.outbound { + position: relative; + } + + .flow-lane.inbound .source-list::after { + content: ""; + position: absolute; + right: 1rem; + top: 6.05rem; + width: 3.1rem; + height: 4.9rem; + border-right: 0; + border-top: 2px dashed var(--blue); + border-bottom: 2px dashed var(--blue); + border-radius: 0 999px 999px 0; + opacity: 0.95; + transform: none; + } + + .flow-lane.inbound { + grid-column: 1; + } + + .flow-lane.buffer { + grid-column: 3; + } + + .flow-lane.delivery { + grid-column: 5; + } + + .flow-lane.outbound { + grid-column: 7; + } + + .flow-connector { + align-self: start; + position: relative; + display: block; + height: 2px; + margin-top: 7.15rem; + background: var(--blue); + box-shadow: 0 0 14px oklch(65% 0.16 246 / 0.42); + } + + .flow-connector::after { + content: ""; + position: absolute; + top: -4px; + right: 0; + width: 10px; + height: 10px; + border-top: 2px solid var(--blue); + border-right: 2px solid var(--blue); + transform: rotate(45deg); + } + + .connector-a { + grid-column: 2; + } + + .connector-b { + grid-column: 4; + } + + .connector-c { + grid-column: 6; + } + + .flow-lane.standby { + position: absolute; + right: var(--space-3); + bottom: 0; + width: min(13rem, 20%); + min-height: auto; + margin-top: 0; + } + + .flow-lines { + display: none; + } + + .line { + fill: none; + stroke: var(--blue); + stroke-width: 3; + stroke-linecap: round; + stroke-linejoin: round; + filter: drop-shadow(0 0 6px oklch(65% 0.16 246 / 0.36)); + } + + .line.dashed { + stroke-dasharray: 9 9; + } + + .status-strip { + grid-template-columns: 1fr 1.15fr repeat(3, 1fr) auto; + } + + .aws-box { + min-height: 7.2rem; + } + + .local-strip { + grid-template-columns: minmax(16rem, 0.34fr) minmax(0, 1fr); + align-items: center; + } +} + +@media (max-width: 1500px) and (min-width: 760px) { + .header-actions .button { + display: none; + } +} + +@media (max-width: 1240px) and (min-width: 760px) { + .site-header { + grid-template-columns: auto 1fr auto; + } + + .brand { + grid-template-columns: 2.35rem auto; + gap: var(--space-2); + letter-spacing: 0.06em; + } + + .brand-mark { + width: 2.25rem; + height: 2.25rem; + } + + .nav-menu { + justify-content: end; + } + +} + +@media (max-width: 980px) { + .footer-main { + grid-template-columns: 1fr 1fr; + } + + .footer-brand { + grid-column: 1 / -1; + } + + .local-strip ul { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .deliverability-head, + .deliverability-card-grid { + grid-template-columns: 1fr; + } + + .deliverability-head h2 { + max-width: 16ch; + } + + .process-card-grid { + grid-template-columns: 1fr; + } + + .process-card { + min-height: 0; + } + + .migration-process-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .migration-process-grid li::after { + display: none; + } +} + +@media (max-width: 560px) { + :root { + --page-gutter: clamp(1rem, 5vw, 1.25rem); + } + + .site-header { + padding-inline: var(--page-gutter); + } + + .menu-toggle { + position: fixed; + top: max(0.85rem, env(safe-area-inset-top)); + right: 1rem; + } + + .hero-actions, + .hero-actions .button, + .button-large { + width: 100%; + } + + .hero-actions { + display: grid; + max-width: calc(100vw - (var(--page-gutter) * 2)); + } + + .hero-actions .button { + justify-self: stretch; + inline-size: 100%; + padding-inline: 0.9rem; + font-size: 0.95rem; + overflow-wrap: anywhere; + } + + .hero-copy, + .hero-lede, + .trust-list, + .architecture-panel, + .module-grid, + .local-strip, + .content-section { + max-width: 100%; + } + + .hero-lede { + max-width: 100%; + } + + .hero-copy { + padding-right: 0; + } + + h1 { + max-width: 10ch; + font-size: clamp(2rem, 12vw, 3rem); + } + + .architecture-panel { + overflow: hidden; + padding: 0; + } + + .architecture-image { + width: 100%; + max-width: 100%; + min-height: 20rem; + object-fit: contain; + } + + .button { + max-width: 100%; + min-width: 0; + } + + .panel-head { + display: grid; + } + + .panel-head h2 { + text-align: left; + } + + .process-steps { + grid-template-columns: 1fr; + } + + .module-grid { + grid-template-columns: 1fr; + } + + .module-card { + min-height: 0; + } + + .local-strip { + margin-top: clamp(3rem, 10vw, 4rem); + } + + .local-strip ul { + grid-template-columns: 1fr; + } + + .local-strip li { + min-height: 0; + grid-template-columns: auto 1fr; + align-items: center; + } + + .deliverability-panel { + padding: 0; + } + + .deliverability-head { + gap: var(--space-4); + } + + .deliverability-head h2 { + max-width: 100%; + } + + .deliverability-card { + min-height: 0; + } + + .record-visual { + min-height: 12rem; + } + + .process-heading { + text-align: left; + } + + .process-heading .process-kicker { + justify-self: start; + } + + .process-card { + padding: var(--space-5); + } + + .process-card-content { + justify-items: start; + text-align: left; + } + + .process-card h3 { + max-width: 100%; + } + + .process-card p { + margin-inline: 0; + } + + .process-step-label { + margin-left: 0.55rem; + } + + .process-cta { + display: grid; + align-items: stretch; + } + + .process-cta .button { + justify-content: center; + width: 100%; + } + + .migration-process-panel { + padding: 0; + } + + .migration-process-head { + display: grid; + gap: var(--space-3); + } + + .migration-process-head > span { + display: none; + } + + .migration-process-grid { + grid-template-columns: 1fr; + } + + .migration-step-badge { + width: 2.7rem; + height: 2.7rem; + } + + .migration-needs { + display: grid; + } + + .migration-needs ul { + display: grid; + } + + .record-stack article { + grid-template-columns: 1fr; + } + + .compare-table { + overflow-x: auto; + font-size: 0.68rem; + } + + .compare-table [role="row"] { + min-width: 20rem; + grid-template-columns: 1.05fr repeat(3, minmax(3.05rem, 0.7fr)); + } + + .compare-table span { + padding: 0.5rem 0.25rem; + overflow-wrap: anywhere; + } + + .comparison-head { + display: grid; + } + + .status-pill { + justify-self: start; + } + + .feature-panel-top { + display: grid; + } + + .feature-tabs button { + min-height: 0; + } + + .timeline::before { + left: 1.18rem; + } + + .timeline li { + gap: var(--space-3); + padding: var(--space-3); + } + + .timeline-step { + width: 2.35rem; + height: 2.35rem; + } + + .assessment-section { + width: calc(100% - (var(--page-gutter) * 2)); + padding: var(--space-4); + } + + .split-form-row { + grid-template-columns: 1fr; + } + + .assessment-copy h2 { + max-width: 10ch; + font-size: clamp(2.35rem, 13vw, 3.4rem); + } + + .direct-contact-card { + display: grid; + grid-template-columns: auto 1fr; + width: 100%; + } + + .direct-contact-card a { + grid-column: 1 / -1; + justify-content: center; + } + + .footer-main { + grid-template-columns: 1fr; + } + + .footer-bottom, + .footer-bottom > div { + align-items: flex-start; + } + + .footer-bottom { + flex-direction: column; + } + + .pricing-segmented { + border-radius: var(--radius-md); + } + + .pricing-segmented button { + padding-inline: 0.5rem; + font-size: 0.88rem; + } + + .plan-total { + font-size: clamp(2.6rem, 16vw, 4rem); + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } + + .motion-ready .reveal-item, + .motion-ready .hero-copy.reveal-item, + .motion-ready .architecture-panel.reveal-item { + opacity: 1; + transform: none; + } + + .status-strip i { + animation: none; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..00737b7 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,20 @@ +import type { Metadata } from "next"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "Business Email Hosting Corpus Christi | Bay Area Email Services", + description: + "Professional domain email hosting for Corpus Christi businesses. 25 GB mailboxes, Outlook and iPhone setup, SPF/DKIM/DMARC, migration, and local support.", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..671d6a5 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,240 @@ +"use client"; + +import { FormEvent, MouseEvent, useEffect, useState } from "react"; +import SiteHeader from "../components/SiteHeader"; +import HeroSection from "../components/HeroSection"; +import ProblemSection from "../components/ProblemSection"; +import ProcessSection from "../components/ProcessSection"; +import DeliverabilitySection from "../components/DeliverabilitySection"; +import ContinuitySection, { type ContinuityFeature, type FeatureKey } from "../components/ContinuitySection"; +import MigrationProcessSection from "../components/MigrationProcessSection"; +import PricingSection, { type Plan } from "../components/PricingSection"; +import FaqSection from "../components/FaqSection"; +import AssessmentSection from "../components/AssessmentSection"; +import SiteFooter from "../components/SiteFooter"; + + +type Theme = "dark" | "light"; +const pricingSummaries: Record = { + hosting: + "Core business email hosting with 25 GB mailboxes, custom domain email, and AWS-backed infrastructure.", + managed: + "Managed setup adds rollout planning, DNS validation, migration coordination, and device handoff checks during the assessment.", +}; + +const continuityFeatures: Record = { + buffering: { + title: "Inbound buffering", + copy: "Incoming mail can be buffered before mailbox delivery during maintenance or provider-side disruption.", + proof: [ + "Supports planned maintenance windows", + "Keeps delivery flow observable", + "Feeds mailbox delivery after processing", + ], + }, + sending: { + title: "Outbound sending", + copy: "Amazon SES gives outbound email an authenticated sending path with reputation tooling and clearer operational visibility.", + proof: [ + "Separates outbound sending from old shared hosting mail", + "Uses domain authentication as part of setup", + "Makes sending behavior easier to troubleshoot", + ], + }, + standby: { + title: "Standby failover", + copy: "A standby environment is part of the continuity plan when primary systems need intervention or provider-side work.", + proof: [ + "Keeps the fallback path visible", + "Reduces guesswork during incidents", + "Pairs with status checks and local support", + ], + }, + local: { + title: "Local management", + copy: "Domain records, migration, mailbox changes, device setup, and troubleshooting stay with a local Corpus Christi team.", + proof: [ + "One support path for DNS and devices", + "Migration scope is reviewed before work starts", + "Mailbox changes stay tied to the business context", + ], + }, +}; + +export default function Page() { + const [menuOpen, setMenuOpen] = useState(false); + const [theme, setTheme] = useState("dark"); + const [activeFeature, setActiveFeature] = useState("buffering"); + const [activePlan, setActivePlan] = useState("hosting"); + const [mailboxes, setMailboxes] = useState(25); + const [formErrors, setFormErrors] = useState({ name: "", email: "" }); + const [formStatus, setFormStatus] = useState(""); + const activeFeatureDetails = continuityFeatures[activeFeature]; + + useEffect(() => { + const storedTheme = window.localStorage.getItem("bes-theme"); + setTheme(storedTheme === "light" ? "light" : "dark"); + }, []); + + useEffect(() => { + document.documentElement.dataset.theme = theme; + window.localStorage.setItem("bes-theme", theme); + }, [theme]); + + useEffect(() => { + document.body.classList.toggle("menu-open", menuOpen); + return () => document.body.classList.remove("menu-open"); + }, [menuOpen]); + + useEffect(() => { + const scrollProgress = document.querySelector(".scroll-progress"); + if (!scrollProgress) { + return; + } + + let ticking = false; + const updateScrollProgress = () => { + const maxScroll = document.documentElement.scrollHeight - window.innerHeight; + const progress = maxScroll > 0 ? window.scrollY / maxScroll : 0; + scrollProgress.style.setProperty("--scroll-progress", Math.min(Math.max(progress, 0), 1).toFixed(4)); + ticking = false; + }; + const onScroll = () => { + if (ticking) { + return; + } + ticking = true; + requestAnimationFrame(updateScrollProgress); + }; + + updateScrollProgress(); + window.addEventListener("scroll", onScroll, { passive: true }); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + useEffect(() => { + const revealItems = [ + document.querySelector(".hero-copy"), + document.querySelector(".architecture-panel"), + ...document.querySelectorAll(".module-card"), + document.querySelector(".local-strip"), + ...document.querySelectorAll(".content-section > *"), + ].filter((item): item is Element => item instanceof Element); + + revealItems.forEach((item, index) => { + if (item instanceof HTMLElement) { + item.classList.add("reveal-item"); + item.style.setProperty("--reveal-delay", `${Math.min(index % 4, 3) * 85}ms`); + } + }); + + const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + if (prefersReducedMotion || !("IntersectionObserver" in window)) { + revealItems.forEach((item) => item instanceof HTMLElement && item.classList.add("is-revealed")); + return; + } + + document.body.classList.add("motion-ready"); + const revealObserver = new IntersectionObserver( + (entries, observer) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) { + return; + } + entry.target.classList.add("is-revealed"); + observer.unobserve(entry.target); + }); + }, + { + threshold: 0.18, + rootMargin: "0px 0px -8% 0px", + }, + ); + + revealItems.forEach((item) => revealObserver.observe(item)); + return () => { + revealObserver.disconnect(); + document.body.classList.remove("motion-ready"); + }; + }, []); + + const handleNavClick = (event: MouseEvent) => { + if (event.target instanceof HTMLAnchorElement) { + setMenuOpen(false); + } + }; + + const handleAssessmentSubmit = (event: FormEvent) => { + event.preventDefault(); + const form = event.currentTarget; + const formData = new FormData(form); + const name = String(formData.get("name") || "").trim(); + const email = String(formData.get("email") || "").trim(); + const nextErrors = { + name: name ? "" : "Please enter your name.", + email: "", + }; + + if (!email) { + nextErrors.email = "Please enter your business email."; + } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { + nextErrors.email = "Email address needs to include an @ symbol."; + } + + setFormErrors(nextErrors); + setFormStatus(""); + + if (nextErrors.name || nextErrors.email) { + window.requestAnimationFrame(() => { + document.getElementById(nextErrors.name ? "name" : "email")?.focus(); + }); + return; + } + + setFormStatus("Thanks. We'll review your mailbox count and current provider before we reply."); + form.reset(); + }; + + return ( + <> + Skip to content + + + setMenuOpen((isOpen) => !isOpen)} + onThemeToggle={() => setTheme((currentTheme) => (currentTheme === "light" ? "dark" : "light"))} + onNavClick={handleNavClick} + /> + +
+ + + + + + + + + +
+ + + + ); +} diff --git a/components/AssessmentSection.tsx b/components/AssessmentSection.tsx new file mode 100644 index 0000000..b09af7c --- /dev/null +++ b/components/AssessmentSection.tsx @@ -0,0 +1,114 @@ +import type { FormEventHandler } from "react"; + +type AssessmentSectionProps = { + formErrors: { name: string; email: string }; + formStatus: string; + onAssessmentSubmit: FormEventHandler; +}; + +export default function AssessmentSection({ formErrors, formStatus, onAssessmentSubmit }: AssessmentSectionProps) { + return ( +
+ +
+
+
+
+

Bay Area Email Services

+

Request an assessment

+
+ +
+ +
+
+ + +

{formErrors.name}

+
+
+ + +

{formErrors.email}

+
+
+
+ + +
+
+ + +
+
+
+ + +
+ +

{formStatus}

+
+
+ +
+

Start here

+

Let’s review your email setup.

+

+ Tell us about your domain, mailbox count, current provider, and support needs. We will reply with clear next steps for hosting, DNS, migration, and device setup. +

+ +
+
+ +
+ Quick response +

Most requests receive a reply within one business day.

+
+
+
+ +
+ Clear next steps +

We outline DNS, migration, mailbox, and device requirements before work starts.

+
+
+
+ +
+ +
+

Prefer to talk?

+ Local Corpus Christi support +
+ Call (361) 765-8400 +
+
+
+
+ ); +} diff --git a/components/ContinuitySection.tsx b/components/ContinuitySection.tsx new file mode 100644 index 0000000..31796ff --- /dev/null +++ b/components/ContinuitySection.tsx @@ -0,0 +1,95 @@ +export type FeatureKey = "buffering" | "sending" | "standby" | "local"; + +export type ContinuityFeature = { + title: string; + copy: string; + proof: string[]; +}; + +type ContinuitySectionProps = { + activeFeature: FeatureKey; + activeFeatureDetails: ContinuityFeature; + onFeatureChange: (feature: FeatureKey) => void; +}; + +export default function ContinuitySection({ activeFeature, activeFeatureDetails, onFeatureChange }: ContinuitySectionProps) { + return ( +
+
+

Continuity

+

Designed for continuity, explained in plain English.

+

+ The platform uses AWS services including Amazon S3 and Amazon SES, plus standby infrastructure and local management. +

+
+
+
+ + + + +
+ +
+
+ Selected capability + Operational +
+

{activeFeatureDetails.title}

+

+ {activeFeatureDetails.copy} +

+
    + {activeFeatureDetails.proof.map((proof) => ( +
  • {proof}
  • + ))} +
+
+
+
+ ); +} diff --git a/components/DeliverabilitySection.tsx b/components/DeliverabilitySection.tsx new file mode 100644 index 0000000..d46fa0a --- /dev/null +++ b/components/DeliverabilitySection.tsx @@ -0,0 +1,75 @@ +export default function DeliverabilitySection() { + return ( +
+
+ +
+
+

Deliverability foundation

+

Authenticate your domain before mail starts moving.

+
+

+ Receiving mail systems look for SPF, DKIM, and DMARC before they decide how much they trust your messages. + We configure and check those records before migration work begins. +

+
+ +
+
+ +
+

SPF

+

Defines which servers are allowed to send email for your domain.

+
+
+ +
+ +
+

DKIM

+

Adds a signed key to outgoing messages so receiving systems can verify they were not altered.

+
+
+ +
+ +
+

DMARC

+

Sets the policy for suspicious mail and gives you a clearer path for domain protection.

+
+
+
+
+
+ ); +} diff --git a/components/FaqSection.tsx b/components/FaqSection.tsx new file mode 100644 index 0000000..d0a306d --- /dev/null +++ b/components/FaqSection.tsx @@ -0,0 +1,32 @@ +export default function FaqSection() { + return ( +
+
+

Questions

+

Business email questions, answered directly.

+
+
+
+ What is a professional business email address? +

It is an email address on your domain, such as info@yourcompany.com or name@yourcompany.com, instead of a free Gmail or Yahoo address.

+
+
+ Why are my business emails going to spam? +

Common causes include missing or incorrect SPF, DKIM, and DMARC records, old provider reputation, shared sending systems, or inconsistent domain settings.

+
+
+ Can you migrate our existing email? +

Yes. The migration plan depends on your current provider, mailbox count, domain access, and preferred migration window.

+
+
+ Does this work with Outlook, iPhone, and iPad? +

Yes. Outlook, iPhone, iPad, web, and desktop access are part of the setup conversation.

+
+
+ Is this Microsoft 365 or Google Workspace? +

No. It is a managed business email hosting service for teams that want professional email, DNS correctness, migration help, and local support without buying a full office suite by default.

+
+
+
+ ); +} diff --git a/components/HeroSection.tsx b/components/HeroSection.tsx new file mode 100644 index 0000000..ecd961c --- /dev/null +++ b/components/HeroSection.tsx @@ -0,0 +1,187 @@ +export default function HeroSection() { + return ( +
+
+
+

Corpus Christi business email hosting

+

Business Email Hosting in Corpus Christi

+

+ Infrastructure and support from a local team that understands how business gets done. +

+ +
    +
  • + + AWS-built architecture +
  • +
  • + + Configured to improve deliverability +
  • +
  • + + Real people. Local support. +
  • +
+ + +
+ +
+

Mail flow designed for continuity

+ Mail flow diagram showing inbound email, Amazon S3 buffering, mailbox delivery, Amazon SES outbound sending, standby infrastructure, and operational system status. + +

+ Inbound messages are collected from the internet, remote mail servers, and other providers, buffered and processed through Amazon S3, delivered to mailboxes, sent outbound through Amazon SES, and supported by standby infrastructure. +

+
+
+ +
+
+
+

DNS authentication

+ +
+

We configure and validate the records that help protect your domain.

+
    +
  • SPF
  • +
  • DKIM
  • +
  • DMARC
  • +
+ Learn more about email security +
+ +
+ +

Local migration help

+
    +
  1. + 1 + Discover +

    We learn your setup, volume, and needs.

    +
  2. +
  3. + 2 + Plan +

    We design the migration and share the plan.

    +
  4. +
  5. + 3 + Migrate +

    We move mail, users, and settings.

    +
  6. +
  7. + 4 + Validate +

    We test, verify, and hand it over.

    +
  8. +
+ See the full migration checklist +
+ +
+ +

AWS-backed email

+

$5 / inbox / month

+

25 GB mailbox included.

+
    +
  • Business email on your domain
  • +
  • AWS-backed infrastructure
  • +
  • Web, mobile, and desktop access
  • +
  • Local support from real people
  • +
+ Book a 20-minute email assessment +
+ +
+

Compare Plans

+
+
+ Feature + BES Basic + BES Pro + Other Providers +
+
+ Business email +
+
+ Custom domain +
+
+ AWS infrastructureVaries +
+
+ Local supportVaries +
+
+ Transparent pricingVaries +
+
+ View full plan details +
+
+ +
+
+

Local Support. Real People.

+

Corpus Christi support for setup, migration, DNS, and day-to-day email questions.

+
+
    +
  • + + Corpus Christi team +
  • +
  • + + U.S.-based support +
  • +
  • + + Business-hour response +
  • +
  • + + Small business focused +
  • +
  • + + Bay Area IT family +
  • +
+
+
+ ); +} diff --git a/components/MigrationProcessSection.tsx b/components/MigrationProcessSection.tsx new file mode 100644 index 0000000..701598b --- /dev/null +++ b/components/MigrationProcessSection.tsx @@ -0,0 +1,51 @@ +export default function MigrationProcessSection() { + return ( +
+
+
+
+

Switching providers

+

Migration process

+
+ +

how we move your business email

+
+ + + +
    +
  1. +
    01
    +

    Assess

    +

    Domain, provider, mailbox count, aliases, forwards, and device needs are reviewed first.

    +
  2. +
  3. +
    02
    +

    Prepare DNS

    +

    MX, SPF, DKIM, DMARC, routing, aliases, and spam rules are staged before cutover.

    +
  4. +
  5. +
    03
    +

    Migrate mail

    +

    Existing mail is moved from Gmail, Yahoo, Microsoft 365, shared hosting, or legacy providers.

    +
  6. +
  7. +
    04
    +

    Set up devices

    +

    Outlook, iPhone, iPad, web access, and login details are verified before handoff.

    +
  8. +
+ +
+ What we need from you +
    +
  • Domain access
  • +
  • User and mailbox list
  • +
  • Current provider details
  • +
  • Preferred migration window
  • +
+
+
+
+ ); +} diff --git a/components/PricingSection.tsx b/components/PricingSection.tsx new file mode 100644 index 0000000..ded07e6 --- /dev/null +++ b/components/PricingSection.tsx @@ -0,0 +1,133 @@ +export type Plan = "hosting" | "managed"; + +type PricingSectionProps = { + activePlan: Plan; + mailboxes: number; + pricingSummaries: Record; + onPlanChange: (plan: Plan) => void; + onMailboxesChange: (mailboxes: number) => void; +}; + +export default function PricingSection({ activePlan, mailboxes, pricingSummaries, onPlanChange, onMailboxesChange }: PricingSectionProps) { + return ( +
+
+

Simple mailbox pricing

+

$5 per inbox per month, scoped before you switch.

+

+ Pick a mailbox count and plan focus. The base mailbox price is transparent; setup, migration, support scope, minimums, taxes, and add-ons are confirmed during the assessment. +

+
+ +
+
+
+ Plan focus +
+ + +
+
+ +
+ Mailbox count +
+ {[10, 25, 50].map((mailboxCount) => ( + + ))} +
+
+ +
+ Estimated base hosting +

${mailboxes * 5}/ month

+ Based on {mailboxes} inboxes at $5 each. +
+ +

+ {pricingSummaries[activePlan]} +

+ + Get a mailbox count quote +
+ +
+
+
+ What changes by scope +

Hosting first, managed help when the migration needs it.

+
+ Operational plan +
+ +
+
+ Feature + Hosting + Managed setup +
+
+ 25 GB mailbox + Included + Included +
+
+ Custom domain email + Included + Included +
+
+ SPF, DKIM, DMARC check + Configured + Configured + validated +
+
+ Migration from current provider + Scoped + Planned with handoff +
+
+ Outlook, iPhone, iPad setup + Guided + Checked before handoff +
+
+ Local support + Available + Priority during rollout +
+
+ +

+ No inbox placement guarantees, no zero-downtime promise. The assessment confirms DNS access, provider constraints, migration timing, and device needs before work starts. +

+
+
+
+ ); +} diff --git a/components/ProblemSection.tsx b/components/ProblemSection.tsx new file mode 100644 index 0000000..a9fdc1f --- /dev/null +++ b/components/ProblemSection.tsx @@ -0,0 +1,31 @@ +export default function ProblemSection() { + return ( +
+
+

Why it matters

+

Email problems rarely look technical at first.

+

+ They show up as missed leads, delayed approvals, confused customers, and a team that does not know who to call. +

+
+
+
+ Free addresses cost trust +

Gmail and Yahoo are fine for personal use. A business domain signals that your company is established.

+
+
+ DNS mistakes send mail to spam +

SPF, DKIM, and DMARC help receiving servers recognize legitimate mail from your domain.

+
+
+ Shared hosting mail breaks quietly +

Old hosting mailboxes often hide weak deliverability, limited storage, and unclear support paths.

+
+
+ Support queues slow the fix +

When email breaks, a local team can assess the domain, provider, device, and DNS together.

+
+
+
+ ); +} diff --git a/components/ProcessSection.tsx b/components/ProcessSection.tsx new file mode 100644 index 0000000..e9e8c80 --- /dev/null +++ b/components/ProcessSection.tsx @@ -0,0 +1,73 @@ +export default function ProcessSection() { + return ( +
+
+
+

Process

+

How your email move works.

+

+ A clear three-step path from assessment to working mailboxes, DNS records, and device setup. +

+
+ +
+
+ + + + +
+
+ Step 1 +
+

Assess the setup

+

+ We review your domain, mailbox count, current provider, DNS status, aliases, and device needs before anything changes. +

+
+
+ +
+ + + + +
+
+ Step 2 +
+

Configure the records

+

+ Mailboxes, MX routing, SPF, DKIM, DMARC, aliases, forwards, and sending paths are prepared and checked. +

+
+
+ +
+ + + + +
+
+ Step 3 +
+

Migrate and hand off

+

+ We move mail when needed, verify delivery, set up Outlook and mobile devices, and leave your team with a clear support path. +

+
+
+
+ +
+

Ready to review your current email setup?

+ + Request an assessment + + +
+
+
+ ); +} diff --git a/components/SiteFooter.tsx b/components/SiteFooter.tsx new file mode 100644 index 0000000..c46c235 --- /dev/null +++ b/components/SiteFooter.tsx @@ -0,0 +1,63 @@ +export default function SiteFooter() { + return ( + + ); +} diff --git a/components/SiteHeader.tsx b/components/SiteHeader.tsx new file mode 100644 index 0000000..80e4b3f --- /dev/null +++ b/components/SiteHeader.tsx @@ -0,0 +1,87 @@ +import type { MouseEventHandler } from "react"; + +type Theme = "dark" | "light"; + +type SiteHeaderProps = { + menuOpen: boolean; + theme: Theme; + onMenuToggle: () => void; + onThemeToggle: () => void; + onNavClick: MouseEventHandler; +}; + +export default function SiteHeader({ menuOpen, theme, onMenuToggle, onThemeToggle, onNavClick }: SiteHeaderProps) { + return ( +
+ + + + Bay Area + Email Services + + + + + + + + +
+ ); +} diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..830fb59 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..05291a8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,963 @@ +{ + "name": "bay-area-email-services-marketing", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bay-area-email-services-marketing", + "version": "1.0.0", + "dependencies": { + "next": "^15.3.3", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.15.24", + "@types/react": "^19.0.12", + "@types/react-dom": "^19.0.4", + "typescript": "^5.8.3" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz", + "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz", + "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz", + "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz", + "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz", + "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz", + "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz", + "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz", + "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz", + "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "15.5.18", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz", + "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.18", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.5.18", + "@next/swc-darwin-x64": "15.5.18", + "@next/swc-linux-arm64-gnu": "15.5.18", + "@next/swc-linux-arm64-musl": "15.5.18", + "@next/swc-linux-x64-gnu": "15.5.18", + "@next/swc-linux-x64-musl": "15.5.18", + "@next/swc-win32-arm64-msvc": "15.5.18", + "@next/swc-win32-x64-msvc": "15.5.18", + "sharp": "^0.34.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..663340d --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "bay-area-email-services-marketing", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "next": "^15.3.3", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.15.24", + "@types/react": "^19.0.12", + "@types/react-dom": "^19.0.4", + "typescript": "^5.8.3" + } +} diff --git a/public/assets/mail-flow-panel-light.png b/public/assets/mail-flow-panel-light.png new file mode 100644 index 0000000..546a21f Binary files /dev/null and b/public/assets/mail-flow-panel-light.png differ diff --git a/public/assets/mail-flow-panel.png b/public/assets/mail-flow-panel.png new file mode 100644 index 0000000..c6c492d Binary files /dev/null and b/public/assets/mail-flow-panel.png differ diff --git a/research-handover.yaml b/research-handover.yaml new file mode 100644 index 0000000..25acd4d --- /dev/null +++ b/research-handover.yaml @@ -0,0 +1,86 @@ +goal: > + Informationssammlung fuer eine lokale Marketing-/Landingpage fuer Bay Area Email Services, damit spaeter eine SEO-starke SaaS-/Service-Landingpage geplant werden kann. +current_phase: > + research +owner: > + swarm-researcher +context: + - "Produkt: Business email hosting fuer Corpus Christi / Coastal Bend mit 25 GB Mailboxen fuer $5 pro Inbox, AWS-basierter Infrastruktur, inbound buffering in Amazon S3, outbound via Amazon SES, hot standby/failover, DNS-Setup, Migration und laufendem lokalen Support." + - "Google SEO-Grundlage: Seiten sollten Suchmaschinen helfen, Inhalt und Seitenstruktur zu verstehen, aber vor allem Nutzern helfen, die richtige Entscheidung zu treffen; Ranking-Garantien sind nicht belastbar." + - "Local SEO-Grundlage: Google Business Profile sollte reale Business-Daten, passende Service Areas und klare Service-Beschreibungen nutzen; wer Kunden nicht am Standort empfaengt, muss Service-Area-Regeln sauber beachten." + - "FAQPage Rich Results werden laut Google ab 7. Mai 2026 nicht mehr in Google Search angezeigt; FAQs bleiben fuer Nutzer und Long-Tail-Intent sinnvoll, sollten aber nicht als Rich-Result-Hebel verkauft werden." + - "Amazon SES unterstuetzt DKIM, SPF und DMARC, Reputation-/Deliverability-Dashboards, Bounce-/Complaint-Monitoring und Email Receiving mit Speicherung in Amazon S3." + - "AWS empfiehlt fuer SES typischerweise DKIM und optional Custom MAIL FROM; Deliverability haengt weiter von Domain-Reputation, Empfaengerfiltern, Versandmustern und DNS-Korrektheit ab." +constraints: + - "Keine Implementierung in dieser Phase; nur Research und Handover." + - "Marketing-Claims muessen belegbar, qualifiziert und nicht irrefuehrend formuliert werden." + - "Preisclaim '$5 per inbox' sollte mit klaren Bedingungen erscheinen: Speicher, Abrechnung, Setup-/Migrationskosten, Supportumfang und etwaige Limits." + - "Keine absoluten Garantien wie 'no emails lost', 'always reaches the inbox', 'zero downtime' oder 'spam-proof', sofern keine SLA-/Monitoring-/Rechtsgrundlage vorliegt." +assumptions: + - "Die Zielkunden sind lokale kleine Unternehmen, die professionelle Domain-E-Mail ohne eigenes IT-Team wollen." + - "Bay Area Email Services darf AWS, Amazon S3 und Amazon SES namentlich nennen, ohne eine Partnerschaft oder Zertifizierung zu behaupten." + - "Der Service ist primaer ein lokaler Managed-Service, kann aber spaeter als SaaS-nahe Landingpage mit Self-Serve-Anteilen positioniert werden." + - "Telefon und Assessment-CTA aus dem bestehenden Kontext bleiben valide: (361) 765-8400 und kostenloses 20-Minuten-Assessment." +open_questions: + - "Gibt es eine belegbare Uptime-Historie oder ein formales SLA fuer Failover/Verfuegbarkeit?" + - "Sind Setup, Migration und DNS-Konfiguration im $5/InBox-Preis enthalten oder einmalige Leistungen?" + - "Welche Mailbox-Protokolle/Clients werden sicher unterstuetzt: IMAP, SMTP, webmail, Outlook, Apple Mail, iOS/Android?" + - "Gibt es lokale Testimonials, Review-Sterne, Case Studies oder konkrete Kundenlogos, die verwendet werden duerfen?" + - "Soll die Seite unter der bestehenden Bay Area IT Website laufen oder als eigenstaendige Produktdomain?" +requested_output: + - "Zielgruppen:" + - " - Lokale kleine Unternehmen in Corpus Christi / Coastal Bend, die noch Gmail/Yahoo oder Hosting-Mail nutzen." + - " - Kanzleien, Bau-/Handwerksbetriebe, Praxen, lokale Dienstleister und Shops, bei denen verpasste E-Mails direkte Umsatz-/Vertrauenskosten verursachen." + - " - Unternehmen mit 2-30 Mailboxen, die Outlook/iPhone-Setup, Migration und laufenden Support wichtiger finden als reine Software-Suite-Funktionen." + - " - Existing IT-helpdesk clients, die E-Mail als Teil eines betreuten IT-Betriebs auslagern wollen." + - "Kernbotschaften:" + - " - Professional email on your domain, managed locally in Corpus Christi." + - " - $5 per inbox with 25 GB storage, plus setup and support from a local IT team." + - " - Built for continuity: resilient AWS-backed mail flow, S3 inbound buffering, and standby failover." + - " - Better email foundation: DNS, SPF, DKIM, DMARC, migration and troubleshooting handled for you." + - " - Alternative zu ueberdimensionierten Suites: business email without paying for tools your team does not use." + - "Conversion-Abschnitte:" + - " - Hero: klares Angebot, lokaler Bezug, Preisanker, primaerer CTA 'Book a 20-minute email assessment' und sekundärer CTA 'See what is included'." + - " - Pain section: free Gmail looks unprofessional, missed messages, spam-folder delivery, DNS confusion, downtime, migration anxiety." + - " - Offer block: 25 GB mailbox, $5/inbox, forwards, auto-replies, spam filtering, DNS setup, migration, local support." + - " - Infrastructure explainer: simple visual flow inbound buffering -> mailbox delivery -> SES outbound -> standby/failover; nicht zu technisch im Above-the-fold." + - " - Local trust block: Corpus Christi / Coastal Bend service area, 30+ years IT experience, 30+ local businesses supported, phone number, response expectations." + - " - Migration block: what we need from you, timeline, downtime-minimization, old provider coverage." + - " - Pricing/FAQ: transparent recurring price, one-time setup/migration caveats, supported clients, DNS records, deliverability, support scope." + - " - Final CTA: assessment booking, call, or message form with low-friction copy." + - "Vertrauenssignale:" + - " - Real local phone number and service-area cities: Corpus Christi, Portland, Rockport, Aransas Pass, Kingsville." + - " - Specific infrastructure details: Amazon SES, Amazon S3 buffering, hot standby, DNS authentication." + - " - Operational proof: monitoring screenshots, status page, uptime history, migration checklist, before/after DNS audit examples." + - " - Social proof: permitted testimonials, review snippets, local client categories, years of experience." + - " - Security hygiene: SPF/DKIM/DMARC, spam filtering, password reset process, access support, incident response language." + - "CTA-Empfehlungen:" + - " - Primary: 'Book a 20-minute email assessment'." + - " - Secondary: 'Check my domain email setup' or 'Get a mailbox count estimate'." + - " - Phone CTA for local intent: 'Call (361) 765-8400'." + - " - Mid-page CTA after pain section: 'Find out why your emails go to spam'." + - " - Pricing CTA: 'Start with your first mailbox' only if onboarding can actually begin without custom scoping." + - "Risiken/Claims die sauber formuliert werden sollten:" + - " - Deliverability: use 'configured to improve deliverability' or 'helps reduce spam-folder risk', not 'guaranteed inbox placement'." + - " - Uptime/failover: use 'designed for continuity' and 'standby server can take over within minutes' only if monitored and tested; avoid 'zero downtime'." + - " - S3 buffering: use 'messages can be safely buffered during maintenance or outage windows' if technically exact; avoid 'no message is ever lost' unless the entire chain is guaranteed." + - " - Security: use 'email security hardening' and 'spam filtering configuration'; avoid 'hack-proof', 'fully secure', or unqualified compliance claims." + - " - AWS: say 'built on AWS services including Amazon S3 and Amazon SES'; avoid implying AWS partnership/certification unless documented." + - " - Local support: define support hours, SLA, emergency coverage and whether 24/7 applies." + - " - Pricing: disclose whether DNS setup, migration, mailbox backups, archiving, support, taxes or minimum mailbox count are included." +done_definition: + - "Research packet identifies audience, messages, sections, trust signals, CTAs and claim risks." + - "Next planning role can create a landing-page outline and SEO brief without repeating foundational research." + - "No production files or app implementation are created in this phase." +verification: + - "Created project folder: C:\\Users\\a931627\\Documents\\gitea\\bayarea\\E-Mail Webseite Marketing" + - "Checked swarm-research skill and handover contract." + - "Reviewed current public sources for Google SEO, Google Business Profile, FAQ structured data, Amazon SES and FTC ad substantiation." + - "Agent launch attempted but blocked by active thread limit; sequential research fallback used." +sources: + - "Google SEO Starter Guide: https://developers.google.com/search/docs/fundamentals/seo-starter-guide" + - "Google Business Profile Guidelines: https://support.google.com/business/answer/3038177" + - "Google FAQ structured data deprecation notice: https://developers.google.com/search/docs/appearance/structured-data/faqpage" + - "Amazon SES documentation overview: https://aws.amazon.com/documentation-overview/ses/" + - "AWS SES domain/deliverability guidance: https://aws.amazon.com/blogs/messaging-and-targeting/choosing-the-right-domain-for-optimal-deliverability-with-amazon-ses/" + - "FTC advertising substantiation principles: https://www.ftc.gov/business-guidance/resources/health-products-compliance-guidance" diff --git a/research/landingpage-best-practices-handover.yaml b/research/landingpage-best-practices-handover.yaml new file mode 100644 index 0000000..d366ceb --- /dev/null +++ b/research/landingpage-best-practices-handover.yaml @@ -0,0 +1,158 @@ +goal: > + Prepare a concise research handover for turning Bay Area Email Services into a separate + marketing/Product-Led landing page that can later support SaaS positioning. +current_phase: > + research +owner: > + swarm-researcher +context: + - The separate project folder already exists at C:/Users/a931627/Documents/gitea/bayarea/E-Mail Webseite Marketing. + - Existing project content positions the offer as local Corpus Christi business email setup/support plus a distinct Bay Area Email Services hosting offer. + - Current core offer from local materials: 25 GB business mailbox, $5 per inbox, domain email, DNS setup for MX/SPF/DKIM/DMARC, migration, spam filtering, aliases/forwards/auto-replies, Outlook/mobile setup, and local support. + - Infrastructure positioning from existing materials: AWS-based platform, inbound S3 buffering before delivery, outbound Amazon SES, hot standby failover, DNS/migration/day-to-day management handled locally. + - Google Workspace Business Starter is a relevant comparison anchor: custom business email, 30 GB pooled storage per user, listed at $7/user/month on annual billing in the checked US-facing page. + - Microsoft 365 Business Basic is a relevant comparison anchor: custom business email plus web/mobile Office apps, Teams, OneDrive, spam/malware filtering, listed at $6/user/month paid yearly on the checked US-facing page. + - AWS SES documentation supports claims around deliverability insights, configuration recommendations, and SPF/DKIM/DMARC support, but not a blanket guarantee that every message reaches inboxes. + - AWS S3 Standard documentation supports a factual durability/availability claim for objects stored in S3, but that should not be converted into an email-platform uptime guarantee unless the service has its own SLA. + - Google SEO guidance favors descriptive URLs, helpful reliable people-first content, and structured data where it accurately describes the page/business. +recommended_sections: + - id: hero + purpose: > + State the product-level promise before listing infrastructure. + content_direction: + - "Headline option: Business email that stays professional, deliverable, and locally supported." + - "Subcopy should combine domain email, DNS correctness, migration, and local Corpus Christi support." + - "Primary CTA: Get email set up / Book assessment. Secondary CTA: Compare plans or See how migration works." + decision_points: + - Decide whether "$5 per inbox" appears in the hero or in the pricing band; hero price is strong for product-led positioning, but may attract low-intent buyers if setup/support is the real margin. + - id: problem + purpose: > + Name the business pain in non-technical terms before introducing SPF/DKIM/DMARC. + content_direction: + - "Missed leads from spam-folder delivery." + - "Unprofessional free Gmail/Yahoo addresses." + - "Downtime or lockouts from old/shared hosting email." + - "No clear local support when email breaks." + - id: product_snapshot + purpose: > + Make the offer scannable as a product, not only a consulting service. + content_direction: + - "25 GB mailbox." + - "$5 per inbox." + - "Domain email addresses." + - "DNS authentication setup." + - "Migration and device setup." + - "Local support." + - id: benefits_map + purpose: > + Translate technical features into buyer outcomes. + content_direction: + - "SPF/DKIM/DMARC -> better authentication and lower spoofing/spam risk." + - "S3 inbound buffering -> continuity during maintenance or server issues." + - "Amazon SES outbound -> deliverability tooling and sender-authentication foundation." + - "Hot standby -> reduced downtime risk." + - "Local setup/support -> fewer self-service admin failures." + - id: how_it_works + purpose: > + Explain the architecture without making unsupported guarantees. + content_direction: + - "1. We verify your domain and DNS." + - "2. We create mailboxes, aliases, forwards, and spam rules." + - "3. We migrate existing mail and configure Outlook/iPhone/iPad." + - "4. We monitor and support day-to-day changes." + - "Optional visual: inbound email -> S3 buffer -> mailbox delivery; outbound email -> SES -> recipients." + - id: pricing + purpose: > + Present the offer as simple and transparent while leaving room for migration/setup fees. + content_direction: + - "Single anchor: $5 per inbox/month, 25 GB included." + - "Separate setup/migration/support line items if they are not included." + - "Use a comparison row against Google Workspace Starter and Microsoft 365 Business Basic only for fit, not as attack copy." + decision_points: + - Clarify whether $5 includes support, DNS setup, migration, backup/buffering, and device setup or whether those are onboarding/support add-ons. + - Clarify billing interval, minimum mailbox count, cancellation policy, and whether taxes/fees apply. + - id: comparison + purpose: > + Differentiate against Google Workspace, Microsoft 365, and shared hosting. + content_direction: + - "Google Workspace: best when a business wants the full Google productivity suite and AI/collaboration bundle." + - "Microsoft 365: best when a business wants Microsoft apps, Teams, OneDrive, and broader Office ecosystem." + - "Shared hosting email: often cheap, but weaker support, deliverability, admin control, and resilience story." + - "Bay Area Email Services: best when a small local business wants professional email, careful DNS/migration, resilient hosting, and local support without buying a full office suite." + - id: trust_security + purpose: > + Reduce perceived risk around email infrastructure. + content_direction: + - "30+ years IT experience." + - "30+ local businesses supported, if verifiable." + - "Plain-English DNS/security explanations." + - "Corpus Christi / Coastal Bend local support." + - "Use exact terms: SPF, DKIM, DMARC, spam filtering, authentication, failover, S3 buffering, SES." + decision_points: + - Avoid absolute claims like 'no emails lost' or 'guaranteed inbox placement' unless backed by SLA/logging/legal review. + - Decide whether to publish uptime history, SLA, data retention, backup, and incident-response language. + - id: migration_onboarding + purpose: > + Turn switching anxiety into a managed process. + content_direction: + - "What we need: domain access, user list, current provider details." + - "What happens next: discovery, DNS plan, mailbox creation, migration window, device setup, post-migration check." + - "Address downtime explicitly with realistic expectations." + - id: local_seo + purpose: > + Capture Corpus Christi and Coastal Bend demand while preserving product-led readability. + content_direction: + - "Primary URL idea: /business-email-hosting-corpus-christi or /business-email-services-corpus-christi." + - "Support pages/blogs: business email vs Google Workspace vs Microsoft 365; why business emails go to spam; SPF DKIM DMARC setup; email migration checklist; shared hosting email problems." + - "Use LocalBusiness/ProfessionalService structured data for the local company page and Product/Offer-style schema only where pricing/offer details are accurate." + - id: faq + purpose: > + Answer purchase-blocking questions and support SEO long-tail queries. + content_direction: + - "Is this Google Workspace or Microsoft 365?" + - "Can you migrate from Gmail/Yahoo/shared hosting?" + - "Will my emails stop going to spam?" + - "What does $5 per inbox include?" + - "Do you set up Outlook/iPhone/iPad?" + - "What happens if the mail server is down?" + - "Do you support aliases, forwards, shared inboxes, and auto-replies?" +constraints: + - Keep claims legally and technically defensible; use 'designed to', 'helps', 'reduces risk', and 'supports' where infrastructure docs do not prove end-to-end guarantees. + - The page must work both as a local service landing page now and as a SaaS/product landing page later. + - Do not position directly against Google Workspace/Microsoft 365 as universally better; position by fit and buyer need. + - Existing content has encoding artifacts in src/pages/ServicesPage.tsx, so future implementation should normalize copy/encoding before reuse. +assumptions: + - The product brand remains Bay Area Email Services unless a new SaaS brand/domain is chosen. + - The first target audience is small businesses in Corpus Christi/Coastal Bend, not national self-serve SaaS buyers. + - $5 per inbox is an ongoing mailbox price, while setup/migration/support terms still need clarification. + - The AWS/S3/SES architecture is already implemented or will be implemented as described in current materials. +open_questions: + - Is there a separate setup fee, migration fee, monthly support plan, or minimum mailbox count? + - What exact uptime/failover/SLA claims are allowed? + - What retention period applies to S3-buffered inbound messages? + - Are testimonials, case studies, Google reviews, or named customer logos available? + - Will the site use the existing Bay Area IT domain, a subdomain, or a standalone product domain? + - Should the product target only Corpus Christi/Coastal Bend or expand to broader US small businesses? +requested_output: + - A landingpage plan that converts the recommended_sections into wireframe-level content blocks. + - A pricing/packaging decision sheet clarifying what $5 includes and which services are add-ons. + - A claim-safety checklist for all infrastructure, deliverability, uptime, security, and migration claims. +done_definition: + - The next role can draft a landingpage without rediscovering product facts, competitor anchors, SEO direction, or unresolved decisions. + - Each major section has a clear purpose, content direction, and known decision points. + - Unsupported claims are flagged before implementation. +verification: + - Checked local project for existing email-service copy and product facts. + - Confirmed separate marketing folder exists and added this research handover under research/. + - Checked current public pages/docs for Google Workspace, Microsoft 365, Google Search Central, AWS SES, and AWS S3. + - Agent launch was attempted but blocked by the current collab thread limit; research was completed sequentially as fallback. +sources: + - "Existing brief: C:/Users/a931627/Documents/gitea/bayarea/E-Mail Webseite Marketing/PROJECT_BRIEF.md" + - "Existing repo content: C:/Users/a931627/Documents/gitea/bayarea/byarea/src/data/seoData.ts" + - "Existing repo content: C:/Users/a931627/Documents/gitea/bayarea/byarea/src/pages/ServicesPage.tsx" + - "Google Workspace Business pricing/features: https://workspace.google.com/intl/en_US/business/" + - "Microsoft 365 Business Basic pricing/features: https://www.microsoft.com/en-us/microsoft-365/business/microsoft-365-business-basic" + - "Google SEO Starter Guide: https://developers.google.com/search/docs/fundamentals/seo-starter-guide" + - "Google LocalBusiness structured data: https://developers.google.com/search/docs/appearance/structured-data/local-business" + - "Amazon SES documentation overview: https://aws.amazon.com/documentation-overview/ses/" + - "Amazon S3 data durability documentation: https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html" diff --git a/research/seo-local-research-handover.yaml b/research/seo-local-research-handover.yaml new file mode 100644 index 0000000..8484e5f --- /dev/null +++ b/research/seo-local-research-handover.yaml @@ -0,0 +1,215 @@ +goal: > + Informationssammlung fuer SEO und Local SEO einer separaten Marketing-Webseite/Landingpage + fuer Business Email Services in Corpus Christi und Coastal Bend. +current_phase: > + research +owner: > + swarm-researcher +context: + - Das Angebot kombiniert lokale Einrichtung und Support mit gehosteter Business-E-Mail: + Domain-Adressen, Outlook/iPhone/iPad Setup, SPF/DKIM/DMARC, Migration, Amazon SES + Deliverability, AWS-Redundanz, 25 GB Mailboxen fuer $5 pro Inbox. + - Google Local Ranking wird offiziell stark durch Relevance, Distance und Prominence + beeinflusst; Google Business Profile, vollstaendige Services, Bewertungen und lokale + Signale sind deshalb fuer diese Seite relevant. + - Google empfiehlt eindeutige, beschreibende Title-Tags, hilfreiche Inhalte fuer echte + Nutzer und strukturierte Daten dort, wo sie den Seiteninhalt korrekt beschreiben. + - FAQ Rich Results sind fuer die meisten nicht-behoerdlichen und nicht-gesundheitsbezogenen + Websites stark eingeschraenkt; FAQ-Inhalte bleiben trotzdem sinnvoll fuer Nutzer, + interne Struktur und AI/maschinenlesbares Verstaendnis. + - Lokale Wettbewerber in Corpus Christi/Coastal Bend positionieren sich meist breit + als Managed-IT-, Cybersecurity-, VoIP-, Netzwerk- oder Cloud-Anbieter statt mit einer + dedizierten Business-Email-Hosting-Landingpage. + - Beispiele fuer lokale Wettbewerber/Referenzen: Coltarus Halo, 1820 Services, Southern + Sky Technologies, ReNetworked, Corpus Christi IT Services, Copano IT, ITECH2 und + Tech-Net. Viele sprechen IT-Support breit an; klare Email-only-Positionierung und + transparente Inbox-Preise sind weniger sichtbar. + - AWS SES kann eingehende E-Mails per Receipt Rules unter anderem in Amazon S3 speichern; + Amazon SES Virtual Deliverability Manager adressiert Inbox Deliverability, Reputation + und Authentifizierungsprobleme wie fehlende SPF/DMARC/DKIM-Eintraege. +constraints: + - Separate Marketing-/SaaS-artige Seite soll eine Ebene ueber dem bestehenden Projekt + liegen: C:\Users\a931627\Documents\gitea\bayarea\E-Mail Webseite Marketing. + - Nicht ueberclaimen: Amazon SES, SPF, DKIM und DMARC als bessere technische Grundlage, + geringeres Spam-Risiko und staerkere Reputation formulieren, nicht als garantierte + Inbox-Platzierung. + - Corpus Christi sollte primaerer lokaler Fokus sein; Coastal Bend und Orte wie + Portland, Rockport, Aransas Pass und Kingsville sollten sekundaer und nicht als + duplizierte Doorway-Pages behandelt werden. + - Preisangabe "$5 pro Inbox" nur mit Abrechnungszeitraum und Leistungsumfang verwenden, + sobald das bestaetigt ist. +assumptions: + - Zielkunden sind kleine Unternehmen, Office Manager, lokale Dienstleister und Teams, + die von Gmail/Yahoo, Webhost-Mail oder schlecht betreutem Microsoft/Outlook-Setup + weg wollen. + - Lokale Naehe, schneller Support und technische E-Mail-Kompetenz sind staerkere + Differenzierer als ein generisches "Managed IT" Versprechen. + - Die Seite darf sichtbare Preise, lokale Trust Proofs und eine direkte Assessment-CTA + verwenden. + - Es gibt oder soll ein Google Business Profile geben, dessen Services und Bewertungen + auf diese E-Mail-Leistung ausgerichtet werden koennen. +open_questions: + - Soll die Marke "Bay Area Email Services", "Bay Area Business Email" oder ein neuer + SaaS-artiger Produktname werden? + - Ist "$5 pro Inbox" monatlich, jaehrlich, promotional oder an Mindestanzahl/Setup-Fee + gebunden? + - Sind Kalender/Kontakte/Groupware enthalten, oder ist das Produkt primaer IMAP/SMTP + Mailbox plus Outlook/mobile Einrichtung? + - Welche SLA-, Uptime-, Backup-, Retention- und Failover-Aussagen sind technisch und + rechtlich sicher belegbar? + - Soll die Seite nur lokal verkaufen oder spaeter national skalierbar als SaaS-Landingpage + funktionieren? +requested_output: + - Landingpage-Plan mit einer kanonischen Hauptseite fuer Corpus Christi plus spaeteren + Support-/Vergleichsseiten fuer Migration, SPF/DKIM/DMARC und Outlook/iPhone Setup. + - SEO-Brief fuer Copy, Informationsarchitektur, FAQ, Schema und Google Business Profile. +done_definition: + - Die naechste Rolle kann daraus direkt Seitenstruktur, Copy oder Frontend-Prototyp + erstellen, ohne die SEO-Grundlagen erneut zu recherchieren. + - Die Seite adressiert lokale transaktionale Suchintention, erklaert das Produkt klar, + differenziert sich gegen generische Managed-IT-Seiten und erzeugt Assessment- oder + Quote-Anfragen. +keyword_clusters: + primary_local_transactional: + - business email services Corpus Christi + - business email hosting Corpus Christi + - professional business email Corpus Christi + - small business email setup Corpus Christi + - business email provider Corpus Christi + - custom domain email Corpus Christi + coastal_bend_modifiers: + - business email Coastal Bend + - business email hosting Coastal Bend + - IT support email setup Coastal Bend + - business email Portland TX + - business email Rockport TX + - business email Aransas Pass TX + - business email Kingsville TX + setup_support_intent: + - Outlook email setup Corpus Christi + - Outlook setup for business email + - iPhone business email setup + - iPad email setup for business + - email migration services Corpus Christi + - migrate business email from Gmail + - migrate business email from Yahoo + - move from web hosting email + deliverability_security_intent: + - SPF DKIM DMARC setup Corpus Christi + - why business emails go to spam + - email DNS setup for business + - DMARC setup for small business + - business email deliverability help + - domain email authentication setup + comparison_intent: + - Gmail vs business email + - web hosting email vs business email hosting + - Microsoft 365 vs local email hosting + - best email hosting for small business Corpus Christi + - affordable business email hosting + pricing_intent: + - $5 business email inbox + - affordable business email Corpus Christi + - 25 GB business email mailbox + - low cost business email hosting +recommended_page_structure: + - Hero: "Business Email Hosting in Corpus Christi" mit Preis, 25 GB Mailbox, lokalem + Support und primaerer CTA. + - Problem: kostenlose Gmail/Yahoo-Adressen, Webhost-Mail-Ausfaelle, Spam-Folder, + verpasste Leads und Vertrauensverlust. + - Product: Domain-Mailboxen, info@/contact@/user@, Outlook, iPhone, iPad, Aliases, + Forwards, Auto-Replies und Custom Spam Filtering. + - Deliverability: SPF, DKIM, DMARC, DNS-Konfiguration, Amazon SES, Reputation und + plain-English Erklaerung. + - Reliability: AWS-Redundanz, S3-Inbound-Buffering, Hot Standby/Failover und + Wartungs-/Ausfallpositionierung nur soweit belegbar. + - Migration: Wechsel von Gmail, Yahoo, Webhost-Mail oder altem Provider mit minimaler + Unterbrechung. + - Local Support: Corpus Christi/Coastal Bend, lokale Telefonnummer, Onboarding, + Passwort-Resets, neue Nutzer, laufende Hilfe. + - Pricing: klarer per-inbox Preis, was enthalten ist, was optional/extra ist. + - FAQ: echte Kauf- und Setup-Fragen statt Keyword-Stuffing. + - CTA: "Book a 20-minute email setup assessment" und "Get a mailbox count quote". +title_meta_ideas: + - title: "Business Email Services Corpus Christi | $5/Inbox Local Support" + meta: "Professional domain email hosting for Corpus Christi businesses. 25 GB mailboxes, Outlook and iPhone setup, SPF/DKIM/DMARC, migration, and local support." + - title: "Business Email Hosting in Corpus Christi | Bay Area Email Services" + meta: "Affordable business email hosting with 25 GB mailboxes, Amazon SES deliverability, AWS redundancy, DNS setup, migration, and Coastal Bend IT support." + - title: "Professional Email Setup Corpus Christi | Outlook, SPF, DKIM, DMARC" + meta: "Upgrade from Gmail, Yahoo, or web-host email. We set up domain email, Outlook, iPhone, iPad, DNS records, spam protection, and email migration." +faq_targets: + - question: "What is a professional business email address?" + intent: "Domain-based email versus free Gmail/Yahoo erklaeren." + - question: "Why are my business emails going to spam?" + intent: "SPF/DKIM/DMARC und DNS-Fehlkonfiguration verstaendlich erklaeren." + - question: "Can you migrate my old email?" + intent: "Migration von Gmail/Yahoo/Webhost/Altanbieter abfangen." + - question: "Does this work with Outlook, iPhone, and iPad?" + intent: "Client- und Device-Setup-Bedenken beantworten." + - question: "How much does business email cost?" + intent: "$5/inbox und 25 GB Mailbox transparent machen." + - question: "Is this Microsoft 365?" + intent: "Positionierung gegenueber Microsoft 365 klaeren, ohne Kaeufer zu verwirren." + - question: "Do you support businesses outside Corpus Christi?" + intent: "Coastal-Bend-Servicegebiet natuerlich einbinden." + - question: "What do SPF, DKIM, and DMARC do?" + intent: "Technische Autoritaet und Vertrauen aufbauen." +content_gap_opportunities: + - Dedizierte Email-only-Landingpage statt Email als Unterpunkt in Managed IT. + - Sichtbarer per-inbox Preis; viele lokale IT-Anbieter erzwingen erst Kontaktaufnahme. + - Plain-English-Seite zu SPF/DKIM/DMARC mit Bezug auf verpasste Leads und Spam-Folder. + - Vergleichscontent: Gmail/Yahoo vs Domain Email, Webhost Email vs Managed Business + Email, Microsoft 365 vs lokal betreutes Email Hosting. + - Lokaler Proof: 30+ Jahre IT-Erfahrung, 30+ lokale Unternehmen, konkrete Orte, + Branchen, Testimonials, Response-Zeiten. + - Technischer Trust ohne Ueberladung: SES, AWS-Redundanz, S3-Buffering, Failover und + 25 GB Mailboxes als Business-Vorteile statt Infrastruktur-Deep-Dive. + - Setup-Workflow: Domain-Zugang, Mailboxliste, Migrationsfenster, Device Setup, + DNS-Verifikation, Go-live-Checkliste. +concrete_seo_recommendations: + - Eine kanonische Landing-URL nutzen, z.B. /business-email-corpus-christi/ oder + /email-services-corpus-christi/. + - H1 mit Service und Ort: "Business Email Hosting in Corpus Christi". + - Above the fold: Preis, Mailboxgroesse, lokale Hilfe und Domain-Email-Versprechen + sichtbar machen. + - LocalBusiness oder ProfessionalService Schema mit Name, URL, Telefon, Service Area, + Adresse/Area Served, Opening Hours, sameAs und angebotenen Services verwenden. + - Service Schema fuer Business Email Services/Email Hosting ergaenzen, wenn die Seite + den Service klar beschreibt. + - FAQPage Schema nur als semantische Hilfe einbauen; nicht als Traffic-Hebel fuer + Google FAQ-Dropdowns verkaufen. + - GBP Services abstimmen: Business Email Services, Email Hosting, Email Migration, + Microsoft Outlook Setup, IT Support, SPF/DKIM/DMARC Setup. + - Kundenbewertungen gezielt, aber natuerlich einsammeln; Wuensche: "business email", + "Outlook setup", "email migration", "Corpus Christi", "local support". + - Keine duplizierten Ortseiten fuer jede Stadt erstellen, solange kein einzigartiger + lokaler Inhalt/Proof vorhanden ist; lieber ein starkes Service-Area-Modul. + - Spaetere Content-Seiten priorisieren: "Why business emails go to spam", "SPF DKIM + DMARC setup for small businesses", "Business email migration checklist", "Outlook + and iPhone business email setup". +verification: + - Swarm-research Skill und Handover-Contract gelesen. + - Vorhandener Zielordner geprueft: C:\Users\a931627\Documents\gitea\bayarea\E-Mail Webseite Marketing. + - Ein Subagent fuer Keyword/Local-Intent-Research wurde erfolgreich gestartet und + ausgewertet; weitere Agent-Spawns waren durch Thread-Limit blockiert. + - Web-Recherche mit aktuellen Quellen zu Google Local SEO, Google Title/Content/FAQ + Guidance, AWS SES, Amazon S3 Receiving und lokalen Corpus-Christi-Wettbewerbern + durchgefuehrt. + - Handover-Datei wurde erstellt. +sources: + - "Google Business Profile local ranking: https://support.google.com/business/answer/7091/improve-your-local-ranking-on-google" + - "Google LocalBusiness structured data: https://developers.google.com/search/docs/appearance/structured-data/local-business" + - "Google title link guidance: https://developers.google.com/search/docs/appearance/title-link" + - "Google helpful content guidance: https://developers.google.com/search/docs/fundamentals/creating-helpful-content" + - "Google FAQ/HowTo rich result changes: https://developers.google.com/search/blog/2023/08/howto-faq-changes" + - "Amazon SES S3 receiving action: https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-s3.html" + - "Amazon SES Virtual Deliverability Manager: https://docs.aws.amazon.com/ses/latest/dg/vdm.html" + - "Amazon SES email receiving: https://docs.aws.amazon.com/ses/latest/dg/receiving-email.html" + - "Coltarus Halo competitor reference: https://www.coltarushalo.com/" + - "1820 Services competitor reference: https://1820services.com/" + - "Southern Sky Technologies competitor reference: https://getsouthern.com/" + - "ReNetworked competitor reference: https://www.renetworked.com/" + - "Corpus Christi IT Services competitor reference: https://ccitservices.net/" + - "Copano IT competitor reference: https://www.copanoit.com/contact/" + - "ITECH2 Corpus Christi competitor reference: https://itech2.net/city/corpus-christi/" + - "Tech-Net competitor reference: https://www.tech-net.com/" diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4b674cf --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}