This commit is contained in:
2026-07-30 10:03:37 +02:00
parent 018b751723
commit c9e776ae98
19 changed files with 1256 additions and 223 deletions

View File

@@ -0,0 +1,150 @@
import type { Metadata } from 'next'
import Link from 'next/link'
import styles from './press.module.css'
const releaseUrl =
'https://news.prfree.org/@greenlenspro/greenlens-publishes-a-step-by-step-guide-to-troubleshooting-common-houseplant-problems-0ochpt6gr315'
const routineReleaseUrl =
'https://news.newswirebiz.com/@greenlenspro/greenlens-shares-a-5-step-plant-care-routine-for-when-houseplants-start-showing-stress-39kipufgt3xh'
const openPrReleaseUrl =
'https://www.openpr.de/news/1319466/Zimmerpflanzen-retten-statt-raten-6-Fragen-vor-jedem-Pflege-Schritt.html'
export const metadata: Metadata = {
title: 'Press | GreenLens',
description: 'Latest GreenLens news, press releases, and company announcements.',
alternates: { canonical: '/press' },
}
export default function PressPage() {
return (
<main className={styles.page}>
<section className={styles.hero}>
<div className={styles.contour} aria-hidden="true" />
<div className={styles.heroInner}>
<header className={styles.nav}>
<Link href="/" className={styles.brand} aria-label="GreenLens home">
<span className={styles.brandMark} aria-hidden="true">
<LeafIcon />
</span>
GreenLens
</Link>
<nav aria-label="Press navigation" className={styles.navLinks}>
<Link href="/">Home</Link>
<Link href="/support">Support</Link>
<a href="https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB" target="_blank" rel="noreferrer">
Get the app
</a>
</nav>
</header>
<div className={styles.heroCopy}>
<p className={styles.kicker}>GreenLens press office</p>
<h1>Newsroom</h1>
<div className={styles.rule} />
<p>Latest updates, product news, and practical plant-care resources from the GreenLens team.</p>
</div>
</div>
</section>
<section className={styles.releases} aria-labelledby="latest-release">
<div className={styles.content}>
<div className={styles.sectionHeading}>
<span className={styles.sectionIcon} aria-hidden="true"><LeafIcon /></span>
<h2 id="latest-release">Latest releases</h2>
<span className={styles.headingLine} aria-hidden="true" />
</div>
<div className={styles.releaseList}>
<ReleaseCard
title="Zimmerpflanzen retten statt raten: 6 Fragen vor jedem Pflege-Schritt"
lede="Der deutschsprachige Ratgeber zeigt, wie Pflanzenfans Symptome einordnen, vor einer Veränderung die wichtigsten Hinweise prüfen und mit ruhigen, nachvollziehbaren Schritten handeln können."
points={[
'Sichtbare Veränderungen genauer beschreiben statt sofort zu reagieren.',
'Wasser, Licht und jüngste Änderungen am Standort prüfen.',
'Hinweise auf Schädlinge oder Krankheiten früh erkennen.',
'Mit kleinen Anpassungen arbeiten und die Entwicklung dokumentieren.',
]}
href={openPrReleaseUrl}
date="July 30, 2026"
/>
<ReleaseCard
title="GreenLens Shares a 5-Step Plant Care Routine for When Houseplants Start Showing Stress"
lede="A practical five-step routine helps indoor plant owners assess common warning signs before changing watering, light, fertilizer, or treatments."
points={[
'Define the symptom before treating it.',
'Review recent changes in the plants environment.',
'Check the root zone, drainage, and available light.',
'Make one low-risk adjustment and document the response.',
]}
href={routineReleaseUrl}
/>
<ReleaseCard
title="GreenLens Publishes a Step-by-Step Guide to Troubleshooting Common Houseplant Problems"
lede="The new guide gives indoor plant owners a practical way to assess yellow leaves, brown tips, wilting, pests, light, and watering before making a care change."
points={[
'Read symptom patterns before reacting to a single leaf.',
'Check watering, drainage, light, and recent changes one at a time.',
'Build a simple photo-and-notes history to spot recurring patterns.',
'Know when a plant issue needs professional or urgent attention.',
]}
href={releaseUrl}
/>
</div>
</div>
</section>
</main>
)
}
function ReleaseCard({
title,
lede,
points,
href,
date = 'July 29, 2026',
}: {
title: string
lede: string
points: string[]
href: string
date?: string
}) {
return (
<article className={styles.releaseCard}>
<div className={styles.releaseMeta}>
<time dateTime={date === 'July 30, 2026' ? '2026-07-30' : '2026-07-29'}>{date}</time>
<span>Press release</span>
</div>
<h3>{title}</h3>
<p className={styles.lede}>{lede}</p>
<div className={styles.keyPoints}>
<h4>What the guide covers</h4>
<ul>
{points.map((point) => <li key={point}><LeafBullet /> {point}</li>)}
</ul>
</div>
<div className={styles.releaseFooter}>
<p>Source: <strong>GreenLens Press Office</strong></p>
<a href={href} target="_blank" rel="noreferrer" className={styles.releaseLink}>
Read full release <span aria-hidden="true"></span>
</a>
</div>
</article>
)
}
function LeafIcon() {
return (
<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
<path d="M19.5 3.5C12.1 3.6 6.4 7.2 5.1 13.1c-.8 3.7 1.4 6.6 4.8 6.6 6.3 0 9.9-7.7 9.6-16.2Z" stroke="currentColor" strokeWidth="1.7" strokeLinejoin="round" />
<path d="M4.4 20.5c3.8-4.6 7.7-7.8 12.4-10.1M10.2 14.5l.7 4.2M13.9 10.5l3.1 1" stroke="currentColor" strokeWidth="1.7" strokeLinecap="round" />
</svg>
)
}
function LeafBullet() {
return <span className={styles.bullet} aria-hidden="true"><LeafIcon /></span>
}

View File

@@ -0,0 +1,288 @@
.page {
min-height: 100vh;
color: #12332e;
background: #f7f5ef;
}
.hero {
position: relative;
overflow: hidden;
min-height: 430px;
color: #f7f5ef;
background: #0e1b24;
}
.hero::after {
position: absolute;
inset: 0;
content: '';
pointer-events: none;
background: radial-gradient(circle at 70% 48%, rgba(47, 165, 114, 0.09), transparent 30%);
}
.contour {
position: absolute;
right: -5%;
bottom: -45%;
width: min(720px, 65vw);
aspect-ratio: 1;
opacity: 0.48;
border: 1px solid rgba(111, 205, 151, 0.35);
border-radius: 54% 46% 58% 42%;
box-shadow:
42px -32px 0 -1px rgba(111, 205, 151, 0.26),
88px -70px 0 -1px rgba(111, 205, 151, 0.18),
132px -114px 0 -1px rgba(111, 205, 151, 0.12);
transform: rotate(-18deg);
}
.heroInner,
.content {
position: relative;
z-index: 1;
width: min(1180px, calc(100% - 48px));
margin: 0 auto;
}
.nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 26px 0;
border-bottom: 1px solid rgba(247, 245, 239, 0.13);
}
.brand {
display: inline-flex;
align-items: center;
gap: 10px;
color: #fff;
font-family: var(--body);
font-size: 1.28rem;
font-weight: 800;
letter-spacing: -0.04em;
}
.brandMark,
.sectionIcon,
.bullet {
display: inline-grid;
place-items: center;
color: #61c98c;
}
.brandMark { width: 27px; height: 27px; }
.brandMark svg { width: 100%; height: 100%; }
.navLinks {
display: flex;
align-items: center;
gap: 26px;
}
.navLinks a {
color: rgba(247, 245, 239, 0.76);
font-size: 0.86rem;
font-weight: 600;
transition: color 160ms ease;
}
.navLinks a:hover { color: #fff; }
.heroCopy {
max-width: 630px;
padding: 74px 0 88px;
}
.kicker {
margin-bottom: 17px;
color: #78d8a1;
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.14em;
text-transform: uppercase;
}
.heroCopy h1 {
color: #fff;
font-family: var(--body);
font-size: clamp(3.4rem, 7vw, 6.6rem);
font-weight: 800;
letter-spacing: -0.075em;
line-height: 0.9;
}
.rule {
width: 58px;
height: 3px;
margin: 28px 0 23px;
border-radius: 4px;
background: #61c98c;
}
.heroCopy > p:last-child {
max-width: 530px;
color: rgba(247, 245, 239, 0.77);
font-size: 1.08rem;
line-height: 1.65;
}
.releases { padding: 72px 0 110px; }
.sectionHeading {
display: flex;
align-items: center;
gap: 13px;
margin-bottom: 28px;
}
.sectionIcon {
width: 42px;
height: 42px;
border: 1px solid #8acdae;
border-radius: 50%;
}
.sectionIcon svg { width: 22px; height: 22px; }
.sectionHeading h2 {
color: #12332e;
font-family: var(--body);
font-size: clamp(1.45rem, 2vw, 1.9rem);
font-weight: 750;
letter-spacing: -0.04em;
}
.headingLine {
height: 1px;
flex: 1;
margin-left: 18px;
background: #9ad1b5;
}
.releaseCard {
padding: clamp(28px, 5vw, 58px);
border: 1px solid #d0dbd3;
border-radius: 16px;
background: #fffefa;
box-shadow: 0 18px 55px rgba(14, 51, 42, 0.06);
}
.releaseList {
display: grid;
gap: 22px;
}
.releaseMeta,
.releaseFooter {
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
}
.releaseMeta time {
color: #587069;
font-size: 0.88rem;
font-weight: 600;
}
.releaseMeta span {
padding: 7px 11px;
border: 1px solid #c5d6cd;
border-radius: 7px;
color: #276e51;
font-size: 0.69rem;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.releaseCard h3 {
max-width: 880px;
margin: 27px 0 16px;
color: #12332e;
font-family: var(--body);
font-size: clamp(1.75rem, 4vw, 3rem);
font-weight: 760;
letter-spacing: -0.055em;
line-height: 1.08;
}
.lede {
max-width: 820px;
color: #536762;
font-size: 1.05rem;
line-height: 1.7;
}
.keyPoints {
margin-top: 38px;
padding: 25px 0 27px;
border-top: 1px solid #d8e1da;
border-bottom: 1px solid #d8e1da;
}
.keyPoints h4 {
margin-bottom: 17px;
color: #2b7a58;
font-family: var(--body);
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.13em;
text-transform: uppercase;
}
.keyPoints ul {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px 28px;
}
.keyPoints li {
display: flex;
align-items: flex-start;
gap: 9px;
color: #4a5f59;
font-size: 0.92rem;
line-height: 1.52;
}
.bullet { width: 16px; min-width: 16px; height: 16px; margin-top: 3px; }
.bullet svg { width: 100%; height: 100%; }
.releaseFooter { padding-top: 24px; }
.releaseFooter p {
color: #697b75;
font-size: 0.84rem;
}
.releaseFooter strong { color: #347c5b; }
.releaseLink {
display: inline-flex;
align-items: center;
gap: 10px;
color: #236f50;
font-size: 0.9rem;
font-weight: 750;
}
.releaseLink span { font-size: 1.2rem; transition: transform 160ms ease; }
.releaseLink:hover span { transform: translateX(4px); }
@media (max-width: 640px) {
.hero { min-height: 390px; }
.heroInner, .content { width: min(100% - 32px, 1180px); }
.nav { padding: 19px 0; }
.navLinks { gap: 14px; }
.navLinks a { font-size: 0.75rem; }
.navLinks a:first-child { display: none; }
.heroCopy { padding: 62px 0 68px; }
.releases { padding: 48px 0 72px; }
.headingLine { display: none; }
.releaseMeta, .releaseFooter { align-items: flex-start; flex-direction: column; }
.releaseMeta { gap: 12px; }
.keyPoints ul { grid-template-columns: 1fr; }
}

View File

@@ -24,6 +24,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
changeFrequency: 'monthly',
priority: 0.5,
},
{
url: `${baseUrl}/press`,
lastModified: new Date('2026-07-29'),
changeFrequency: 'monthly',
priority: 0.5,
},
{
url: `${baseUrl}/plant-identifier-app`,
lastModified: new Date('2026-07-10'),