Add Playwright a11y tests, structured data, and reduced motion support

- Add Playwright tests with axe-core (42 tests across 3 browsers)
- Add prefers-reduced-motion support to NebulaField
- Add JSON-LD structured data (Organization schema)
- Add canonical URLs to all pages
- Consolidate TODO files, update README
This commit is contained in:
jwinterm
2026-01-17 12:10:18 -05:00
parent 3c1e0b659c
commit 487754d3a2
11 changed files with 381 additions and 331 deletions
+3
View File
@@ -7,6 +7,9 @@ import type { Metadata } from "next";
export const metadata: Metadata = {
title: "About | Such Software",
description: "Full-service software provider in Kennett Square, PA. Founded by John Winter Murphy, specializing in accessible web engineering and WCAG 2.2 compliance.",
alternates: {
canonical: "/about",
},
openGraph: {
title: "About | Such Software",
description: "Full-service software provider in Kennett Square, PA. Founded by John Winter Murphy.",
+36
View File
@@ -7,8 +7,12 @@ import { Footer } from "@/components/layout/footer";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
metadataBase: new URL("https://such.software"),
title: "Such Software | Digital Craftsmanship",
description: "Next-generation web applications engineered for scale, compliance, and performance.",
alternates: {
canonical: "/",
},
icons: {
icon: [
{ url: "/images/favicon.svg", type: "image/svg+xml" },
@@ -22,6 +26,32 @@ export const metadata: Metadata = {
manifest: "/manifest.json",
};
const structuredData = {
"@context": "https://schema.org",
"@type": "Organization",
name: "Such Software LLC",
url: "https://such.software",
logo: "https://such.software/images/logo_dark.svg",
description: "Next-generation web applications engineered for scale, compliance, and performance.",
address: {
"@type": "PostalAddress",
streetAddress: "110 E State St, Suite 300",
addressLocality: "Kennett Square",
addressRegion: "PA",
postalCode: "19348",
addressCountry: "US",
},
founder: {
"@type": "Person",
name: "John Winter Murphy",
jobTitle: "Founder & Principal Engineer",
},
sameAs: [
"https://github.com/suchsoftware",
"https://linkedin.com/company/suchsoftware",
],
};
export default function RootLayout({
children,
}: Readonly<{
@@ -29,6 +59,12 @@ export default function RootLayout({
}>) {
return (
<html lang="en" suppressHydrationWarning>
<head>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
/>
</head>
<body className={inter.className}>
<ThemeProvider
attribute="class"
+3
View File
@@ -8,6 +8,9 @@ import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Services | Such Software",
description: "Medusa v2 development, custom web applications, and cryptocurrency consulting. High-performance headless commerce, real-time platforms, and Web3 integration.",
alternates: {
canonical: "/services",
},
openGraph: {
title: "Services | Such Software",
description: "Medusa v2 development, custom web applications, and cryptocurrency consulting.",