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>
This commit is contained in:
null 2026-09-10 04:26:21 -05:00
parent 26136f4e5c
commit aab0104b01
7 changed files with 9 additions and 9 deletions

View File

@ -22,13 +22,13 @@
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Queue North Technologies Business Communications & IT Partner" />
<meta property="og:image:alt" content="Queue North Technologies: Business Communications & IT Partner" />
<!-- Twitter / X Card fallback -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Queue North Technologies | Business Communications & IT Partner" />
<meta name="twitter:description" content="Veteran-owned 8x8 Certified Partner. Business phone, UCaaS, contact center, IT support, and networking solutions." />
<meta name="twitter:image" content="https://queuenorth.com/assets/og-image.png" />
<meta name="twitter:image:alt" content="Queue North Technologies Business Communications & IT Partner" />
<meta name="twitter:image:alt" content="Queue North Technologies: Business Communications & IT Partner" />
<!-- The prerenderer injects a per-route <link rel="preload"> for that page's
hero image here (scripts/prerender.js). -->
<link rel="preconnect" href="https://fonts.googleapis.com">

View File

@ -1,7 +1,7 @@
{
"name": "Queue North Technologies",
"short_name": "Queue North",
"description": "Veteran-owned 8x8 Certified Partner business phone, UCaaS, contact center, IT support, and networking solutions.",
"description": "Veteran-owned 8x8 Certified Partner: business phone, UCaaS, contact center, IT support, and networking solutions.",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",

View File

@ -1,7 +1,7 @@
import { Helmet } from 'react-helmet-async'
const DEFAULT_IMAGE = 'https://queuenorth.com/assets/og-image.png'
const DEFAULT_IMAGE_ALT = 'Queue North Technologies Business Communications & IT Partner'
const DEFAULT_IMAGE_ALT = 'Queue North Technologies: Business Communications & IT Partner'
const SITE_NAME = 'Queue North Technologies'
const SEO = ({ title, description, url, type = 'website', image = DEFAULT_IMAGE, jsonLd, noindex = false }) => {

View File

@ -117,7 +117,7 @@ We support Cisco Webex Contact Center, 8x8 Contact Center, and other leading pla
id: 'wireless-access',
name: 'Wireless Access',
shortDesc: 'Enterprise-grade Wi-Fi solutions for reliable mobile connectivity',
homeDesc: 'Wi-Fi that just works everywhere in your building. No dead zones, no complaints.',
homeDesc: 'Wi-Fi that just works, everywhere in your building. No dead zones, no complaints.',
fullDesc: 'Business Wi-Fi designed for usable coverage, dependable performance, and fewer support headaches across your environment.',
icon: 'wifi',
image: '/assets/wireless.webp',

View File

@ -180,7 +180,7 @@ const Contact = () => {
'Cisco Certified Partner',
<div key="veteran"><span className="font-numeric">25+</span> years of experience</div>,
'SMB to Enterprise solutions',
'No vendor bias we recommend what fits',
'No vendor bias: we recommend what fits',
]
return (

View File

@ -254,7 +254,7 @@ const Home = () => {
</div>
<h3 className="text-lg font-semibold text-primary-navy mb-2">Responsiveness</h3>
<p className="text-sm text-soft-text">
When you call, a human answers not a ticket queue, not a chatbot. Real support from people who know your system.
When you call, a human answers: not a ticket queue, not a chatbot. Real support from people who know your system.
</p>
</CardContent>
</Card>
@ -287,7 +287,7 @@ const Home = () => {
</div>
<h3 className="text-lg font-semibold text-primary-navy mb-2">Vendor Neutrality</h3>
<p className="text-sm text-soft-text">
As an 8x8 and Cisco Certified Partner, we recommend what works best for you not what pays the highest commission. We've tested the alternatives so you don't have to.
As an 8x8 and Cisco Certified Partner, we recommend what works best for you, not what pays the highest commission. We've tested the alternatives so you don't have to.
</p>
</CardContent>
</Card>

View File

@ -96,7 +96,7 @@ const Services = () => {
Everything your business communications needs.
</h1>
<p className="text-lg md:text-xl text-white/75 max-w-2xl leading-relaxed mb-8">
From phone systems to full network infrastructure designed, deployed, and supported by one accountable team.
From phone systems to full network infrastructure: designed, deployed, and supported by one accountable team.
</p>
<div className="flex flex-col sm:flex-row gap-3">
<Link