Commit Graph

34 Commits

Author SHA1 Message Date
null aab0104b01 ui: no em dashes in anything a visitor or a crawler reads
Null's direction of 2026-09-10. Punctuation only: not one word changed.

Nine of them, and the share-image alt text was on every page twice:

  src/components/SEO.jsx:4        the default og:image and twitter:image alt
  index.html:25,:31               the same string, as template fallbacks
  src/pages/Home.jsx:257,:290
  src/pages/Services.jsx:99
  src/pages/Contact.jsx:183
  src/data/services.js:120        the wireless card on Home and the index
  public/site.webmanifest:4       linked from every page

Thirteen more sit in code comments and reach no page, so they stay. The hours
range on /contact uses en dashes, which are a different character and are not
what was asked about.

This lands before the guards that reject an em dash in content or in built
HTML, because until now every built page carried one and those guards would
have gone red on arrival.

Verified against the build, not the source: no U+2014 in any file under dist/,
including the HTML, the webmanifest, the sitemap and the JS bundle.

Closes #222.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 04:26:21 -05:00
null ac6f5d1f78 feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3)
Client directive (Levi Halford, 2026-08-01) ahead of Google/Meta lead forms.

Privacy policy:
- Publish approved policy verbatim at /privacy-policy (src/data/privacyPolicy.js
  is the single source of truth; 292/292 source lines verified present)
- Privacy Policy link in the footer of every page
- Effective/Last Updated 2026-07-31, privacy@queuenorth.com as mailto

Remove St. Petersburg street address from every surface named in the brief:
footer, contact page, schema markup, SEO metadata, Google Maps links. Collapse
ProfessionalService + Organization schema into a single Organization with
areaServed: United States; drop geo coordinates, priceRange, openingHours.
Add the approved US-coverage sentence to About. No replacement address.

Crawler visibility (the site previously served 0 bytes of body HTML without JS):
- Prerender all 19 routes at build time via src/entry-server.jsx + scripts/prerender.js
- Hoist title/meta/canonical/JSON-LD into <head>; renderToString does not do this
  and react-helmet-async's context is empty under React 19
- Serve prerendered HTML; return a real 404 for unknown paths instead of 200
- Hydrate instead of discarding the prerendered markup

SEO/perf:
- Titles <=60 and descriptions <=160 chars across all pages
- Add BreadcrumbList to interior pages, WebSite to home
- Generate sitemap.xml from the route list with git-derived lastmod
- 301 duplicate URL forms (trailing slash, //, /index.html), preserving query
- Immutable caching for content-hashed assets; no-cache for HTML
- Split the 522 KB bundle into app/react-vendor/router/icons
- loading/decoding/fetchpriority + per-route hero preload; drop unused asset

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 01:45:52 -05:00
null 05b27d216a feat: Dockerfile/docker-compose updates, server improvements, contact form with recaptcha, API integration (batch 0.9.0) 2026-06-14 15:37:26 -05:00
null 0f272fcf19 error and injection 2026-05-28 00:18:08 -05:00
null 033bdf6625 Form now POSTs to Zoho 2026-05-27 20:57:55 -05:00
null 8f20670292 breadcrumbs 2026-05-27 14:27:30 -05:00
null 6bab4b5c89 corrections 2026-05-27 14:10:28 -05:00
null a2a32687ff branding 2026-05-26 13:29:37 -05:00
null d626c34ba2 parternership branding 2026-05-26 12:22:11 -05:00
null afec6547c1 RECAPTCHA 2026-05-25 20:20:15 -05:00
null 09926fed6d Contact.jsx (line 23): added ZIP to validation/error state, rendered it as required, and shows ZIP code is required.
server/index.js (line 253): backend Zod schema now rejects missing or blank ZIP.
api.js (line 3): preserves backend field errors for display.
2026-05-25 18:17:16 -05:00
null 5f5c085fbe contact update 2026-05-25 17:56:32 -05:00
null f378233328 fix: seo 2026-05-18 13:55:06 -05:00
null de61d5e625 fix(ui): UI fixes across header, contact, home, about, support, services, industries (#132 #133 #134 #154 #165 #172 #173) 2026-05-18 13:12:18 -05:00
null 928527b908 fix: remove all email addresses from site, redesign contact page, update footer, about, header, support (#165 #172 #134 #173) 2026-05-18 12:11:56 -05:00
null d8a975431f fix(ui): dropdown hover gap fix (#132) and remove contact form button (#133) 2026-05-18 09:35:29 -05:00
null e1604ee28f fix: add aria-labels for accessibility, fix JSX template literal syntax (#101) (batch 10.2) 2026-05-17 22:47:03 -05:00
null 9c1b6e4753 fix: optimize images to WebP (95% reduction), add form loading spinners (#97 #130) (batch 10.1) 2026-05-17 22:35:55 -05:00
null 2c002c2f82 fix: remove React Query, add HTTPS redirect, document CSP Zoho note (#128 #127 #129) (batch 10.0) 2026-05-17 22:33:11 -05:00
null 6e975b869b fix: favicon/manifest, og:image PNG, logo optimized to 44KB PNG (#99 #117 #118) (batch 9.7) 2026-05-17 22:01:27 -05:00
null 53e2873fd4 fix: honeypot spam protection, 409 conflict handling (#119 #126) (batch 9.5) 2026-05-17 21:51:53 -05:00
null 8adb9cdb76 fix: desktop dropdown nav, Button→Link, Contact scroll-to-form (#109 #102 #105) (batch 9.3) 2026-05-17 21:44:48 -05:00
null 4fe31ed9b6 fix: correct contact info and remove unverified location claims (batch 8.9)
- Phone: (906) 482-6616 → (321) 730-8020 direct, (888) 656-2850 toll-free
- Add toll-free number to Footer and Contact page
- Add LinkedIn link to footer
- Add 8x8 trademark disclaimer to footer legal section
- Fix JSON-LD phone numbers in Home.jsx
- Add support phone to Support page
- Strip all Houghton, MI and Upper Peninsula location references
  from meta tags, JSON-LD, and fallback descriptions
  (not present on original site, unverified)
- Change JSON-LD areaServed from Houghton/UP to United States
- Update Support.jsx Zoho Desk link placeholder
2026-05-17 20:44:18 -05:00
null 1b0d5adc36 feat(seo): add react-helmet-async, per-page meta/OG tags, JSON-LD, sitemap, robots.txt, heading fixes (#71)
- Added react-helmet-async + HelmetProvider to main.jsx
- Per-page Helmet components on all 8 pages (title, description, OG tags)
- JSON-LD structured data (Organization, LocalBusiness, Service)
- Created public/sitemap.xml with all 17 routes
- Created public/robots.txt
- Fixed heading hierarchy (no h1->h3 skips)
- Improved image alt text throughout
- Fixed docs/zoho-setup.md env defaults clarification
2026-05-17 20:03:42 -05:00
null 1437b2af07 fix: 10 bug fixes from code review (batch 0.6.5)
- #63: Fix industry.href undefined → use industry.id for navigation
- #50: Fix sanitized scope error in catch block (let before try)
- #58: Footer.jsx: convert all internal <a href> to <Link to>
- #61: Textarea.jsx: fix className interpolation (quotes → backticks)
- #59: About.jsx: convert CTA <a href> to <Link to>
- #60: Support.jsx: convert Contact button <a href> to <Link to>
- #62: Badge.jsx: text-foreground → text-text
- #64: Support.jsx: hover:bg-navy-darker → hover:bg-primary-navy-dark
- #65: Server: move timeoutMiddleware before catch-all routes
- #66: Contact.jsx: convert self-referencing <a href> to <Link to>
2026-05-17 18:03:55 -05:00
null 9cdc299ade fix: undefined Tailwind classes, SPA navigation, phone/email links (closes #51, #52)
- Replace all undefined shadcn/ui Tailwind classes with correct config values
  (text-muted-foreground→text-muted, text-card-foreground→text-text,
   bg-secondary→bg-section-alt, ring-ring→ring-primary-navy, etc.)
- Replace text-cyan/bg-cyan with text-primary-cyan/bg-primary-cyan
- Convert all internal <a href> to React Router <Link to> for SPA navigation
- Remove self-referencing /contact button on Contact page
- Add tel: links for phone numbers, mailto: links for emails in
  Contact.jsx and Support.jsx hero badges and info sections
- Fix Header.jsx mobile menu button hover:text-cyan→hover:text-primary-cyan (batch 0.6.3)
2026-05-17 17:42:03 -05:00
null b5170caf9d refactor: full-bleed section backgrounds with centered content (closes #48) 2026-05-17 17:11:29 -05:00
null 56bdf07216 fix: close issues #12 #15 #17 #18 — CSP nonce, API retry, input debounce, caching verified (batch 0.6.1) 2026-05-17 16:10:10 -05:00
null e11aefd184 fix: audit issues #10 #14 #16 #19 — CORS errors, JSON middleware, Zoho fields, noValidate (batch 0.6.8) 2026-05-17 15:46:59 -05:00
null 71c8129046 feat(ui): footer + contact improvements, CTAs everywhere, gitignore update (batch 0.5.6)
- Footer: email, phone, Request Consultation CTA
- Home: CTA links added to Trust Signals, Services, Why Queue North
- Contact: hero CTA, prominent phone/email
- Support page updates
- Version bumped to 0.5.3
- FUTURE.md and HISTORY.md now tracked in git
- .gitignore updated to allow FUTURE.md and HISTORY.md
2026-05-17 15:07:28 -05:00
null 851759ae5e fix: P0 owner feedback — contact info, phone, support redirect (#25, #26, #27)
- Remove fake info@queuenorth.com, replace with contact form callout (fixes #25)
- Add phone (906) 482-6616 to Contact, Support, and Footer (fixes #26)
- Add Zoho support center link to Support page (fixes #27)
2026-05-17 14:35:29 -05:00
null c4985e37bc feat: Phase 5 SPA fixes, mobile menu, assets, and redesign planning
- Fix BrowserRouter → RouterProvider (routes were disconnected)
- Strip TS generics from .jsx files (Card, Badge, Dialog, Input, Textarea)
- Fix useToast import from sonner (Contact, Support)
- Merge mobile Sheet into Header (DialogTrigger outside Dialog)
- Add SPA catch-all route for client-side navigation
- Add CSP style-src for Google Fonts
- Copy all image assets to public/ (were 404)
- Replace placeholder logo with real Queue North logo
- Fix SheetContent positional CSS + install tailwindcss-animate
- Add visually hidden SheetTitle for accessibility
- Update README and FUTURE.md with Phase 5 redesign batches
- Add review.md (redesign assessment, exempt from git)
2026-05-13 22:07:35 -05:00
null 931c9a9095 feat: client-side form validation + Sonner feedback (v0.4.4) 2026-05-13 18:10:04 -05:00
null b7f7765a72 feat: complete phase 1 foundation 2026-05-12 01:04:17 -05:00