diff --git a/next-env.d.ts b/next-env.d.ts
index 9edff1c..c4b7818 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/types/routes.d.ts";
+import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/package-lock.json b/package-lock.json
index 9d4f1ea..23f426b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -598,9 +598,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -617,9 +614,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -636,9 +630,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -655,9 +646,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -674,9 +662,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -693,9 +678,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -712,9 +694,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -731,9 +710,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -750,9 +726,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -775,9 +748,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -800,9 +770,6 @@
"cpu": [
"ppc64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -825,9 +792,6 @@
"cpu": [
"riscv64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -850,9 +814,6 @@
"cpu": [
"s390x"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -875,9 +836,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -900,9 +858,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -925,9 +880,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -1119,9 +1071,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1138,9 +1087,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1157,9 +1103,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1176,9 +1119,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1382,9 +1322,6 @@
"cpu": [
"arm"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1405,9 +1342,6 @@
"cpu": [
"arm"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1428,9 +1362,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1451,9 +1382,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1474,9 +1402,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1497,9 +1422,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1657,9 +1579,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -1676,9 +1595,6 @@
"cpu": [
"arm64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -1695,9 +1611,6 @@
"cpu": [
"x64"
],
- "libc": [
- "glibc"
- ],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -1714,9 +1627,6 @@
"cpu": [
"x64"
],
- "libc": [
- "musl"
- ],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
@@ -1933,9 +1843,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1953,9 +1860,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1973,9 +1877,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -1993,9 +1894,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2510,9 +2408,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2527,9 +2422,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2544,9 +2436,6 @@
"ppc64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2561,9 +2450,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2578,9 +2464,6 @@
"riscv64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2595,9 +2478,6 @@
"s390x"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2612,9 +2492,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -2629,9 +2506,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MIT",
"optional": true,
"os": [
@@ -4964,9 +4838,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4988,9 +4859,6 @@
"arm64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5012,9 +4880,6 @@
"x64"
],
"dev": true,
- "libc": [
- "glibc"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5036,9 +4901,6 @@
"x64"
],
"dev": true,
- "libc": [
- "musl"
- ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5365,6 +5227,17 @@
}
}
},
+ "node_modules/next-intl/node_modules/@swc/helpers": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz",
+ "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
"node_modules/next/node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
diff --git a/src/app/[locale]/cart/page.tsx b/src/app/[locale]/cart/page.tsx
index 88c60a4..55d00f4 100644
--- a/src/app/[locale]/cart/page.tsx
+++ b/src/app/[locale]/cart/page.tsx
@@ -12,7 +12,7 @@ export default async function CartPage() {
return (
-
+
{t("title")}
diff --git a/src/app/[locale]/checkout/page.tsx b/src/app/[locale]/checkout/page.tsx
index 746126a..d54c420 100644
--- a/src/app/[locale]/checkout/page.tsx
+++ b/src/app/[locale]/checkout/page.tsx
@@ -11,10 +11,10 @@ export default async function CheckoutPage() {
return (
-
+
{t("title")}
-
{t("subtitle")}
+
{t("subtitle")}
diff --git a/src/app/[locale]/not-found.tsx b/src/app/[locale]/not-found.tsx
index 34b6aec..0872afc 100644
--- a/src/app/[locale]/not-found.tsx
+++ b/src/app/[locale]/not-found.tsx
@@ -6,10 +6,10 @@ export default async function NotFound() {
return (
-
{t("notFound")}
+
{t("notFound")}
{t("back")}
diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx
index 71f6a1b..584dfda 100644
--- a/src/app/[locale]/page.tsx
+++ b/src/app/[locale]/page.tsx
@@ -11,31 +11,31 @@ export default async function HomePage() {
-
+
{t("hero.eyebrow")}
-
+
{t("hero.title")}
-
+
{t("hero.subtitle")}
{t("hero.ctaCatalog")}
{t("hero.ctaQuote")}
-
+
{t("services.title")}
-
{t("services.subtitle")}
+
{t("services.subtitle")}
{(
[
@@ -75,17 +75,44 @@ export default async function HomePage() {
).map((key) => (
-
-
-
- ✓
-
+
+ {key === "cut" && (
+
+ )}
+ {key === "coating" && (
+
+ )}
+ {key === "docs" && (
+
+ )}
+ {key === "delivery" && (
+
+ )}
+ {key === "sizing" && (
+
+ )}
+ {key === "bulk" && (
+
+ )}
-
+
{t(`services.${key}.title`)}
-
+
{t(`services.${key}.body`)}
@@ -96,23 +123,23 @@ export default async function HomePage() {
-
+
{t("how.title")}
-
{t("how.subtitle")}
+
{t("how.subtitle")}
{([1, 2, 3, 4] as const).map((n) => (
-
-
+
{n}
-
+
{t(`how.step${n}.title` as "how.step1.title")}
-
+
{t(`how.step${n}.body` as "how.step1.body")}
@@ -123,28 +150,28 @@ export default async function HomePage() {
{t("faq.title")}
-
{t("faq.subtitle")}
+
{t("faq.subtitle")}
{([1, 2, 3, 4, 5, 6] as const).map((n) => (
-
+
{t(`faq.i${n}.q` as "faq.i1.q")}
-
+
{t(`faq.i${n}.a` as "faq.i1.a")}
@@ -167,21 +194,21 @@ export default async function HomePage() {
-
-
{t("ctaBand.title")}
-
+
+
{t("ctaBand.title")}
+
{t("ctaBand.body")}
{t("ctaBand.primary")}
{t("ctaBand.secondary")}
diff --git a/src/app/[locale]/product/[slug]/page.tsx b/src/app/[locale]/product/[slug]/page.tsx
index ff0385d..4521824 100644
--- a/src/app/[locale]/product/[slug]/page.tsx
+++ b/src/app/[locale]/product/[slug]/page.tsx
@@ -39,7 +39,7 @@ export default async function ProductPage({ params }: Props) {
← {t("back")}
@@ -47,8 +47,8 @@ export default async function ProductPage({ params }: Props) {
-
-
+
+
{t("thicknessLabel")}
{t("thicknessValue", {
value: formatThicknessMm(mm),
@@ -72,13 +72,13 @@ export default async function ProductPage({ params }: Props) {
-
+
{tcl(product.catalogLineKey)}
{tn("supplier")}
-
+
{tp(`${slug}.name`)}
@@ -95,8 +95,8 @@ export default async function ProductPage({ params }: Props) {
-
-
+
+
{t("details")}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index efce0b4..a8f23c3 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -11,7 +11,7 @@ const dmSans = DM_Sans({
export default function RootLayout({ children }: { children: ReactNode }) {
return (
-
+
{children}
diff --git a/src/components/CartBadge.tsx b/src/components/CartBadge.tsx
index 065f1e2..be85c3e 100644
--- a/src/components/CartBadge.tsx
+++ b/src/components/CartBadge.tsx
@@ -9,7 +9,7 @@ export function CartBadge() {
if (count === 0) return null;
return (
-
+
{count > 99 ? "99+" : count}
);
diff --git a/src/components/CartCheckoutLink.tsx b/src/components/CartCheckoutLink.tsx
index 5dd2a27..b496854 100644
--- a/src/components/CartCheckoutLink.tsx
+++ b/src/components/CartCheckoutLink.tsx
@@ -12,7 +12,7 @@ export function CartCheckoutLink() {
{t("checkout")}
diff --git a/src/components/CartView.tsx b/src/components/CartView.tsx
index 0f9b3eb..2cead73 100644
--- a/src/components/CartView.tsx
+++ b/src/components/CartView.tsx
@@ -17,11 +17,11 @@ export function CartView() {
if (items.length === 0) {
return (
-
-
{t("empty")}
+
+
{t("empty")}
{t("emptyCta")}
@@ -79,13 +79,13 @@ function CartLineRow({
const lineTotal = price * line.quantity;
return (
-
-
+
-
-
{name}
+
{name}
{sub ? (
-
{sub}
+
{sub}
) : null}
-
+
{price.toFixed(2)}{" "}
{product ? tu(product.unitKey) : ""} {t("each")}
@@ -103,9 +103,9 @@ function CartLineRow({
onChange={(e) =>
updateQuantity(line.lineId, Number(e.target.value) || 1)
}
- className="w-20 rounded-lg border border-stone-200 px-2 py-1.5 text-sm font-semibold"
+ className="w-20 rounded-lg border border-neutral-200 bg-neutral-50 px-2 py-1.5 text-sm font-semibold outline-none transition duration-150 focus:border-neutral-300 focus:bg-white focus:ring-2 focus:ring-neutral-900/8"
/>
-
+
{lineTotal.toFixed(2)}