2026-05-17 18:03:55 -05:00
|
|
|
import { Link } from 'react-router-dom'
|
|
|
|
|
|
2026-05-12 01:04:17 -05:00
|
|
|
const Footer = () => {
|
|
|
|
|
const currentYear = new Date().getFullYear()
|
|
|
|
|
|
2026-05-12 02:39:35 -05:00
|
|
|
const companyInfo = {
|
2026-05-25 19:44:10 -05:00
|
|
|
name: 'Queue North Technologies',
|
2026-05-12 02:39:35 -05:00
|
|
|
tagline: 'Modern communications infrastructure without the vendor noise.',
|
2026-05-17 20:44:18 -05:00
|
|
|
phone: '(321) 730-8020',
|
|
|
|
|
tollFree: '(888) 656-2850',
|
2026-05-12 02:39:35 -05:00
|
|
|
}
|
|
|
|
|
|
2026-05-12 01:04:17 -05:00
|
|
|
const quickLinks = [
|
|
|
|
|
{ name: 'Home', href: '/' },
|
|
|
|
|
{ name: 'Services', href: '/services' },
|
|
|
|
|
{ name: 'Industries', href: '/industries' },
|
|
|
|
|
{ name: 'About', href: '/about' },
|
|
|
|
|
{ name: 'Contact', href: '/contact' },
|
|
|
|
|
{ name: 'Support', href: '/support' },
|
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
|
|
|
{ name: 'Privacy Policy', href: '/privacy-policy' },
|
2026-05-12 01:04:17 -05:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const services = [
|
|
|
|
|
{ name: 'Unified Communications', href: '/services/unified-communications' },
|
|
|
|
|
{ name: 'Contact Center', href: '/services/contact-center' },
|
|
|
|
|
{ name: 'Managed Support', href: '/services/managed-support' },
|
|
|
|
|
{ name: 'Consulting & Training', href: '/services/consulting-training' },
|
|
|
|
|
{ name: 'Infrastructure Cabling', href: '/services/infrastructure-cabling' },
|
|
|
|
|
{ name: 'Wireless Access', href: '/services/wireless-access' },
|
|
|
|
|
{ name: 'Local Networking', href: '/services/local-networking' },
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
const industries = [
|
|
|
|
|
{ name: 'Healthcare', href: '/industries/healthcare' },
|
|
|
|
|
{ name: 'Retail', href: '/industries/retail' },
|
|
|
|
|
{ name: 'Manufacturing', href: '/industries/manufacturing' },
|
|
|
|
|
{ name: 'Education & Finance', href: '/industries/education-finance' },
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<footer className="bg-primary-navy text-white">
|
2026-05-18 10:57:06 -05:00
|
|
|
<div className="container mx-auto px-4 pt-24 pb-12">
|
2026-05-25 18:33:19 -05:00
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
|
2026-05-12 01:04:17 -05:00
|
|
|
{/* Company Info */}
|
|
|
|
|
<div>
|
2026-05-27 22:19:04 -05:00
|
|
|
<Link to="/" className="flex items-center gap-3 mb-3 group" aria-label="Queue North Technologies Home">
|
2026-05-18 10:57:06 -05:00
|
|
|
<img
|
|
|
|
|
src="/logo.png"
|
|
|
|
|
alt="Queue North Technologies"
|
2026-05-25 20:02:36 -05:00
|
|
|
className="brand-logo-on-dark h-12 w-auto shrink-0 transition-opacity group-hover:opacity-90"
|
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
|
|
|
loading="lazy"
|
|
|
|
|
decoding="async"
|
|
|
|
|
width="200"
|
|
|
|
|
height="200"
|
2026-05-12 01:04:17 -05:00
|
|
|
/>
|
2026-05-28 00:41:24 -05:00
|
|
|
<span className="font-bold text-sm leading-tight tracking-tight text-white sm:text-xl sm:whitespace-nowrap">Queue North Technologies</span>
|
2026-05-18 10:57:06 -05:00
|
|
|
</Link>
|
|
|
|
|
<p className="text-navy-light text-sm leading-relaxed mb-5">{companyInfo.tagline}</p>
|
|
|
|
|
<div className="space-y-2 text-navy-light text-sm mb-6">
|
2026-05-17 15:07:28 -05:00
|
|
|
<div>
|
2026-05-17 22:47:03 -05:00
|
|
|
<a href={`tel:+1${companyInfo.phone.replace(/\D/g, '')}`} className="hover:text-primary-cyan transition-colors" aria-label={`Call ${companyInfo.phone}`}>{companyInfo.phone}</a>
|
2026-05-17 15:07:28 -05:00
|
|
|
</div>
|
2026-05-17 20:44:18 -05:00
|
|
|
<div>
|
2026-05-18 10:57:06 -05:00
|
|
|
<a href={`tel:+1${companyInfo.tollFree.replace(/\D/g, '')}`} className="hover:text-primary-cyan transition-colors" aria-label={`Call toll-free ${companyInfo.tollFree}`}>{companyInfo.tollFree} (Toll-Free)</a>
|
2026-05-17 20:44:18 -05:00
|
|
|
</div>
|
2026-05-17 14:35:29 -05:00
|
|
|
</div>
|
2026-05-18 10:57:06 -05:00
|
|
|
<Link
|
2026-05-27 22:33:54 -05:00
|
|
|
to="/contact#contact-form"
|
2026-05-18 10:57:06 -05:00
|
|
|
className="inline-flex items-center gap-2 rounded-md text-sm font-semibold px-5 py-2.5 bg-primary-cyan text-primary-navy hover:bg-white transition-colors duration-200"
|
fix(a11y): visible focus indicator, aria-expanded, and six Label-in-Name failures
Batch 10, and only three of its six issues were real. The other three are
answered on the tracker with the arithmetic.
#189 — focus indicator. Footer and Home carried zero focus styling across 17
links. Added one global :focus-visible rule rather than sprinkling classes,
because the issue's own scope was "all interactive <a> and <Link> elements".
Not the ring the issue asked for. It suggested ring-primary-cyan; #22D3EE is
6.26:1 on navy and 2.38:1 on white, so on this light-first design that ring
would have failed WCAG 1.4.11 across most of the site. Two rings instead — white
inside, navy outside — so the white carries the dark bands and the navy carries
the light sections. Worst case across every background in the palette is
13.62:1. box-shadow so both rings follow each element's own border-radius, plus
a transparent outline for forced-colors mode.
#192 — aria-expanded={isOpen} and aria-controls on the mobile nav trigger, and
the id on SheetContent it now points at. Confirmed as "false" in the
prerendered HTML.
#193 — INVERTED. The issue asked for aria-labels to be added consistently to
hero CTAs. The aria-labels already there were WCAG 2.5.3 Label in Name failures,
Level A: "Schedule a consultation" is not a superset of the visible "Schedule
Consultation", so a voice-control user saying what they see cannot activate the
link. Doing what the issue asked would have spread a Level A failure. Removed
the six that broke it; kept the eight that genuinely add context and do contain
their visible text, including the icon-only header logo link that needs one.
Audit now reports 0 failures across Home, Services, Footer and Header.
Verified: npm run build; the ring is in the built CSS, aria-expanded="false" and
id="mobile-nav-content" are in the prerendered HTML, all six removed labels are
absent from it, and the visible CTA text still renders.
NOT verified: nothing has been walked keyboard-only in a browser, and no screen
reader has been used. That gap is recorded in docs/qa/ClaudeQACoverage.md.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 02:31:13 -05:00
|
|
|
|
2026-05-18 10:57:06 -05:00
|
|
|
>
|
|
|
|
|
Get a Free Quote
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" d="M17 8l4 4m0 0l-4 4m4-4H3" />
|
|
|
|
|
</svg>
|
|
|
|
|
</Link>
|
2026-05-12 01:04:17 -05:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Quick Links */}
|
2026-05-18 10:57:06 -05:00
|
|
|
<div className="lg:pt-16">
|
2026-05-17 17:42:03 -05:00
|
|
|
<h3 className="font-semibold mb-4 text-sm uppercase tracking-wider text-primary-cyan">Quick Links</h3>
|
2026-05-12 01:04:17 -05:00
|
|
|
<ul className="space-y-2">
|
|
|
|
|
{quickLinks.map((link) => (
|
|
|
|
|
<li key={link.name}>
|
2026-05-17 18:03:55 -05:00
|
|
|
<Link
|
|
|
|
|
to={link.href}
|
2026-05-12 02:39:35 -05:00
|
|
|
className="text-navy-light hover:text-white transition-colors text-sm"
|
2026-05-17 22:47:03 -05:00
|
|
|
aria-label={link.name}
|
2026-05-12 01:04:17 -05:00
|
|
|
>
|
|
|
|
|
{link.name}
|
2026-05-17 18:03:55 -05:00
|
|
|
</Link>
|
2026-05-12 01:04:17 -05:00
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Services */}
|
2026-05-18 10:57:06 -05:00
|
|
|
<div className="lg:pt-16">
|
2026-05-17 17:42:03 -05:00
|
|
|
<h3 className="font-semibold mb-4 text-sm uppercase tracking-wider text-primary-cyan">Services</h3>
|
2026-05-12 01:04:17 -05:00
|
|
|
<ul className="space-y-2">
|
|
|
|
|
{services.map((service) => (
|
|
|
|
|
<li key={service.name}>
|
2026-05-17 18:03:55 -05:00
|
|
|
<Link
|
|
|
|
|
to={service.href}
|
2026-05-12 02:39:35 -05:00
|
|
|
className="text-navy-light hover:text-white transition-colors text-sm"
|
2026-05-17 22:47:03 -05:00
|
|
|
aria-label={service.name}
|
2026-05-12 01:04:17 -05:00
|
|
|
>
|
|
|
|
|
{service.name}
|
2026-05-17 18:03:55 -05:00
|
|
|
</Link>
|
2026-05-12 01:04:17 -05:00
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Industries */}
|
2026-05-18 10:57:06 -05:00
|
|
|
<div className="lg:pt-16">
|
2026-05-17 17:42:03 -05:00
|
|
|
<h3 className="font-semibold mb-4 text-sm uppercase tracking-wider text-primary-cyan">Industries</h3>
|
2026-05-12 01:04:17 -05:00
|
|
|
<ul className="space-y-2">
|
|
|
|
|
{industries.map((industry) => (
|
|
|
|
|
<li key={industry.name}>
|
2026-05-17 18:03:55 -05:00
|
|
|
<Link
|
|
|
|
|
to={industry.href}
|
2026-05-12 02:39:35 -05:00
|
|
|
className="text-navy-light hover:text-white transition-colors text-sm"
|
2026-05-17 22:47:03 -05:00
|
|
|
aria-label={industry.name}
|
2026-05-12 01:04:17 -05:00
|
|
|
>
|
|
|
|
|
{industry.name}
|
2026-05-17 18:03:55 -05:00
|
|
|
</Link>
|
2026-05-12 01:04:17 -05:00
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-05-25 18:33:19 -05:00
|
|
|
{/* Veteran Owned & Operated */}
|
2026-05-25 19:23:37 -05:00
|
|
|
<div className="border-t border-white/10 mt-10 py-6">
|
2026-05-25 19:51:03 -05:00
|
|
|
<div className="flex flex-col items-center gap-4 text-center">
|
2026-06-14 16:08:29 -05:00
|
|
|
<span className="flex h-24 w-20 items-center justify-center rounded-md border border-white/10 bg-white p-1 shadow-sm">
|
|
|
|
|
<img
|
|
|
|
|
src="/assets/brand/veteran-owned-certified.webp"
|
|
|
|
|
alt="SBA Veteran-Owned Certified badge"
|
|
|
|
|
className="h-full w-full object-contain"
|
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
|
|
|
loading="lazy"
|
|
|
|
|
decoding="async"
|
2026-06-14 16:08:29 -05:00
|
|
|
/>
|
|
|
|
|
</span>
|
2026-05-25 19:51:03 -05:00
|
|
|
<p className="text-primary-cyan text-xs font-semibold uppercase tracking-[0.18em]">
|
|
|
|
|
Veteran Owned & Operated
|
|
|
|
|
</p>
|
|
|
|
|
<div className="flex flex-wrap justify-center gap-2">
|
2026-05-25 19:23:37 -05:00
|
|
|
<span className="rounded-md border border-white/10 bg-white/5 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-white/85">
|
|
|
|
|
United States Marine Corps
|
|
|
|
|
</span>
|
|
|
|
|
<span className="rounded-md border border-white/10 bg-white/5 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-white/85">
|
|
|
|
|
United States Air Force
|
2026-05-25 18:33:19 -05:00
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-05-12 01:04:17 -05:00
|
|
|
{/* Bottom */}
|
2026-05-25 18:33:19 -05:00
|
|
|
<div className="border-t border-white/10 pt-8">
|
2026-05-18 10:57:06 -05:00
|
|
|
<div className="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
|
|
|
|
<div className="flex flex-col gap-1">
|
2026-05-17 20:44:18 -05:00
|
|
|
<p className="text-navy-light text-xs">
|
2026-05-18 10:57:06 -05:00
|
|
|
© {currentYear} Queue North Technologies. All rights reserved.
|
2026-05-17 20:44:18 -05:00
|
|
|
</p>
|
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
|
|
|
<Link
|
|
|
|
|
to="/privacy-policy"
|
|
|
|
|
className="text-navy-light text-xs hover:text-primary-cyan transition-colors w-fit"
|
|
|
|
|
aria-label="Read the Queue North Technologies Privacy Policy"
|
|
|
|
|
>
|
|
|
|
|
Privacy Policy
|
|
|
|
|
</Link>
|
2026-05-17 20:44:18 -05:00
|
|
|
</div>
|
2026-05-18 12:11:56 -05:00
|
|
|
<div className="flex items-center gap-4">
|
|
|
|
|
<a
|
|
|
|
|
href="https://linkedin.com/company/queue-north-technologies-llc"
|
|
|
|
|
target="_blank"
|
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
|
className="text-navy-light hover:text-primary-cyan transition-colors"
|
|
|
|
|
aria-label="Follow Queue North on LinkedIn"
|
|
|
|
|
>
|
|
|
|
|
<svg className="h-5 w-5" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
|
|
|
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
|
|
|
|
</svg>
|
|
|
|
|
<span className="sr-only">LinkedIn</span>
|
|
|
|
|
</a>
|
|
|
|
|
<a
|
|
|
|
|
href="https://www.facebook.com/QueueNorth"
|
|
|
|
|
target="_blank"
|
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
|
className="text-navy-light hover:text-primary-cyan transition-colors"
|
|
|
|
|
aria-label="Follow Queue North on Facebook"
|
|
|
|
|
>
|
|
|
|
|
<svg className="h-5 w-5" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
|
|
|
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
|
|
|
|
|
</svg>
|
|
|
|
|
<span className="sr-only">Facebook</span>
|
2026-05-18 10:57:06 -05:00
|
|
|
</a>
|
2026-05-25 19:44:10 -05:00
|
|
|
<a
|
|
|
|
|
href="https://www.instagram.com/queue_north/"
|
|
|
|
|
target="_blank"
|
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
|
className="text-navy-light hover:text-primary-cyan transition-colors"
|
|
|
|
|
aria-label="Follow Queue North Technologies on Instagram"
|
|
|
|
|
>
|
|
|
|
|
<svg className="h-5 w-5" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
|
|
|
<path d="M7.75 2h8.5A5.76 5.76 0 0122 7.75v8.5A5.76 5.76 0 0116.25 22h-8.5A5.76 5.76 0 012 16.25v-8.5A5.76 5.76 0 017.75 2zm0 2A3.75 3.75 0 004 7.75v8.5A3.75 3.75 0 007.75 20h8.5A3.75 3.75 0 0020 16.25v-8.5A3.75 3.75 0 0016.25 4h-8.5zM12 7a5 5 0 110 10 5 5 0 010-10zm0 2a3 3 0 100 6 3 3 0 000-6zm5.25-2.5a1.25 1.25 0 110 2.5 1.25 1.25 0 010-2.5z" />
|
|
|
|
|
</svg>
|
|
|
|
|
<span className="sr-only">Instagram</span>
|
|
|
|
|
</a>
|
2026-05-18 10:57:06 -05:00
|
|
|
</div>
|
2026-05-17 20:44:18 -05:00
|
|
|
</div>
|
2026-05-18 10:57:06 -05:00
|
|
|
<p className="text-navy-light text-xs mt-4">
|
|
|
|
|
8x8® is a registered trademark of 8x8, Inc. Queue North Technologies is an independent certified partner and is not owned or operated by 8x8, Inc.
|
|
|
|
|
</p>
|
2026-05-12 01:04:17 -05:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</footer>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Footer
|