feat: implement landing page structure with legal pages, footer, CTA, and domain redirection proxy

This commit is contained in:
2026-04-14 10:30:46 +02:00
parent 765eea05f7
commit 383d8484a6
14 changed files with 515 additions and 319 deletions

View File

@@ -37,11 +37,11 @@ export default function CTA() {
<span className="store-btn-big">{hasIosStoreUrl ? 'App Store' : t.cta.supportLabel}</span>
</div>
</a>
<a
href={hasAndroidStoreUrl ? siteConfig.androidPlayStoreUrl : `mailto:${siteConfig.supportEmail}`}
className="store-btn"
id="cta-googleplay"
aria-label="Google Play or contact"
<a
href={hasAndroidStoreUrl ? siteConfig.androidPlayStoreUrl : '/support'}
className="store-btn"
id="cta-googleplay"
aria-label="Google Play or contact"
>
<svg className="store-btn-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M3.18 23.76c.33.18.7.24 1.08.17L14.84 12 11.17 8.33 3.18 23.76zm17.16-12.38-3.32-1.89-3.78 3.78 3.78 3.78 3.34-1.9c.95-.54.95-1.92-.02-2.77zM2.01 1.11C1.7 1.44 1.5 1.97 1.5 2.67v18.66c0 .7.2 1.23.51 1.56l.08.08L12.16 12v-.22L2.09 1.03l-.08.08zm9.16 10.67 2.67 2.67-10.5 5.97 7.83-8.64z" />

View File

@@ -1,17 +1,19 @@
'use client'
import Link from 'next/link'
import { useLang } from '@/context/LangContext'
import { siteConfig } from '@/lib/site'
const LINK_HREFS = [
['#features', '#intelligence', '#cta', '/support'],
['/#how', '/#faq', '/support'],
['/imprint', '/privacy'],
]
export default function Footer() {
const { t } = useLang()
'use client'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { useLang } from '@/context/LangContext'
import { siteConfig } from '@/lib/site'
export default function Footer() {
const pathname = usePathname()
const { t } = useLang()
const homeHref = (hash: string) => (pathname === '/' ? hash : `/${hash}`)
const linkHrefs = [
[homeHref('#features'), homeHref('#intelligence'), homeHref('#cta'), '/support'],
[homeHref('#how'), homeHref('#faq'), '/support'],
['/imprint', '/privacy', '/terms'],
]
return (
<footer className="footer" id="footer">
@@ -26,12 +28,12 @@ export default function Footer() {
{t.footer.cols.map((col, ci) => (
<div className="footer-col" key={col.title}>
<div className="footer-col-title">{col.title}</div>
{col.links.map((label, li) => (
<Link key={label} href={LINK_HREFS[ci]?.[li] ?? '/support'}>
{label}
</Link>
))}
<div className="footer-col-title">{col.title}</div>
{col.links.map((label, li) => (
<Link key={label} href={linkHrefs[ci]?.[li] ?? '/support'}>
{label}
</Link>
))}
{ci === 1 && (
<>
<Link href="/plant-identifier-app">Plant Identifier App</Link>
@@ -49,13 +51,13 @@ export default function Footer() {
<div className="footer-brand-xl" aria-hidden="true">GREENLENS</div>
<div className="footer-bottom">
<p>{t.footer.copy}</p>
<a href={`mailto:${siteConfig.supportEmail}`} className="footer-contact">
{siteConfig.supportEmail}
</a>
</div>
</div>
</footer>
)
}
<div className="footer-bottom">
<p>{t.footer.copy}</p>
<Link href="/support" className="footer-contact">
Support
</Link>
</div>
</div>
</footer>
)
}

View File

@@ -1,9 +1,10 @@
'use client'
import Link from 'next/link'
import { useEffect, useState } from 'react'
import { useLang } from '@/context/LangContext'
import type { Lang } from '@/lib/i18n'
'use client'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { useEffect, useState } from 'react'
import { useLang } from '@/context/LangContext'
import type { Lang } from '@/lib/i18n'
const LANGS: { code: Lang; label: string; flag: string }[] = [
{ code: 'de', label: 'DE', flag: 'DE' },
@@ -11,10 +12,12 @@ const LANGS: { code: Lang; label: string; flag: string }[] = [
{ code: 'es', label: 'ES', flag: 'ES' },
]
export default function Navbar() {
const [scrolled, setScrolled] = useState(false)
const [menuOpen, setMenuOpen] = useState(false)
const { lang, setLang, t } = useLang()
export default function Navbar() {
const [scrolled, setScrolled] = useState(false)
const [menuOpen, setMenuOpen] = useState(false)
const pathname = usePathname()
const { lang, setLang, t } = useLang()
const homeHref = (hash: string) => (pathname === '/' ? hash : `/${hash}`)
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 40)
@@ -29,13 +32,13 @@ export default function Navbar() {
GREENLENS
</Link>
<div className={`nav-links${menuOpen ? ' nav-links--open' : ''}`}>
<a href="#features" onClick={() => setMenuOpen(false)}>{t.nav.features}</a>
<a href="#intelligence" onClick={() => setMenuOpen(false)}>{t.nav.tech}</a>
<a href="#faq" onClick={() => setMenuOpen(false)}>FAQ</a>
<a href="#how" onClick={() => setMenuOpen(false)}>{t.nav.how}</a>
<Link href="/support" onClick={() => setMenuOpen(false)}>Support</Link>
<a href="#cta" onClick={() => setMenuOpen(false)}>{t.nav.download}</a>
<div className={`nav-links${menuOpen ? ' nav-links--open' : ''}`}>
<a href={homeHref('#features')} onClick={() => setMenuOpen(false)}>{t.nav.features}</a>
<a href={homeHref('#intelligence')} onClick={() => setMenuOpen(false)}>{t.nav.tech}</a>
<a href={homeHref('#faq')} onClick={() => setMenuOpen(false)}>FAQ</a>
<a href={homeHref('#how')} onClick={() => setMenuOpen(false)}>{t.nav.how}</a>
<Link href="/support" onClick={() => setMenuOpen(false)}>Support</Link>
<a href={homeHref('#cta')} onClick={() => setMenuOpen(false)}>{t.nav.download}</a>
<div className="lang-switcher" role="group" aria-label="Language selector">
{LANGS.map((l) => (
@@ -55,8 +58,8 @@ export default function Navbar() {
))}
</div>
<a href="#cta" className="nav-cta" onClick={() => setMenuOpen(false)}>{t.nav.cta}</a>
</div>
<a href={homeHref('#cta')} className="nav-cta" onClick={() => setMenuOpen(false)}>{t.nav.cta}</a>
</div>
<button
className="nav-hamburger"