diff --git a/apps/marketing/src/lib/macArch.test.ts b/apps/marketing/src/lib/macArch.test.ts new file mode 100644 index 00000000000..24a03f2cffe --- /dev/null +++ b/apps/marketing/src/lib/macArch.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vite-plus/test"; + +import { macArchFromGpuRenderer } from "./macArch"; + +describe("macArchFromGpuRenderer", () => { + it("detects explicit Apple Silicon renderers", () => { + expect(macArchFromGpuRenderer("Apple M4 Pro")).toBe("arm64"); + }); + + it("prefers an Intel GPU marker even when the renderer also mentions Apple", () => { + expect(macArchFromGpuRenderer("ANGLE Metal Renderer: Apple, Intel Iris Plus Graphics")).toBe( + "x64", + ); + }); + + it("uses x64 for ambiguous Safari and unavailable renderer values", () => { + expect(macArchFromGpuRenderer("Apple GPU")).toBe("x64"); + expect(macArchFromGpuRenderer("")).toBe("x64"); + }); +}); diff --git a/apps/marketing/src/lib/macArch.ts b/apps/marketing/src/lib/macArch.ts new file mode 100644 index 00000000000..8399c4adbdf --- /dev/null +++ b/apps/marketing/src/lib/macArch.ts @@ -0,0 +1,16 @@ +const INTEL_GPU_PATTERN = /intel|amd|radeon|nvidia|geforce/i; +const APPLE_SILICON_GPU_PATTERN = /\bapple\s+m\d/i; + +export function macArchFromGpuRenderer(renderer: string): "arm64" | "x64" { + if (INTEL_GPU_PATTERN.test(renderer)) { + return "x64"; + } + if (APPLE_SILICON_GPU_PATTERN.test(renderer)) { + return "arm64"; + } + + // Generic "Apple GPU" renderers are ambiguous on Safari. x64 is the safe + // fallback because Apple Silicon can run it through Rosetta, while Intel + // Macs cannot run an arm64 build. + return "x64"; +} diff --git a/apps/marketing/src/pages/index.astro b/apps/marketing/src/pages/index.astro index 4d43fc595c0..37ff6b69346 100644 --- a/apps/marketing/src/pages/index.astro +++ b/apps/marketing/src/pages/index.astro @@ -391,14 +391,33 @@ const mobileEndorsementRows = [