Commit Graph

18 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 196389ddf3 fix(brand): update veteran-owned badge to certified mark logo (batch 0.9.2) 2026-06-14 16:17:42 -05:00
null d074e597b2 feat(zoho): WebToLead forwarding mode, veteran-owned certified badge, Docker/env/CI updates (batch 0.9.1) 2026-06-14 16:08:29 -05:00
null a3ba03b7e1 cisco about 2026-05-27 21:15:54 -05:00
null f9b36c198b badges size 2026-05-27 13:58:31 -05:00
null d626c34ba2 parternership branding 2026-05-26 12:22:11 -05:00
null 52d9a16462 branch footer 2026-05-25 18:35:40 -05:00
null 529cce7ec0 branding 2026-05-25 18:11:51 -05:00
null a79f42123a fix: seo fb 2026-05-18 14:02:12 -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 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 5c17019931 fix: remove unused assets (24MB), Dialog component, CardDescription dup, zustand dep (#95 #113 #114 #115 #116) (batch 9.9) 2026-05-17 22:08:21 -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 6ca8585f89 fix: rename asset files to kebab-case (batch 8.4, issue #81) 2026-05-17 20:49:11 -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 f1823bcc4b fix: rename asset files to remove spaces (closes #67) 2026-05-17 18:08:25 -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