diff --git a/messages/de.json b/messages/de.json index d2e5c32..c1c0e1b 100644 --- a/messages/de.json +++ b/messages/de.json @@ -742,7 +742,11 @@ "detailPoint2": "Gesundheitsdaten bleiben privat, außer du teilst sie bewusst per Link", "footerTagline": "Wo Haustiere die Stars sind.", "footerDesignedBy": "Designed & Powered by PawFeed", - "footerSecurityBadge": "Sicherheits-Check: Note A+" + "footerSecurityBadge": "Sicherheits-Check: Note A+", + "heroAndroidHint": "Auch als App für Android", + "playStoreAlt": "Jetzt bei Google Play", + "appHeading": "PawFeed für die Hosentasche", + "appBody": "Die Android-App bringt Feed, Storys und Nachrichten direkt aufs Handy — mit Push-Benachrichtigungen, wenn dein Tier ein neues Like oder einen neuen Follower bekommt." }, "AboutPage": { "metaTitle": "Über uns — PawFeed", diff --git a/messages/en.json b/messages/en.json index df36ed8..92a8b4c 100644 --- a/messages/en.json +++ b/messages/en.json @@ -742,7 +742,11 @@ "detailPoint2": "Health data stays private unless you deliberately share it via link", "footerTagline": "Where pets are the stars.", "footerDesignedBy": "Designed & Powered by PawFeed", - "footerSecurityBadge": "Security check: Grade A+" + "footerSecurityBadge": "Security check: Grade A+", + "heroAndroidHint": "Also available as an Android app", + "playStoreAlt": "Get it on Google Play", + "appHeading": "PawFeed in your pocket", + "appBody": "The Android app puts the feed, stories, and messages right on your phone — with push notifications when your pet gets a new like or follower." }, "AboutPage": { "metaTitle": "About us — PawFeed", diff --git a/public/badges/google-play-de.png b/public/badges/google-play-de.png new file mode 100644 index 0000000..04d4f45 Binary files /dev/null and b/public/badges/google-play-de.png differ diff --git a/public/badges/google-play-en.png b/public/badges/google-play-en.png new file mode 100644 index 0000000..131f3ac Binary files /dev/null and b/public/badges/google-play-en.png differ diff --git a/src/app/fonts/inter-latin-wght-normal.woff2 b/src/app/fonts/inter-latin-wght-normal.woff2 new file mode 100644 index 0000000..d15208d Binary files /dev/null and b/src/app/fonts/inter-latin-wght-normal.woff2 differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index e38694c..29c4ebb 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,6 @@ import type { Metadata, Viewport } from "next"; import { headers } from "next/headers"; -import { Inter } from "next/font/google"; +import localFont from "next/font/local"; import { ThemeProvider } from "next-themes"; import { NextIntlClientProvider } from "next-intl"; import { getLocale, getMessages } from "next-intl/server"; @@ -9,9 +9,14 @@ import { ActivePetProvider } from "@/context/ActivePetContext"; import { Toaster } from "@/components/ui/sonner"; import "./globals.css"; -const inter = Inter({ +// Inter (variable weight, latin subset) is vendored in ./fonts rather than +// pulled via next/font/google, so neither visitors nor the Docker build ever +// contact Google's servers. Source: @fontsource-variable/inter@5.3.0. +const inter = localFont({ + src: "./fonts/inter-latin-wght-normal.woff2", variable: "--font-sans", - subsets: ["latin"], + weight: "100 900", + display: "swap", }); export const metadata: Metadata = { diff --git a/src/app/page.tsx b/src/app/page.tsx index 8d81d36..2f52ff2 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,6 +7,7 @@ import { PawPrint, HeartPulse, MessageCircle, Images, Heart, Sparkles, CheckCirc import { ScrollReveal } from "@/components/landing/ScrollReveal"; import { LandingHeader } from "@/components/landing/LandingHeader"; import { LandingFooter } from "@/components/landing/LandingFooter"; +import { PlayStoreBadge } from "@/components/landing/PlayStoreBadge"; /** * Root route (/) — public landing page for logged-out visitors, redirects @@ -74,6 +75,11 @@ export default async function RootPage() { {t("logIn")} + +
+ {t("heroAndroidHint")} + +
{/* Phone mockup — sits inside one soft marigold glow, the hero's @@ -211,6 +217,20 @@ export default async function RootPage() { + + {/* Android app — a closing, left-aligned invitation rather than a + second hero; the official Play badge is the only CTA. */} +
+ +
+

+ {t("appHeading")} +

+

{t("appBody")}

+
+ +
+
{/* Footer — repeats the navbar */} diff --git a/src/components/landing/LandingFooter.tsx b/src/components/landing/LandingFooter.tsx index c4d2484..d80597b 100644 --- a/src/components/landing/LandingFooter.tsx +++ b/src/components/landing/LandingFooter.tsx @@ -1,6 +1,7 @@ import { getTranslations } from "next-intl/server"; import Link from "next/link"; import { PawPrint, ShieldCheck } from "lucide-react"; +import { PlayStoreBadge } from "./PlayStoreBadge"; /** * Shared footer for the public landing page and "Über uns" (Gitea #23) — @@ -19,6 +20,9 @@ export async function LandingFooter() { PawFeed

{t("footerTagline")}

+
+ +