TTikotok V4
This commit is contained in:
388
.playwright-mcp/page-2026-07-10T08-43-38-727Z.yml
Normal file
388
.playwright-mcp/page-2026-07-10T08-43-38-727Z.yml
Normal file
@@ -0,0 +1,388 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e2]:
|
||||
- navigation [ref=e3]:
|
||||
- generic [ref=e4]:
|
||||
- link "GreenLens Home" [ref=e5] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=e6]:
|
||||
- link "Funktionen" [ref=e7] [cursor=pointer]:
|
||||
- /url: "#advantage"
|
||||
- link "Technologie" [ref=e8] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- link "FAQ" [ref=e9] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- link "So funktioniert es" [ref=e10] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- link "Support" [ref=e11] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- group "Language selector" [ref=e13]:
|
||||
- link "DE" [ref=e14] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "EN" [ref=e15] [cursor=pointer]:
|
||||
- /url: /en
|
||||
- link "ES" [ref=e16] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "App laden" [ref=e18] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- main [ref=e19]:
|
||||
- generic [ref=e20]:
|
||||
- generic [ref=e21]:
|
||||
- generic [ref=e22]: KI-Pflanzenerkennung
|
||||
- heading "Gieß-Erinnerung App" [level=1] [ref=e23]
|
||||
- paragraph [ref=e24]: Nie wieder Gießen vergessen — Erinnerungen, die zu jeder Pflanze passen.
|
||||
- paragraph [ref=e25]: GreenLens ist eine Gieß-Erinnerung App für iOS und Android. Pflanze scannen, und die App legt automatisch einen Gießplan mit Push-Erinnerung an — abgestimmt auf Art, Standort und Jahreszeit statt auf einen starren Timer.
|
||||
- generic [ref=e26]:
|
||||
- link "App laden" [ref=e27] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- link "So funktioniert es" [ref=e28] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- generic [ref=e29]:
|
||||
- generic [ref=e30]:
|
||||
- generic [ref=e31]: KI-gestützt
|
||||
- generic [ref=e32]: Sofortige Analyse
|
||||
- generic [ref=e33]:
|
||||
- generic [ref=e34]: Ganzheitlich
|
||||
- generic [ref=e35]: Erkennung & Pflegeplan
|
||||
- generic [ref=e37]:
|
||||
- img "Smartphone scannt eine Lotusblüte" [ref=e38]
|
||||
- generic [ref=e41]:
|
||||
- generic [ref=e42]: Indische Lotosblume
|
||||
- generic [ref=e43]: Erkannt in 0,8s
|
||||
- generic [ref=e44]:
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: — Der Vorteil
|
||||
- heading "Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für Pflanzenpflege." [level=2] [ref=e47]
|
||||
- paragraph [ref=e48]: "Eine Gieß-Erinnerung App erinnert dich daran, deine Pflanzen zu gießen, bevor sie vertrocknen oder überwässert werden. GreenLens erstellt die Erinnerung nicht aus einem festen Intervall, sondern aus dem Scan-Ergebnis: Die erkannte Art bestimmt den Wasserbedarf, Standort und Jahreszeit passen den Rhythmus an, und der Gesundheitscheck greift ein, wenn die Pflanze Stresssignale zeigt."
|
||||
- generic [ref=e49]: "Algorithmen aktualisiert: Juli 2026"
|
||||
- generic [ref=e50]:
|
||||
- heading "Wusstest du schon?" [level=3] [ref=e55]
|
||||
- list [ref=e56]:
|
||||
- listitem [ref=e57]:
|
||||
- strong [ref=e58]: Überwässerung ist Todesursache Nr. 1
|
||||
- text: Die meisten Zimmerpflanzen sterben an Wurzelfäule durch zu häufiges Gießen. GreenLens berechnet präzise Trocknungszeiten.
|
||||
- listitem [ref=e59]:
|
||||
- strong [ref=e60]: Lichtintensität fällt rasant ab
|
||||
- text: Schon 1 Meter vom Fenster entfernt sinkt die Lichtintensität um 50 %. Pflegehinweise berücksichtigen den Standort.
|
||||
- listitem [ref=e61]:
|
||||
- strong [ref=e62]: Pflanzen reinigen die Raumluft
|
||||
- text: Bestimmte Arten können einen Großteil der Schadstoffe aus der Luft filtern. GreenLens hebt luftreinigende Pflanzen hervor.
|
||||
- generic [ref=e64]:
|
||||
- generic [ref=e65]:
|
||||
- generic [ref=e66]: — Die Technologie
|
||||
- heading "Unsere Methodik" [level=2] [ref=e67]
|
||||
- paragraph [ref=e68]: Wie GreenLens aus einem einfachen Handyfoto eine vollständige botanische Analyse macht.
|
||||
- generic [ref=e69]:
|
||||
- generic [ref=e70]:
|
||||
- generic [ref=e71]: "1"
|
||||
- heading "Bildaufnahme" [level=3] [ref=e72]
|
||||
- paragraph [ref=e73]: Die hochauflösende Aufnahme analysiert Blattmorphologie, Blattadern und Stängelstruktur. Unscharfe Bilder werden aussortiert.
|
||||
- generic [ref=e74]:
|
||||
- generic [ref=e75]: "2"
|
||||
- heading "Merkmals-Extraktion" [level=3] [ref=e76]
|
||||
- paragraph [ref=e77]: Das neuronale Netz isoliert über 120 spezifische Merkmale und vergleicht sie mit einer umfangreichen botanischen Datenbank.
|
||||
- generic [ref=e78]:
|
||||
- generic [ref=e79]: "3"
|
||||
- heading "Diagnose" [level=3] [ref=e80]
|
||||
- paragraph [ref=e81]: Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welke — basierend auf typischen Krankheiten der jeweiligen Art.
|
||||
- generic [ref=e82]:
|
||||
- generic [ref=e83]: "4"
|
||||
- heading "Plan-Erstellung" [level=3] [ref=e84]
|
||||
- paragraph [ref=e85]: Aus Erkennung und Gesundheitszustand entsteht ein individueller Pflegeplan, angepasst an Standort und Lichtverhältnisse.
|
||||
- generic [ref=e87]:
|
||||
- generic [ref=e89]:
|
||||
- generic [ref=e90]: — Im Vergleich
|
||||
- heading "GreenLens vs. Timer- und Kalender-Erinnerungen" [level=2] [ref=e91]
|
||||
- paragraph [ref=e92]: "Warum ernsthafte Pflanzenfans auf unsere Plattform statt auf Standard-Erkennungstools setzen: verwertbare Daten statt bloßer Namen."
|
||||
- generic [ref=e93]:
|
||||
- heading "Botanik-Tipp" [level=4] [ref=e94]
|
||||
- paragraph [ref=e95]: Regelmäßige Pflege ist besser als seltene Intensiv-Pflege. Nutze Erinnerungen für eine gute Routine.
|
||||
- link "Pflanzen Pflege App →" [ref=e96] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- generic [ref=e97]:
|
||||
- generic [ref=e98]:
|
||||
- generic [ref=e99]:
|
||||
- heading "Gießerinnerung einrichten" [level=3] [ref=e104]
|
||||
- generic [ref=e105]: GreenLens
|
||||
- paragraph [ref=e106]: Pflanze scannen — der Gießplan mit Erinnerung wird automatisch aus der erkannten Art erstellt.
|
||||
- generic [ref=e107]:
|
||||
- generic [ref=e108]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e109]: Intervall selbst recherchieren und für jede Pflanze manuell eintragen.
|
||||
- generic [ref=e110]:
|
||||
- generic [ref=e111]:
|
||||
- heading "Gießintervall" [level=3] [ref=e116]
|
||||
- generic [ref=e117]: GreenLens
|
||||
- paragraph [ref=e118]: Passt sich an Pflanzenart, Standort, Licht und Jahreszeit an — Sukkulente und Monstera bekommen unterschiedliche Rhythmen.
|
||||
- generic [ref=e119]:
|
||||
- generic [ref=e120]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e121]: Festes Intervall (z.B. alle 7 Tage), unabhängig davon, was die Pflanze braucht.
|
||||
- generic [ref=e122]:
|
||||
- generic [ref=e123]:
|
||||
- heading "Mehrere Pflanzen" [level=3] [ref=e128]
|
||||
- generic [ref=e129]: GreenLens
|
||||
- paragraph [ref=e130]: Jede Pflanze hat ein eigenes Profil mit Foto, Notizen und eigener Erinnerung.
|
||||
- generic [ref=e131]:
|
||||
- generic [ref=e132]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e133]: Eine lange Erinnerungsliste ohne Pflanzenkontext — leicht zu verwechseln.
|
||||
- generic [ref=e134]:
|
||||
- generic [ref=e135]:
|
||||
- heading "Überwässerung" [level=3] [ref=e140]
|
||||
- generic [ref=e141]: GreenLens
|
||||
- paragraph [ref=e142]: Gesundheitscheck erkennt Überwässerungssymptome und passt die Empfehlung an, statt stur weiter zu erinnern.
|
||||
- generic [ref=e143]:
|
||||
- generic [ref=e144]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e145]: Der Timer läuft weiter, auch wenn die Pflanze bereits zu nass steht.
|
||||
- generic [ref=e146]:
|
||||
- generic [ref=e147]:
|
||||
- heading "Mehr als Gießen" [level=3] [ref=e152]
|
||||
- generic [ref=e153]: GreenLens
|
||||
- paragraph [ref=e154]: Erinnert auch an Düngen und Umtopfen — abgestimmt auf die erkannte Art.
|
||||
- generic [ref=e155]:
|
||||
- generic [ref=e156]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e157]: Jede weitere Erinnerung muss separat angelegt und gepflegt werden.
|
||||
- generic [ref=e159]:
|
||||
- article [ref=e160]:
|
||||
- generic [ref=e161]: So funktioniert es
|
||||
- heading "Vom Scan zur Gießerinnerung in unter einer Minute." [level=2] [ref=e162]
|
||||
- paragraph [ref=e163]: Statt Gießintervalle zu googeln und manuell einzutragen, scannst du die Pflanze einmal. GreenLens erkennt die Art, legt ein Profil an und erstellt daraus den Gießplan mit Push-Erinnerung — für jede Pflanze einzeln.
|
||||
- list [ref=e164]:
|
||||
- listitem [ref=e165]:
|
||||
- generic [ref=e169]: Pflanze fotografieren — Art und Wasserbedarf werden automatisch erkannt.
|
||||
- listitem [ref=e170]:
|
||||
- generic [ref=e174]: Gießplan pro Pflanze, angepasst an Standort, Licht und Jahreszeit.
|
||||
- listitem [ref=e175]:
|
||||
- generic [ref=e179]: Push-Erinnerung, wenn eine Pflanze dran ist — mit Foto, damit nichts verwechselt wird.
|
||||
- article [ref=e180]:
|
||||
- generic [ref=e181]: Zu viel oder zu wenig
|
||||
- heading "Die Erinnerung, die auch vor Überwässerung schützt." [level=2] [ref=e182]
|
||||
- paragraph [ref=e183]: Die meisten Zimmerpflanzen sterben nicht am Vergessen, sondern am zu häufigen Gießen. Zeigt eine Pflanze gelbe Blätter oder weiche Stiele, prüfst du sie mit dem Gesundheitscheck — GreenLens erkennt Überwässerung und passt die Empfehlung an, statt die nächste Erinnerung zu erzwingen.
|
||||
- article [ref=e184]:
|
||||
- generic [ref=e185]: Urlaub und Alltag
|
||||
- heading "Gießerinnerungen, die deinen Rhythmus mitmachen." [level=2] [ref=e186]
|
||||
- paragraph [ref=e187]: "Ob Urlaubsvorbereitung, Umzug ans andere Fenster oder Winterruhe: Gießintervalle lassen sich pro Pflanze jederzeit anpassen. Die Pflegehistorie zeigt dir, wann zuletzt gegossen wurde — auch wenn mehrere Personen im Haushalt gießen."
|
||||
- generic [ref=e188]:
|
||||
- article [ref=e189]:
|
||||
- generic [ref=e190]: Passt gut
|
||||
- heading "Wähle GreenLens, wenn:" [level=2] [ref=e191]
|
||||
- list [ref=e192]:
|
||||
- listitem [ref=e193]:
|
||||
- generic [ref=e197]: Du vergisst regelmäßig das Gießen und willst Push-Erinnerungen pro Pflanze statt eines Standard-Timers.
|
||||
- listitem [ref=e198]:
|
||||
- generic [ref=e202]: Du hast Pflanzen mit unterschiedlichem Wasserbedarf — Sukkulenten, Zimmerpflanzen, Balkonkästen — und willst sie getrennt verwalten.
|
||||
- listitem [ref=e203]:
|
||||
- generic [ref=e207]: Du willst, dass die Erinnerung sich anpasst, wenn eine Pflanze gestresst aussieht, statt blind weiterzulaufen.
|
||||
- article [ref=e208]:
|
||||
- generic [ref=e209]: Nicht ideal
|
||||
- heading "GreenLens ist nicht die richtige Wahl, wenn:" [level=2] [ref=e210]
|
||||
- list [ref=e211]:
|
||||
- listitem [ref=e212]:
|
||||
- generic [ref=e213]: –
|
||||
- generic [ref=e214]: Du hast nur eine einzige robuste Pflanze und ein Wecker reicht dir völlig.
|
||||
- listitem [ref=e215]:
|
||||
- generic [ref=e216]: –
|
||||
- generic [ref=e217]: Du suchst Bewässerungssteuerung für Sensoren oder automatische Bewässerungssysteme — GreenLens arbeitet mit Erinnerungen, nicht mit Hardware.
|
||||
- generic [ref=e219]:
|
||||
- heading "Häufige Fragen" [level=2] [ref=e221]
|
||||
- generic [ref=e222]:
|
||||
- generic [ref=e223]:
|
||||
- heading "Welche App erinnert mich ans Pflanzen gießen?" [level=3] [ref=e224]
|
||||
- paragraph [ref=e225]: GreenLens erinnert dich per Push-Nachricht ans Gießen — für jede Pflanze einzeln. Nach dem Scan wird der Gießplan automatisch aus der erkannten Art erstellt und an Standort und Jahreszeit angepasst.
|
||||
- generic [ref=e226]:
|
||||
- heading "Ist die Gieß-Erinnerung in GreenLens kostenlos?" [level=3] [ref=e227]
|
||||
- paragraph [ref=e228]: Ja. Pflanzensammlung, Gießpläne und Gieß-Erinnerungen sind in der kostenlosen Version enthalten. Kostenpflichtig sind nur erweiterte KI-Gesundheitschecks und unbegrenzte Scans.
|
||||
- generic [ref=e229]:
|
||||
- heading "Woher weiß die App, wie oft meine Pflanze Wasser braucht?" [level=3] [ref=e230]
|
||||
- paragraph [ref=e231]: Beim Scan erkennt GreenLens die Pflanzenart und leitet daraus den Wasserbedarf ab. Der Gießplan berücksichtigt zusätzlich Standort, Licht und Jahreszeit — eine Sukkulente am Südfenster bekommt einen anderen Rhythmus als ein Farn im Bad.
|
||||
- generic [ref=e232]:
|
||||
- heading "Kann ich für jede Pflanze eine eigene Gießerinnerung einstellen?" [level=3] [ref=e233]
|
||||
- paragraph [ref=e234]: Ja. Jede gespeicherte Pflanze hat ein eigenes Profil mit Foto, Notizen und eigenem Gießintervall. Du kannst jedes Intervall manuell anpassen, wenn du es anders willst als vorgeschlagen.
|
||||
- generic [ref=e235]:
|
||||
- heading "Erinnert die App auch an Düngen und Umtopfen?" [level=3] [ref=e236]
|
||||
- paragraph [ref=e237]: Ja. GreenLens-Pflegepläne umfassen Gießen, Düngen und Umtopfen. Jeder Erinnerungstyp lässt sich pro Pflanze einzeln aktivieren und anpassen.
|
||||
- generic [ref=e238]:
|
||||
- heading "Was passiert, wenn ich eine Gießerinnerung verpasse?" [level=3] [ref=e239]
|
||||
- paragraph [ref=e240]: Die Erinnerung bleibt offen, bis du das Gießen bestätigst — nichts verschiebt sich stillschweigend. Die Pflegehistorie zeigt dir jederzeit, wann jede Pflanze zuletzt gegossen wurde.
|
||||
- generic [ref=e241]:
|
||||
- heading "Hilft die App auch gegen Überwässerung?" [level=3] [ref=e242]
|
||||
- paragraph [ref=e243]: Ja. Überwässerung ist die häufigste Todesursache bei Zimmerpflanzen. Zeigt eine Pflanze weiche Stiele oder gelbe Blätter, erkennt der GreenLens-Gesundheitscheck Überwässerung und empfiehlt eine Gießpause, statt weiter zu erinnern.
|
||||
- generic [ref=e244]:
|
||||
- heading "Funktioniert die Gieß-Erinnerung auch für Balkon- und Gartenpflanzen?" [level=3] [ref=e245]
|
||||
- paragraph [ref=e246]: Ja. GreenLens unterstützt Innen- und Außenpflanzen. Balkonkästen und Gartenpflanzen bekommen eigene Profile mit Intervallen, die zur Saison passen.
|
||||
- generic [ref=e247]:
|
||||
- heading "Brauche ich für die Erinnerungen eine Internetverbindung?" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: Nein. Scannen erfordert eine Verbindung, aber deine Pflanzensammlung, Gießpläne und Erinnerungen funktionieren auch offline.
|
||||
- generic [ref=e250]:
|
||||
- generic [ref=e251]:
|
||||
- generic [ref=e252]: Verwandt
|
||||
- heading "Weitere Guides" [level=2] [ref=e253]
|
||||
- generic [ref=e254]:
|
||||
- link [ref=e255] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- heading "Pflanzen Pflege App" [level=3] [ref=e256]
|
||||
- paragraph [ref=e257]: "Der komplette Pflegeplan: Gießen, Düngen, Standort und Gesundheitscheck in einer App."
|
||||
- link [ref=e258] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- heading "Pflanzen bestimmen" [level=3] [ref=e259]
|
||||
- paragraph [ref=e260]: Pflanze per Foto bestimmen — die Grundlage für den automatischen Gießplan.
|
||||
- link [ref=e261] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- heading "Zimmerpflanzen bestimmen" [level=3] [ref=e262]
|
||||
- paragraph [ref=e263]: Zimmerpflanzen erkennen und direkt passende Gießerinnerungen einrichten.
|
||||
- link [ref=e264] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- heading "Pflanzenkrankheiten erkennen" [level=3] [ref=e265]
|
||||
- paragraph [ref=e266]: Gelbe Blätter trotz Gießplan? Symptome per Foto analysieren.
|
||||
- contentinfo [ref=e267]:
|
||||
- generic [ref=e268]:
|
||||
- generic [ref=e269]:
|
||||
- generic [ref=e270]:
|
||||
- generic [ref=e271]: Download
|
||||
- heading "Bereit für bessere Pflanzenpflege?" [level=2] [ref=e272]: Bereit fürbesserePflanzenpflege?
|
||||
- paragraph [ref=e273]: GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Bei Fragen erreichst du uns über die Support-Seite.
|
||||
- link [ref=e275] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e276]
|
||||
- paragraph [ref=e277]:
|
||||
- text: Die App ist in den Stores verfügbar.
|
||||
- link "Support" [ref=e278] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- img "GreenLens" [ref=e280]
|
||||
- generic [ref=e282]:
|
||||
- generic [ref=e283]:
|
||||
- heading "GREENLENS" [level=3] [ref=e284]
|
||||
- paragraph [ref=e285]: Die App für Pflanzenfans, die Analyse, Erkennung und Pflege an einem Ort vereint.
|
||||
- generic [ref=e286]:
|
||||
- heading "Produkt" [level=4] [ref=e287]
|
||||
- list [ref=e288]:
|
||||
- listitem [ref=e289]:
|
||||
- link "Funktionen" [ref=e290] [cursor=pointer]:
|
||||
- /url: "#advantage"
|
||||
- listitem [ref=e291]:
|
||||
- link "Technologie" [ref=e292] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=e293]:
|
||||
- link "App laden" [ref=e294] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- listitem [ref=e295]:
|
||||
- link "Support" [ref=e296] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e297]:
|
||||
- heading "Unternehmen" [level=4] [ref=e298]
|
||||
- list [ref=e299]:
|
||||
- listitem [ref=e300]:
|
||||
- link "So funktioniert es" [ref=e301] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=e302]:
|
||||
- link "FAQ" [ref=e303] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- listitem [ref=e304]:
|
||||
- link "Support" [ref=e305] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e306]:
|
||||
- heading "Rechtliches" [level=4] [ref=e307]
|
||||
- list [ref=e308]:
|
||||
- listitem [ref=e309]:
|
||||
- link "Impressum" [ref=e310] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- listitem [ref=e311]:
|
||||
- link "Datenschutz" [ref=e312] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- listitem [ref=e313]:
|
||||
- link "Nutzungsbedingungen" [ref=e314] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=e315]:
|
||||
- generic [ref=e316]:
|
||||
- heading "Use Cases" [level=4] [ref=e317]
|
||||
- list [ref=e318]:
|
||||
- listitem [ref=e319]:
|
||||
- link "Best Plant Identification App" [ref=e320] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- listitem [ref=e321]:
|
||||
- link "Plant Identifier App" [ref=e322] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- listitem [ref=e323]:
|
||||
- link "Plant Scanner" [ref=e324] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- listitem [ref=e325]:
|
||||
- link "Flower Scanner" [ref=e326] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- listitem [ref=e327]:
|
||||
- link "Houseplant Identifier" [ref=e328] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- listitem [ref=e329]:
|
||||
- link "Succulent Identifier" [ref=e330] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- listitem [ref=e331]:
|
||||
- link "Identify Plant by Photo" [ref=e332] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- listitem [ref=e333]:
|
||||
- link "Plant Disease Identifier" [ref=e334] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- listitem [ref=e335]:
|
||||
- link "Plant Health App" [ref=e336] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- listitem [ref=e337]:
|
||||
- link "Plant Care App" [ref=e338] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- listitem [ref=e339]:
|
||||
- link "vs PictureThis" [ref=e340] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- listitem [ref=e341]:
|
||||
- link "vs Plantum" [ref=e342] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- listitem [ref=e343]:
|
||||
- link "vs iNaturalist" [ref=e344] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- listitem [ref=e345]:
|
||||
- link "vs Google Lens" [ref=e346] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=e347]:
|
||||
- heading "Pflanzen erkennen" [level=4] [ref=e348]
|
||||
- list [ref=e349]:
|
||||
- listitem [ref=e350]:
|
||||
- link "Pflanzen erkennen kostenlos" [ref=e351] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- listitem [ref=e352]:
|
||||
- link "Pflanzen erkennen App" [ref=e353] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- listitem [ref=e354]:
|
||||
- link "Pflanzen bestimmen per Foto" [ref=e355] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- listitem [ref=e356]:
|
||||
- link "Blumen Scanner kostenlos" [ref=e357] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- listitem [ref=e358]:
|
||||
- link "Zimmerpflanzen bestimmen" [ref=e359] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- listitem [ref=e360]:
|
||||
- link "Pflanzen Pflege App" [ref=e361] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- listitem [ref=e362]:
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=e363] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- listitem [ref=e364]:
|
||||
- link "Gieß-Erinnerung App" [ref=e365] [cursor=pointer]:
|
||||
- /url: /giess-erinnerung-app
|
||||
- generic [ref=e366]:
|
||||
- heading "En español" [level=4] [ref=e367]
|
||||
- list [ref=e368]:
|
||||
- listitem [ref=e369]:
|
||||
- link "Identificador de plantas" [ref=e370] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- listitem [ref=e371]:
|
||||
- link "App para cuidar plantas" [ref=e372] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- listitem [ref=e373]:
|
||||
- link "Diagnosticar enfermedades de plantas" [ref=e374] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- listitem [ref=e375]:
|
||||
- link "Escaner de plantas" [ref=e376] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- listitem [ref=e377]:
|
||||
- link "GreenLens vs Google Lens para plantas" [ref=e378] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=e379]: GREENLENS
|
||||
- generic [ref=e381]:
|
||||
- paragraph [ref=e382]: © 2026 GreenLens. Alle Rechte vorbehalten.
|
||||
- generic [ref=e383]: GREENLENS
|
||||
- alert [ref=e384]
|
||||
372
.playwright-mcp/page-2026-07-10T08-46-57-250Z.yml
Normal file
372
.playwright-mcp/page-2026-07-10T08-46-57-250Z.yml
Normal file
@@ -0,0 +1,372 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e2]:
|
||||
- navigation [ref=e3]:
|
||||
- generic [ref=e4]:
|
||||
- link "GreenLens Home" [ref=e5] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=e6]:
|
||||
- link "App laden" [ref=e7] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- button "Open menu" [ref=e8] [cursor=pointer]
|
||||
- main [ref=e11]:
|
||||
- generic [ref=e12]:
|
||||
- generic [ref=e13]:
|
||||
- generic [ref=e14]: KI-Pflanzenerkennung
|
||||
- heading "Gieß-Erinnerung App" [level=1] [ref=e15]
|
||||
- paragraph [ref=e16]: Nie wieder Gießen vergessen — Erinnerungen, die zu jeder Pflanze passen.
|
||||
- paragraph [ref=e17]: GreenLens ist eine Gieß-Erinnerung App für iOS und Android. Pflanze scannen, und die App legt automatisch einen Gießplan mit Push-Erinnerung an — abgestimmt auf Art, Standort und Jahreszeit statt auf einen starren Timer.
|
||||
- generic [ref=e18]:
|
||||
- link "App laden" [ref=e19] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- link "So funktioniert es" [ref=e20] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- generic [ref=e21]:
|
||||
- generic [ref=e22]:
|
||||
- generic [ref=e23]: KI-gestützt
|
||||
- generic [ref=e24]: Sofortige Analyse
|
||||
- generic [ref=e25]:
|
||||
- generic [ref=e26]: Ganzheitlich
|
||||
- generic [ref=e27]: Erkennung & Pflegeplan
|
||||
- generic [ref=e29]:
|
||||
- img "Smartphone scannt eine Lotusblüte" [ref=e30]
|
||||
- generic [ref=e33]:
|
||||
- generic [ref=e34]: Indische Lotosblume
|
||||
- generic [ref=e35]: Erkannt in 0,8s
|
||||
- generic [ref=e36]:
|
||||
- generic [ref=e37]:
|
||||
- generic [ref=e38]: — Der Vorteil
|
||||
- heading "Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für Pflanzenpflege." [level=2] [ref=e39]
|
||||
- paragraph [ref=e40]: "Eine Gieß-Erinnerung App erinnert dich daran, deine Pflanzen zu gießen, bevor sie vertrocknen oder überwässert werden. GreenLens erstellt die Erinnerung nicht aus einem festen Intervall, sondern aus dem Scan-Ergebnis: Die erkannte Art bestimmt den Wasserbedarf, Standort und Jahreszeit passen den Rhythmus an, und der Gesundheitscheck greift ein, wenn die Pflanze Stresssignale zeigt."
|
||||
- generic [ref=e41]: "Algorithmen aktualisiert: Juli 2026"
|
||||
- generic [ref=e42]:
|
||||
- heading "Wusstest du schon?" [level=3] [ref=e47]
|
||||
- list [ref=e48]:
|
||||
- listitem [ref=e49]:
|
||||
- strong [ref=e50]: Überwässerung ist Todesursache Nr. 1
|
||||
- text: Die meisten Zimmerpflanzen sterben an Wurzelfäule durch zu häufiges Gießen. GreenLens berechnet präzise Trocknungszeiten.
|
||||
- listitem [ref=e51]:
|
||||
- strong [ref=e52]: Lichtintensität fällt rasant ab
|
||||
- text: Schon 1 Meter vom Fenster entfernt sinkt die Lichtintensität um 50 %. Pflegehinweise berücksichtigen den Standort.
|
||||
- listitem [ref=e53]:
|
||||
- strong [ref=e54]: Pflanzen reinigen die Raumluft
|
||||
- text: Bestimmte Arten können einen Großteil der Schadstoffe aus der Luft filtern. GreenLens hebt luftreinigende Pflanzen hervor.
|
||||
- generic [ref=e56]:
|
||||
- generic [ref=e57]:
|
||||
- generic [ref=e58]: — Die Technologie
|
||||
- heading "Unsere Methodik" [level=2] [ref=e59]
|
||||
- paragraph [ref=e60]: Wie GreenLens aus einem einfachen Handyfoto eine vollständige botanische Analyse macht.
|
||||
- generic [ref=e61]:
|
||||
- generic [ref=e62]:
|
||||
- generic [ref=e63]: "1"
|
||||
- heading "Bildaufnahme" [level=3] [ref=e64]
|
||||
- paragraph [ref=e65]: Die hochauflösende Aufnahme analysiert Blattmorphologie, Blattadern und Stängelstruktur. Unscharfe Bilder werden aussortiert.
|
||||
- generic [ref=e66]:
|
||||
- generic [ref=e67]: "2"
|
||||
- heading "Merkmals-Extraktion" [level=3] [ref=e68]
|
||||
- paragraph [ref=e69]: Das neuronale Netz isoliert über 120 spezifische Merkmale und vergleicht sie mit einer umfangreichen botanischen Datenbank.
|
||||
- generic [ref=e70]:
|
||||
- generic [ref=e71]: "3"
|
||||
- heading "Diagnose" [level=3] [ref=e72]
|
||||
- paragraph [ref=e73]: Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welke — basierend auf typischen Krankheiten der jeweiligen Art.
|
||||
- generic [ref=e74]:
|
||||
- generic [ref=e75]: "4"
|
||||
- heading "Plan-Erstellung" [level=3] [ref=e76]
|
||||
- paragraph [ref=e77]: Aus Erkennung und Gesundheitszustand entsteht ein individueller Pflegeplan, angepasst an Standort und Lichtverhältnisse.
|
||||
- generic [ref=e79]:
|
||||
- generic [ref=e81]:
|
||||
- generic [ref=e82]: — Im Vergleich
|
||||
- heading "GreenLens vs. Timer- und Kalender-Erinnerungen" [level=2] [ref=e83]
|
||||
- paragraph [ref=e84]: "Warum ernsthafte Pflanzenfans auf unsere Plattform statt auf Standard-Erkennungstools setzen: verwertbare Daten statt bloßer Namen."
|
||||
- generic [ref=e85]:
|
||||
- heading "Botanik-Tipp" [level=4] [ref=e86]
|
||||
- paragraph [ref=e87]: Regelmäßige Pflege ist besser als seltene Intensiv-Pflege. Nutze Erinnerungen für eine gute Routine.
|
||||
- link "Pflanzen Pflege App →" [ref=e88] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- generic [ref=e89]:
|
||||
- generic [ref=e90]:
|
||||
- generic [ref=e91]:
|
||||
- heading "Gießerinnerung einrichten" [level=3] [ref=e96]
|
||||
- generic [ref=e97]: GreenLens
|
||||
- paragraph [ref=e98]: Pflanze scannen — der Gießplan mit Erinnerung wird automatisch aus der erkannten Art erstellt.
|
||||
- generic [ref=e99]:
|
||||
- generic [ref=e100]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e101]: Intervall selbst recherchieren und für jede Pflanze manuell eintragen.
|
||||
- generic [ref=e102]:
|
||||
- generic [ref=e103]:
|
||||
- heading "Gießintervall" [level=3] [ref=e108]
|
||||
- generic [ref=e109]: GreenLens
|
||||
- paragraph [ref=e110]: Passt sich an Pflanzenart, Standort, Licht und Jahreszeit an — Sukkulente und Monstera bekommen unterschiedliche Rhythmen.
|
||||
- generic [ref=e111]:
|
||||
- generic [ref=e112]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e113]: Festes Intervall (z.B. alle 7 Tage), unabhängig davon, was die Pflanze braucht.
|
||||
- generic [ref=e114]:
|
||||
- generic [ref=e115]:
|
||||
- heading "Mehrere Pflanzen" [level=3] [ref=e120]
|
||||
- generic [ref=e121]: GreenLens
|
||||
- paragraph [ref=e122]: Jede Pflanze hat ein eigenes Profil mit Foto, Notizen und eigener Erinnerung.
|
||||
- generic [ref=e123]:
|
||||
- generic [ref=e124]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e125]: Eine lange Erinnerungsliste ohne Pflanzenkontext — leicht zu verwechseln.
|
||||
- generic [ref=e126]:
|
||||
- generic [ref=e127]:
|
||||
- heading "Überwässerung" [level=3] [ref=e132]
|
||||
- generic [ref=e133]: GreenLens
|
||||
- paragraph [ref=e134]: Gesundheitscheck erkennt Überwässerungssymptome und passt die Empfehlung an, statt stur weiter zu erinnern.
|
||||
- generic [ref=e135]:
|
||||
- generic [ref=e136]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e137]: Der Timer läuft weiter, auch wenn die Pflanze bereits zu nass steht.
|
||||
- generic [ref=e138]:
|
||||
- generic [ref=e139]:
|
||||
- heading "Mehr als Gießen" [level=3] [ref=e144]
|
||||
- generic [ref=e145]: GreenLens
|
||||
- paragraph [ref=e146]: Erinnert auch an Düngen und Umtopfen — abgestimmt auf die erkannte Art.
|
||||
- generic [ref=e147]:
|
||||
- generic [ref=e148]: Timer- und Kalender-Apps
|
||||
- paragraph [ref=e149]: Jede weitere Erinnerung muss separat angelegt und gepflegt werden.
|
||||
- generic [ref=e151]:
|
||||
- article [ref=e152]:
|
||||
- generic [ref=e153]: So funktioniert es
|
||||
- heading "Vom Scan zur Gießerinnerung in unter einer Minute." [level=2] [ref=e154]
|
||||
- paragraph [ref=e155]: Statt Gießintervalle zu googeln und manuell einzutragen, scannst du die Pflanze einmal. GreenLens erkennt die Art, legt ein Profil an und erstellt daraus den Gießplan mit Push-Erinnerung — für jede Pflanze einzeln.
|
||||
- list [ref=e156]:
|
||||
- listitem [ref=e157]:
|
||||
- generic [ref=e161]: Pflanze fotografieren — Art und Wasserbedarf werden automatisch erkannt.
|
||||
- listitem [ref=e162]:
|
||||
- generic [ref=e166]: Gießplan pro Pflanze, angepasst an Standort, Licht und Jahreszeit.
|
||||
- listitem [ref=e167]:
|
||||
- generic [ref=e171]: Push-Erinnerung, wenn eine Pflanze dran ist — mit Foto, damit nichts verwechselt wird.
|
||||
- article [ref=e172]:
|
||||
- generic [ref=e173]: Zu viel oder zu wenig
|
||||
- heading "Die Erinnerung, die auch vor Überwässerung schützt." [level=2] [ref=e174]
|
||||
- paragraph [ref=e175]: Die meisten Zimmerpflanzen sterben nicht am Vergessen, sondern am zu häufigen Gießen. Zeigt eine Pflanze gelbe Blätter oder weiche Stiele, prüfst du sie mit dem Gesundheitscheck — GreenLens erkennt Überwässerung und passt die Empfehlung an, statt die nächste Erinnerung zu erzwingen.
|
||||
- article [ref=e176]:
|
||||
- generic [ref=e177]: Urlaub und Alltag
|
||||
- heading "Gießerinnerungen, die deinen Rhythmus mitmachen." [level=2] [ref=e178]
|
||||
- paragraph [ref=e179]: "Ob Urlaubsvorbereitung, Umzug ans andere Fenster oder Winterruhe: Gießintervalle lassen sich pro Pflanze jederzeit anpassen. Die Pflegehistorie zeigt dir, wann zuletzt gegossen wurde — auch wenn mehrere Personen im Haushalt gießen."
|
||||
- generic [ref=e180]:
|
||||
- article [ref=e181]:
|
||||
- generic [ref=e182]: Passt gut
|
||||
- heading "Wähle GreenLens, wenn:" [level=2] [ref=e183]
|
||||
- list [ref=e184]:
|
||||
- listitem [ref=e185]:
|
||||
- generic [ref=e189]: Du vergisst regelmäßig das Gießen und willst Push-Erinnerungen pro Pflanze statt eines Standard-Timers.
|
||||
- listitem [ref=e190]:
|
||||
- generic [ref=e194]: Du hast Pflanzen mit unterschiedlichem Wasserbedarf — Sukkulenten, Zimmerpflanzen, Balkonkästen — und willst sie getrennt verwalten.
|
||||
- listitem [ref=e195]:
|
||||
- generic [ref=e199]: Du willst, dass die Erinnerung sich anpasst, wenn eine Pflanze gestresst aussieht, statt blind weiterzulaufen.
|
||||
- article [ref=e200]:
|
||||
- generic [ref=e201]: Nicht ideal
|
||||
- heading "GreenLens ist nicht die richtige Wahl, wenn:" [level=2] [ref=e202]
|
||||
- list [ref=e203]:
|
||||
- listitem [ref=e204]:
|
||||
- generic [ref=e205]: –
|
||||
- generic [ref=e206]: Du hast nur eine einzige robuste Pflanze und ein Wecker reicht dir völlig.
|
||||
- listitem [ref=e207]:
|
||||
- generic [ref=e208]: –
|
||||
- generic [ref=e209]: Du suchst Bewässerungssteuerung für Sensoren oder automatische Bewässerungssysteme — GreenLens arbeitet mit Erinnerungen, nicht mit Hardware.
|
||||
- generic [ref=e211]:
|
||||
- heading "Häufige Fragen" [level=2] [ref=e213]
|
||||
- generic [ref=e214]:
|
||||
- generic [ref=e215]:
|
||||
- heading "Welche App erinnert mich ans Pflanzen gießen?" [level=3] [ref=e216]
|
||||
- paragraph [ref=e217]: GreenLens erinnert dich per Push-Nachricht ans Gießen — für jede Pflanze einzeln. Nach dem Scan wird der Gießplan automatisch aus der erkannten Art erstellt und an Standort und Jahreszeit angepasst.
|
||||
- generic [ref=e218]:
|
||||
- heading "Ist die Gieß-Erinnerung in GreenLens kostenlos?" [level=3] [ref=e219]
|
||||
- paragraph [ref=e220]: Ja. Pflanzensammlung, Gießpläne und Gieß-Erinnerungen sind in der kostenlosen Version enthalten. Kostenpflichtig sind nur erweiterte KI-Gesundheitschecks und unbegrenzte Scans.
|
||||
- generic [ref=e221]:
|
||||
- heading "Woher weiß die App, wie oft meine Pflanze Wasser braucht?" [level=3] [ref=e222]
|
||||
- paragraph [ref=e223]: Beim Scan erkennt GreenLens die Pflanzenart und leitet daraus den Wasserbedarf ab. Der Gießplan berücksichtigt zusätzlich Standort, Licht und Jahreszeit — eine Sukkulente am Südfenster bekommt einen anderen Rhythmus als ein Farn im Bad.
|
||||
- generic [ref=e224]:
|
||||
- heading "Kann ich für jede Pflanze eine eigene Gießerinnerung einstellen?" [level=3] [ref=e225]
|
||||
- paragraph [ref=e226]: Ja. Jede gespeicherte Pflanze hat ein eigenes Profil mit Foto, Notizen und eigenem Gießintervall. Du kannst jedes Intervall manuell anpassen, wenn du es anders willst als vorgeschlagen.
|
||||
- generic [ref=e227]:
|
||||
- heading "Erinnert die App auch an Düngen und Umtopfen?" [level=3] [ref=e228]
|
||||
- paragraph [ref=e229]: Ja. GreenLens-Pflegepläne umfassen Gießen, Düngen und Umtopfen. Jeder Erinnerungstyp lässt sich pro Pflanze einzeln aktivieren und anpassen.
|
||||
- generic [ref=e230]:
|
||||
- heading "Was passiert, wenn ich eine Gießerinnerung verpasse?" [level=3] [ref=e231]
|
||||
- paragraph [ref=e232]: Die Erinnerung bleibt offen, bis du das Gießen bestätigst — nichts verschiebt sich stillschweigend. Die Pflegehistorie zeigt dir jederzeit, wann jede Pflanze zuletzt gegossen wurde.
|
||||
- generic [ref=e233]:
|
||||
- heading "Hilft die App auch gegen Überwässerung?" [level=3] [ref=e234]
|
||||
- paragraph [ref=e235]: Ja. Überwässerung ist die häufigste Todesursache bei Zimmerpflanzen. Zeigt eine Pflanze weiche Stiele oder gelbe Blätter, erkennt der GreenLens-Gesundheitscheck Überwässerung und empfiehlt eine Gießpause, statt weiter zu erinnern.
|
||||
- generic [ref=e236]:
|
||||
- heading "Funktioniert die Gieß-Erinnerung auch für Balkon- und Gartenpflanzen?" [level=3] [ref=e237]
|
||||
- paragraph [ref=e238]: Ja. GreenLens unterstützt Innen- und Außenpflanzen. Balkonkästen und Gartenpflanzen bekommen eigene Profile mit Intervallen, die zur Saison passen.
|
||||
- generic [ref=e239]:
|
||||
- heading "Brauche ich für die Erinnerungen eine Internetverbindung?" [level=3] [ref=e240]
|
||||
- paragraph [ref=e241]: Nein. Scannen erfordert eine Verbindung, aber deine Pflanzensammlung, Gießpläne und Erinnerungen funktionieren auch offline.
|
||||
- generic [ref=e242]:
|
||||
- generic [ref=e243]:
|
||||
- generic [ref=e244]: Verwandt
|
||||
- heading "Weitere Guides" [level=2] [ref=e245]
|
||||
- generic [ref=e246]:
|
||||
- link [ref=e247] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- heading "Pflanzen Pflege App" [level=3] [ref=e248]
|
||||
- paragraph [ref=e249]: "Der komplette Pflegeplan: Gießen, Düngen, Standort und Gesundheitscheck in einer App."
|
||||
- link [ref=e250] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- heading "Pflanzen bestimmen" [level=3] [ref=e251]
|
||||
- paragraph [ref=e252]: Pflanze per Foto bestimmen — die Grundlage für den automatischen Gießplan.
|
||||
- link [ref=e253] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- heading "Zimmerpflanzen bestimmen" [level=3] [ref=e254]
|
||||
- paragraph [ref=e255]: Zimmerpflanzen erkennen und direkt passende Gießerinnerungen einrichten.
|
||||
- link [ref=e256] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- heading "Pflanzenkrankheiten erkennen" [level=3] [ref=e257]
|
||||
- paragraph [ref=e258]: Gelbe Blätter trotz Gießplan? Symptome per Foto analysieren.
|
||||
- contentinfo [ref=e259]:
|
||||
- generic [ref=e260]:
|
||||
- generic [ref=e261]:
|
||||
- generic [ref=e262]:
|
||||
- generic [ref=e263]: Download
|
||||
- heading "Bereit für bessere Pflanzenpflege?" [level=2] [ref=e264]: Bereit fürbesserePflanzenpflege?
|
||||
- paragraph [ref=e265]: GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Bei Fragen erreichst du uns über die Support-Seite.
|
||||
- link [ref=e267] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e268]
|
||||
- paragraph [ref=e269]:
|
||||
- text: Die App ist in den Stores verfügbar.
|
||||
- link "Support" [ref=e270] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- img "GreenLens" [ref=e272]
|
||||
- generic [ref=e274]:
|
||||
- generic [ref=e275]:
|
||||
- heading "GREENLENS" [level=3] [ref=e276]
|
||||
- paragraph [ref=e277]: Die App für Pflanzenfans, die Analyse, Erkennung und Pflege an einem Ort vereint.
|
||||
- generic [ref=e278]:
|
||||
- heading "Produkt" [level=4] [ref=e279]
|
||||
- list [ref=e280]:
|
||||
- listitem [ref=e281]:
|
||||
- link "Funktionen" [ref=e282] [cursor=pointer]:
|
||||
- /url: "#advantage"
|
||||
- listitem [ref=e283]:
|
||||
- link "Technologie" [ref=e284] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=e285]:
|
||||
- link "App laden" [ref=e286] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- listitem [ref=e287]:
|
||||
- link "Support" [ref=e288] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e289]:
|
||||
- heading "Unternehmen" [level=4] [ref=e290]
|
||||
- list [ref=e291]:
|
||||
- listitem [ref=e292]:
|
||||
- link "So funktioniert es" [ref=e293] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=e294]:
|
||||
- link "FAQ" [ref=e295] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- listitem [ref=e296]:
|
||||
- link "Support" [ref=e297] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e298]:
|
||||
- heading "Rechtliches" [level=4] [ref=e299]
|
||||
- list [ref=e300]:
|
||||
- listitem [ref=e301]:
|
||||
- link "Impressum" [ref=e302] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- listitem [ref=e303]:
|
||||
- link "Datenschutz" [ref=e304] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- listitem [ref=e305]:
|
||||
- link "Nutzungsbedingungen" [ref=e306] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=e307]:
|
||||
- generic [ref=e308]:
|
||||
- heading "Use Cases" [level=4] [ref=e309]
|
||||
- list [ref=e310]:
|
||||
- listitem [ref=e311]:
|
||||
- link "Best Plant Identification App" [ref=e312] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- listitem [ref=e313]:
|
||||
- link "Plant Identifier App" [ref=e314] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- listitem [ref=e315]:
|
||||
- link "Plant Scanner" [ref=e316] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- listitem [ref=e317]:
|
||||
- link "Flower Scanner" [ref=e318] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- listitem [ref=e319]:
|
||||
- link "Houseplant Identifier" [ref=e320] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- listitem [ref=e321]:
|
||||
- link "Succulent Identifier" [ref=e322] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- listitem [ref=e323]:
|
||||
- link "Identify Plant by Photo" [ref=e324] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- listitem [ref=e325]:
|
||||
- link "Plant Disease Identifier" [ref=e326] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- listitem [ref=e327]:
|
||||
- link "Plant Health App" [ref=e328] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- listitem [ref=e329]:
|
||||
- link "Plant Care App" [ref=e330] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- listitem [ref=e331]:
|
||||
- link "vs PictureThis" [ref=e332] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- listitem [ref=e333]:
|
||||
- link "vs Plantum" [ref=e334] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- listitem [ref=e335]:
|
||||
- link "vs iNaturalist" [ref=e336] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- listitem [ref=e337]:
|
||||
- link "vs Google Lens" [ref=e338] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=e339]:
|
||||
- heading "Pflanzen erkennen" [level=4] [ref=e340]
|
||||
- list [ref=e341]:
|
||||
- listitem [ref=e342]:
|
||||
- link "Pflanzen erkennen kostenlos" [ref=e343] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- listitem [ref=e344]:
|
||||
- link "Pflanzen erkennen App" [ref=e345] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- listitem [ref=e346]:
|
||||
- link "Pflanzen bestimmen per Foto" [ref=e347] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- listitem [ref=e348]:
|
||||
- link "Blumen Scanner kostenlos" [ref=e349] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- listitem [ref=e350]:
|
||||
- link "Zimmerpflanzen bestimmen" [ref=e351] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- listitem [ref=e352]:
|
||||
- link "Pflanzen Pflege App" [ref=e353] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- listitem [ref=e354]:
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=e355] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- listitem [ref=e356]:
|
||||
- link "Gieß-Erinnerung App" [ref=e357] [cursor=pointer]:
|
||||
- /url: /giess-erinnerung-app
|
||||
- generic [ref=e358]:
|
||||
- heading "En español" [level=4] [ref=e359]
|
||||
- list [ref=e360]:
|
||||
- listitem [ref=e361]:
|
||||
- link "Identificador de plantas" [ref=e362] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- listitem [ref=e363]:
|
||||
- link "App para cuidar plantas" [ref=e364] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- listitem [ref=e365]:
|
||||
- link "Diagnosticar enfermedades de plantas" [ref=e366] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- listitem [ref=e367]:
|
||||
- link "Escaner de plantas" [ref=e368] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- listitem [ref=e369]:
|
||||
- link "GreenLens vs Google Lens para plantas" [ref=e370] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=e371]: GREENLENS
|
||||
- generic [ref=e373]:
|
||||
- paragraph [ref=e374]: © 2026 GreenLens. Alle Rechte vorbehalten.
|
||||
- generic [ref=e375]: GREENLENS
|
||||
- alert [ref=e376]
|
||||
308
.playwright-mcp/page-2026-07-10T08-49-38-325Z.yml
Normal file
308
.playwright-mcp/page-2026-07-10T08-49-38-325Z.yml
Normal file
@@ -0,0 +1,308 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- generic [ref=e2]:
|
||||
- navigation [ref=e3]:
|
||||
- generic [ref=e4]:
|
||||
- link "GREENLENS" [ref=e5] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e6]:
|
||||
- link "Get the App" [ref=e7] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- button "menu" [ref=e8] [cursor=pointer]
|
||||
- main [ref=e10]:
|
||||
- generic [ref=e11]:
|
||||
- generic [ref=e12]:
|
||||
- generic [ref=e13]: AI-POWERED PLANT IDENTIFICATION
|
||||
- heading "Identify plants. Fast & Precise." [level=1] [ref=e14]: Identify plants.Fast & Precise.
|
||||
- paragraph [ref=e15]: GreenLens is your smart pocket companion. Scan any plant for instant identification, get customized care plans and professional diagnostics for visible symptoms. We bring botanical expertise directly to your smartphone.
|
||||
- generic [ref=e16]:
|
||||
- link "Download App" [ref=e17] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- link "So funktioniert es" [ref=e18] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- generic [ref=e19]:
|
||||
- generic [ref=e20]:
|
||||
- generic [ref=e21]: AI-powered
|
||||
- generic [ref=e22]: INSTANT ANALYSIS
|
||||
- generic [ref=e23]:
|
||||
- generic [ref=e24]: Holistic
|
||||
- generic [ref=e25]: IDENTIFICATION & CARE PLANS
|
||||
- generic [ref=e27]:
|
||||
- img "Phone scanning a lotus flower" [ref=e28]
|
||||
- generic [ref=e31]:
|
||||
- generic [ref=e32]: Sacred lotus
|
||||
- generic [ref=e33]: IDENTIFIED IN 0.8s
|
||||
- generic [ref=e34]:
|
||||
- generic [ref=e35]:
|
||||
- generic [ref=e36]: — The Advantage
|
||||
- heading "More than just identification. A holistic approach to plant care." [level=2] [ref=e37]
|
||||
- paragraph [ref=e38]: A basic plant identification app identifies plants in photos and provides species names along with general care tips. GreenLens goes much further, leveraging state-of-the-art image recognition and massive botanical databases.
|
||||
- paragraph [ref=e39]: Each scan automatically generates a customized care plan tailored to your specific climate zone and indoor environment. The app creates precise watering reminders based on species transpiration rates and catalogs your collection. A separate health diagnostic tool analyzes visible symptoms like chlorosis (yellowing), necrosis (browning), or structural decay to suggest immediate, actionable measures.
|
||||
- generic [ref=e40]: "UPDATED ALGORITHMS: APRIL 2024"
|
||||
- generic [ref=e41]:
|
||||
- generic [ref=e42]:
|
||||
- generic [ref=e43]: psychology
|
||||
- heading "Did you know?" [level=3] [ref=e44]
|
||||
- list [ref=e45]:
|
||||
- listitem [ref=e46]:
|
||||
- strong [ref=e47]: "Overwatering is the #1 cause of death"
|
||||
- text: 90% of all houseplants die from root rot due to overwatering. GreenLens calculates precise drying times.
|
||||
- listitem [ref=e48]:
|
||||
- strong [ref=e49]: Light intensity drops quickly
|
||||
- text: Light intensity drops by 50% just 1 meter away from the window. Our light meter ensures the optimal placement.
|
||||
- listitem [ref=e50]:
|
||||
- strong [ref=e51]: Plants purify indoor air
|
||||
- text: Certain species can filter up to 87% of airborne toxins. GreenLens highlights air-purifying plants.
|
||||
- generic [ref=e53]:
|
||||
- generic [ref=e54]:
|
||||
- generic [ref=e55]: — The Technology
|
||||
- heading "Our Methodology" [level=2] [ref=e56]
|
||||
- paragraph [ref=e57]: How GreenLens turns a simple smartphone photo into a comprehensive botanical analysis.
|
||||
- generic [ref=e58]:
|
||||
- generic [ref=e59]:
|
||||
- generic [ref=e60]: "1"
|
||||
- heading "Image Capture" [level=3] [ref=e61]
|
||||
- paragraph [ref=e62]: High-resolution capture analyzes leaf morphology, venation, and stem structure. Blurry images are discarded to ensure accuracy.
|
||||
- generic [ref=e63]:
|
||||
- generic [ref=e64]: "2"
|
||||
- heading "Feature Extraction" [level=3] [ref=e65]
|
||||
- paragraph [ref=e66]: Our neural network isolates over 120 specific features and matches them against a massive database.
|
||||
- generic [ref=e67]:
|
||||
- generic [ref=e68]: "3"
|
||||
- heading "Diagnostics" [level=3] [ref=e69]
|
||||
- paragraph [ref=e70]: A second pass specifically looks for discoloration, pest traces, and wilting, based on typical diseases of the respective species.
|
||||
- generic [ref=e71]:
|
||||
- generic [ref=e72]: "4"
|
||||
- heading "Plan Generation" [level=3] [ref=e73]
|
||||
- paragraph [ref=e74]: From the identification and health status, an individual care plan is created that adapts to local weather and lighting conditions.
|
||||
- generic [ref=e76]:
|
||||
- generic [ref=e78]:
|
||||
- generic [ref=e79]: — Perspective
|
||||
- heading "GreenLens vs. Basic Apps" [level=2] [ref=e80]
|
||||
- paragraph [ref=e81]: Why serious plant enthusiasts and professionals trust our platform more than standard identification tools. We deliver actionable data, not just trivia.
|
||||
- generic [ref=e82]:
|
||||
- heading "Botanical Tip" [level=4] [ref=e83]
|
||||
- paragraph [ref=e84]: Regular care is better than intensive, infrequent care. Use our scheduling tools for a good routine.
|
||||
- link "Read Care Guides →" [ref=e85] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e86]:
|
||||
- generic [ref=e87]:
|
||||
- generic [ref=e88]:
|
||||
- generic [ref=e89]:
|
||||
- generic [ref=e90]: check_circle
|
||||
- heading "Plant Identification" [level=3] [ref=e91]
|
||||
- generic [ref=e92]: GREENLENS
|
||||
- paragraph [ref=e93]: Der AI-powerede Scan liefert Artenname, Trivialname, botanischen Hintergrund, Herkunftsdaten und Giftigkeitswarnungen in unter einer Sekunde.
|
||||
- generic [ref=e94]:
|
||||
- generic [ref=e95]: BASIC APPS
|
||||
- paragraph [ref=e96]: The species name is often vaguely provided – without further context or next steps.
|
||||
- generic [ref=e97]:
|
||||
- generic [ref=e98]:
|
||||
- generic [ref=e99]:
|
||||
- generic [ref=e100]: calendar_month
|
||||
- heading "Care Planning" [level=3] [ref=e101]
|
||||
- generic [ref=e102]: GREENLENS
|
||||
- paragraph [ref=e103]: Watering, fertilizing, and repotting are dynamically scheduled based on species needs, local weather, and your environmental data.
|
||||
- generic [ref=e104]:
|
||||
- generic [ref=e105]: BASIC APPS
|
||||
- paragraph [ref=e106]: Generic, static texts like "Water when the soil is dry". Care must be manually researched and tracked.
|
||||
- generic [ref=e107]:
|
||||
- generic [ref=e108]:
|
||||
- generic [ref=e109]:
|
||||
- generic [ref=e110]: healing
|
||||
- heading "Gesundheits-Diagnostics" [level=3] [ref=e111]
|
||||
- generic [ref=e112]: GREENLENS
|
||||
- paragraph [ref=e113]: Specialized scan for visible symptoms. Identifies pests (thrips, mites), fungal infections, and nutrient deficiencies with concrete treatment protocols.
|
||||
- generic [ref=e114]:
|
||||
- generic [ref=e115]: BASIC APPS
|
||||
- paragraph [ref=e116]: Barely existent. Most identification apps offer no diagnosis or confuse damage with a different plant.
|
||||
- generic [ref=e117]:
|
||||
- generic [ref=e118]:
|
||||
- generic [ref=e119]:
|
||||
- generic [ref=e120]: wb_sunny
|
||||
- heading "Environment Tools" [level=3] [ref=e121]
|
||||
- generic [ref=e122]: GREENLENS
|
||||
- paragraph [ref=e123]: A built-in light meter uses your camera to measure exact lighting conditions and matches them with the identified plants requirements.
|
||||
- generic [ref=e124]:
|
||||
- generic [ref=e125]: BASIC APPS
|
||||
- paragraph [ref=e126]: No tools included for measuring the environment.
|
||||
- generic [ref=e128]:
|
||||
- heading "Frequently Asked Questions" [level=2] [ref=e130]
|
||||
- generic [ref=e131]:
|
||||
- generic [ref=e132]:
|
||||
- heading "Wie genau ist die Plant Identification?" [level=4] [ref=e133]
|
||||
- paragraph [ref=e134]: Our neural network offers extremely high accuracy for common houseplants and rare cultivars. It is constantly improved through verified community scans.
|
||||
- generic [ref=e135]:
|
||||
- heading "Are pests and diseases also recognized?" [level=4] [ref=e136]
|
||||
- paragraph [ref=e137]: Yes. The specialized health check looks for visible signs of common pests (spider mites, mealybugs) and diseases (powdery mildew, root rot) and provides immediate countermeasures.
|
||||
- generic [ref=e138]:
|
||||
- heading "Does the light meter really work?" [level=4] [ref=e139]
|
||||
- paragraph [ref=e140]: The integrated light meter uses the ambient light sensor and your smartphones camera to calculate a reliable estimate in lux, which is perfectly sufficient for indoor placement.
|
||||
- generic [ref=e141]:
|
||||
- heading "Is there a limit to how many plants I can save?" [level=4] [ref=e142]
|
||||
- paragraph [ref=e143]: In the free version, you can save up to 5 plants. GreenLens Premium offers unlimited tracking, custom folders, and advanced history charts.
|
||||
- generic [ref=e144]:
|
||||
- heading "How does the watering plan adapt?" [level=4] [ref=e145]
|
||||
- paragraph [ref=e146]: The plans are not static. They adapt to seasons, local weather (temperature and humidity), and your feedback (if the soil is still wet, the plan shifts).
|
||||
- generic [ref=e147]:
|
||||
- heading "What if the app is wrong?" [level=4] [ref=e148]
|
||||
- paragraph [ref=e149]: In cases of low confidence, the app shows the 3 most likely matches. Premium users can request a review by real botanists for tricky scans.
|
||||
- contentinfo [ref=e150]:
|
||||
- generic [ref=e151]:
|
||||
- generic [ref=e152]:
|
||||
- generic [ref=e153]:
|
||||
- generic [ref=e154]: DOWNLOAD
|
||||
- heading "Ready for better plant care?" [level=2] [ref=e155]: Ready forbetterplant care?
|
||||
- paragraph [ref=e156]: GreenLens helps you identify, understand, and care for your plants. Use the one-click feature, if you are not there yet, you can reach us via the support page.
|
||||
- link [ref=e158] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e159]
|
||||
- paragraph [ref=e160]:
|
||||
- text: The app is already available in the stores.
|
||||
- link "Support" [ref=e161] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- img "Pflanzenregal" [ref=e163]
|
||||
- generic [ref=e165]:
|
||||
- generic [ref=e166]:
|
||||
- heading "GREENLENS" [level=3] [ref=e167]
|
||||
- paragraph [ref=e168]: The app for plant lovers that combines analysis, identification, and care in one place.
|
||||
- generic [ref=e169]:
|
||||
- heading "PRODUCT" [level=4] [ref=e170]
|
||||
- list [ref=e171]:
|
||||
- listitem [ref=e172]:
|
||||
- link "Features" [ref=e173] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e174]:
|
||||
- link "Technology" [ref=e175] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e176]:
|
||||
- link "Get the App" [ref=e177] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e178]:
|
||||
- link "Support" [ref=e179] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e180]:
|
||||
- heading "COMPANY" [level=4] [ref=e181]
|
||||
- list [ref=e182]:
|
||||
- listitem [ref=e183]:
|
||||
- link "How it works" [ref=e184] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e185]:
|
||||
- link "FAQ" [ref=e186] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e187]:
|
||||
- link "Support" [ref=e188] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e189]:
|
||||
- heading "LEGAL" [level=4] [ref=e190]
|
||||
- list [ref=e191]:
|
||||
- listitem [ref=e192]:
|
||||
- link "Imprint" [ref=e193] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e194]:
|
||||
- link "Privacy" [ref=e195] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e196]:
|
||||
- link "Terms of Use" [ref=e197] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e198]:
|
||||
- generic [ref=e199]:
|
||||
- heading "USE CASES & MEHR" [level=4] [ref=e200]
|
||||
- list [ref=e201]:
|
||||
- listitem [ref=e202]:
|
||||
- link "Best Plant ID App" [ref=e203] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e204]:
|
||||
- link "Plant Identifier app" [ref=e205] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e206]:
|
||||
- link "Plant Scanner" [ref=e207] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e208]:
|
||||
- link "Picture This App" [ref=e209] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e210]:
|
||||
- link "Houseplant Identifier" [ref=e211] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e212]:
|
||||
- link "Succulent Identifier" [ref=e213] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e214]:
|
||||
- link "Identify Plant by Photo" [ref=e215] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e216]:
|
||||
- link "Plant Disease Identifier" [ref=e217] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e218]:
|
||||
- link "Plant Health App" [ref=e219] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e220]:
|
||||
- link "Plant Care App" [ref=e221] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e222]:
|
||||
- link "vs PictureThis" [ref=e223] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e224]:
|
||||
- link "vs Planta" [ref=e225] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e226]:
|
||||
- link "vs Blossom" [ref=e227] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e228]:
|
||||
- link "vs Google Lens" [ref=e229] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e230]:
|
||||
- heading "PFLANZEN ERKENNEN" [level=4] [ref=e231]
|
||||
- list [ref=e232]:
|
||||
- listitem [ref=e233]:
|
||||
- link "Healthy or Sick" [ref=e234] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e235]:
|
||||
- link "Identify plants for free" [ref=e236] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e237]:
|
||||
- link "Pflanzen erkennen app" [ref=e238] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e239]:
|
||||
- link "Determine plants" [ref=e240] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e241]:
|
||||
- link "Blumen Scanner" [ref=e242] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e243]:
|
||||
- link "Recognize flowers by photo" [ref=e244] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e245]:
|
||||
- link "Identify houseplants" [ref=e246] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e247]:
|
||||
- link "Plant Care App" [ref=e248] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e249]:
|
||||
- link "Identify plant diseases" [ref=e250] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- generic [ref=e251]:
|
||||
- heading "LANGUAGES" [level=4] [ref=e252]
|
||||
- list [ref=e253]:
|
||||
- listitem [ref=e254]:
|
||||
- link "GreenLens en español" [ref=e255] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e256]:
|
||||
- link "Identificador de plantas" [ref=e257] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e258]:
|
||||
- link "Escaner de plantas" [ref=e259] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e260]:
|
||||
- link "App para cuidar plantas" [ref=e261] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e262]:
|
||||
- link "Diagnosticar enfermedades" [ref=e263] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- listitem [ref=e264]:
|
||||
- link "GreenLens vs Google Lens" [ref=e265] [cursor=pointer]:
|
||||
- /url: "#"
|
||||
- heading "GREENLENS" [level=1] [ref=e267]
|
||||
- generic [ref=e268]:
|
||||
- paragraph [ref=e269]: © 2024 GreenLens. All rights reserved.
|
||||
- generic [ref=e270]: GREENLENS
|
||||
- alert [ref=e271]
|
||||
363
.playwright-mcp/page-2026-07-10T08-53-10-721Z.yml
Normal file
363
.playwright-mcp/page-2026-07-10T08-53-10-721Z.yml
Normal file
@@ -0,0 +1,363 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- navigation "Main navigation" [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "GreenLens Home" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=e5]:
|
||||
- link "Features" [ref=e6] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "Technologie" [ref=e7] [cursor=pointer]:
|
||||
- /url: "#intelligence"
|
||||
- link "FAQ" [ref=e8] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- link "So funktioniert es" [ref=e9] [cursor=pointer]:
|
||||
- /url: "#how"
|
||||
- link "Support" [ref=e10] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- link "App laden" [ref=e11] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- group "Language selector" [ref=e12]:
|
||||
- link "DE" [ref=e13] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "EN" [ref=e14] [cursor=pointer]:
|
||||
- /url: /en
|
||||
- link "ES" [ref=e15] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Jetzt starten" [ref=e16] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- main [ref=e17]:
|
||||
- region "Hero" [ref=e18]:
|
||||
- generic [ref=e22]:
|
||||
- generic [ref=e23]: GreenLens App - Botanische Intelligenz
|
||||
- heading [level=1] [ref=e26]:
|
||||
- text: Dein UrbanJungle,
|
||||
- emphasis [ref=e27]: besser gepflegt.
|
||||
- paragraph [ref=e28]: Scanne Pflanzen, verstehe ihre Bedürfnisse und organisiere Pflege, Erinnerungen und Sammlung in einer App.
|
||||
- generic [ref=e29]:
|
||||
- link "App entdecken" [ref=e30] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Mehr erfahren" [ref=e34] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "GreenLens on Product Hunt" [ref=e35] [cursor=pointer]:
|
||||
- /url: https://www.producthunt.com/products/greenlens?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-greenlens
|
||||
- img "GreenLens - Scan plants, understand care, and grow smarter | Product Hunt" [ref=e36]
|
||||
- group "Wobei hilft dir GreenLens?" [ref=e37]:
|
||||
- paragraph [ref=e38]: Wobei hilft dir GreenLens?
|
||||
- generic [ref=e39]:
|
||||
- button "Ich will die Pflanze erkennen." [ref=e40] [cursor=pointer]
|
||||
- button "Ich will Pflegeprobleme verstehen." [ref=e42] [cursor=pointer]
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: Scan it
|
||||
- generic [ref=e48]: Track it
|
||||
- generic [ref=e50]: Live Design
|
||||
- generic [ref=e52]: Urban Jungle
|
||||
- generic [ref=e54]: Botanical KI
|
||||
- generic [ref=e56]: Pflege-Tipps
|
||||
- generic [ref=e58]: Scan it
|
||||
- generic [ref=e60]: Track it
|
||||
- generic [ref=e62]: Live Design
|
||||
- generic [ref=e64]: Urban Jungle
|
||||
- generic [ref=e66]: Botanical KI
|
||||
- generic [ref=e68]: Pflege-Tipps
|
||||
- generic [ref=e70]: Scan it
|
||||
- generic [ref=e72]: Track it
|
||||
- generic [ref=e74]: Live Design
|
||||
- generic [ref=e76]: Urban Jungle
|
||||
- generic [ref=e78]: Botanical KI
|
||||
- generic [ref=e80]: Pflege-Tipps
|
||||
- generic [ref=e82]: Scan it
|
||||
- generic [ref=e84]: Track it
|
||||
- generic [ref=e86]: Live Design
|
||||
- generic [ref=e88]: Urban Jungle
|
||||
- generic [ref=e90]: Botanical KI
|
||||
- generic [ref=e92]: Pflege-Tipps
|
||||
- region [ref=e94]:
|
||||
- generic [ref=e95]:
|
||||
- generic [ref=e96]:
|
||||
- paragraph [ref=e97]: Features
|
||||
- heading "Alles, was dein Urban Jungle braucht." [level=2] [ref=e98]: Alles, was deinUrban Jungle braucht.
|
||||
- paragraph [ref=e99]: Von der ersten Identifikation bis zur laufenden Pflege hilft GreenLens dir, Pflanzen besser zu verstehen und besser zu organisieren. Das Lexikon umfasst über 450 Pflanzenarten.
|
||||
- generic [ref=e100]:
|
||||
- generic [ref=e101]:
|
||||
- img "Person scannt eine Pflanze mit der GreenLens App" [ref=e102]
|
||||
- generic [ref=e104]:
|
||||
- generic [ref=e105]: KI Scan
|
||||
- heading "Scan it." [level=3] [ref=e106]
|
||||
- paragraph [ref=e107]: Richte die Kamera auf jede Pflanze – GreenLens erkennt sie in Sekundenbruchteilen und liefert alle Infos.
|
||||
- generic [ref=e108]:
|
||||
- generic [ref=e109]:
|
||||
- img "Pflanzen auf einem Regal mit Pflegeplänen" [ref=e110]
|
||||
- generic [ref=e112]:
|
||||
- generic [ref=e113]: Tracking
|
||||
- heading "Track it." [level=3] [ref=e114]
|
||||
- paragraph [ref=e115]: Gießplan, Lichtbedarf und Wachstum – alles in einer Timeline.
|
||||
- generic [ref=e116]:
|
||||
- img "Pflanzensammlung im Urban Jungle Stil" [ref=e117]
|
||||
- generic [ref=e119]:
|
||||
- generic [ref=e120]: Sammlung
|
||||
- heading "Grow it." [level=3] [ref=e121]
|
||||
- paragraph [ref=e122]: Baue deine digitale Pflanzenbibliothek auf – mit Fotos und Notizen.
|
||||
- generic [ref=e123]:
|
||||
- generic [ref=e128]:
|
||||
- heading "Smarte Erinnerungen" [level=4] [ref=e129]
|
||||
- paragraph [ref=e130]: Vergiss nie mehr das Gießen – personalisiert für jede Pflanze.
|
||||
- generic [ref=e135]:
|
||||
- heading "Diagnose & Hilfe" [level=4] [ref=e136]
|
||||
- paragraph [ref=e137]: KI erkennt Krankheiten und Schädlinge sofort.
|
||||
- generic [ref=e143]:
|
||||
- heading "Standort-Tipps" [level=4] [ref=e144]
|
||||
- paragraph [ref=e145]: Pflegehinweise basierend auf deinem Klima und Licht.
|
||||
- region [ref=e146]:
|
||||
- generic [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- paragraph [ref=e149]: Pflanzenhilfe
|
||||
- heading [level=2] [ref=e150]:
|
||||
- text: Weniger raten.
|
||||
- emphasis [ref=e151]: Schneller verstehen, was deiner Pflanze fehlt.
|
||||
- paragraph [ref=e152]: GreenLens hilft dir dabei, Symptome einzuordnen, Pflanzen zu identifizieren und nächste Pflegeschritte klarer zu machen.
|
||||
- generic [ref=e153]:
|
||||
- generic "Vergleichs-Slider" [ref=e154]:
|
||||
- generic [ref=e155]: Vorher
|
||||
- generic [ref=e159]: Nachher
|
||||
- slider "Vergleichs-Slider" [ref=e163]: "50"
|
||||
- generic: Botanical Intelligence
|
||||
- generic [ref=e164]:
|
||||
- generic [ref=e169]:
|
||||
- heading "Braune Spitzen einordnen" [level=4] [ref=e170]
|
||||
- paragraph [ref=e171]: Schneller von Unsicherheit zu einer klareren Ursache
|
||||
- generic [ref=e177]:
|
||||
- heading "Pflegeplan strukturieren" [level=4] [ref=e178]
|
||||
- paragraph [ref=e179]: Weniger Chaos bei Licht, Wasser und Intervallen
|
||||
- generic [ref=e185]:
|
||||
- heading "Hinweise an einem Ort" [level=4] [ref=e186]
|
||||
- paragraph [ref=e187]: Scan, Sammlung und Care Notes zusammengeführt
|
||||
- region [ref=e188]:
|
||||
- generic [ref=e190]:
|
||||
- paragraph [ref=e191]: Technologie
|
||||
- heading [level=2] [ref=e192]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=e193]: Intelligence.
|
||||
- paragraph [ref=e194]: GreenLens verbindet Scan-Ergebnisse, Pflegekontext und Sammlungsverwaltung in einer App. So kommst du schneller von einem Pflanzenfoto zu einer verständlichen Entscheidung.
|
||||
- generic [ref=e195]:
|
||||
- generic [ref=e201]:
|
||||
- heading "Scan-basierte Erkennung" [level=4] [ref=e202]
|
||||
- paragraph [ref=e203]: Vom Foto zur besseren Einordnung in wenigen Schritten.
|
||||
- generic [ref=e208]:
|
||||
- heading "Pflegeorientierte Hinweise" [level=4] [ref=e209]
|
||||
- paragraph [ref=e210]: Hilft dir, nächste Pflegeentscheidungen schneller zu treffen.
|
||||
- generic [ref=e216]:
|
||||
- heading "Sammlung und Verlauf" [level=4] [ref=e217]
|
||||
- paragraph [ref=e218]: Behalte Scans, Pflanzen und Notizen an einem Ort.
|
||||
- generic [ref=e223]:
|
||||
- heading "Lexikon und Suche" [level=4] [ref=e224]
|
||||
- paragraph [ref=e225]: Suche Pflanzen und vergleiche Informationen in einer App.
|
||||
- region [ref=e226]:
|
||||
- generic [ref=e228]:
|
||||
- paragraph [ref=e229]: So funktioniert es
|
||||
- heading [level=2] [ref=e230]:
|
||||
- text: Einfacherals du
|
||||
- emphasis [ref=e231]: denkst.
|
||||
- generic [ref=e232]:
|
||||
- generic [ref=e233]:
|
||||
- generic [ref=e234]: "01"
|
||||
- generic [ref=e235]:
|
||||
- heading "Pflanze fotografieren" [level=4] [ref=e236]
|
||||
- paragraph [ref=e237]: Öffne die App, richte die Kamera auf deine Pflanze und tippe auf Scan. Das war's schon.
|
||||
- generic [ref=e238]:
|
||||
- generic [ref=e239]: "02"
|
||||
- generic [ref=e240]:
|
||||
- heading "KI identifiziert sofort" [level=4] [ref=e241]
|
||||
- paragraph [ref=e242]: In unter einer Sekunde erhältst du den genauen Namen, die Art und alle wichtigen Eckdaten.
|
||||
- generic [ref=e243]:
|
||||
- generic [ref=e244]: "03"
|
||||
- generic [ref=e245]:
|
||||
- heading "Pflegeplan erhalten" [level=4] [ref=e246]
|
||||
- paragraph [ref=e247]: GreenLens erstellt automatisch einen personalisierten Pflegeplan passend zu deiner Pflanze und deinem Standort.
|
||||
- generic [ref=e248]:
|
||||
- generic [ref=e249]: "04"
|
||||
- generic [ref=e250]:
|
||||
- heading "Wachstum verfolgen" [level=4] [ref=e251]
|
||||
- paragraph [ref=e252]: Dokumentiere Fotos, tracke das Gießen und lass dich an wichtige Pflegetermine erinnern.
|
||||
- generic [ref=e254]:
|
||||
- generic [ref=e255]:
|
||||
- generic [ref=e256]: Fragen
|
||||
- heading [level=2] [ref=e257]:
|
||||
- text: Häufig gestellte
|
||||
- emphasis [ref=e258]: Fragen
|
||||
- paragraph [ref=e259]: Alles, was du über GreenLens und den Einstieg wissen musst.
|
||||
- generic [ref=e260]:
|
||||
- heading "Wie erkennt GreenLens eine Pflanze?" [level=3] [ref=e263] [cursor=pointer]
|
||||
- heading "Ist GreenLens kostenlos?" [level=3] [ref=e269] [cursor=pointer]
|
||||
- heading "Kann ich GreenLens offline nutzen?" [level=3] [ref=e275] [cursor=pointer]
|
||||
- heading "Für welche Pflanzen kann ich GreenLens nutzen?" [level=3] [ref=e281] [cursor=pointer]
|
||||
- heading "Wie starte ich meine Pflanzensammlung?" [level=3] [ref=e287] [cursor=pointer]
|
||||
- region [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- generic [ref=e293]:
|
||||
- paragraph [ref=e294]: Guides
|
||||
- heading "Pflanzen schneller erkennen und richtig handeln." [level=2] [ref=e295]
|
||||
- generic [ref=e296]:
|
||||
- link [ref=e297] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=e298]: Blumen
|
||||
- heading "Blumen Scanner" [level=3] [ref=e299]
|
||||
- paragraph [ref=e300]: Blumen per Foto erkennen, Namen erhalten und direkt Pflegehinweise nutzen.
|
||||
- link [ref=e301] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=e302]: Foto-Erkennung
|
||||
- heading "Blumen per Foto erkennen" [level=3] [ref=e303]
|
||||
- paragraph [ref=e304]: Ideal, wenn du eine Blume fotografiert hast und sofort wissen willst, was sie braucht.
|
||||
- link [ref=e305] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- paragraph [ref=e306]: Pflanzen
|
||||
- heading "Pflanzen bestimmen" [level=3] [ref=e307]
|
||||
- paragraph [ref=e308]: Pflanze scannen, Artname sehen und den passenden Pflegeplan erhalten.
|
||||
- link [ref=e309] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- paragraph [ref=e310]: Gießerinnerung
|
||||
- heading "Pflanzen gießen Erinnerung" [level=3] [ref=e311]
|
||||
- paragraph [ref=e312]: Pflegeplan, Push-Erinnerung und Gießrhythmus pro Pflanze verwalten.
|
||||
- link [ref=e313] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- paragraph [ref=e314]: Google Lens
|
||||
- heading "Google Pflanzen erkennen" [level=3] [ref=e315]
|
||||
- paragraph [ref=e316]: Vergleiche Google Lens mit GreenLens für Pflanzenerkennung, Pflege und Diagnose.
|
||||
- link [ref=e317] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- paragraph [ref=e318]: English
|
||||
- heading "Identify plant by photo" [level=3] [ref=e319]
|
||||
- paragraph [ref=e320]: Use a plant photo or picture to get the name, care plan, and reminders.
|
||||
- link [ref=e321] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- paragraph [ref=e322]: Diagnose
|
||||
- heading "Pflanzenkrankheiten erkennen" [level=3] [ref=e323]
|
||||
- paragraph [ref=e324]: Gelbe Blätter, braune Spitzen oder weiche Stiele einordnen und den nächsten Schritt finden.
|
||||
- region [ref=e325]:
|
||||
- generic [ref=e328]:
|
||||
- paragraph [ref=e329]: Download
|
||||
- heading [level=2] [ref=e330]:
|
||||
- text: Bereit für bessere
|
||||
- emphasis [ref=e331]: Pflanzenpflege?
|
||||
- paragraph [ref=e332]: GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Wenn der Store-Link noch nicht live ist, erreichst du uns über die Support-Seite.
|
||||
- generic [ref=e333]:
|
||||
- link "App Store or support" [ref=e334] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- generic [ref=e337]:
|
||||
- generic [ref=e338]: Laden im
|
||||
- text: App Store
|
||||
- link "Google Play or contact" [ref=e339] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e342]:
|
||||
- generic [ref=e343]: Direkt
|
||||
- text: E-Mail senden
|
||||
- paragraph [ref=e344]:
|
||||
- text: Die App ist bereits in den Stores verfügbar.
|
||||
- link "Support" [ref=e345] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- contentinfo [ref=e346]:
|
||||
- generic [ref=e347]:
|
||||
- generic [ref=e348]:
|
||||
- generic [ref=e349]:
|
||||
- link "GREENLENS" [ref=e350] [cursor=pointer]:
|
||||
- /url: /
|
||||
- paragraph [ref=e351]: Die App für Pflanzenfans, die Sammlung, Identifikation und Pflege an einem Ort wollen.
|
||||
- link [ref=e353] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e354]
|
||||
- generic [ref=e355]:
|
||||
- generic [ref=e356]: Produkt
|
||||
- link "Features" [ref=e357] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "Technologie" [ref=e358] [cursor=pointer]:
|
||||
- /url: "#intelligence"
|
||||
- link "App laden" [ref=e359] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Support" [ref=e360] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e361]:
|
||||
- generic [ref=e362]: Ressourcen
|
||||
- link "So funktioniert es" [ref=e363] [cursor=pointer]:
|
||||
- /url: "#how"
|
||||
- link "FAQ" [ref=e364] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- link "Support" [ref=e365] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e366]:
|
||||
- generic [ref=e367]: Rechtliches
|
||||
- link "Impressum" [ref=e368] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- link "Datenschutz" [ref=e369] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- link "Nutzungsbedingungen" [ref=e370] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=e371]:
|
||||
- generic [ref=e372]: Identify & Care
|
||||
- link "Best Plant ID App" [ref=e373] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- link "Plant Identifier App" [ref=e374] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- link "Plant Scanner" [ref=e375] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- link "Flower Scanner" [ref=e376] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- link "Houseplant Identifier" [ref=e377] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- link "Succulent Identifier" [ref=e378] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- link "Identify Plant by Photo" [ref=e379] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- link "Plant Disease Identifier" [ref=e380] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- link "Plant Health App" [ref=e381] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- link "Plant Care App" [ref=e382] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- link "vs PictureThis" [ref=e383] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- link "vs Plantum" [ref=e384] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- link "vs iNaturalist" [ref=e385] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- link "vs Google Lens" [ref=e386] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=e387]:
|
||||
- generic [ref=e388]: Pflanzen & Erkennen
|
||||
- link "GreenLens auf Deutsch" [ref=e389] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "Pflanzen erkennen kostenlos" [ref=e390] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- link "Pflanzen erkennen App" [ref=e391] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- link "Pflanzen bestimmen" [ref=e392] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- link "Blumen Scanner" [ref=e393] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Blumen per Foto erkennen" [ref=e394] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Zimmerpflanzen bestimmen" [ref=e395] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- link "Pflanzen Pflege App" [ref=e396] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=e397] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- generic [ref=e398]:
|
||||
- generic [ref=e399]: Español
|
||||
- link "GreenLens en español" [ref=e400] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Identificador de plantas" [ref=e401] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- link "Escaner de plantas" [ref=e402] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- link "App para cuidar plantas" [ref=e403] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- link "Diagnosticar enfermedades" [ref=e404] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- link "GreenLens vs Google Lens" [ref=e405] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=e406]: GREENLENS
|
||||
- generic [ref=e407]:
|
||||
- paragraph [ref=e408]: © 2026 GreenLens. Alle Rechte vorbehalten.
|
||||
- link "Support" [ref=e409] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- alert [ref=e410]
|
||||
375
.playwright-mcp/page-2026-07-10T08-54-40-749Z.yml
Normal file
375
.playwright-mcp/page-2026-07-10T08-54-40-749Z.yml
Normal file
@@ -0,0 +1,375 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- navigation "Main navigation" [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "GreenLens Home" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=e5]:
|
||||
- link "Features" [ref=e6] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "Technologie" [ref=e7] [cursor=pointer]:
|
||||
- /url: "#intelligence"
|
||||
- link "FAQ" [ref=e8] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- link "So funktioniert es" [ref=e9] [cursor=pointer]:
|
||||
- /url: "#how"
|
||||
- link "Support" [ref=e10] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- link "App laden" [ref=e11] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- group "Language selector" [ref=e12]:
|
||||
- link "DE" [ref=e13] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "EN" [ref=e14] [cursor=pointer]:
|
||||
- /url: /en
|
||||
- link "ES" [ref=e15] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Jetzt starten" [ref=e16] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- main [ref=e17]:
|
||||
- region "Hero" [ref=e18]:
|
||||
- generic [ref=e21]:
|
||||
- generic [ref=e22]:
|
||||
- generic [ref=e23]: GreenLens App - Botanische Intelligenz
|
||||
- heading [level=1] [ref=e26]:
|
||||
- text: Dein UrbanJungle,
|
||||
- emphasis [ref=e27]: besser gepflegt.
|
||||
- paragraph [ref=e28]: Scanne Pflanzen, verstehe ihre Bedürfnisse und organisiere Pflege, Erinnerungen und Sammlung in einer App.
|
||||
- generic [ref=e29]:
|
||||
- link "App entdecken" [ref=e30] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Mehr erfahren" [ref=e34] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "GreenLens on Product Hunt" [ref=e35] [cursor=pointer]:
|
||||
- /url: https://www.producthunt.com/products/greenlens?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-greenlens
|
||||
- img "GreenLens - Scan plants, understand care, and grow smarter | Product Hunt" [ref=e36]
|
||||
- group "Wobei hilft dir GreenLens?" [ref=e37]:
|
||||
- paragraph [ref=e38]: Wobei hilft dir GreenLens?
|
||||
- generic [ref=e39]:
|
||||
- button "Ich will die Pflanze erkennen." [ref=e40] [cursor=pointer]
|
||||
- button "Ich will Pflegeprobleme verstehen." [ref=e42] [cursor=pointer]
|
||||
- generic [ref=e45]:
|
||||
- generic "GreenLens App Demo" [ref=e46]
|
||||
- generic [ref=e48]: Plant care with AI
|
||||
- generic [ref=e51]:
|
||||
- generic [ref=e52]: Scan it
|
||||
- generic [ref=e54]: Track it
|
||||
- generic [ref=e56]: Live Design
|
||||
- generic [ref=e58]: Urban Jungle
|
||||
- generic [ref=e60]: Botanical KI
|
||||
- generic [ref=e62]: Pflege-Tipps
|
||||
- generic [ref=e64]: Scan it
|
||||
- generic [ref=e66]: Track it
|
||||
- generic [ref=e68]: Live Design
|
||||
- generic [ref=e70]: Urban Jungle
|
||||
- generic [ref=e72]: Botanical KI
|
||||
- generic [ref=e74]: Pflege-Tipps
|
||||
- generic [ref=e76]: Scan it
|
||||
- generic [ref=e78]: Track it
|
||||
- generic [ref=e80]: Live Design
|
||||
- generic [ref=e82]: Urban Jungle
|
||||
- generic [ref=e84]: Botanical KI
|
||||
- generic [ref=e86]: Pflege-Tipps
|
||||
- generic [ref=e88]: Scan it
|
||||
- generic [ref=e90]: Track it
|
||||
- generic [ref=e92]: Live Design
|
||||
- generic [ref=e94]: Urban Jungle
|
||||
- generic [ref=e96]: Botanical KI
|
||||
- generic [ref=e98]: Pflege-Tipps
|
||||
- region [ref=e100]:
|
||||
- generic [ref=e101]:
|
||||
- generic [ref=e102]:
|
||||
- paragraph [ref=e103]: Features
|
||||
- heading "Alles, was dein Urban Jungle braucht." [level=2] [ref=e104]: Alles, was deinUrban Jungle braucht.
|
||||
- paragraph [ref=e105]: Von der ersten Identifikation bis zur laufenden Pflege hilft GreenLens dir, Pflanzen besser zu verstehen und besser zu organisieren. Das Lexikon umfasst über 450 Pflanzenarten.
|
||||
- generic [ref=e106]:
|
||||
- generic [ref=e107]:
|
||||
- img "Person scannt eine Pflanze mit der GreenLens App" [ref=e108]
|
||||
- generic [ref=e110]:
|
||||
- generic [ref=e111]: KI Scan
|
||||
- heading "Scan it." [level=3] [ref=e112]
|
||||
- paragraph [ref=e113]: Richte die Kamera auf jede Pflanze – GreenLens erkennt sie in Sekundenbruchteilen und liefert alle Infos.
|
||||
- generic [ref=e114]:
|
||||
- generic [ref=e115]:
|
||||
- img "Pflanzen auf einem Regal mit Pflegeplänen" [ref=e116]
|
||||
- generic [ref=e118]:
|
||||
- generic [ref=e119]: Tracking
|
||||
- heading "Track it." [level=3] [ref=e120]
|
||||
- paragraph [ref=e121]: Gießplan, Lichtbedarf und Wachstum – alles in einer Timeline.
|
||||
- generic [ref=e122]:
|
||||
- img "Pflanzensammlung im Urban Jungle Stil" [ref=e123]
|
||||
- generic [ref=e125]:
|
||||
- generic [ref=e126]: Sammlung
|
||||
- heading "Grow it." [level=3] [ref=e127]
|
||||
- paragraph [ref=e128]: Baue deine digitale Pflanzenbibliothek auf – mit Fotos und Notizen.
|
||||
- generic [ref=e129]:
|
||||
- generic [ref=e134]:
|
||||
- heading "Smarte Erinnerungen" [level=4] [ref=e135]
|
||||
- paragraph [ref=e136]: Vergiss nie mehr das Gießen – personalisiert für jede Pflanze.
|
||||
- generic [ref=e141]:
|
||||
- heading "Diagnose & Hilfe" [level=4] [ref=e142]
|
||||
- paragraph [ref=e143]: KI erkennt Krankheiten und Schädlinge sofort.
|
||||
- generic [ref=e149]:
|
||||
- heading "Standort-Tipps" [level=4] [ref=e150]
|
||||
- paragraph [ref=e151]: Pflegehinweise basierend auf deinem Klima und Licht.
|
||||
- region [ref=e152]:
|
||||
- generic [ref=e153]:
|
||||
- generic [ref=e154]:
|
||||
- paragraph [ref=e155]: Pflanzenhilfe
|
||||
- heading [level=2] [ref=e156]:
|
||||
- text: Weniger raten.
|
||||
- emphasis [ref=e157]: Schneller verstehen, was deiner Pflanze fehlt.
|
||||
- paragraph [ref=e158]: GreenLens hilft dir dabei, Symptome einzuordnen, Pflanzen zu identifizieren und nächste Pflegeschritte klarer zu machen.
|
||||
- generic [ref=e159]:
|
||||
- generic "Vergleichs-Slider" [ref=e160]:
|
||||
- generic [ref=e161]: Vorher
|
||||
- generic [ref=e165]: Nachher
|
||||
- slider "Vergleichs-Slider" [ref=e169]: "50"
|
||||
- generic: Botanical Intelligence
|
||||
- generic [ref=e170]:
|
||||
- generic [ref=e175]:
|
||||
- heading "Braune Spitzen einordnen" [level=4] [ref=e176]
|
||||
- paragraph [ref=e177]: Schneller von Unsicherheit zu einer klareren Ursache
|
||||
- generic [ref=e183]:
|
||||
- heading "Pflegeplan strukturieren" [level=4] [ref=e184]
|
||||
- paragraph [ref=e185]: Weniger Chaos bei Licht, Wasser und Intervallen
|
||||
- generic [ref=e191]:
|
||||
- heading "Hinweise an einem Ort" [level=4] [ref=e192]
|
||||
- paragraph [ref=e193]: Scan, Sammlung und Care Notes zusammengeführt
|
||||
- region [ref=e194]:
|
||||
- generic [ref=e195]:
|
||||
- generic [ref=e196]:
|
||||
- paragraph [ref=e197]: Technologie
|
||||
- heading [level=2] [ref=e198]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=e199]: Intelligence.
|
||||
- paragraph [ref=e200]: GreenLens verbindet Scan-Ergebnisse, Pflegekontext und Sammlungsverwaltung in einer App. So kommst du schneller von einem Pflanzenfoto zu einer verständlichen Entscheidung.
|
||||
- generic [ref=e201]:
|
||||
- generic [ref=e207]:
|
||||
- heading "Scan-basierte Erkennung" [level=4] [ref=e208]
|
||||
- paragraph [ref=e209]: Vom Foto zur besseren Einordnung in wenigen Schritten.
|
||||
- generic [ref=e214]:
|
||||
- heading "Pflegeorientierte Hinweise" [level=4] [ref=e215]
|
||||
- paragraph [ref=e216]: Hilft dir, nächste Pflegeentscheidungen schneller zu treffen.
|
||||
- generic [ref=e222]:
|
||||
- heading "Sammlung und Verlauf" [level=4] [ref=e223]
|
||||
- paragraph [ref=e224]: Behalte Scans, Pflanzen und Notizen an einem Ort.
|
||||
- generic [ref=e229]:
|
||||
- heading "Lexikon und Suche" [level=4] [ref=e230]
|
||||
- paragraph [ref=e231]: Suche Pflanzen und vergleiche Informationen in einer App.
|
||||
- generic [ref=e233]:
|
||||
- img "Botanical AI plant analysis visualization" [ref=e234]
|
||||
- heading [level=3] [ref=e237]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=e238]: Intelligence.
|
||||
- region [ref=e239]:
|
||||
- generic [ref=e240]:
|
||||
- generic [ref=e241]:
|
||||
- paragraph [ref=e242]: So funktioniert es
|
||||
- heading [level=2] [ref=e243]:
|
||||
- text: Einfacherals du
|
||||
- emphasis [ref=e244]: denkst.
|
||||
- generic [ref=e245]:
|
||||
- generic [ref=e246]:
|
||||
- generic [ref=e247]: "01"
|
||||
- generic [ref=e248]:
|
||||
- heading "Pflanze fotografieren" [level=4] [ref=e249]
|
||||
- paragraph [ref=e250]: Öffne die App, richte die Kamera auf deine Pflanze und tippe auf Scan. Das war's schon.
|
||||
- generic [ref=e251]:
|
||||
- generic [ref=e252]: "02"
|
||||
- generic [ref=e253]:
|
||||
- heading "KI identifiziert sofort" [level=4] [ref=e254]
|
||||
- paragraph [ref=e255]: In unter einer Sekunde erhältst du den genauen Namen, die Art und alle wichtigen Eckdaten.
|
||||
- generic [ref=e256]:
|
||||
- generic [ref=e257]: "03"
|
||||
- generic [ref=e258]:
|
||||
- heading "Pflegeplan erhalten" [level=4] [ref=e259]
|
||||
- paragraph [ref=e260]: GreenLens erstellt automatisch einen personalisierten Pflegeplan passend zu deiner Pflanze und deinem Standort.
|
||||
- generic [ref=e261]:
|
||||
- generic [ref=e262]: "04"
|
||||
- generic [ref=e263]:
|
||||
- heading "Wachstum verfolgen" [level=4] [ref=e264]
|
||||
- paragraph [ref=e265]: Dokumentiere Fotos, tracke das Gießen und lass dich an wichtige Pflegetermine erinnern.
|
||||
- img "GreenLens App in Verwendung – Pflanze wird gescannt" [ref=e268]
|
||||
- generic [ref=e270]:
|
||||
- generic [ref=e271]:
|
||||
- generic [ref=e272]: Fragen
|
||||
- heading [level=2] [ref=e273]:
|
||||
- text: Häufig gestellte
|
||||
- emphasis [ref=e274]: Fragen
|
||||
- paragraph [ref=e275]: Alles, was du über GreenLens und den Einstieg wissen musst.
|
||||
- generic [ref=e276]:
|
||||
- heading "Wie erkennt GreenLens eine Pflanze?" [level=3] [ref=e279] [cursor=pointer]
|
||||
- heading "Ist GreenLens kostenlos?" [level=3] [ref=e285] [cursor=pointer]
|
||||
- heading "Kann ich GreenLens offline nutzen?" [level=3] [ref=e291] [cursor=pointer]
|
||||
- heading "Für welche Pflanzen kann ich GreenLens nutzen?" [level=3] [ref=e297] [cursor=pointer]
|
||||
- heading "Wie starte ich meine Pflanzensammlung?" [level=3] [ref=e303] [cursor=pointer]
|
||||
- region [ref=e307]:
|
||||
- generic [ref=e308]:
|
||||
- generic [ref=e309]:
|
||||
- paragraph [ref=e310]: Guides
|
||||
- heading "Pflanzen schneller erkennen und richtig handeln." [level=2] [ref=e311]
|
||||
- generic [ref=e312]:
|
||||
- link [ref=e313] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=e314]: Blumen
|
||||
- heading "Blumen Scanner" [level=3] [ref=e315]
|
||||
- paragraph [ref=e316]: Blumen per Foto erkennen, Namen erhalten und direkt Pflegehinweise nutzen.
|
||||
- link [ref=e317] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=e318]: Foto-Erkennung
|
||||
- heading "Blumen per Foto erkennen" [level=3] [ref=e319]
|
||||
- paragraph [ref=e320]: Ideal, wenn du eine Blume fotografiert hast und sofort wissen willst, was sie braucht.
|
||||
- link [ref=e321] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- paragraph [ref=e322]: Pflanzen
|
||||
- heading "Pflanzen bestimmen" [level=3] [ref=e323]
|
||||
- paragraph [ref=e324]: Pflanze scannen, Artname sehen und den passenden Pflegeplan erhalten.
|
||||
- link [ref=e325] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- paragraph [ref=e326]: Gießerinnerung
|
||||
- heading "Pflanzen gießen Erinnerung" [level=3] [ref=e327]
|
||||
- paragraph [ref=e328]: Pflegeplan, Push-Erinnerung und Gießrhythmus pro Pflanze verwalten.
|
||||
- link [ref=e329] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- paragraph [ref=e330]: Google Lens
|
||||
- heading "Google Pflanzen erkennen" [level=3] [ref=e331]
|
||||
- paragraph [ref=e332]: Vergleiche Google Lens mit GreenLens für Pflanzenerkennung, Pflege und Diagnose.
|
||||
- link [ref=e333] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- paragraph [ref=e334]: English
|
||||
- heading "Identify plant by photo" [level=3] [ref=e335]
|
||||
- paragraph [ref=e336]: Use a plant photo or picture to get the name, care plan, and reminders.
|
||||
- link [ref=e337] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- paragraph [ref=e338]: Diagnose
|
||||
- heading "Pflanzenkrankheiten erkennen" [level=3] [ref=e339]
|
||||
- paragraph [ref=e340]: Gelbe Blätter, braune Spitzen oder weiche Stiele einordnen und den nächsten Schritt finden.
|
||||
- region [ref=e341]:
|
||||
- generic [ref=e344]:
|
||||
- paragraph [ref=e345]: Download
|
||||
- heading [level=2] [ref=e346]:
|
||||
- text: Bereit für bessere
|
||||
- emphasis [ref=e347]: Pflanzenpflege?
|
||||
- paragraph [ref=e348]: GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Wenn der Store-Link noch nicht live ist, erreichst du uns über die Support-Seite.
|
||||
- generic [ref=e349]:
|
||||
- link "App Store or support" [ref=e350] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- generic [ref=e353]:
|
||||
- generic [ref=e354]: Laden im
|
||||
- text: App Store
|
||||
- link "Google Play or contact" [ref=e355] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e358]:
|
||||
- generic [ref=e359]: Direkt
|
||||
- text: E-Mail senden
|
||||
- paragraph [ref=e360]:
|
||||
- text: Die App ist bereits in den Stores verfügbar.
|
||||
- link "Support" [ref=e361] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- contentinfo [ref=e364]:
|
||||
- generic [ref=e365]:
|
||||
- generic [ref=e366]:
|
||||
- generic [ref=e367]:
|
||||
- link "GREENLENS" [ref=e368] [cursor=pointer]:
|
||||
- /url: /
|
||||
- paragraph [ref=e369]: Die App für Pflanzenfans, die Sammlung, Identifikation und Pflege an einem Ort wollen.
|
||||
- link [ref=e371] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e372]
|
||||
- generic [ref=e373]:
|
||||
- generic [ref=e374]: Produkt
|
||||
- link "Features" [ref=e375] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "Technologie" [ref=e376] [cursor=pointer]:
|
||||
- /url: "#intelligence"
|
||||
- link "App laden" [ref=e377] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Support" [ref=e378] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e379]:
|
||||
- generic [ref=e380]: Ressourcen
|
||||
- link "So funktioniert es" [ref=e381] [cursor=pointer]:
|
||||
- /url: "#how"
|
||||
- link "FAQ" [ref=e382] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- link "Support" [ref=e383] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e384]:
|
||||
- generic [ref=e385]: Rechtliches
|
||||
- link "Impressum" [ref=e386] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- link "Datenschutz" [ref=e387] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- link "Nutzungsbedingungen" [ref=e388] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=e389]:
|
||||
- generic [ref=e390]: Identify & Care
|
||||
- link "Best Plant ID App" [ref=e391] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- link "Plant Identifier App" [ref=e392] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- link "Plant Scanner" [ref=e393] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- link "Flower Scanner" [ref=e394] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- link "Houseplant Identifier" [ref=e395] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- link "Succulent Identifier" [ref=e396] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- link "Identify Plant by Photo" [ref=e397] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- link "Plant Disease Identifier" [ref=e398] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- link "Plant Health App" [ref=e399] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- link "Plant Care App" [ref=e400] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- link "vs PictureThis" [ref=e401] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- link "vs Plantum" [ref=e402] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- link "vs iNaturalist" [ref=e403] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- link "vs Google Lens" [ref=e404] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=e405]:
|
||||
- generic [ref=e406]: Pflanzen & Erkennen
|
||||
- link "GreenLens auf Deutsch" [ref=e407] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "Pflanzen erkennen kostenlos" [ref=e408] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- link "Pflanzen erkennen App" [ref=e409] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- link "Pflanzen bestimmen" [ref=e410] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- link "Blumen Scanner" [ref=e411] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Blumen per Foto erkennen" [ref=e412] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Zimmerpflanzen bestimmen" [ref=e413] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- link "Pflanzen Pflege App" [ref=e414] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=e415] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- generic [ref=e416]:
|
||||
- generic [ref=e417]: Español
|
||||
- link "GreenLens en español" [ref=e418] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Identificador de plantas" [ref=e419] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- link "Escaner de plantas" [ref=e420] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- link "App para cuidar plantas" [ref=e421] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- link "Diagnosticar enfermedades" [ref=e422] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- link "GreenLens vs Google Lens" [ref=e423] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=e424]: GREENLENS
|
||||
- generic [ref=e425]:
|
||||
- paragraph [ref=e426]: © 2026 GreenLens. Alle Rechte vorbehalten.
|
||||
- link "Support" [ref=e427] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- alert [ref=e428]
|
||||
375
.playwright-mcp/page-2026-07-10T08-55-03-578Z.yml
Normal file
375
.playwright-mcp/page-2026-07-10T08-55-03-578Z.yml
Normal file
@@ -0,0 +1,375 @@
|
||||
- generic [active] [ref=f1e1]:
|
||||
- navigation "Main navigation" [ref=f1e2]:
|
||||
- generic [ref=f1e3]:
|
||||
- link "GreenLens Home" [ref=f1e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=f1e5]:
|
||||
- link "Features" [ref=f1e6] [cursor=pointer]:
|
||||
- /url: /#features
|
||||
- link "Technology" [ref=f1e7] [cursor=pointer]:
|
||||
- /url: /#intelligence
|
||||
- link "FAQ" [ref=f1e8] [cursor=pointer]:
|
||||
- /url: /#faq
|
||||
- link "How it works" [ref=f1e9] [cursor=pointer]:
|
||||
- /url: /#how
|
||||
- link "Support" [ref=f1e10] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- link "Get the App" [ref=f1e11] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- group "Language selector" [ref=f1e12]:
|
||||
- link "DE" [ref=f1e13] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "EN" [ref=f1e14] [cursor=pointer]:
|
||||
- /url: /en
|
||||
- link "ES" [ref=f1e15] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Get Started" [ref=f1e16] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- main [ref=f1e17]:
|
||||
- region "Hero" [ref=f1e18]:
|
||||
- generic [ref=f1e21]:
|
||||
- generic [ref=f1e22]:
|
||||
- generic [ref=f1e23]: GreenLens App - Botanical intelligence
|
||||
- heading [level=1] [ref=f1e26]:
|
||||
- text: Your UrbanJungle,
|
||||
- emphasis [ref=f1e27]: better cared for.
|
||||
- paragraph [ref=f1e28]: Scan plants, understand what they need, and keep care, reminders, and your collection in one app.
|
||||
- generic [ref=f1e29]:
|
||||
- link "Explore the App" [ref=f1e30] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Learn more" [ref=f1e34] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "GreenLens on Product Hunt" [ref=f1e35] [cursor=pointer]:
|
||||
- /url: https://www.producthunt.com/products/greenlens?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-greenlens
|
||||
- img "GreenLens - Scan plants, understand care, and grow smarter | Product Hunt" [ref=f1e36]
|
||||
- group "What do you need help with?" [ref=f1e37]:
|
||||
- paragraph [ref=f1e38]: What do you need help with?
|
||||
- generic [ref=f1e39]:
|
||||
- button "I want to identify the plant." [ref=f1e40] [cursor=pointer]
|
||||
- button "I want to understand care problems." [ref=f1e42] [cursor=pointer]
|
||||
- generic [ref=f1e45]:
|
||||
- generic "GreenLens App Demo" [ref=f1e46]
|
||||
- generic [ref=f1e48]: Plant care with AI
|
||||
- generic [ref=f1e51]:
|
||||
- generic [ref=f1e52]: Scan it
|
||||
- generic [ref=f1e54]: Track it
|
||||
- generic [ref=f1e56]: Live Design
|
||||
- generic [ref=f1e58]: Urban Jungle
|
||||
- generic [ref=f1e60]: Botanical KI
|
||||
- generic [ref=f1e62]: Pflege-Tipps
|
||||
- generic [ref=f1e64]: Scan it
|
||||
- generic [ref=f1e66]: Track it
|
||||
- generic [ref=f1e68]: Live Design
|
||||
- generic [ref=f1e70]: Urban Jungle
|
||||
- generic [ref=f1e72]: Botanical KI
|
||||
- generic [ref=f1e74]: Pflege-Tipps
|
||||
- generic [ref=f1e76]: Scan it
|
||||
- generic [ref=f1e78]: Track it
|
||||
- generic [ref=f1e80]: Live Design
|
||||
- generic [ref=f1e82]: Urban Jungle
|
||||
- generic [ref=f1e84]: Botanical KI
|
||||
- generic [ref=f1e86]: Pflege-Tipps
|
||||
- generic [ref=f1e88]: Scan it
|
||||
- generic [ref=f1e90]: Track it
|
||||
- generic [ref=f1e92]: Live Design
|
||||
- generic [ref=f1e94]: Urban Jungle
|
||||
- generic [ref=f1e96]: Botanical KI
|
||||
- generic [ref=f1e98]: Pflege-Tipps
|
||||
- region [ref=f1e100]:
|
||||
- generic [ref=f1e101]:
|
||||
- generic [ref=f1e102]:
|
||||
- paragraph [ref=f1e103]: Features
|
||||
- heading "Everything your Urban Jungle needs." [level=2] [ref=f1e104]: Everything yourUrban Jungle needs.
|
||||
- paragraph [ref=f1e105]: From first identification to ongoing care, GreenLens helps you understand plants better and stay organized. The lexicon covers 450+ plant species.
|
||||
- generic [ref=f1e106]:
|
||||
- generic [ref=f1e107]:
|
||||
- img "Person scanning a plant with the GreenLens app" [ref=f1e108]
|
||||
- generic [ref=f1e110]:
|
||||
- generic [ref=f1e111]: AI Scan
|
||||
- heading "Scan it." [level=3] [ref=f1e112]
|
||||
- paragraph [ref=f1e113]: Point your camera at any plant – GreenLens identifies it in milliseconds and delivers all the info.
|
||||
- generic [ref=f1e114]:
|
||||
- generic [ref=f1e115]:
|
||||
- img "Plants on a shelf with care plans" [ref=f1e116]
|
||||
- generic [ref=f1e118]:
|
||||
- generic [ref=f1e119]: Tracking
|
||||
- heading "Track it." [level=3] [ref=f1e120]
|
||||
- paragraph [ref=f1e121]: Watering schedule, light needs and growth – all in one timeline.
|
||||
- generic [ref=f1e122]:
|
||||
- img "Plant collection in urban jungle style" [ref=f1e123]
|
||||
- generic [ref=f1e125]:
|
||||
- generic [ref=f1e126]: Collection
|
||||
- heading "Grow it." [level=3] [ref=f1e127]
|
||||
- paragraph [ref=f1e128]: Build your digital plant library – with photos and notes.
|
||||
- generic [ref=f1e129]:
|
||||
- generic [ref=f1e134]:
|
||||
- heading "Smart Reminders" [level=4] [ref=f1e135]
|
||||
- paragraph [ref=f1e136]: Never forget watering again – personalized for every plant.
|
||||
- generic [ref=f1e141]:
|
||||
- heading "Diagnosis & Help" [level=4] [ref=f1e142]
|
||||
- paragraph [ref=f1e143]: AI detects diseases and pests instantly.
|
||||
- generic [ref=f1e149]:
|
||||
- heading "Location Tips" [level=4] [ref=f1e150]
|
||||
- paragraph [ref=f1e151]: Care advice based on your climate and light conditions.
|
||||
- region [ref=f1e152]:
|
||||
- generic [ref=f1e153]:
|
||||
- generic [ref=f1e154]:
|
||||
- paragraph [ref=f1e155]: Plant help
|
||||
- heading [level=2] [ref=f1e156]:
|
||||
- text: Less guessing.
|
||||
- emphasis [ref=f1e157]: Understand faster what your plant may need.
|
||||
- paragraph [ref=f1e158]: GreenLens helps you interpret symptoms, identify plants, and get clearer next-step care guidance.
|
||||
- generic [ref=f1e159]:
|
||||
- generic "Before and after slider" [ref=f1e160]:
|
||||
- generic [ref=f1e161]: Before
|
||||
- generic [ref=f1e165]: After
|
||||
- slider "Before and after slider" [ref=f1e169]: "50"
|
||||
- generic: Botanical Intelligence
|
||||
- generic [ref=f1e170]:
|
||||
- generic [ref=f1e175]:
|
||||
- heading "Assess brown leaf tips" [level=4] [ref=f1e176]
|
||||
- paragraph [ref=f1e177]: Move from uncertainty to a clearer diagnosis path
|
||||
- generic [ref=f1e183]:
|
||||
- heading "Structure the care routine" [level=4] [ref=f1e184]
|
||||
- paragraph [ref=f1e185]: Reduce the chaos around light, water, and intervals
|
||||
- generic [ref=f1e191]:
|
||||
- heading "Keep guidance in one place" [level=4] [ref=f1e192]
|
||||
- paragraph [ref=f1e193]: Scan, collection, and care notes together
|
||||
- region [ref=f1e194]:
|
||||
- generic [ref=f1e195]:
|
||||
- generic [ref=f1e196]:
|
||||
- paragraph [ref=f1e197]: Technology
|
||||
- heading [level=2] [ref=f1e198]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=f1e199]: Intelligence.
|
||||
- paragraph [ref=f1e200]: GreenLens combines scan results, care context, and collection management in one app, helping you move from plant photo to a clearer decision faster.
|
||||
- generic [ref=f1e201]:
|
||||
- generic [ref=f1e207]:
|
||||
- heading "Scan-based identification" [level=4] [ref=f1e208]
|
||||
- paragraph [ref=f1e209]: Move from photo to clearer plant context in a few steps.
|
||||
- generic [ref=f1e214]:
|
||||
- heading "Care-focused guidance" [level=4] [ref=f1e215]
|
||||
- paragraph [ref=f1e216]: Helps you make faster next-step care decisions.
|
||||
- generic [ref=f1e222]:
|
||||
- heading "Collection and history" [level=4] [ref=f1e223]
|
||||
- paragraph [ref=f1e224]: Keep scans, plants, and notes in one place.
|
||||
- generic [ref=f1e229]:
|
||||
- heading "Lexicon and search" [level=4] [ref=f1e230]
|
||||
- paragraph [ref=f1e231]: Look up plants and compare information in one app.
|
||||
- generic [ref=f1e233]:
|
||||
- img "Botanical AI plant analysis visualization" [ref=f1e234]
|
||||
- heading [level=3] [ref=f1e237]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=f1e238]: Intelligence.
|
||||
- region [ref=f1e239]:
|
||||
- generic [ref=f1e240]:
|
||||
- generic [ref=f1e241]:
|
||||
- paragraph [ref=f1e242]: How it works
|
||||
- heading [level=2] [ref=f1e243]:
|
||||
- text: Simplerthan you
|
||||
- emphasis [ref=f1e244]: think.
|
||||
- generic [ref=f1e245]:
|
||||
- generic [ref=f1e246]:
|
||||
- generic [ref=f1e247]: "01"
|
||||
- generic [ref=f1e248]:
|
||||
- heading "Photograph your plant" [level=4] [ref=f1e249]
|
||||
- paragraph [ref=f1e250]: Open the app, point the camera at your plant and tap Scan. That's it.
|
||||
- generic [ref=f1e251]:
|
||||
- generic [ref=f1e252]: "02"
|
||||
- generic [ref=f1e253]:
|
||||
- heading "AI identifies instantly" [level=4] [ref=f1e254]
|
||||
- paragraph [ref=f1e255]: In under a second you get the exact name, species and all key details.
|
||||
- generic [ref=f1e256]:
|
||||
- generic [ref=f1e257]: "03"
|
||||
- generic [ref=f1e258]:
|
||||
- heading "Receive care plan" [level=4] [ref=f1e259]
|
||||
- paragraph [ref=f1e260]: GreenLens automatically creates a personalized care plan for your plant and location.
|
||||
- generic [ref=f1e261]:
|
||||
- generic [ref=f1e262]: "04"
|
||||
- generic [ref=f1e263]:
|
||||
- heading "Track growth" [level=4] [ref=f1e264]
|
||||
- paragraph [ref=f1e265]: Document photos, track watering and get reminded of important care dates.
|
||||
- img "GreenLens app in use – scanning a plant" [ref=f1e268]
|
||||
- generic [ref=f1e270]:
|
||||
- generic [ref=f1e271]:
|
||||
- generic [ref=f1e272]: Questions
|
||||
- heading [level=2] [ref=f1e273]:
|
||||
- text: Frequently Asked
|
||||
- emphasis [ref=f1e274]: Questions
|
||||
- paragraph [ref=f1e275]: Everything you need to know about GreenLens and getting started.
|
||||
- generic [ref=f1e276]:
|
||||
- heading "How does GreenLens identify a plant?" [level=3] [ref=f1e279] [cursor=pointer]
|
||||
- heading "Is GreenLens free to use?" [level=3] [ref=f1e285] [cursor=pointer]
|
||||
- heading "Can I use GreenLens offline?" [level=3] [ref=f1e291] [cursor=pointer]
|
||||
- heading "What kind of plants can I use GreenLens for?" [level=3] [ref=f1e297] [cursor=pointer]
|
||||
- heading "How do I start my plant collection?" [level=3] [ref=f1e303] [cursor=pointer]
|
||||
- region [ref=f1e307]:
|
||||
- generic [ref=f1e308]:
|
||||
- generic [ref=f1e309]:
|
||||
- paragraph [ref=f1e310]: Guides
|
||||
- heading "Pflanzen schneller erkennen und richtig handeln." [level=2] [ref=f1e311]
|
||||
- generic [ref=f1e312]:
|
||||
- link [ref=f1e313] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=f1e314]: Blumen
|
||||
- heading "Blumen Scanner" [level=3] [ref=f1e315]
|
||||
- paragraph [ref=f1e316]: Blumen per Foto erkennen, Namen erhalten und direkt Pflegehinweise nutzen.
|
||||
- link [ref=f1e317] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- paragraph [ref=f1e318]: Foto-Erkennung
|
||||
- heading "Blumen per Foto erkennen" [level=3] [ref=f1e319]
|
||||
- paragraph [ref=f1e320]: Ideal, wenn du eine Blume fotografiert hast und sofort wissen willst, was sie braucht.
|
||||
- link [ref=f1e321] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- paragraph [ref=f1e322]: Pflanzen
|
||||
- heading "Pflanzen bestimmen" [level=3] [ref=f1e323]
|
||||
- paragraph [ref=f1e324]: Pflanze scannen, Artname sehen und den passenden Pflegeplan erhalten.
|
||||
- link [ref=f1e325] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- paragraph [ref=f1e326]: Gießerinnerung
|
||||
- heading "Pflanzen gießen Erinnerung" [level=3] [ref=f1e327]
|
||||
- paragraph [ref=f1e328]: Pflegeplan, Push-Erinnerung und Gießrhythmus pro Pflanze verwalten.
|
||||
- link [ref=f1e329] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- paragraph [ref=f1e330]: Google Lens
|
||||
- heading "Google Pflanzen erkennen" [level=3] [ref=f1e331]
|
||||
- paragraph [ref=f1e332]: Vergleiche Google Lens mit GreenLens für Pflanzenerkennung, Pflege und Diagnose.
|
||||
- link [ref=f1e333] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- paragraph [ref=f1e334]: English
|
||||
- heading "Identify plant by photo" [level=3] [ref=f1e335]
|
||||
- paragraph [ref=f1e336]: Use a plant photo or picture to get the name, care plan, and reminders.
|
||||
- link [ref=f1e337] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- paragraph [ref=f1e338]: Diagnose
|
||||
- heading "Pflanzenkrankheiten erkennen" [level=3] [ref=f1e339]
|
||||
- paragraph [ref=f1e340]: Gelbe Blätter, braune Spitzen oder weiche Stiele einordnen und den nächsten Schritt finden.
|
||||
- region [ref=f1e341]:
|
||||
- generic [ref=f1e344]:
|
||||
- paragraph [ref=f1e345]: Download
|
||||
- heading [level=2] [ref=f1e346]:
|
||||
- text: Ready for better
|
||||
- emphasis [ref=f1e347]: plant care?
|
||||
- paragraph [ref=f1e348]: GreenLens helps you identify, understand, and care for your plants. If the store listing is not live yet, use the support page to reach us.
|
||||
- generic [ref=f1e349]:
|
||||
- link "App Store or support" [ref=f1e350] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- generic [ref=f1e353]:
|
||||
- generic [ref=f1e354]: Download on the
|
||||
- text: App Store
|
||||
- link "Google Play or contact" [ref=f1e355] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=f1e358]:
|
||||
- generic [ref=f1e359]: Direct
|
||||
- text: Send Email
|
||||
- paragraph [ref=f1e360]:
|
||||
- text: The app is already available in app stores.
|
||||
- link "Support" [ref=f1e361] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- contentinfo [ref=f1e364]:
|
||||
- generic [ref=f1e365]:
|
||||
- generic [ref=f1e366]:
|
||||
- generic [ref=f1e367]:
|
||||
- link "GREENLENS" [ref=f1e368] [cursor=pointer]:
|
||||
- /url: /
|
||||
- paragraph [ref=f1e369]: The app for plant lovers who want identification, care, and collection management in one place.
|
||||
- link [ref=f1e371] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=f1e372]
|
||||
- generic [ref=f1e373]:
|
||||
- generic [ref=f1e374]: Product
|
||||
- link "Features" [ref=f1e375] [cursor=pointer]:
|
||||
- /url: /#features
|
||||
- link "Technology" [ref=f1e376] [cursor=pointer]:
|
||||
- /url: /#intelligence
|
||||
- link "Get the App" [ref=f1e377] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- link "Support" [ref=f1e378] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=f1e379]:
|
||||
- generic [ref=f1e380]: Resources
|
||||
- link "How it works" [ref=f1e381] [cursor=pointer]:
|
||||
- /url: /#how
|
||||
- link "FAQ" [ref=f1e382] [cursor=pointer]:
|
||||
- /url: /#faq
|
||||
- link "Support" [ref=f1e383] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=f1e384]:
|
||||
- generic [ref=f1e385]: Legal
|
||||
- link "Imprint" [ref=f1e386] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- link "Privacy Policy" [ref=f1e387] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- link "Terms of Service" [ref=f1e388] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=f1e389]:
|
||||
- generic [ref=f1e390]: Identify & Care
|
||||
- link "Best Plant ID App" [ref=f1e391] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- link "Plant Identifier App" [ref=f1e392] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- link "Plant Scanner" [ref=f1e393] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- link "Flower Scanner" [ref=f1e394] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- link "Houseplant Identifier" [ref=f1e395] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- link "Succulent Identifier" [ref=f1e396] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- link "Identify Plant by Photo" [ref=f1e397] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- link "Plant Disease Identifier" [ref=f1e398] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- link "Plant Health App" [ref=f1e399] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- link "Plant Care App" [ref=f1e400] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- link "vs PictureThis" [ref=f1e401] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- link "vs Plantum" [ref=f1e402] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- link "vs iNaturalist" [ref=f1e403] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- link "vs Google Lens" [ref=f1e404] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=f1e405]:
|
||||
- generic [ref=f1e406]: Pflanzen & Erkennen
|
||||
- link "GreenLens auf Deutsch" [ref=f1e407] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "Pflanzen erkennen kostenlos" [ref=f1e408] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- link "Pflanzen erkennen App" [ref=f1e409] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- link "Pflanzen bestimmen" [ref=f1e410] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- link "Blumen Scanner" [ref=f1e411] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Blumen per Foto erkennen" [ref=f1e412] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Zimmerpflanzen bestimmen" [ref=f1e413] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- link "Pflanzen Pflege App" [ref=f1e414] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=f1e415] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- generic [ref=f1e416]:
|
||||
- generic [ref=f1e417]: Español
|
||||
- link "GreenLens en español" [ref=f1e418] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Identificador de plantas" [ref=f1e419] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- link "Escaner de plantas" [ref=f1e420] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- link "App para cuidar plantas" [ref=f1e421] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- link "Diagnosticar enfermedades" [ref=f1e422] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- link "GreenLens vs Google Lens" [ref=f1e423] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=f1e424]: GREENLENS
|
||||
- generic [ref=f1e425]:
|
||||
- paragraph [ref=f1e426]: © 2026 GreenLens. All rights reserved.
|
||||
- link "Support" [ref=f1e427] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- alert [ref=f1e428]
|
||||
311
.playwright-mcp/page-2026-07-10T08-55-29-850Z.yml
Normal file
311
.playwright-mcp/page-2026-07-10T08-55-29-850Z.yml
Normal file
@@ -0,0 +1,311 @@
|
||||
- generic [active] [ref=f2e1]:
|
||||
- generic [ref=f2e2]:
|
||||
- navigation [ref=f2e3]:
|
||||
- generic [ref=f2e4]:
|
||||
- link "GreenLens Home" [ref=f2e5] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- text: GREENLENS
|
||||
- button "Open menu" [ref=f2e7] [cursor=pointer]
|
||||
- main [ref=f2e10]:
|
||||
- generic [ref=f2e11]:
|
||||
- generic [ref=f2e12]:
|
||||
- generic [ref=f2e13]: Identificación de plantas por IA
|
||||
- heading "Identificador de plantas" [level=1] [ref=f2e14]
|
||||
- paragraph [ref=f2e15]: Escanea una planta y entiende que necesita en segundos.
|
||||
- paragraph [ref=f2e16]: GreenLens es un identificador de plantas para iOS y Android. Toma una foto, recibe el nombre de la especie y pasa directamente a cuidados, riego y diagnostico si la planta muestra sintomas.
|
||||
- generic [ref=f2e17]:
|
||||
- link "Descargar App" [ref=f2e18] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- link "Cómo funciona" [ref=f2e19] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- generic [ref=f2e20]:
|
||||
- generic [ref=f2e21]:
|
||||
- generic [ref=f2e22]: Impulsado por IA
|
||||
- generic [ref=f2e23]: Análisis instantáneo
|
||||
- generic [ref=f2e24]:
|
||||
- generic [ref=f2e25]: Holístico
|
||||
- generic [ref=f2e26]: Identificación y planes
|
||||
- generic [ref=f2e28]:
|
||||
- img "Teléfono escaneando una flor de loto" [ref=f2e29]
|
||||
- generic [ref=f2e32]:
|
||||
- generic [ref=f2e33]: Loto sagrado
|
||||
- generic [ref=f2e34]: Identificada en 0,8s
|
||||
- generic [ref=f2e35]:
|
||||
- generic [ref=f2e36]:
|
||||
- generic [ref=f2e37]: — La Ventaja
|
||||
- heading "Más que solo identificación. Un enfoque holístico para el cuidado de las plantas." [level=2] [ref=f2e38]
|
||||
- paragraph [ref=f2e39]: Un identificador de plantas usa IA para comparar una foto con una base de datos vegetal. GreenLens conecta esa identificacion con un plan de cuidado, recordatorios y revision de salud.
|
||||
- generic [ref=f2e40]: "Algoritmos actualizados: Mayo 2026"
|
||||
- generic [ref=f2e41]:
|
||||
- heading "¿Sabías que?" [level=3] [ref=f2e46]
|
||||
- list [ref=f2e47]:
|
||||
- listitem [ref=f2e48]:
|
||||
- strong [ref=f2e49]: El exceso de riego es la causa n.º 1 de muerte
|
||||
- text: La mayoría de las plantas de interior mueren por pudrición de la raíz debido al exceso de riego. GreenLens calcula tiempos de secado precisos.
|
||||
- listitem [ref=f2e50]:
|
||||
- strong [ref=f2e51]: La intensidad de la luz disminuye rápidamente
|
||||
- text: La intensidad de la luz disminuye un 50 % a solo 1 metro de la ventana. Los consejos de cuidado tienen en cuenta la ubicación.
|
||||
- listitem [ref=f2e52]:
|
||||
- strong [ref=f2e53]: Las plantas purifican el aire interior
|
||||
- text: Ciertas especies pueden filtrar gran parte de las toxinas del aire. GreenLens destaca las plantas purificadoras.
|
||||
- generic [ref=f2e55]:
|
||||
- generic [ref=f2e56]:
|
||||
- generic [ref=f2e57]: — La Tecnología
|
||||
- heading "Nuestra Metodología" [level=2] [ref=f2e58]
|
||||
- paragraph [ref=f2e59]: Cómo GreenLens convierte una simple foto de teléfono en un análisis botánico completo.
|
||||
- generic [ref=f2e60]:
|
||||
- generic [ref=f2e61]:
|
||||
- generic [ref=f2e62]: "1"
|
||||
- heading "Captura de Imagen" [level=3] [ref=f2e63]
|
||||
- paragraph [ref=f2e64]: La captura de alta resolución analiza la morfología de las hojas, las venas y la estructura del tallo. Se descartan las imágenes borrosas.
|
||||
- generic [ref=f2e65]:
|
||||
- generic [ref=f2e66]: "2"
|
||||
- heading "Extracción de Características" [level=3] [ref=f2e67]
|
||||
- paragraph [ref=f2e68]: Nuestra red neuronal aísla más de 120 características específicas y las compara con una enorme base de datos botánica.
|
||||
- generic [ref=f2e69]:
|
||||
- generic [ref=f2e70]: "3"
|
||||
- heading "Diagnóstico" [level=3] [ref=f2e71]
|
||||
- paragraph [ref=f2e72]: Una segunda pasada busca decoloración, rastros de plagas y marchitamiento, según las enfermedades típicas de cada especie.
|
||||
- generic [ref=f2e73]:
|
||||
- generic [ref=f2e74]: "4"
|
||||
- heading "Generación de Plan" [level=3] [ref=f2e75]
|
||||
- paragraph [ref=f2e76]: La identificación y el estado de salud se combinan en un plan de cuidado individual adaptado al clima y la luz locales.
|
||||
- generic [ref=f2e78]:
|
||||
- generic [ref=f2e80]:
|
||||
- generic [ref=f2e81]: — Perspectiva
|
||||
- heading "GreenLens frente a un identificador basico" [level=2] [ref=f2e82]
|
||||
- paragraph [ref=f2e83]: "Por qué los entusiastas serios de las plantas confían en nuestra plataforma más que en herramientas estándar: datos procesables, no solo curiosidades."
|
||||
- generic [ref=f2e84]:
|
||||
- heading "Consejo Botánico" [level=4] [ref=f2e85]
|
||||
- paragraph [ref=f2e86]: El cuidado regular es mejor que el cuidado intensivo y poco frecuente. Usa recordatorios para una buena rutina.
|
||||
- link "Escaner de plantas →" [ref=f2e87] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- generic [ref=f2e88]:
|
||||
- generic [ref=f2e89]:
|
||||
- generic [ref=f2e90]:
|
||||
- heading "Identificacion por foto" [level=3] [ref=f2e95]
|
||||
- generic [ref=f2e96]: GreenLens
|
||||
- paragraph [ref=f2e97]: Nombre, especie y perfil de cuidado en el mismo flujo.
|
||||
- generic [ref=f2e98]:
|
||||
- generic [ref=f2e99]: Apps basicas
|
||||
- paragraph [ref=f2e100]: Normalmente solo muestran el nombre o enlaces externos.
|
||||
- generic [ref=f2e101]:
|
||||
- generic [ref=f2e102]:
|
||||
- heading "Plan de cuidado" [level=3] [ref=f2e107]
|
||||
- generic [ref=f2e108]: GreenLens
|
||||
- paragraph [ref=f2e109]: Riego, luz y fertilizacion despues del escaneo.
|
||||
- generic [ref=f2e110]:
|
||||
- generic [ref=f2e111]: Apps basicas
|
||||
- paragraph [ref=f2e112]: El usuario debe buscar y configurar todo manualmente.
|
||||
- generic [ref=f2e113]:
|
||||
- generic [ref=f2e114]:
|
||||
- heading "Diagnostico de salud" [level=3] [ref=f2e119]
|
||||
- generic [ref=f2e120]: GreenLens
|
||||
- paragraph [ref=f2e121]: Analiza sintomas como hojas amarillas, manchas o tallos blandos.
|
||||
- generic [ref=f2e122]:
|
||||
- generic [ref=f2e123]: Apps basicas
|
||||
- paragraph [ref=f2e124]: Suele estar ausente o separado de la identificacion.
|
||||
- generic [ref=f2e125]:
|
||||
- article [ref=f2e126]:
|
||||
- generic [ref=f2e127]: Mejor opción
|
||||
- heading "Elige GreenLens si:" [level=2] [ref=f2e128]
|
||||
- list [ref=f2e129]:
|
||||
- listitem [ref=f2e130]:
|
||||
- generic [ref=f2e134]: Quieres identificar una planta y saber que hacer despues.
|
||||
- listitem [ref=f2e135]:
|
||||
- generic [ref=f2e139]: Tienes plantas de interior, jardin o suculentas y necesitas una guia sencilla.
|
||||
- listitem [ref=f2e140]:
|
||||
- generic [ref=f2e144]: Quieres guardar tus plantas con notas y recordatorios.
|
||||
- article [ref=f2e145]:
|
||||
- generic [ref=f2e146]: No es ideal
|
||||
- heading "GreenLens no es la herramienta adecuada si:" [level=2] [ref=f2e147]
|
||||
- list [ref=f2e148]:
|
||||
- listitem [ref=f2e149]:
|
||||
- generic [ref=f2e150]: –
|
||||
- generic [ref=f2e151]: Necesitas identificacion botanica profesional para especies raras.
|
||||
- listitem [ref=f2e152]:
|
||||
- generic [ref=f2e153]: –
|
||||
- generic [ref=f2e154]: Solo quieres una busqueda ocasional sin seguimiento de cuidado.
|
||||
- generic [ref=f2e156]:
|
||||
- heading "Preguntas Frecuentes" [level=2] [ref=f2e158]
|
||||
- generic [ref=f2e159]:
|
||||
- generic [ref=f2e160]:
|
||||
- heading "¿GreenLens identifica plantas desde fotos antiguas?" [level=3] [ref=f2e161]
|
||||
- paragraph [ref=f2e162]: Si. Puedes usar una foto de la galeria o tomar una nueva imagen desde la app.
|
||||
- generic [ref=f2e163]:
|
||||
- heading "¿GreenLens tambien ayuda con el cuidado?" [level=3] [ref=f2e164]
|
||||
- paragraph [ref=f2e165]: Si. Cada identificacion se conecta con recomendaciones de riego, luz, fertilizacion y seguimiento.
|
||||
- generic [ref=f2e166]:
|
||||
- heading "¿Funciona para plantas de interior?" [level=3] [ref=f2e167]
|
||||
- paragraph [ref=f2e168]: Si. GreenLens cubre plantas comunes de interior, plantas de jardin, flores y suculentas.
|
||||
- generic [ref=f2e169]:
|
||||
- generic [ref=f2e170]:
|
||||
- generic [ref=f2e171]: Relacionado
|
||||
- heading "Más guías" [level=2] [ref=f2e172]
|
||||
- generic [ref=f2e173]:
|
||||
- link [ref=f2e174] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- heading "Escaner de plantas" [level=3] [ref=f2e175]
|
||||
- paragraph [ref=f2e176]: Escanea hojas, flores o plantas completas desde el movil.
|
||||
- link [ref=f2e177] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- heading "App para cuidar plantas" [level=3] [ref=f2e178]
|
||||
- paragraph [ref=f2e179]: Organiza riego, luz y recordatorios para cada planta.
|
||||
- link [ref=f2e180] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- heading "Diagnosticar enfermedades de plantas" [level=3] [ref=f2e181]
|
||||
- paragraph [ref=f2e182]: Analiza sintomas y recibe el siguiente paso mas seguro.
|
||||
- contentinfo [ref=f2e183]:
|
||||
- generic [ref=f2e184]:
|
||||
- generic [ref=f2e185]:
|
||||
- generic [ref=f2e186]:
|
||||
- generic [ref=f2e187]: Download
|
||||
- heading "¿Listo para un mejor cuidado de plantas?" [level=2] [ref=f2e188]: ¿Listo paraun mejorcuidado de plantas?
|
||||
- paragraph [ref=f2e189]: GreenLens te ayuda a identificar, comprender y cuidar tus plantas. ¿Preguntas? Contáctanos a través de la página de soporte.
|
||||
- link [ref=f2e191] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=f2e192]
|
||||
- paragraph [ref=f2e193]:
|
||||
- text: La aplicación ya está disponible en las tiendas.
|
||||
- link "Soporte" [ref=f2e194] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- img "GreenLens" [ref=f2e196]
|
||||
- generic [ref=f2e198]:
|
||||
- generic [ref=f2e199]:
|
||||
- heading "GREENLENS" [level=3] [ref=f2e200]
|
||||
- paragraph [ref=f2e201]: La app para los amantes de las plantas que combina análisis, identificación y cuidado en un solo lugar.
|
||||
- generic [ref=f2e202]:
|
||||
- heading "Producto" [level=4] [ref=f2e203]
|
||||
- list [ref=f2e204]:
|
||||
- listitem [ref=f2e205]:
|
||||
- link "Funciones" [ref=f2e206] [cursor=pointer]:
|
||||
- /url: "#advantage"
|
||||
- listitem [ref=f2e207]:
|
||||
- link "Tecnología" [ref=f2e208] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=f2e209]:
|
||||
- link "Descargar la App" [ref=f2e210] [cursor=pointer]:
|
||||
- /url: "#download"
|
||||
- listitem [ref=f2e211]:
|
||||
- link "Soporte" [ref=f2e212] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=f2e213]:
|
||||
- heading "Empresa" [level=4] [ref=f2e214]
|
||||
- list [ref=f2e215]:
|
||||
- listitem [ref=f2e216]:
|
||||
- link "Cómo funciona" [ref=f2e217] [cursor=pointer]:
|
||||
- /url: "#methodology"
|
||||
- listitem [ref=f2e218]:
|
||||
- link "FAQ" [ref=f2e219] [cursor=pointer]:
|
||||
- /url: "#faq"
|
||||
- listitem [ref=f2e220]:
|
||||
- link "Soporte" [ref=f2e221] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=f2e222]:
|
||||
- heading "Legal" [level=4] [ref=f2e223]
|
||||
- list [ref=f2e224]:
|
||||
- listitem [ref=f2e225]:
|
||||
- link "Aviso Legal" [ref=f2e226] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- listitem [ref=f2e227]:
|
||||
- link "Privacidad" [ref=f2e228] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- listitem [ref=f2e229]:
|
||||
- link "Términos de uso" [ref=f2e230] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=f2e231]:
|
||||
- generic [ref=f2e232]:
|
||||
- heading "Use Cases" [level=4] [ref=f2e233]
|
||||
- list [ref=f2e234]:
|
||||
- listitem [ref=f2e235]:
|
||||
- link "Best Plant Identification App" [ref=f2e236] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- listitem [ref=f2e237]:
|
||||
- link "Plant Identifier App" [ref=f2e238] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- listitem [ref=f2e239]:
|
||||
- link "Plant Scanner" [ref=f2e240] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- listitem [ref=f2e241]:
|
||||
- link "Flower Scanner" [ref=f2e242] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- listitem [ref=f2e243]:
|
||||
- link "Houseplant Identifier" [ref=f2e244] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- listitem [ref=f2e245]:
|
||||
- link "Succulent Identifier" [ref=f2e246] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- listitem [ref=f2e247]:
|
||||
- link "Identify Plant by Photo" [ref=f2e248] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- listitem [ref=f2e249]:
|
||||
- link "Plant Disease Identifier" [ref=f2e250] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- listitem [ref=f2e251]:
|
||||
- link "Plant Health App" [ref=f2e252] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- listitem [ref=f2e253]:
|
||||
- link "Plant Care App" [ref=f2e254] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- listitem [ref=f2e255]:
|
||||
- link "vs PictureThis" [ref=f2e256] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- listitem [ref=f2e257]:
|
||||
- link "vs Plantum" [ref=f2e258] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- listitem [ref=f2e259]:
|
||||
- link "vs iNaturalist" [ref=f2e260] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- listitem [ref=f2e261]:
|
||||
- link "vs Google Lens" [ref=f2e262] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=f2e263]:
|
||||
- heading "Auf Deutsch" [level=4] [ref=f2e264]
|
||||
- list [ref=f2e265]:
|
||||
- listitem [ref=f2e266]:
|
||||
- link "Pflanzen erkennen kostenlos" [ref=f2e267] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- listitem [ref=f2e268]:
|
||||
- link "Pflanzen erkennen App" [ref=f2e269] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- listitem [ref=f2e270]:
|
||||
- link "Pflanzen bestimmen per Foto" [ref=f2e271] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- listitem [ref=f2e272]:
|
||||
- link "Blumen Scanner kostenlos" [ref=f2e273] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- listitem [ref=f2e274]:
|
||||
- link "Zimmerpflanzen bestimmen" [ref=f2e275] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- listitem [ref=f2e276]:
|
||||
- link "Pflanzen Pflege App" [ref=f2e277] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- listitem [ref=f2e278]:
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=f2e279] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- listitem [ref=f2e280]:
|
||||
- link "Gieß-Erinnerung App" [ref=f2e281] [cursor=pointer]:
|
||||
- /url: /giess-erinnerung-app
|
||||
- generic [ref=f2e282]:
|
||||
- heading "En español" [level=4] [ref=f2e283]
|
||||
- list [ref=f2e284]:
|
||||
- listitem [ref=f2e285]:
|
||||
- link "Identificador de plantas" [ref=f2e286] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- listitem [ref=f2e287]:
|
||||
- link "App para cuidar plantas" [ref=f2e288] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- listitem [ref=f2e289]:
|
||||
- link "Diagnosticar enfermedades de plantas" [ref=f2e290] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- listitem [ref=f2e291]:
|
||||
- link "Escaner de plantas" [ref=f2e292] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- listitem [ref=f2e293]:
|
||||
- link "GreenLens vs Google Lens para plantas" [ref=f2e294] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=f2e295]: GREENLENS
|
||||
- generic [ref=f2e297]:
|
||||
- paragraph [ref=f2e298]: © 2026 GreenLens. Todos los derechos reservados.
|
||||
- generic [ref=f2e299]: GREENLENS
|
||||
- alert [ref=f2e300]
|
||||
353
.playwright-mcp/page-2026-07-10T09-14-34-355Z.yml
Normal file
353
.playwright-mcp/page-2026-07-10T09-14-34-355Z.yml
Normal file
@@ -0,0 +1,353 @@
|
||||
- generic [active] [ref=e1]:
|
||||
- navigation "Main navigation" [ref=e2]:
|
||||
- generic [ref=e3]:
|
||||
- link "GreenLens Home" [ref=e4] [cursor=pointer]:
|
||||
- /url: /
|
||||
- text: GREENLENS
|
||||
- generic [ref=e5]:
|
||||
- link "Funciones" [ref=e6] [cursor=pointer]:
|
||||
- /url: /#features
|
||||
- link "Tecnologia" [ref=e7] [cursor=pointer]:
|
||||
- /url: /#intelligence
|
||||
- link "FAQ" [ref=e8] [cursor=pointer]:
|
||||
- /url: /#faq
|
||||
- link "Como funciona" [ref=e9] [cursor=pointer]:
|
||||
- /url: /#how
|
||||
- link "Support" [ref=e10] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- link "Descargar" [ref=e11] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- group "Language selector" [ref=e12]:
|
||||
- link "DE" [ref=e13] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "EN" [ref=e14] [cursor=pointer]:
|
||||
- /url: /en
|
||||
- link "ES" [ref=e15] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Empezar" [ref=e16] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- main [ref=e17]:
|
||||
- region "Hero" [ref=e18]:
|
||||
- generic [ref=e22]:
|
||||
- generic [ref=e23]: GreenLens App - Inteligencia botanica
|
||||
- heading [level=1] [ref=e26]:
|
||||
- text: Tu jardinurbano,
|
||||
- emphasis [ref=e27]: mejor cuidado.
|
||||
- paragraph [ref=e28]: Escanea plantas, entiende lo que necesitan y organiza cuidado, recordatorios y coleccion en una sola app.
|
||||
- generic [ref=e29]:
|
||||
- link "Explorar la app" [ref=e30] [cursor=pointer]:
|
||||
- /url: "#cta"
|
||||
- link "Saber mas" [ref=e34] [cursor=pointer]:
|
||||
- /url: "#features"
|
||||
- link "GreenLens on Product Hunt" [ref=e35] [cursor=pointer]:
|
||||
- /url: https://www.producthunt.com/products/greenlens?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-greenlens
|
||||
- img "GreenLens - Scan plants, understand care, and grow smarter | Product Hunt" [ref=e36]
|
||||
- group "En que te ayuda GreenLens?" [ref=e37]:
|
||||
- paragraph [ref=e38]: En que te ayuda GreenLens?
|
||||
- generic [ref=e39]:
|
||||
- button "Quiero identificar la planta." [ref=e40] [cursor=pointer]
|
||||
- button "Quiero entender problemas de cuidado." [ref=e42] [cursor=pointer]
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: Scan it
|
||||
- generic [ref=e48]: Track it
|
||||
- generic [ref=e50]: Live Design
|
||||
- generic [ref=e52]: Urban Jungle
|
||||
- generic [ref=e54]: Botanical KI
|
||||
- generic [ref=e56]: Pflege-Tipps
|
||||
- generic [ref=e58]: Scan it
|
||||
- generic [ref=e60]: Track it
|
||||
- generic [ref=e62]: Live Design
|
||||
- generic [ref=e64]: Urban Jungle
|
||||
- generic [ref=e66]: Botanical KI
|
||||
- generic [ref=e68]: Pflege-Tipps
|
||||
- generic [ref=e70]: Scan it
|
||||
- generic [ref=e72]: Track it
|
||||
- generic [ref=e74]: Live Design
|
||||
- generic [ref=e76]: Urban Jungle
|
||||
- generic [ref=e78]: Botanical KI
|
||||
- generic [ref=e80]: Pflege-Tipps
|
||||
- generic [ref=e82]: Scan it
|
||||
- generic [ref=e84]: Track it
|
||||
- generic [ref=e86]: Live Design
|
||||
- generic [ref=e88]: Urban Jungle
|
||||
- generic [ref=e90]: Botanical KI
|
||||
- generic [ref=e92]: Pflege-Tipps
|
||||
- region [ref=e94]:
|
||||
- generic [ref=e95]:
|
||||
- generic [ref=e96]:
|
||||
- paragraph [ref=e97]: Funciones
|
||||
- heading "Todo lo que tu jardin urbano necesita." [level=2] [ref=e98]: Todo lo que tujardin urbano necesita.
|
||||
- paragraph [ref=e99]: Desde la primera identificacion hasta el cuidado continuo, GreenLens te ayuda a entender mejor tus plantas y a organizarte. El lexico cubre mas de 450 especies de plantas.
|
||||
- generic [ref=e100]:
|
||||
- generic [ref=e101]:
|
||||
- img "Persona escaneando una planta con la app GreenLens" [ref=e102]
|
||||
- generic [ref=e104]:
|
||||
- generic [ref=e105]: Escaneo IA
|
||||
- heading "Escanéala." [level=3] [ref=e106]
|
||||
- paragraph [ref=e107]: Apunta la cámara a cualquier planta – GreenLens la identifica en milisegundos y entrega toda la información.
|
||||
- generic [ref=e108]:
|
||||
- generic [ref=e109]:
|
||||
- img "Plantas en un estante con planes de cuidado" [ref=e110]
|
||||
- generic [ref=e112]:
|
||||
- generic [ref=e113]: Seguimiento
|
||||
- heading "Monitoréala." [level=3] [ref=e114]
|
||||
- paragraph [ref=e115]: Plan de riego, necesidades de luz y crecimiento – todo en una línea de tiempo.
|
||||
- generic [ref=e116]:
|
||||
- img "Colección de plantas estilo jungla urbana" [ref=e117]
|
||||
- generic [ref=e119]:
|
||||
- generic [ref=e120]: Colección
|
||||
- heading "Hazla crecer." [level=3] [ref=e121]
|
||||
- paragraph [ref=e122]: Construye tu biblioteca digital de plantas – con fotos y notas.
|
||||
- generic [ref=e123]:
|
||||
- generic [ref=e128]:
|
||||
- heading "Recordatorios inteligentes" [level=4] [ref=e129]
|
||||
- paragraph [ref=e130]: Nunca olvides regar – personalizado para cada planta.
|
||||
- generic [ref=e135]:
|
||||
- heading "Diagnóstico y ayuda" [level=4] [ref=e136]
|
||||
- paragraph [ref=e137]: La IA detecta enfermedades y plagas al instante.
|
||||
- generic [ref=e143]:
|
||||
- heading "Consejos por ubicación" [level=4] [ref=e144]
|
||||
- paragraph [ref=e145]: Consejos basados en tu clima y condiciones de luz.
|
||||
- region [ref=e146]:
|
||||
- generic [ref=e147]:
|
||||
- generic [ref=e148]:
|
||||
- paragraph [ref=e149]: Ayuda para plantas
|
||||
- heading [level=2] [ref=e150]:
|
||||
- text: Menos adivinanzas.
|
||||
- emphasis [ref=e151]: Entiende mas rapido que puede necesitar tu planta.
|
||||
- paragraph [ref=e152]: GreenLens te ayuda a interpretar sintomas, identificar plantas y obtener pasos de cuidado mas claros.
|
||||
- generic [ref=e153]:
|
||||
- generic "Comparador antes y despues" [ref=e154]:
|
||||
- generic [ref=e155]: Antes
|
||||
- generic [ref=e159]: Despues
|
||||
- slider "Comparador antes y despues" [ref=e163]: "50"
|
||||
- generic: Botanical Intelligence
|
||||
- generic [ref=e164]:
|
||||
- generic [ref=e169]:
|
||||
- heading "Evaluar puntas marrones" [level=4] [ref=e170]
|
||||
- paragraph [ref=e171]: Pasa de la duda a una causa mas clara
|
||||
- generic [ref=e177]:
|
||||
- heading "Ordenar la rutina" [level=4] [ref=e178]
|
||||
- paragraph [ref=e179]: Menos caos con luz, riego e intervalos
|
||||
- generic [ref=e185]:
|
||||
- heading "Guardar ayuda en un lugar" [level=4] [ref=e186]
|
||||
- paragraph [ref=e187]: Escaneo, coleccion y notas juntos
|
||||
- region [ref=e188]:
|
||||
- generic [ref=e190]:
|
||||
- paragraph [ref=e191]: Tecnologia
|
||||
- heading [level=2] [ref=e192]:
|
||||
- text: Botanical
|
||||
- emphasis [ref=e193]: Intelligence.
|
||||
- paragraph [ref=e194]: GreenLens combina resultados de escaneo, contexto de cuidado y gestion de coleccion en una sola app para ayudarte a pasar de una foto a una decision mas clara.
|
||||
- generic [ref=e195]:
|
||||
- generic [ref=e201]:
|
||||
- heading "Identificacion basada en escaneo" [level=4] [ref=e202]
|
||||
- paragraph [ref=e203]: Pasa de una foto a un contexto mas claro en pocos pasos.
|
||||
- generic [ref=e208]:
|
||||
- heading "Guias centradas en cuidado" [level=4] [ref=e209]
|
||||
- paragraph [ref=e210]: Te ayuda a decidir los siguientes pasos mas rapido.
|
||||
- generic [ref=e216]:
|
||||
- heading "Coleccion e historial" [level=4] [ref=e217]
|
||||
- paragraph [ref=e218]: Guarda escaneos, plantas y notas en un solo lugar.
|
||||
- generic [ref=e223]:
|
||||
- heading "Lexico y busqueda" [level=4] [ref=e224]
|
||||
- paragraph [ref=e225]: Busca plantas y compara informacion dentro de una app.
|
||||
- region [ref=e226]:
|
||||
- generic [ref=e228]:
|
||||
- paragraph [ref=e229]: Cómo funciona
|
||||
- heading [level=2] [ref=e230]:
|
||||
- text: Más fácilde lo que
|
||||
- emphasis [ref=e231]: crees.
|
||||
- generic [ref=e232]:
|
||||
- generic [ref=e233]:
|
||||
- generic [ref=e234]: "01"
|
||||
- generic [ref=e235]:
|
||||
- heading "Fotografía tu planta" [level=4] [ref=e236]
|
||||
- paragraph [ref=e237]: Abre la app, apunta la cámara a tu planta y toca Escanear. Eso es todo.
|
||||
- generic [ref=e238]:
|
||||
- generic [ref=e239]: "02"
|
||||
- generic [ref=e240]:
|
||||
- heading "La IA identifica al instante" [level=4] [ref=e241]
|
||||
- paragraph [ref=e242]: En menos de un segundo obtienes el nombre exacto, la especie y todos los datos clave.
|
||||
- generic [ref=e243]:
|
||||
- generic [ref=e244]: "03"
|
||||
- generic [ref=e245]:
|
||||
- heading "Recibe el plan de cuidado" [level=4] [ref=e246]
|
||||
- paragraph [ref=e247]: GreenLens crea automáticamente un plan de cuidado personalizado para tu planta y ubicación.
|
||||
- generic [ref=e248]:
|
||||
- generic [ref=e249]: "04"
|
||||
- generic [ref=e250]:
|
||||
- heading "Seguimiento del crecimiento" [level=4] [ref=e251]
|
||||
- paragraph [ref=e252]: Documenta fotos, registra el riego y recibe recordatorios de citas de cuidado importantes.
|
||||
- generic [ref=e254]:
|
||||
- generic [ref=e255]:
|
||||
- generic [ref=e256]: Preguntas
|
||||
- heading [level=2] [ref=e257]:
|
||||
- text: Preguntas
|
||||
- emphasis [ref=e258]: Frecuentes
|
||||
- paragraph [ref=e259]: Todo lo que necesitas saber sobre GreenLens y el inicio.
|
||||
- generic [ref=e260]:
|
||||
- heading "Como identifica GreenLens una planta?" [level=3] [ref=e263] [cursor=pointer]
|
||||
- heading "Es GreenLens gratuito?" [level=3] [ref=e269] [cursor=pointer]
|
||||
- heading "Puedo usar GreenLens sin conexion?" [level=3] [ref=e275] [cursor=pointer]
|
||||
- heading "Para que tipo de plantas puedo usar GreenLens?" [level=3] [ref=e281] [cursor=pointer]
|
||||
- heading "Como empiezo mi coleccion de plantas?" [level=3] [ref=e287] [cursor=pointer]
|
||||
- region [ref=e291]:
|
||||
- generic [ref=e292]:
|
||||
- generic [ref=e293]:
|
||||
- paragraph [ref=e294]: Guías
|
||||
- heading "Identifica plantas más rápido y actúa con claridad." [level=2] [ref=e295]
|
||||
- generic [ref=e296]:
|
||||
- link [ref=e297] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- paragraph [ref=e298]: Identificar
|
||||
- heading "Identificador de plantas" [level=3] [ref=e299]
|
||||
- paragraph [ref=e300]: Escanea una planta y entiende qué necesita en segundos.
|
||||
- link [ref=e301] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- paragraph [ref=e302]: Escáner
|
||||
- heading "Escáner de plantas" [level=3] [ref=e303]
|
||||
- paragraph [ref=e304]: Apunta la cámara a cualquier planta y recibe nombre, cuidados y diagnóstico.
|
||||
- link [ref=e305] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- paragraph [ref=e306]: Cuidado
|
||||
- heading "App para cuidar plantas" [level=3] [ref=e307]
|
||||
- paragraph [ref=e308]: Planes de cuidado, recordatorios de riego y tu colección en una sola app.
|
||||
- link [ref=e309] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- paragraph [ref=e310]: Diagnóstico
|
||||
- heading "Diagnosticar enfermedades" [level=3] [ref=e311]
|
||||
- paragraph [ref=e312]: ¿Hojas amarillas o puntas marrones? Analiza los síntomas con una foto.
|
||||
- link [ref=e313] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- paragraph [ref=e314]: Google Lens
|
||||
- heading "GreenLens vs Google Lens" [level=3] [ref=e315]
|
||||
- paragraph [ref=e316]: Compara Google Lens con GreenLens para identificación, cuidado y diagnóstico.
|
||||
- region [ref=e317]:
|
||||
- generic [ref=e320]:
|
||||
- paragraph [ref=e321]: Descarga
|
||||
- heading [level=2] [ref=e322]:
|
||||
- text: Listo para un mejor
|
||||
- emphasis [ref=e323]: cuidado de plantas?
|
||||
- paragraph [ref=e324]: GreenLens te ayuda a identificar, entender y cuidar tus plantas. Si la ficha de la tienda aun no esta activa, usa la pagina de soporte.
|
||||
- generic [ref=e325]:
|
||||
- link "App Store or support" [ref=e326] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/greenlens-pro/id6759843546?l=en-GB
|
||||
- generic [ref=e329]:
|
||||
- generic [ref=e330]: Descargar en
|
||||
- text: App Store
|
||||
- link "Google Play or contact" [ref=e331] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e334]:
|
||||
- generic [ref=e335]: Contacto
|
||||
- text: Enviar correo
|
||||
- paragraph [ref=e336]:
|
||||
- text: La app ya esta disponible en las tiendas.
|
||||
- link "Support" [ref=e337] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- contentinfo [ref=e338]:
|
||||
- generic [ref=e339]:
|
||||
- generic [ref=e340]:
|
||||
- generic [ref=e341]:
|
||||
- link "GREENLENS" [ref=e342] [cursor=pointer]:
|
||||
- /url: /
|
||||
- paragraph [ref=e343]: La app para quienes quieren identificacion, cuidado y coleccion de plantas en un solo lugar.
|
||||
- link [ref=e345] [cursor=pointer]:
|
||||
- /url: https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB
|
||||
- img "Download on the App Store" [ref=e346]
|
||||
- generic [ref=e347]:
|
||||
- generic [ref=e348]: Producto
|
||||
- link "Funciones" [ref=e349] [cursor=pointer]:
|
||||
- /url: /#features
|
||||
- link "Tecnologia" [ref=e350] [cursor=pointer]:
|
||||
- /url: /#intelligence
|
||||
- link "Descargar" [ref=e351] [cursor=pointer]:
|
||||
- /url: /#cta
|
||||
- link "Support" [ref=e352] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e353]:
|
||||
- generic [ref=e354]: Recursos
|
||||
- link "Como funciona" [ref=e355] [cursor=pointer]:
|
||||
- /url: /#how
|
||||
- link "FAQ" [ref=e356] [cursor=pointer]:
|
||||
- /url: /#faq
|
||||
- link "Support" [ref=e357] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- generic [ref=e358]:
|
||||
- generic [ref=e359]: Legal
|
||||
- link "Aviso legal" [ref=e360] [cursor=pointer]:
|
||||
- /url: /imprint
|
||||
- link "Privacidad" [ref=e361] [cursor=pointer]:
|
||||
- /url: /privacy
|
||||
- link "Terminos del servicio" [ref=e362] [cursor=pointer]:
|
||||
- /url: /terms
|
||||
- generic [ref=e363]:
|
||||
- generic [ref=e364]: Identify & Care
|
||||
- link "Best Plant ID App" [ref=e365] [cursor=pointer]:
|
||||
- /url: /best-plant-identification-app
|
||||
- link "Plant Identifier App" [ref=e366] [cursor=pointer]:
|
||||
- /url: /plant-identifier-app
|
||||
- link "Plant Scanner" [ref=e367] [cursor=pointer]:
|
||||
- /url: /plant-scanner
|
||||
- link "Flower Scanner" [ref=e368] [cursor=pointer]:
|
||||
- /url: /flower-scanner
|
||||
- link "Houseplant Identifier" [ref=e369] [cursor=pointer]:
|
||||
- /url: /houseplant-identifier
|
||||
- link "Succulent Identifier" [ref=e370] [cursor=pointer]:
|
||||
- /url: /succulent-identifier
|
||||
- link "Identify Plant by Photo" [ref=e371] [cursor=pointer]:
|
||||
- /url: /identify-plant-photo
|
||||
- link "Plant Disease Identifier" [ref=e372] [cursor=pointer]:
|
||||
- /url: /plant-disease-identifier
|
||||
- link "Plant Health App" [ref=e373] [cursor=pointer]:
|
||||
- /url: /plant-health-app
|
||||
- link "Plant Care App" [ref=e374] [cursor=pointer]:
|
||||
- /url: /plant-care-app
|
||||
- link "vs PictureThis" [ref=e375] [cursor=pointer]:
|
||||
- /url: /vs/picturethis
|
||||
- link "vs Plantum" [ref=e376] [cursor=pointer]:
|
||||
- /url: /vs/plantum
|
||||
- link "vs iNaturalist" [ref=e377] [cursor=pointer]:
|
||||
- /url: /vs/inaturalist
|
||||
- link "vs Google Lens" [ref=e378] [cursor=pointer]:
|
||||
- /url: /vs/google-lens
|
||||
- generic [ref=e379]:
|
||||
- generic [ref=e380]: Pflanzen & Erkennen
|
||||
- link "GreenLens auf Deutsch" [ref=e381] [cursor=pointer]:
|
||||
- /url: /
|
||||
- link "Pflanzen erkennen kostenlos" [ref=e382] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-kostenlos
|
||||
- link "Pflanzen erkennen App" [ref=e383] [cursor=pointer]:
|
||||
- /url: /pflanzen-erkennen-app
|
||||
- link "Pflanzen bestimmen" [ref=e384] [cursor=pointer]:
|
||||
- /url: /pflanzen-bestimmen
|
||||
- link "Blumen Scanner" [ref=e385] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Blumen per Foto erkennen" [ref=e386] [cursor=pointer]:
|
||||
- /url: /blumen-scanner
|
||||
- link "Zimmerpflanzen bestimmen" [ref=e387] [cursor=pointer]:
|
||||
- /url: /zimmerpflanzen-bestimmen
|
||||
- link "Pflanzen Pflege App" [ref=e388] [cursor=pointer]:
|
||||
- /url: /pflanzen-pflege-app
|
||||
- link "Pflanzenkrankheiten erkennen" [ref=e389] [cursor=pointer]:
|
||||
- /url: /pflanzen-krankheiten-erkennen
|
||||
- generic [ref=e390]:
|
||||
- generic [ref=e391]: Español
|
||||
- link "GreenLens en español" [ref=e392] [cursor=pointer]:
|
||||
- /url: /es
|
||||
- link "Identificador de plantas" [ref=e393] [cursor=pointer]:
|
||||
- /url: /es/identificador-de-plantas
|
||||
- link "Escaner de plantas" [ref=e394] [cursor=pointer]:
|
||||
- /url: /es/escaner-de-plantas
|
||||
- link "App para cuidar plantas" [ref=e395] [cursor=pointer]:
|
||||
- /url: /es/app-para-cuidar-plantas
|
||||
- link "Diagnosticar enfermedades" [ref=e396] [cursor=pointer]:
|
||||
- /url: /es/diagnosticar-enfermedades-plantas
|
||||
- link "GreenLens vs Google Lens" [ref=e397] [cursor=pointer]:
|
||||
- /url: /es/comparar/google-lens
|
||||
- generic [ref=e398]: GREENLENS
|
||||
- generic [ref=e399]:
|
||||
- paragraph [ref=e400]: © 2026 GreenLens. Todos los derechos reservados.
|
||||
- link "Support" [ref=e401] [cursor=pointer]:
|
||||
- /url: /support
|
||||
- alert [ref=e402]
|
||||
@@ -11,6 +11,7 @@ import { initDatabase, AppMetaDb } from '../services/database';
|
||||
import * as SecureStore from 'expo-secure-store';
|
||||
import * as SplashScreen from 'expo-splash-screen';
|
||||
import { AuthService } from '../services/authService';
|
||||
import { Analytics } from '../services/analytics';
|
||||
import { AnimatedSplashScreen } from '../components/AnimatedSplashScreen';
|
||||
|
||||
// Prevent the splash screen from auto-hiding before asset loading is complete.
|
||||
@@ -115,6 +116,12 @@ function RootLayoutInner() {
|
||||
})();
|
||||
}, [signOut]);
|
||||
|
||||
useEffect(() => {
|
||||
if (pathname) {
|
||||
Analytics.screen(pathname);
|
||||
}
|
||||
}, [pathname]);
|
||||
|
||||
const isAppReady = installCheckDone && !isInitializing && !isLoadingPlants;
|
||||
const isAllowedWithoutSession = pathname.includes('onboarding')
|
||||
|| pathname.includes('auth/')
|
||||
|
||||
@@ -22,6 +22,7 @@ import {
|
||||
} from '../services/backend/contracts';
|
||||
import { createIdempotencyKey } from '../utils/idempotency';
|
||||
import { AuthService, AuthSession } from '../services/authService';
|
||||
import { Analytics } from '../services/analytics';
|
||||
import { PlantsDb, SettingsDb, LexiconHistoryDb, AppMetaDb } from '../services/database';
|
||||
|
||||
interface AppState {
|
||||
@@ -301,6 +302,10 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
||||
const hydrateSession = useCallback(async (nextSession: AuthSession) => {
|
||||
setSession(nextSession);
|
||||
setProfileNameState(nextSession.name);
|
||||
Analytics.identify(nextSession.serverUserId, {
|
||||
email: nextSession.email,
|
||||
name: nextSession.name,
|
||||
});
|
||||
setIsLoadingPlants(true);
|
||||
setIsLoadingBilling(true);
|
||||
// The previous (guest or prior account) summary is meaningless for this
|
||||
@@ -362,6 +367,7 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
||||
|
||||
const signOut = useCallback(async () => {
|
||||
await AuthService.logout();
|
||||
Analytics.reset();
|
||||
resetStateForSignedOutUser();
|
||||
}, [resetStateForSignedOutUser]);
|
||||
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('best-plant-identification-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('best-plant-identification-app')
|
||||
export default createSeoPage('best-plant-identification-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('blumen-scanner')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('blumen-scanner')
|
||||
export default createSeoPage('blumen-scanner')
|
||||
|
||||
28
greenlns-landing/app/en/page.tsx
Normal file
28
greenlns-landing/app/en/page.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
import type { Metadata } from 'next'
|
||||
import Home from '../page'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'GreenLens - Plant Identifier & Care Planner',
|
||||
description:
|
||||
'Scan plants by photo, understand what they need, and keep care, reminders, and your collection in one app.',
|
||||
alternates: {
|
||||
canonical: '/en',
|
||||
languages: {
|
||||
de: '/',
|
||||
en: '/en',
|
||||
es: '/es',
|
||||
'x-default': '/',
|
||||
},
|
||||
},
|
||||
openGraph: {
|
||||
title: 'GreenLens - Plant Identifier & Care Planner',
|
||||
description:
|
||||
'Scan plants by photo, understand what they need, and keep care, reminders, and your collection in one app.',
|
||||
type: 'website',
|
||||
locale: 'en_US',
|
||||
},
|
||||
}
|
||||
|
||||
export default function EnglishHomePage() {
|
||||
return <Home />
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getHreflangAlternates } from '@/lib/localeRoutes'
|
||||
import { getSpanishSeoPageBySlug, spanishSeoPageSlugs } from '@/lib/spanishSeoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
@@ -30,7 +31,7 @@ export async function generateMetadata({ params }: SpanishSeoRouteProps): Promis
|
||||
description: profile.metaDescription,
|
||||
alternates: {
|
||||
canonical: profile.canonical,
|
||||
languages: {
|
||||
languages: getHreflangAlternates(profile.canonical) ?? {
|
||||
es: profile.canonical,
|
||||
'x-default': '/',
|
||||
},
|
||||
|
||||
@@ -1,81 +1,30 @@
|
||||
import type { Metadata } from 'next'
|
||||
import Link from 'next/link'
|
||||
import Navbar from '@/components/Navbar'
|
||||
import Footer from '@/components/Footer'
|
||||
import Home from '../page'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { spanishSeoPageProfiles } from '@/lib/spanishSeoPages'
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'GreenLens en español - Identificar y cuidar plantas',
|
||||
title: 'GreenLens - Identificar y cuidar plantas',
|
||||
description:
|
||||
'GreenLens en español: identifica plantas por foto, organiza cuidados, recibe recordatorios y diagnostica sintomas comunes.',
|
||||
'GreenLens en español: identifica plantas por foto, organiza cuidados, recibe recordatorios y diagnostica síntomas comunes.',
|
||||
alternates: {
|
||||
canonical: '/es',
|
||||
languages: {
|
||||
de: '/',
|
||||
en: '/en',
|
||||
es: '/es',
|
||||
'x-default': '/',
|
||||
},
|
||||
},
|
||||
openGraph: {
|
||||
title: 'GreenLens en español - Identificar y cuidar plantas',
|
||||
title: 'GreenLens - Identificar y cuidar plantas',
|
||||
description:
|
||||
'Identifica plantas por foto, organiza cuidados, recibe recordatorios y diagnostica sintomas comunes con GreenLens.',
|
||||
'Identifica plantas por foto, organiza cuidados, recibe recordatorios y diagnostica síntomas comunes con GreenLens.',
|
||||
url: `${siteConfig.domain}/es`,
|
||||
type: 'website',
|
||||
locale: 'es_ES',
|
||||
},
|
||||
}
|
||||
|
||||
const pages = [
|
||||
spanishSeoPageProfiles['identificador-de-plantas'],
|
||||
spanishSeoPageProfiles['escaner-de-plantas'],
|
||||
spanishSeoPageProfiles['app-para-cuidar-plantas'],
|
||||
spanishSeoPageProfiles['diagnosticar-enfermedades-plantas'],
|
||||
spanishSeoPageProfiles['comparar-google-lens'],
|
||||
]
|
||||
|
||||
export default function SpanishHomePage() {
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main className="comparison-page">
|
||||
<section className="comparison-hero">
|
||||
<div className="container comparison-hero-grid">
|
||||
<div className="comparison-hero-copy">
|
||||
<p className="tag">GreenLens en español</p>
|
||||
<h1>Identifica, cuida y rescata tus plantas con mas claridad.</h1>
|
||||
<p className="comparison-lead">
|
||||
Escanea una planta, entiende que necesita y organiza cuidados, recordatorios y diagnostico desde una sola app.
|
||||
</p>
|
||||
<div className="comparison-actions">
|
||||
<a href="#cta" className="btn-primary">Probar GreenLens</a>
|
||||
<a href="#guias" className="btn-outline">Ver guias</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside className="comparison-hero-card">
|
||||
<p className="comparison-card-label">Arquitectura en español</p>
|
||||
<p>
|
||||
Esta seccion agrupa las paginas principales para busquedas en español:
|
||||
identificacion, escaneo, cuidado, diagnostico y comparacion con Google Lens.
|
||||
</p>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="comparison-links" id="guias">
|
||||
<div className="container comparison-links-grid">
|
||||
{pages.map((page) => (
|
||||
<Link key={page.slug} href={page.canonical} className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Guia</p>
|
||||
<h2>{page.h1}</h2>
|
||||
<p>{page.metaDescription}</p>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
)
|
||||
return <Home />
|
||||
}
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('flower-scanner')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('flower-scanner')
|
||||
export default createSeoPage('flower-scanner')
|
||||
|
||||
4
greenlns-landing/app/giess-erinnerung-app/page.tsx
Normal file
4
greenlns-landing/app/giess-erinnerung-app/page.tsx
Normal file
@@ -0,0 +1,4 @@
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
export const metadata = buildSeoPageMetadata('giess-erinnerung-app')
|
||||
export default createSeoPage('giess-erinnerung-app')
|
||||
@@ -1,4 +1,61 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Inter:wght@300;400;500;600;700;800&display=swap');
|
||||
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700&display=swap');
|
||||
/* Tailwind v4: nur Theme + Utilities, KEIN Preflight — die Landingpage
|
||||
nutzt das eigene Design-System unten und darf nicht resettet werden.
|
||||
Bewusst OHNE layer(): ungelayerte Utilities schlagen die globalen
|
||||
Element-Styles der Landing (h1, p, a, …) per Klassen-Spezifität. */
|
||||
@import 'tailwindcss/theme.css';
|
||||
@import 'tailwindcss/utilities.css';
|
||||
|
||||
/* ============================================
|
||||
SEO-Subpage Design-Tokens (aus Design-Export)
|
||||
============================================ */
|
||||
@theme {
|
||||
--color-primary: #01261f;
|
||||
--color-on-primary: #ffffff;
|
||||
--color-primary-container: #1a3c34;
|
||||
--color-on-primary-container: #83a69c;
|
||||
--color-primary-fixed: #c5eadf;
|
||||
--color-on-primary-fixed: #00201a;
|
||||
--color-secondary-container: #c9e8cb;
|
||||
--color-on-secondary-container: #4e6952;
|
||||
--color-background: #f8faf8;
|
||||
--color-on-background: #191c1b;
|
||||
--color-surface: #f8faf8;
|
||||
--color-on-surface: #191c1b;
|
||||
--color-on-surface-variant: #414846;
|
||||
--color-surface-container-low: #f2f4f2;
|
||||
--color-surface-container: #eceeec;
|
||||
--color-surface-container-high: #e6e9e7;
|
||||
--color-surface-container-highest: #e1e3e1;
|
||||
--color-outline-variant: #c1c8c4;
|
||||
--color-ink: #162118;
|
||||
--color-ink-soft: #253228;
|
||||
--color-ink-line: #2d3930;
|
||||
--color-ink-deep: #0e1b14;
|
||||
--font-display: 'Montserrat', sans-serif;
|
||||
--font-body: 'Inter', -apple-system, sans-serif;
|
||||
}
|
||||
|
||||
/* SEO-Subpage Hilfsklassen (aus Design-Export portiert) */
|
||||
@keyframes seoSubtleFade {
|
||||
from { opacity: 0; transform: translateY(10px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
.seo-fade {
|
||||
animation: seoSubtleFade 0.8s ease-out forwards;
|
||||
opacity: 0;
|
||||
}
|
||||
.seo-fade-1 { animation-delay: 100ms; }
|
||||
.seo-fade-2 { animation-delay: 200ms; }
|
||||
.seo-fade-3 { animation-delay: 300ms; }
|
||||
.seo-card {
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||
}
|
||||
.seo-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 10px 30px -10px rgba(1, 38, 31, 0.1);
|
||||
}
|
||||
|
||||
/* ============================================
|
||||
GreenLens Design System — Premium Landing
|
||||
@@ -235,8 +292,8 @@ h3 {
|
||||
}
|
||||
|
||||
.nav-cta {
|
||||
background: var(--accent) !important;
|
||||
color: #fff !important;
|
||||
background: #fff !important;
|
||||
color: #162118 !important;
|
||||
padding: 0.6rem 1.4rem;
|
||||
border-radius: var(--r-pill);
|
||||
font-weight: 600 !important;
|
||||
@@ -245,9 +302,9 @@ h3 {
|
||||
}
|
||||
|
||||
.nav-cta:hover {
|
||||
background: var(--accent-h) !important;
|
||||
background: #f1f5f9 !important;
|
||||
transform: scale(1.04);
|
||||
box-shadow: 0 6px 24px rgba(224, 122, 80, 0.35);
|
||||
box-shadow: 0 6px 24px rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.nav-hamburger {
|
||||
@@ -369,7 +426,7 @@ h3 {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
background: var(--accent);
|
||||
background: #162118;
|
||||
color: #fff;
|
||||
padding: 1rem 2.2rem;
|
||||
border-radius: var(--r-pill);
|
||||
@@ -380,9 +437,9 @@ h3 {
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: var(--accent-h);
|
||||
background: #253228;
|
||||
transform: translateY(-3px);
|
||||
box-shadow: 0 12px 36px rgba(224, 122, 80, 0.4);
|
||||
box-shadow: 0 12px 36px rgba(22, 33, 24, 0.4);
|
||||
}
|
||||
|
||||
.btn-outline {
|
||||
@@ -1208,291 +1265,291 @@ h3 {
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.support-faq-item p {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
/* =============================================
|
||||
COMPARISON PAGES
|
||||
============================================= */
|
||||
.comparison-page {
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(86, 160, 116, 0.16), transparent 26%),
|
||||
linear-gradient(180deg, var(--cream) 0%, var(--white) 100%);
|
||||
}
|
||||
|
||||
.comparison-hero {
|
||||
background:
|
||||
linear-gradient(135deg, rgba(13, 22, 15, 0.96) 0%, rgba(28, 46, 33, 0.92) 45%, rgba(42, 92, 63, 0.86) 100%);
|
||||
color: var(--cream);
|
||||
padding: 11rem 0 5rem;
|
||||
}
|
||||
|
||||
.comparison-hero-grid,
|
||||
.comparison-context-grid,
|
||||
.comparison-fit-grid,
|
||||
.comparison-links-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.2fr 0.8fr;
|
||||
gap: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-hero-copy h1 {
|
||||
max-width: 12ch;
|
||||
margin-bottom: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-lead,
|
||||
.comparison-disclaimer,
|
||||
.comparison-context-card p,
|
||||
.comparison-thesis-copy p,
|
||||
.comparison-row-verdict,
|
||||
.comparison-faq-card p,
|
||||
.comparison-link-card p,
|
||||
.comparison-scenario-copy p {
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
.comparison-lead {
|
||||
max-width: 700px;
|
||||
color: rgba(244, 241, 232, 0.86);
|
||||
font-size: 1.08rem;
|
||||
}
|
||||
|
||||
.comparison-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--s2);
|
||||
margin: var(--s4) 0 var(--s3);
|
||||
}
|
||||
|
||||
.comparison-disclaimer,
|
||||
.comparison-verified {
|
||||
font-size: 0.82rem;
|
||||
color: rgba(244, 241, 232, 0.72);
|
||||
}
|
||||
|
||||
.comparison-hero-card,
|
||||
.comparison-context-card,
|
||||
.comparison-pain-card,
|
||||
.comparison-thesis-card,
|
||||
.comparison-fit-card,
|
||||
.comparison-scenario-card,
|
||||
.comparison-faq-card,
|
||||
.comparison-link-card,
|
||||
.comparison-row {
|
||||
border-radius: var(--r-lg);
|
||||
box-shadow: 0 24px 60px rgba(19, 31, 22, 0.08);
|
||||
}
|
||||
|
||||
.comparison-hero-card {
|
||||
background: rgba(244, 241, 232, 0.08);
|
||||
border: 1px solid rgba(244, 241, 232, 0.12);
|
||||
padding: var(--s4);
|
||||
align-self: start;
|
||||
}
|
||||
|
||||
.comparison-hero-card h2 {
|
||||
font-size: clamp(1.55rem, 2.2vw, 2.2rem);
|
||||
margin-bottom: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-card-label,
|
||||
.comparison-mini-label {
|
||||
display: inline-block;
|
||||
font-size: 0.72rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.14em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.comparison-card-label {
|
||||
color: var(--green-light);
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-mini-label {
|
||||
color: var(--accent);
|
||||
margin-bottom: 0.55rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.9rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list li {
|
||||
position: relative;
|
||||
padding-left: 1.25rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list li::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0.7rem;
|
||||
left: 0;
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent);
|
||||
}
|
||||
|
||||
.comparison-bullet-list--dark li::before {
|
||||
background: var(--green-mid);
|
||||
}
|
||||
|
||||
.comparison-context,
|
||||
.comparison-theses,
|
||||
.comparison-table-section,
|
||||
.comparison-fit,
|
||||
.comparison-emergency,
|
||||
.comparison-faq,
|
||||
.comparison-links {
|
||||
padding: var(--s12) 0;
|
||||
}
|
||||
|
||||
.comparison-context-card,
|
||||
.comparison-pain-card,
|
||||
.comparison-thesis-card,
|
||||
.comparison-fit-card,
|
||||
.comparison-scenario-card,
|
||||
.comparison-faq-card,
|
||||
.comparison-link-card {
|
||||
background: rgba(255, 255, 255, 0.86);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
padding: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-context-card h2,
|
||||
.comparison-fit-card h2,
|
||||
.comparison-link-card h3 {
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-context-card--accent,
|
||||
.comparison-fit-card--greenlens {
|
||||
background:
|
||||
linear-gradient(180deg, rgba(86, 160, 116, 0.12) 0%, rgba(255, 255, 255, 0.96) 100%);
|
||||
}
|
||||
|
||||
.comparison-section-head {
|
||||
max-width: 720px;
|
||||
margin-bottom: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-section-head h2 {
|
||||
color: var(--dark);
|
||||
}
|
||||
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-pain-card {
|
||||
background: var(--dark);
|
||||
color: var(--cream);
|
||||
}
|
||||
|
||||
.comparison-pain-card h3,
|
||||
.comparison-thesis-card h3,
|
||||
.comparison-scenario-card h3,
|
||||
.comparison-faq-card h3 {
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-thesis-copy,
|
||||
.comparison-scenario-copy {
|
||||
display: grid;
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-table {
|
||||
display: grid;
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-table-header {
|
||||
display: grid;
|
||||
grid-template-columns: 0.75fr 1fr 1fr;
|
||||
gap: var(--s3);
|
||||
padding: 0 var(--s2);
|
||||
color: var(--muted);
|
||||
font-size: 0.78rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.comparison-row {
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
display: grid;
|
||||
grid-template-columns: 0.75fr 1fr 1fr;
|
||||
gap: var(--s3);
|
||||
padding: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-row-title {
|
||||
font-family: var(--display);
|
||||
font-size: 1.4rem;
|
||||
color: var(--dark);
|
||||
}
|
||||
|
||||
.comparison-cell {
|
||||
padding: var(--s3);
|
||||
border-radius: var(--r-md);
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
.comparison-cell--greenlens {
|
||||
background: rgba(86, 160, 116, 0.12);
|
||||
border: 1px solid rgba(86, 160, 116, 0.18);
|
||||
}
|
||||
|
||||
.comparison-cell--competitor {
|
||||
background: rgba(19, 31, 22, 0.05);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
}
|
||||
|
||||
.comparison-row-verdict {
|
||||
grid-column: 1 / -1;
|
||||
margin-top: 0.2rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.comparison-links-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
.comparison-link-card {
|
||||
display: block;
|
||||
transition: transform var(--t), box-shadow var(--t);
|
||||
}
|
||||
|
||||
.comparison-link-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 20px 50px rgba(19, 31, 22, 0.12);
|
||||
}
|
||||
|
||||
.comparison-link-card--support {
|
||||
background: var(--dark);
|
||||
color: var(--cream);
|
||||
}
|
||||
|
||||
.comparison-link-card--support .comparison-mini-label,
|
||||
.comparison-link-card--support p {
|
||||
color: rgba(244, 241, 232, 0.76);
|
||||
}
|
||||
|
||||
/* =============================================
|
||||
RESPONSIVE
|
||||
============================================= */
|
||||
@media (max-width: 1024px) {
|
||||
.support-faq-item p {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
/* =============================================
|
||||
COMPARISON PAGES
|
||||
============================================= */
|
||||
.comparison-page {
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(86, 160, 116, 0.16), transparent 26%),
|
||||
linear-gradient(180deg, var(--cream) 0%, var(--white) 100%);
|
||||
}
|
||||
|
||||
.comparison-hero {
|
||||
background:
|
||||
linear-gradient(135deg, rgba(13, 22, 15, 0.96) 0%, rgba(28, 46, 33, 0.92) 45%, rgba(42, 92, 63, 0.86) 100%);
|
||||
color: var(--cream);
|
||||
padding: 11rem 0 5rem;
|
||||
}
|
||||
|
||||
.comparison-hero-grid,
|
||||
.comparison-context-grid,
|
||||
.comparison-fit-grid,
|
||||
.comparison-links-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.2fr 0.8fr;
|
||||
gap: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-hero-copy h1 {
|
||||
max-width: 12ch;
|
||||
margin-bottom: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-lead,
|
||||
.comparison-disclaimer,
|
||||
.comparison-context-card p,
|
||||
.comparison-thesis-copy p,
|
||||
.comparison-row-verdict,
|
||||
.comparison-faq-card p,
|
||||
.comparison-link-card p,
|
||||
.comparison-scenario-copy p {
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
.comparison-lead {
|
||||
max-width: 700px;
|
||||
color: rgba(244, 241, 232, 0.86);
|
||||
font-size: 1.08rem;
|
||||
}
|
||||
|
||||
.comparison-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--s2);
|
||||
margin: var(--s4) 0 var(--s3);
|
||||
}
|
||||
|
||||
.comparison-disclaimer,
|
||||
.comparison-verified {
|
||||
font-size: 0.82rem;
|
||||
color: rgba(244, 241, 232, 0.72);
|
||||
}
|
||||
|
||||
.comparison-hero-card,
|
||||
.comparison-context-card,
|
||||
.comparison-pain-card,
|
||||
.comparison-thesis-card,
|
||||
.comparison-fit-card,
|
||||
.comparison-scenario-card,
|
||||
.comparison-faq-card,
|
||||
.comparison-link-card,
|
||||
.comparison-row {
|
||||
border-radius: var(--r-lg);
|
||||
box-shadow: 0 24px 60px rgba(19, 31, 22, 0.08);
|
||||
}
|
||||
|
||||
.comparison-hero-card {
|
||||
background: rgba(244, 241, 232, 0.08);
|
||||
border: 1px solid rgba(244, 241, 232, 0.12);
|
||||
padding: var(--s4);
|
||||
align-self: start;
|
||||
}
|
||||
|
||||
.comparison-hero-card h2 {
|
||||
font-size: clamp(1.55rem, 2.2vw, 2.2rem);
|
||||
margin-bottom: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-card-label,
|
||||
.comparison-mini-label {
|
||||
display: inline-block;
|
||||
font-size: 0.72rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.14em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.comparison-card-label {
|
||||
color: var(--green-light);
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-mini-label {
|
||||
color: var(--accent);
|
||||
margin-bottom: 0.55rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.9rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list li {
|
||||
position: relative;
|
||||
padding-left: 1.25rem;
|
||||
}
|
||||
|
||||
.comparison-bullet-list li::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0.7rem;
|
||||
left: 0;
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent);
|
||||
}
|
||||
|
||||
.comparison-bullet-list--dark li::before {
|
||||
background: var(--green-mid);
|
||||
}
|
||||
|
||||
.comparison-context,
|
||||
.comparison-theses,
|
||||
.comparison-table-section,
|
||||
.comparison-fit,
|
||||
.comparison-emergency,
|
||||
.comparison-faq,
|
||||
.comparison-links {
|
||||
padding: var(--s12) 0;
|
||||
}
|
||||
|
||||
.comparison-context-card,
|
||||
.comparison-pain-card,
|
||||
.comparison-thesis-card,
|
||||
.comparison-fit-card,
|
||||
.comparison-scenario-card,
|
||||
.comparison-faq-card,
|
||||
.comparison-link-card {
|
||||
background: rgba(255, 255, 255, 0.86);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
padding: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-context-card h2,
|
||||
.comparison-fit-card h2,
|
||||
.comparison-link-card h3 {
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-context-card--accent,
|
||||
.comparison-fit-card--greenlens {
|
||||
background:
|
||||
linear-gradient(180deg, rgba(86, 160, 116, 0.12) 0%, rgba(255, 255, 255, 0.96) 100%);
|
||||
}
|
||||
|
||||
.comparison-section-head {
|
||||
max-width: 720px;
|
||||
margin-bottom: var(--s4);
|
||||
}
|
||||
|
||||
.comparison-section-head h2 {
|
||||
color: var(--dark);
|
||||
}
|
||||
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-pain-card {
|
||||
background: var(--dark);
|
||||
color: var(--cream);
|
||||
}
|
||||
|
||||
.comparison-pain-card h3,
|
||||
.comparison-thesis-card h3,
|
||||
.comparison-scenario-card h3,
|
||||
.comparison-faq-card h3 {
|
||||
margin-bottom: var(--s2);
|
||||
}
|
||||
|
||||
.comparison-thesis-copy,
|
||||
.comparison-scenario-copy {
|
||||
display: grid;
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-table {
|
||||
display: grid;
|
||||
gap: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-table-header {
|
||||
display: grid;
|
||||
grid-template-columns: 0.75fr 1fr 1fr;
|
||||
gap: var(--s3);
|
||||
padding: 0 var(--s2);
|
||||
color: var(--muted);
|
||||
font-size: 0.78rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.comparison-row {
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
display: grid;
|
||||
grid-template-columns: 0.75fr 1fr 1fr;
|
||||
gap: var(--s3);
|
||||
padding: var(--s3);
|
||||
}
|
||||
|
||||
.comparison-row-title {
|
||||
font-family: var(--display);
|
||||
font-size: 1.4rem;
|
||||
color: var(--dark);
|
||||
}
|
||||
|
||||
.comparison-cell {
|
||||
padding: var(--s3);
|
||||
border-radius: var(--r-md);
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
.comparison-cell--greenlens {
|
||||
background: rgba(86, 160, 116, 0.12);
|
||||
border: 1px solid rgba(86, 160, 116, 0.18);
|
||||
}
|
||||
|
||||
.comparison-cell--competitor {
|
||||
background: rgba(19, 31, 22, 0.05);
|
||||
border: 1px solid rgba(19, 31, 22, 0.08);
|
||||
}
|
||||
|
||||
.comparison-row-verdict {
|
||||
grid-column: 1 / -1;
|
||||
margin-top: 0.2rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.comparison-links-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
.comparison-link-card {
|
||||
display: block;
|
||||
transition: transform var(--t), box-shadow var(--t);
|
||||
}
|
||||
|
||||
.comparison-link-card:hover {
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 20px 50px rgba(19, 31, 22, 0.12);
|
||||
}
|
||||
|
||||
.comparison-link-card--support {
|
||||
background: var(--dark);
|
||||
color: var(--cream);
|
||||
}
|
||||
|
||||
.comparison-link-card--support .comparison-mini-label,
|
||||
.comparison-link-card--support p {
|
||||
color: rgba(244, 241, 232, 0.76);
|
||||
}
|
||||
|
||||
/* =============================================
|
||||
RESPONSIVE
|
||||
============================================= */
|
||||
@media (max-width: 1024px) {
|
||||
.hero .container {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
@@ -1543,29 +1600,29 @@ h3 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.footer-inner {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: var(--s6);
|
||||
}
|
||||
|
||||
.comparison-hero-grid,
|
||||
.comparison-context-grid,
|
||||
.comparison-fit-grid,
|
||||
.comparison-links-grid,
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid,
|
||||
.comparison-table-header,
|
||||
.comparison-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-row-title {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.footer-inner {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: var(--s6);
|
||||
}
|
||||
|
||||
.comparison-hero-grid,
|
||||
.comparison-context-grid,
|
||||
.comparison-fit-grid,
|
||||
.comparison-links-grid,
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid,
|
||||
.comparison-table-header,
|
||||
.comparison-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-row-title {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.nav-links {
|
||||
display: none;
|
||||
}
|
||||
@@ -1608,34 +1665,34 @@ h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.support-grid,
|
||||
.support-faq-list {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-hero {
|
||||
padding-top: 9rem;
|
||||
}
|
||||
|
||||
.comparison-actions {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid,
|
||||
.comparison-links-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-context,
|
||||
.comparison-theses,
|
||||
.comparison-table-section,
|
||||
.comparison-fit,
|
||||
.comparison-emergency,
|
||||
.comparison-faq,
|
||||
.comparison-links {
|
||||
padding: var(--s8) 0;
|
||||
}
|
||||
}
|
||||
.support-grid,
|
||||
.support-faq-list {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-hero {
|
||||
padding-top: 9rem;
|
||||
}
|
||||
|
||||
.comparison-actions {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.comparison-pain-grid,
|
||||
.comparison-scenario-grid,
|
||||
.comparison-faq-grid,
|
||||
.comparison-links-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.comparison-context,
|
||||
.comparison-theses,
|
||||
.comparison-table-section,
|
||||
.comparison-fit,
|
||||
.comparison-emergency,
|
||||
.comparison-faq,
|
||||
.comparison-links {
|
||||
padding: var(--s8) 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('houseplant-identifier')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('houseplant-identifier')
|
||||
export default createSeoPage('houseplant-identifier')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('identify-plant-photo')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('identify-plant-photo')
|
||||
export default createSeoPage('identify-plant-photo')
|
||||
|
||||
@@ -35,6 +35,7 @@ export const metadata: Metadata = {
|
||||
alternates: {
|
||||
languages: {
|
||||
de: '/',
|
||||
en: '/en',
|
||||
es: '/es',
|
||||
'x-default': '/',
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { Metadata } from 'next'
|
||||
import Link from 'next/link'
|
||||
import Navbar from '@/components/Navbar'
|
||||
import GuideLinks from '@/components/GuideLinks'
|
||||
import Hero from '@/components/Hero'
|
||||
import Ticker from '@/components/Ticker'
|
||||
import Features from '@/components/Features'
|
||||
@@ -19,6 +19,7 @@ export const metadata: Metadata = {
|
||||
canonical: '/',
|
||||
languages: {
|
||||
de: '/',
|
||||
en: '/en',
|
||||
es: '/es',
|
||||
'x-default': '/',
|
||||
},
|
||||
@@ -124,51 +125,7 @@ export default function Home() {
|
||||
<Intelligence />
|
||||
<HowItWorks />
|
||||
<FAQ />
|
||||
<section className="comparison-links" aria-labelledby="homepage-guides-heading">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">Guides</p>
|
||||
<h2 id="homepage-guides-heading">Pflanzen schneller erkennen und richtig handeln.</h2>
|
||||
</div>
|
||||
<div className="comparison-links-grid">
|
||||
<Link href="/blumen-scanner" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Blumen</p>
|
||||
<h3>Blumen Scanner</h3>
|
||||
<p>Blumen per Foto erkennen, Namen erhalten und direkt Pflegehinweise nutzen.</p>
|
||||
</Link>
|
||||
<Link href="/blumen-scanner" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Foto-Erkennung</p>
|
||||
<h3>Blumen per Foto erkennen</h3>
|
||||
<p>Ideal, wenn du eine Blume fotografiert hast und sofort wissen willst, was sie braucht.</p>
|
||||
</Link>
|
||||
<Link href="/pflanzen-bestimmen" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Pflanzen</p>
|
||||
<h3>Pflanzen bestimmen</h3>
|
||||
<p>Pflanze scannen, Artname sehen und den passenden Pflegeplan erhalten.</p>
|
||||
</Link>
|
||||
<Link href="/pflanzen-pflege-app" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Gießerinnerung</p>
|
||||
<h3>Pflanzen gießen Erinnerung</h3>
|
||||
<p>Pflegeplan, Push-Erinnerung und Gießrhythmus pro Pflanze verwalten.</p>
|
||||
</Link>
|
||||
<Link href="/vs/google-lens" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Google Lens</p>
|
||||
<h3>Google Pflanzen erkennen</h3>
|
||||
<p>Vergleiche Google Lens mit GreenLens für Pflanzenerkennung, Pflege und Diagnose.</p>
|
||||
</Link>
|
||||
<Link href="/identify-plant-photo" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">English</p>
|
||||
<h3>Identify plant by photo</h3>
|
||||
<p>Use a plant photo or picture to get the name, care plan, and reminders.</p>
|
||||
</Link>
|
||||
<Link href="/pflanzen-krankheiten-erkennen" className="comparison-link-card">
|
||||
<p className="comparison-mini-label">Diagnose</p>
|
||||
<h3>Pflanzenkrankheiten erkennen</h3>
|
||||
<p>Gelbe Blätter, braune Spitzen oder weiche Stiele einordnen und den nächsten Schritt finden.</p>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<GuideLinks />
|
||||
<CTA />
|
||||
</main>
|
||||
<Footer />
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-bestimmen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('pflanzen-bestimmen')
|
||||
export default createSeoPage('pflanzen-bestimmen')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-erkennen-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('pflanzen-erkennen-app')
|
||||
export default createSeoPage('pflanzen-erkennen-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-erkennen-kostenlos')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('pflanzen-erkennen-kostenlos')
|
||||
export default createSeoPage('pflanzen-erkennen-kostenlos')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-krankheiten-erkennen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('pflanzen-krankheiten-erkennen')
|
||||
export default createSeoPage('pflanzen-krankheiten-erkennen')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('pflanzen-pflege-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('pflanzen-pflege-app')
|
||||
export default createSeoPage('pflanzen-pflege-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('plant-care-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('plant-care-app')
|
||||
export default createSeoPage('plant-care-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('plant-disease-identifier')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('plant-disease-identifier')
|
||||
export default createSeoPage('plant-disease-identifier')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('plant-health-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('plant-health-app')
|
||||
export default createSeoPage('plant-health-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('plant-identifier-app')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('plant-identifier-app')
|
||||
export default createSeoPage('plant-identifier-app')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('plant-scanner')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('plant-scanner')
|
||||
export default createSeoPage('plant-scanner')
|
||||
|
||||
@@ -12,6 +12,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
|
||||
changeFrequency: 'weekly',
|
||||
priority: 1,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/en`,
|
||||
lastModified: new Date('2026-07-10'),
|
||||
changeFrequency: 'weekly',
|
||||
priority: 0.9,
|
||||
},
|
||||
{
|
||||
url: `${baseUrl}/support`,
|
||||
lastModified: new Date('2026-04-08'),
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('succulent-identifier')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('succulent-identifier')
|
||||
export default createSeoPage('succulent-identifier')
|
||||
|
||||
@@ -1,33 +1,4 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
|
||||
const profile = getSeoPageBySlug('zimmerpflanzen-bestimmen')
|
||||
|
||||
export const metadata: Metadata = !profile
|
||||
? {}
|
||||
: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
|
||||
export default function Page() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
export const metadata = buildSeoPageMetadata('zimmerpflanzen-bestimmen')
|
||||
export default createSeoPage('zimmerpflanzen-bestimmen')
|
||||
|
||||
@@ -24,6 +24,11 @@ export default function Footer() {
|
||||
GREENLENS
|
||||
</Link>
|
||||
<p className="footer-brand-desc">{t.footer.brand}</p>
|
||||
<div style={{ display: 'flex', gap: '1rem', marginTop: '1.5rem', flexWrap: 'wrap' }}>
|
||||
<a href="https://apps.apple.com/de/app/plant-doctor-greenlens-pro/id6759843546?l=en-GB" target="_blank" rel="noopener noreferrer" style={{ transition: 'opacity 0.2s' }} onMouseOver={(e) => e.currentTarget.style.opacity = '0.8'} onMouseOut={(e) => e.currentTarget.style.opacity = '1'}>
|
||||
<img src="/app-store.png" alt="Download on the App Store" style={{ height: '40px', width: 'auto' }} />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{t.footer.cols.map((col, ci) => (
|
||||
|
||||
161
greenlns-landing/components/GuideLinks.tsx
Normal file
161
greenlns-landing/components/GuideLinks.tsx
Normal file
@@ -0,0 +1,161 @@
|
||||
'use client'
|
||||
|
||||
import Link from 'next/link'
|
||||
import { useLang } from '@/context/LangContext'
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
interface GuideCard {
|
||||
href: string
|
||||
tag: string
|
||||
title: string
|
||||
description: string
|
||||
}
|
||||
|
||||
const heading: Record<Lang, { tag: string; title: string }> = {
|
||||
de: { tag: 'Guides', title: 'Pflanzen schneller erkennen und richtig handeln.' },
|
||||
en: { tag: 'Guides', title: 'Identify plants faster and act with confidence.' },
|
||||
es: { tag: 'Guías', title: 'Identifica plantas más rápido y actúa con claridad.' },
|
||||
}
|
||||
|
||||
const cards: Record<Lang, GuideCard[]> = {
|
||||
de: [
|
||||
{
|
||||
href: '/blumen-scanner',
|
||||
tag: 'Blumen',
|
||||
title: 'Blumen Scanner',
|
||||
description: 'Blumen per Foto erkennen, Namen erhalten und direkt Pflegehinweise nutzen.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
tag: 'Pflanzen',
|
||||
title: 'Pflanzen bestimmen',
|
||||
description: 'Pflanze scannen, Artname sehen und den passenden Pflegeplan erhalten.',
|
||||
},
|
||||
{
|
||||
href: '/giess-erinnerung-app',
|
||||
tag: 'Gießerinnerung',
|
||||
title: 'Gieß-Erinnerung App',
|
||||
description: 'Nie wieder Gießen vergessen — Push-Erinnerungen pro Pflanze.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
tag: 'Pflege',
|
||||
title: 'Pflanzen Pflege App',
|
||||
description: 'Pflegeplan, Push-Erinnerung und Gießrhythmus pro Pflanze verwalten.',
|
||||
},
|
||||
{
|
||||
href: '/vs/google-lens',
|
||||
tag: 'Google Lens',
|
||||
title: 'Google Pflanzen erkennen',
|
||||
description: 'Vergleiche Google Lens mit GreenLens für Pflanzenerkennung, Pflege und Diagnose.',
|
||||
},
|
||||
{
|
||||
href: '/zimmerpflanzen-bestimmen',
|
||||
tag: 'Zimmerpflanzen',
|
||||
title: 'Zimmerpflanzen bestimmen',
|
||||
description: 'Monstera, Efeutute oder Ficus? Zimmerpflanzen per Foto erkennen.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-krankheiten-erkennen',
|
||||
tag: 'Diagnose',
|
||||
title: 'Pflanzenkrankheiten erkennen',
|
||||
description: 'Gelbe Blätter, braune Spitzen oder weiche Stiele einordnen und den nächsten Schritt finden.',
|
||||
},
|
||||
],
|
||||
en: [
|
||||
{
|
||||
href: '/plant-identifier-app',
|
||||
tag: 'Identify',
|
||||
title: 'Plant Identifier App',
|
||||
description: 'Scan any plant, get the species instantly, and move straight to care guidance.',
|
||||
},
|
||||
{
|
||||
href: '/identify-plant-photo',
|
||||
tag: 'By photo',
|
||||
title: 'Identify plant by photo',
|
||||
description: 'Use a plant photo or picture to get the name, care plan, and reminders.',
|
||||
},
|
||||
{
|
||||
href: '/plant-scanner',
|
||||
tag: 'Scanner',
|
||||
title: 'Plant Scanner',
|
||||
description: 'Point your camera at any plant and get name, care plan, and health check.',
|
||||
},
|
||||
{
|
||||
href: '/plant-disease-identifier',
|
||||
tag: 'Diagnosis',
|
||||
title: 'Plant Disease Identifier',
|
||||
description: 'Yellow leaves, brown tips, or soft stems? Analyze symptoms from a photo.',
|
||||
},
|
||||
{
|
||||
href: '/plant-care-app',
|
||||
tag: 'Care',
|
||||
title: 'Plant Care App',
|
||||
description: 'Care plans, watering reminders, and a collection for every plant you own.',
|
||||
},
|
||||
{
|
||||
href: '/best-plant-identification-app',
|
||||
tag: 'Compare',
|
||||
title: 'Best Plant Identification App',
|
||||
description: 'How GreenLens compares to other plant ID apps — and when to pick which.',
|
||||
},
|
||||
],
|
||||
es: [
|
||||
{
|
||||
href: '/es/identificador-de-plantas',
|
||||
tag: 'Identificar',
|
||||
title: 'Identificador de plantas',
|
||||
description: 'Escanea una planta y entiende qué necesita en segundos.',
|
||||
},
|
||||
{
|
||||
href: '/es/escaner-de-plantas',
|
||||
tag: 'Escáner',
|
||||
title: 'Escáner de plantas',
|
||||
description: 'Apunta la cámara a cualquier planta y recibe nombre, cuidados y diagnóstico.',
|
||||
},
|
||||
{
|
||||
href: '/es/app-para-cuidar-plantas',
|
||||
tag: 'Cuidado',
|
||||
title: 'App para cuidar plantas',
|
||||
description: 'Planes de cuidado, recordatorios de riego y tu colección en una sola app.',
|
||||
},
|
||||
{
|
||||
href: '/es/diagnosticar-enfermedades-plantas',
|
||||
tag: 'Diagnóstico',
|
||||
title: 'Diagnosticar enfermedades',
|
||||
description: '¿Hojas amarillas o puntas marrones? Analiza los síntomas con una foto.',
|
||||
},
|
||||
{
|
||||
href: '/es/comparar/google-lens',
|
||||
tag: 'Google Lens',
|
||||
title: 'GreenLens vs Google Lens',
|
||||
description: 'Compara Google Lens con GreenLens para identificación, cuidado y diagnóstico.',
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
export default function GuideLinks() {
|
||||
const { lang } = useLang()
|
||||
const head = heading[lang]
|
||||
const items = cards[lang]
|
||||
|
||||
return (
|
||||
<section className="comparison-links" aria-labelledby="homepage-guides-heading">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">{head.tag}</p>
|
||||
<h2 id="homepage-guides-heading">{head.title}</h2>
|
||||
</div>
|
||||
<div className="comparison-links-grid">
|
||||
{items.map((card) => (
|
||||
<Link key={card.href + card.title} href={card.href} className="comparison-link-card">
|
||||
<p className="comparison-mini-label">{card.tag}</p>
|
||||
<h3>{card.title}</h3>
|
||||
<p>{card.description}</p>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
50
greenlns-landing/components/LanguageSwitcher.tsx
Normal file
50
greenlns-landing/components/LanguageSwitcher.tsx
Normal file
@@ -0,0 +1,50 @@
|
||||
'use client'
|
||||
|
||||
import { usePathname } from 'next/navigation'
|
||||
import { useLang } from '@/context/LangContext'
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
import { getAlternatePath, getLocaleForPath } from '@/lib/localeRoutes'
|
||||
|
||||
const LANGS: Lang[] = ['de', 'en', 'es']
|
||||
|
||||
interface LanguageSwitcherProps {
|
||||
/** 'landing' für die helle Pille auf der Landing-Navbar, 'seo' für die Subpage-Navbar. */
|
||||
variant?: 'landing' | 'seo'
|
||||
}
|
||||
|
||||
export default function LanguageSwitcher({ variant = 'landing' }: LanguageSwitcherProps) {
|
||||
const pathname = usePathname() ?? '/'
|
||||
const { setLang } = useLang()
|
||||
const active = getLocaleForPath(pathname)
|
||||
|
||||
const baseClass =
|
||||
variant === 'seo'
|
||||
? 'flex items-center bg-ink-soft rounded-full px-1 py-1 text-[10px] font-bold tracking-widest'
|
||||
: 'flex items-center gap-0.5 rounded-full p-[3px] bg-white/5 border border-white/10 text-[10px] font-bold tracking-widest'
|
||||
|
||||
const activeClass =
|
||||
variant === 'seo'
|
||||
? 'bg-[#4a5c4e] text-white rounded-full px-3 py-1 block'
|
||||
: 'bg-white/15 text-white rounded-full px-3 py-1 block'
|
||||
|
||||
const idleClass = 'text-white/50 hover:text-white px-3 py-1 transition-colors block'
|
||||
|
||||
return (
|
||||
<div className={baseClass} role="group" aria-label="Language selector">
|
||||
{LANGS.map((code) => {
|
||||
const isActive = active === code
|
||||
return (
|
||||
<a
|
||||
key={code}
|
||||
href={getAlternatePath(pathname, code)}
|
||||
className={isActive ? activeClass : idleClass}
|
||||
aria-current={isActive ? 'true' : undefined}
|
||||
onClick={() => setLang(code)}
|
||||
>
|
||||
{code.toUpperCase()}
|
||||
</a>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -1,23 +1,17 @@
|
||||
'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'
|
||||
'use client'
|
||||
|
||||
const LANGS: { code: Lang; label: string; flag: string }[] = [
|
||||
{ code: 'de', label: 'DE', flag: 'DE' },
|
||||
{ code: 'en', label: 'EN', flag: 'EN' },
|
||||
{ code: 'es', label: 'ES', flag: 'ES' },
|
||||
]
|
||||
import Link from 'next/link'
|
||||
import { usePathname } from 'next/navigation'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { useLang } from '@/context/LangContext'
|
||||
import LanguageSwitcher from '@/components/LanguageSwitcher'
|
||||
|
||||
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}`)
|
||||
export default function Navbar() {
|
||||
const [scrolled, setScrolled] = useState(false)
|
||||
const [menuOpen, setMenuOpen] = useState(false)
|
||||
const pathname = usePathname()
|
||||
const { t } = useLang()
|
||||
const homeHref = (hash: string) => (pathname === '/' ? hash : `/${hash}`)
|
||||
|
||||
useEffect(() => {
|
||||
const onScroll = () => setScrolled(window.scrollY > 40)
|
||||
@@ -32,43 +26,18 @@ export default function Navbar() {
|
||||
GREENLENS
|
||||
</Link>
|
||||
|
||||
<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={`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) => (
|
||||
<button
|
||||
key={l.code}
|
||||
className={`lang-btn${lang === l.code ? ' lang-btn--active' : ''}`}
|
||||
onClick={() => {
|
||||
setLang(l.code)
|
||||
setMenuOpen(false)
|
||||
if (l.code === 'de' && pathname !== '/') {
|
||||
window.location.href = '/'
|
||||
}
|
||||
if (l.code === 'es' && !pathname.startsWith('/es')) {
|
||||
window.location.href = '/es'
|
||||
}
|
||||
if (l.code === 'en' && (pathname.startsWith('/de') || pathname.startsWith('/es'))) {
|
||||
window.location.href = '/'
|
||||
}
|
||||
}}
|
||||
aria-label={`Switch to ${l.label}`}
|
||||
aria-pressed={lang === l.code}
|
||||
>
|
||||
<span>{l.flag}</span>
|
||||
<span>{l.label}</span>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
<LanguageSwitcher />
|
||||
|
||||
<a href={homeHref('#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"
|
||||
@@ -96,39 +65,6 @@ export default function Navbar() {
|
||||
gap: 1rem;
|
||||
border-top: 1px solid rgba(244,241,232,0.08);
|
||||
}
|
||||
.lang-switcher {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2px;
|
||||
background: rgba(244,241,232,0.07);
|
||||
border: 1px solid rgba(244,241,232,0.12);
|
||||
border-radius: 999px;
|
||||
padding: 3px;
|
||||
}
|
||||
.lang-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: rgba(244,241,232,0.6);
|
||||
font-size: 0.7rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
padding: 4px 10px;
|
||||
border-radius: 999px;
|
||||
cursor: pointer;
|
||||
transition: background 0.2s, color 0.2s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.lang-btn:hover {
|
||||
color: rgba(244,241,232,0.9);
|
||||
background: rgba(244,241,232,0.1);
|
||||
}
|
||||
.lang-btn--active {
|
||||
background: rgba(244,241,232,0.15);
|
||||
color: #fff;
|
||||
}
|
||||
`}</style>
|
||||
</nav>
|
||||
)
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
import Link from 'next/link'
|
||||
import Navbar from '@/components/Navbar'
|
||||
import CTA from '@/components/CTA'
|
||||
import Footer from '@/components/Footer'
|
||||
import SeoNavbar from '@/components/seo/SeoNavbar'
|
||||
import SeoFooter from '@/components/seo/SeoFooter'
|
||||
import {
|
||||
SeoHero,
|
||||
SeoAdvantage,
|
||||
SeoMethodology,
|
||||
SeoComparison,
|
||||
SeoContentSections,
|
||||
SeoBestFit,
|
||||
SeoFaq,
|
||||
SeoRelated,
|
||||
} from '@/components/seo/SeoSections'
|
||||
import type { SeoPageProfile } from '@/lib/seoPages'
|
||||
import { seoTemplateCopy } from '@/lib/seoTemplateCopy'
|
||||
import { siteConfig, hasIosStoreUrl } from '@/lib/site'
|
||||
|
||||
interface SeoCategoryPageProps {
|
||||
@@ -10,62 +19,8 @@ interface SeoCategoryPageProps {
|
||||
}
|
||||
|
||||
export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
const labels = {
|
||||
en: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'Try GreenLens',
|
||||
secondaryCta: 'See full comparison',
|
||||
definition: 'Definition',
|
||||
updated: 'Last updated:',
|
||||
tableTag: 'At a glance',
|
||||
bestFit: 'Best fit',
|
||||
chooseIf: 'Choose GreenLens if:',
|
||||
notBestFit: 'Not the best fit',
|
||||
notRightIf: 'GreenLens is not the right tool if:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Common questions answered directly.',
|
||||
related: 'Related',
|
||||
supportTag: 'Need help?',
|
||||
supportTitle: 'Talk to GreenLens support',
|
||||
supportCopy: 'Questions about scans, care plans, billing, or features? Use the support page.',
|
||||
},
|
||||
de: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'GreenLens testen',
|
||||
secondaryCta: 'Vergleich ansehen',
|
||||
definition: 'Definition',
|
||||
updated: 'Aktualisiert:',
|
||||
tableTag: 'Überblick',
|
||||
bestFit: 'Passt gut',
|
||||
chooseIf: 'Wähle GreenLens, wenn:',
|
||||
notBestFit: 'Nicht ideal',
|
||||
notRightIf: 'GreenLens ist nicht die richtige Wahl, wenn:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Häufige Fragen direkt beantwortet.',
|
||||
related: 'Verwandt',
|
||||
supportTag: 'Brauchst du Hilfe?',
|
||||
supportTitle: 'GreenLens Support kontaktieren',
|
||||
supportCopy: 'Fragen zu Scans, Pflegeplänen, Abrechnung oder Funktionen? Nutze die Support-Seite.',
|
||||
},
|
||||
es: {
|
||||
heroTag: 'GreenLens',
|
||||
primaryCta: 'Probar GreenLens',
|
||||
secondaryCta: 'Ver comparación',
|
||||
definition: 'Definición',
|
||||
updated: 'Actualizado:',
|
||||
tableTag: 'Resumen',
|
||||
bestFit: 'Mejor opción',
|
||||
chooseIf: 'Elige GreenLens si:',
|
||||
notBestFit: 'No es ideal',
|
||||
notRightIf: 'GreenLens no es la herramienta adecuada si:',
|
||||
faqTag: 'FAQ',
|
||||
faqTitle: 'Preguntas frecuentes respondidas directamente.',
|
||||
related: 'Relacionado',
|
||||
supportTag: '¿Necesitas ayuda?',
|
||||
supportTitle: 'Contacta con soporte de GreenLens',
|
||||
supportCopy: '¿Preguntas sobre escaneos, planes de cuidado, facturación o funciones? Usa la página de soporte.',
|
||||
},
|
||||
}[profile.locale ?? 'en']
|
||||
const locale = profile.locale ?? 'en'
|
||||
const copy = seoTemplateCopy[locale]
|
||||
|
||||
const faqSchema = {
|
||||
'@context': 'https://schema.org',
|
||||
@@ -117,7 +72,7 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="bg-background text-on-background font-body antialiased">
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
|
||||
@@ -132,145 +87,28 @@ export default function SeoCategoryPage({ profile }: SeoCategoryPageProps) {
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbSchema) }}
|
||||
/>
|
||||
<Navbar />
|
||||
<main className="comparison-page">
|
||||
{/* Hero */}
|
||||
<section className="comparison-hero">
|
||||
<div className="container comparison-hero-grid">
|
||||
<div className="comparison-hero-copy">
|
||||
<p className="tag">{labels.heroTag}</p>
|
||||
<h1>{profile.h1}</h1>
|
||||
<p className="comparison-lead">{profile.tagline}</p>
|
||||
<p>{profile.directAnswer}</p>
|
||||
<div className="comparison-actions">
|
||||
<a href="#cta" className="btn-primary">{labels.primaryCta}</a>
|
||||
<a href="#feature-table" className="btn-outline">{labels.secondaryCta}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside className="comparison-hero-card">
|
||||
<p className="comparison-card-label">{labels.definition}</p>
|
||||
<p>{profile.definitionBlock}</p>
|
||||
<p className="comparison-verified">{labels.updated} {profile.lastUpdated}</p>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
<SeoNavbar locale={locale} />
|
||||
|
||||
{profile.contentSections && profile.contentSections.length > 0 && (
|
||||
<section className="comparison-context">
|
||||
<div className="container comparison-context-grid">
|
||||
{profile.contentSections.map((section) => (
|
||||
<article key={section.title} className="comparison-context-card">
|
||||
<p className="tag">{section.eyebrow}</p>
|
||||
<h2>{section.title}</h2>
|
||||
<p>{section.body}</p>
|
||||
{section.bullets && (
|
||||
<ul className="comparison-bullet-list comparison-bullet-list--dark">
|
||||
{section.bullets.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
<main className="pt-[72px] relative overflow-hidden bg-[#fdfbf6]">
|
||||
{/* Dekorative Farb-Blobs */}
|
||||
<div className="absolute inset-0 pointer-events-none -z-10" aria-hidden="true">
|
||||
<div className="absolute top-[-5%] left-[-10%] w-[60vw] h-[60vw] max-w-[800px] max-h-[800px] bg-[#ffd8b1] blur-[120px] rounded-full mix-blend-multiply opacity-60"></div>
|
||||
<div className="absolute top-[15%] right-[-5%] w-[50vw] h-[50vw] max-w-[600px] max-h-[600px] bg-[#c2e5cc] blur-[100px] rounded-full mix-blend-multiply opacity-80"></div>
|
||||
<div className="absolute top-[40%] left-[15%] w-[40vw] h-[40vw] max-w-[500px] max-h-[500px] bg-[#e5f0cb] blur-[100px] rounded-full mix-blend-multiply opacity-70"></div>
|
||||
</div>
|
||||
|
||||
{/* Feature table */}
|
||||
<section className="comparison-table-section" id="feature-table">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">{labels.tableTag}</p>
|
||||
<h2>{profile.featureTable.title}</h2>
|
||||
</div>
|
||||
|
||||
<div className="comparison-table">
|
||||
<div className="comparison-table-header">
|
||||
<span>Feature</span>
|
||||
<span>GreenLens</span>
|
||||
<span>{profile.featureTable.alternativeLabel}</span>
|
||||
</div>
|
||||
|
||||
{profile.featureTable.rows.map((row) => (
|
||||
<article key={row.feature} className="comparison-row">
|
||||
<div className="comparison-row-title">{row.feature}</div>
|
||||
<div className="comparison-cell comparison-cell--greenlens">{row.greenlens}</div>
|
||||
<div className="comparison-cell comparison-cell--competitor">{row.alternative}</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Fit cards */}
|
||||
<section className="comparison-fit">
|
||||
<div className="container comparison-fit-grid">
|
||||
<article className="comparison-fit-card comparison-fit-card--greenlens">
|
||||
<p className="tag">{labels.bestFit}</p>
|
||||
<h2>{labels.chooseIf}</h2>
|
||||
<ul className="comparison-bullet-list comparison-bullet-list--dark">
|
||||
{profile.greenLensIf.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article className="comparison-fit-card">
|
||||
<p className="tag">{labels.notBestFit}</p>
|
||||
<h2>{labels.notRightIf}</h2>
|
||||
<ul className="comparison-bullet-list comparison-bullet-list--dark">
|
||||
{profile.notBestIf.map((item) => (
|
||||
<li key={item}>{item}</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* FAQ */}
|
||||
<section className="comparison-faq">
|
||||
<div className="container">
|
||||
<div className="comparison-section-head">
|
||||
<p className="tag">{labels.faqTag}</p>
|
||||
<h2>{labels.faqTitle}</h2>
|
||||
</div>
|
||||
|
||||
<div className="comparison-faq-grid">
|
||||
{profile.faqs.map((item) => (
|
||||
<article key={item.question} className="comparison-faq-card">
|
||||
<h3>{item.question}</h3>
|
||||
<p>{item.answer}</p>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Related links */}
|
||||
{profile.relatedLinks.length > 0 && (
|
||||
<section className="comparison-links">
|
||||
<div className="container comparison-links-grid">
|
||||
{profile.relatedLinks.map((link) => (
|
||||
<Link key={link.href} href={link.href} className="comparison-link-card">
|
||||
<p className="comparison-mini-label">{labels.related}</p>
|
||||
<h3>{link.label}</h3>
|
||||
<p>{link.description}</p>
|
||||
</Link>
|
||||
))}
|
||||
|
||||
<Link href="/support" className="comparison-link-card comparison-link-card--support">
|
||||
<p className="comparison-mini-label">{labels.supportTag}</p>
|
||||
<h3>{labels.supportTitle}</h3>
|
||||
<p>{labels.supportCopy}</p>
|
||||
</Link>
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
<CTA />
|
||||
<SeoHero profile={profile} copy={copy} />
|
||||
<SeoAdvantage profile={profile} copy={copy} />
|
||||
<SeoMethodology copy={copy} />
|
||||
<SeoComparison profile={profile} copy={copy} />
|
||||
<SeoContentSections profile={profile} />
|
||||
<SeoBestFit profile={profile} copy={copy} />
|
||||
<SeoFaq profile={profile} copy={copy} />
|
||||
<SeoRelated profile={profile} copy={copy} />
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
|
||||
<SeoFooter locale={locale} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
171
greenlns-landing/components/seo/SeoFooter.tsx
Normal file
171
greenlns-landing/components/seo/SeoFooter.tsx
Normal file
@@ -0,0 +1,171 @@
|
||||
import Link from 'next/link'
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
import { englishSeoPageSlugs, germanSeoPageSlugs, getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { spanishSeoPageProfiles } from '@/lib/spanishSeoPages'
|
||||
import { seoTemplateCopy } from '@/lib/seoTemplateCopy'
|
||||
import { siteConfig, hasIosStoreUrl, hasAndroidStoreUrl } from '@/lib/site'
|
||||
|
||||
interface SeoFooterProps {
|
||||
locale: Lang
|
||||
}
|
||||
|
||||
function slugLinks(slugs: readonly string[]) {
|
||||
return slugs
|
||||
.map((slug) => getSeoPageBySlug(slug))
|
||||
.filter((profile): profile is NonNullable<typeof profile> => Boolean(profile))
|
||||
.map((profile) => ({ href: profile.canonical, label: profile.h1 }))
|
||||
}
|
||||
|
||||
export default function SeoFooter({ locale }: SeoFooterProps) {
|
||||
const copy = seoTemplateCopy[locale].footer
|
||||
|
||||
const useCaseLinks = [
|
||||
...slugLinks(englishSeoPageSlugs),
|
||||
{ href: '/vs/picturethis', label: 'vs PictureThis' },
|
||||
{ href: '/vs/plantum', label: 'vs Plantum' },
|
||||
{ href: '/vs/inaturalist', label: 'vs iNaturalist' },
|
||||
{ href: '/vs/google-lens', label: 'vs Google Lens' },
|
||||
]
|
||||
const germanLinks = slugLinks(germanSeoPageSlugs)
|
||||
const spanishLinks = Object.values(spanishSeoPageProfiles).map((profile) => ({
|
||||
href: profile.canonical,
|
||||
label: profile.h1,
|
||||
}))
|
||||
|
||||
return (
|
||||
<footer className="bg-ink-deep text-white pt-24 pb-8 font-body overflow-hidden" id="download">
|
||||
<div className="max-w-[1200px] mx-auto px-6">
|
||||
{/* CTA + Bild */}
|
||||
<div className="flex flex-col lg:flex-row gap-12 mb-24 items-center">
|
||||
<div className="flex-1">
|
||||
<div className="text-primary-fixed font-bold tracking-widest text-xs mb-4 uppercase">{copy.downloadTag}</div>
|
||||
<h2 className="text-5xl md:text-6xl font-bold font-display leading-tight mb-6">
|
||||
{copy.ctaLine1}
|
||||
<br />
|
||||
{copy.ctaLine2}
|
||||
<br />
|
||||
<span className="italic text-primary-fixed">{copy.ctaEm}</span>
|
||||
</h2>
|
||||
<p className="text-white/80 max-w-md mb-10 text-sm leading-relaxed">{copy.ctaBody}</p>
|
||||
<div className="flex flex-col sm:flex-row gap-4 mb-6">
|
||||
{hasIosStoreUrl && (
|
||||
<a
|
||||
href={siteConfig.iosAppStoreUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="hover:opacity-80 transition-opacity"
|
||||
>
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img src="/app-store.png" alt="Download on the App Store" className="h-12 w-auto" />
|
||||
</a>
|
||||
)}
|
||||
{hasAndroidStoreUrl && (
|
||||
<a
|
||||
href={siteConfig.androidPlayStoreUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="hover:opacity-80 transition-opacity"
|
||||
>
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img src="/play-store.png" alt="Get it on Google Play" className="h-12 w-auto" />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
<p className="text-xs text-white/60">
|
||||
{copy.storeNote}{' '}
|
||||
<Link href="/support" className="underline hover:text-white">
|
||||
{copy.supportLabel}
|
||||
</Link>
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex-1 w-full relative h-[300px] lg:h-[400px] rounded-3xl overflow-hidden shadow-2xl">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img src="/hero.jpg" alt="GreenLens" className="w-full h-full object-cover" />
|
||||
<div className="absolute inset-0 bg-gradient-to-r from-ink-deep via-transparent to-transparent"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Marken- und Legal-Spalten */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-12 mb-16 border-t border-white/10 pt-12">
|
||||
<div>
|
||||
<h3 className="font-display font-bold text-xl tracking-widest mb-4">GREENLENS</h3>
|
||||
<p className="text-xs text-white/70 leading-relaxed max-w-xs">{copy.brandBody}</p>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.productTitle}</h4>
|
||||
<ul className="space-y-4 text-xs text-white/80">
|
||||
<li><a href="#advantage" className="hover:text-white">{seoTemplateCopy[locale].nav.features}</a></li>
|
||||
<li><a href="#methodology" className="hover:text-white">{seoTemplateCopy[locale].nav.tech}</a></li>
|
||||
<li><a href="#download" className="hover:text-white">{seoTemplateCopy[locale].nav.download}</a></li>
|
||||
<li><Link href="/support" className="hover:text-white">{copy.supportLabel}</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.companyTitle}</h4>
|
||||
<ul className="space-y-4 text-xs text-white/80">
|
||||
<li><a href="#methodology" className="hover:text-white">{seoTemplateCopy[locale].nav.how}</a></li>
|
||||
<li><a href="#faq" className="hover:text-white">FAQ</a></li>
|
||||
<li><Link href="/support" className="hover:text-white">{copy.supportLabel}</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.legalTitle}</h4>
|
||||
<ul className="space-y-4 text-xs text-white/80">
|
||||
<li><Link href="/imprint" className="hover:text-white">{copy.imprint}</Link></li>
|
||||
<li><Link href="/privacy" className="hover:text-white">{copy.privacy}</Link></li>
|
||||
<li><Link href="/terms" className="hover:text-white">{copy.terms}</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* SEO-Link-Spalten (interne Verlinkung) */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-12 mb-24">
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.useCasesTitle}</h4>
|
||||
<ul className="space-y-3 text-xs text-white/70">
|
||||
{useCaseLinks.map((link) => (
|
||||
<li key={link.href}>
|
||||
<Link href={link.href} className="hover:text-white">{link.label}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.germanTitle}</h4>
|
||||
<ul className="space-y-3 text-xs text-white/70">
|
||||
{germanLinks.map((link) => (
|
||||
<li key={link.href}>
|
||||
<Link href={link.href} className="hover:text-white">{link.label}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="text-[10px] font-bold tracking-widest text-primary-fixed mb-6 uppercase">{copy.spanishTitle}</h4>
|
||||
<ul className="space-y-3 text-xs text-white/70">
|
||||
{spanishLinks.map((link) => (
|
||||
<li key={link.href}>
|
||||
<Link href={link.href} className="hover:text-white">{link.label}</Link>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Riesiger Schriftzug */}
|
||||
<div className="w-full overflow-hidden flex justify-center mb-12 border-t border-white/10 pt-16">
|
||||
<div className="text-[10vw] leading-none font-display font-bold text-white/[0.03] tracking-tighter select-none whitespace-nowrap" aria-hidden="true">
|
||||
GREENLENS
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col md:flex-row justify-between items-center text-[10px] text-white/50 border-t border-white/10 pt-8">
|
||||
<p>{copy.copy}</p>
|
||||
<div className="mt-4 md:mt-0 opacity-50">
|
||||
<span className="font-bold tracking-widest">GREENLENS</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
)
|
||||
}
|
||||
67
greenlns-landing/components/seo/SeoIcon.tsx
Normal file
67
greenlns-landing/components/seo/SeoIcon.tsx
Normal file
@@ -0,0 +1,67 @@
|
||||
/** Inline-SVG-Icons (ersetzen die Material-Symbols-Font des Design-Exports). */
|
||||
|
||||
export type SeoIconName =
|
||||
| 'check_circle'
|
||||
| 'calendar'
|
||||
| 'healing'
|
||||
| 'sun'
|
||||
| 'psychology'
|
||||
| 'menu'
|
||||
| 'close'
|
||||
|
||||
const paths: Record<SeoIconName, React.ReactNode> = {
|
||||
check_circle: (
|
||||
<>
|
||||
<circle cx="12" cy="12" r="9" />
|
||||
<path d="m9 12 2 2 4-4" />
|
||||
</>
|
||||
),
|
||||
calendar: (
|
||||
<>
|
||||
<rect x="3" y="5" width="18" height="16" rx="2" />
|
||||
<path d="M8 3v4M16 3v4M3 10h18" />
|
||||
</>
|
||||
),
|
||||
healing: (
|
||||
<>
|
||||
<path d="M12 3v18M3 12h18" transform="rotate(45 12 12)" />
|
||||
<path d="M8.5 8.5h.01M15.5 15.5h.01" />
|
||||
</>
|
||||
),
|
||||
sun: (
|
||||
<>
|
||||
<circle cx="12" cy="12" r="4" />
|
||||
<path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4" />
|
||||
</>
|
||||
),
|
||||
psychology: (
|
||||
<>
|
||||
<path d="M12 4a7 7 0 0 1 7 7c0 2.4-1.2 4.5-3 5.7V20h-6v-2h-2a2 2 0 0 1-2-2v-2H4l1.6-2.7A7 7 0 0 1 12 4Z" />
|
||||
<circle cx="12" cy="11" r="2.2" />
|
||||
</>
|
||||
),
|
||||
menu: <path d="M4 6h16M4 12h16M4 18h16" />,
|
||||
close: <path d="M6 6l12 12M18 6L6 18" />,
|
||||
}
|
||||
|
||||
interface SeoIconProps {
|
||||
name: SeoIconName
|
||||
className?: string
|
||||
}
|
||||
|
||||
export default function SeoIcon({ name, className = 'w-6 h-6' }: SeoIconProps) {
|
||||
return (
|
||||
<svg
|
||||
className={className}
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="1.8"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
aria-hidden="true"
|
||||
>
|
||||
{paths[name]}
|
||||
</svg>
|
||||
)
|
||||
}
|
||||
96
greenlns-landing/components/seo/SeoNavbar.tsx
Normal file
96
greenlns-landing/components/seo/SeoNavbar.tsx
Normal file
@@ -0,0 +1,96 @@
|
||||
'use client'
|
||||
|
||||
import Link from 'next/link'
|
||||
import { useState } from 'react'
|
||||
import LanguageSwitcher from '@/components/LanguageSwitcher'
|
||||
import SeoIcon from '@/components/seo/SeoIcon'
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
import { localeHome } from '@/lib/localeRoutes'
|
||||
import { seoTemplateCopy } from '@/lib/seoTemplateCopy'
|
||||
|
||||
interface SeoNavbarProps {
|
||||
locale: Lang
|
||||
}
|
||||
|
||||
export default function SeoNavbar({ locale }: SeoNavbarProps) {
|
||||
const [menuOpen, setMenuOpen] = useState(false)
|
||||
const copy = seoTemplateCopy[locale]
|
||||
|
||||
const links = [
|
||||
{ href: '#advantage', label: copy.nav.features },
|
||||
{ href: '#methodology', label: copy.nav.tech },
|
||||
{ href: '#faq', label: copy.nav.faq },
|
||||
{ href: '#methodology', label: copy.nav.how },
|
||||
{ href: '/support', label: copy.nav.support },
|
||||
]
|
||||
|
||||
return (
|
||||
<nav className="fixed top-0 w-full z-50 bg-ink text-white border-b border-ink-line">
|
||||
<div className="flex justify-between items-center px-6 py-4 max-w-[1200px] mx-auto">
|
||||
<Link
|
||||
href={localeHome[locale]}
|
||||
className="font-display text-2xl font-bold tracking-widest text-white"
|
||||
aria-label="GreenLens Home"
|
||||
>
|
||||
GREENLENS
|
||||
</Link>
|
||||
|
||||
{/* Desktop */}
|
||||
<div className="hidden lg:flex items-center gap-6">
|
||||
{links.map((link) =>
|
||||
link.href.startsWith('#') ? (
|
||||
<a key={link.label} className="text-white/80 hover:text-white transition-colors text-sm font-semibold" href={link.href}>
|
||||
{link.label}
|
||||
</a>
|
||||
) : (
|
||||
<Link key={link.label} className="text-white/80 hover:text-white transition-colors text-sm font-semibold" href={link.href}>
|
||||
{link.label}
|
||||
</Link>
|
||||
),
|
||||
)}
|
||||
<div className="ml-2">
|
||||
<LanguageSwitcher variant="seo" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-4">
|
||||
<a
|
||||
className="hidden md:inline-flex bg-white text-ink px-6 py-2 rounded-full font-bold shadow-lg hover:bg-gray-200 transition-colors duration-300"
|
||||
href="#download"
|
||||
>
|
||||
{copy.nav.download}
|
||||
</a>
|
||||
<button
|
||||
className="lg:hidden text-white p-2"
|
||||
aria-label={menuOpen ? 'Close menu' : 'Open menu'}
|
||||
aria-expanded={menuOpen}
|
||||
onClick={() => setMenuOpen((open) => !open)}
|
||||
>
|
||||
<SeoIcon name={menuOpen ? 'close' : 'menu'} className="w-6 h-6" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Mobile */}
|
||||
{menuOpen && (
|
||||
<div className="lg:hidden bg-ink border-t border-ink-line px-6 py-6 flex flex-col gap-4">
|
||||
{links.map((link) =>
|
||||
link.href.startsWith('#') ? (
|
||||
<a key={link.label} className="text-white/80 hover:text-white text-sm font-semibold" href={link.href} onClick={() => setMenuOpen(false)}>
|
||||
{link.label}
|
||||
</a>
|
||||
) : (
|
||||
<Link key={link.label} className="text-white/80 hover:text-white text-sm font-semibold" href={link.href} onClick={() => setMenuOpen(false)}>
|
||||
{link.label}
|
||||
</Link>
|
||||
),
|
||||
)}
|
||||
<a className="text-white/80 hover:text-white text-sm font-semibold" href="#download" onClick={() => setMenuOpen(false)}>
|
||||
{copy.nav.download}
|
||||
</a>
|
||||
<LanguageSwitcher variant="seo" />
|
||||
</div>
|
||||
)}
|
||||
</nav>
|
||||
)
|
||||
}
|
||||
270
greenlns-landing/components/seo/SeoSections.tsx
Normal file
270
greenlns-landing/components/seo/SeoSections.tsx
Normal file
@@ -0,0 +1,270 @@
|
||||
import Link from 'next/link'
|
||||
import SeoIcon, { type SeoIconName } from '@/components/seo/SeoIcon'
|
||||
import type { SeoPageProfile } from '@/lib/seoPages'
|
||||
import type { SeoTemplateCopy } from '@/lib/seoTemplateCopy'
|
||||
|
||||
interface SectionProps {
|
||||
profile: SeoPageProfile
|
||||
copy: SeoTemplateCopy
|
||||
}
|
||||
|
||||
export function SeoHero({ profile, copy }: SectionProps) {
|
||||
return (
|
||||
<section className="max-w-[1200px] mx-auto px-6 py-16 grid grid-cols-1 lg:grid-cols-12 gap-12 items-start mt-8">
|
||||
<div className="lg:col-span-6 z-10 flex flex-col justify-center pt-8">
|
||||
<div className="font-body text-xs font-semibold tracking-[0.1em] uppercase text-primary mb-6 seo-fade">
|
||||
{copy.hero.eyebrow}
|
||||
</div>
|
||||
<h1 className="font-display font-bold text-[40px] leading-[1.2] tracking-[-0.01em] md:text-[56px] md:leading-[1.1] md:tracking-[-0.02em] text-primary mb-6 seo-fade seo-fade-1">
|
||||
{profile.h1}
|
||||
</h1>
|
||||
<p className="font-body text-lg text-on-surface-variant mb-4 leading-relaxed seo-fade seo-fade-2">{profile.tagline}</p>
|
||||
<p className="font-body text-base text-on-surface-variant mb-10 leading-relaxed seo-fade seo-fade-2">{profile.directAnswer}</p>
|
||||
<div className="flex flex-col sm:flex-row gap-4 seo-fade seo-fade-3">
|
||||
<a
|
||||
className="inline-flex justify-center items-center px-8 py-3 bg-ink text-white rounded-full font-bold shadow-lg hover:bg-ink-soft transition-colors duration-300"
|
||||
href="#download"
|
||||
>
|
||||
{copy.hero.ctaPrimary}
|
||||
</a>
|
||||
<a
|
||||
className="inline-flex justify-center items-center px-8 py-3 bg-transparent border-2 border-ink text-ink rounded-full font-bold hover:bg-ink hover:text-white transition-colors duration-300"
|
||||
href="#methodology"
|
||||
>
|
||||
{copy.hero.ctaSecondary}
|
||||
</a>
|
||||
</div>
|
||||
<div className="mt-12 grid grid-cols-2 gap-6 pt-8 border-t border-surface-container-high seo-fade seo-fade-3">
|
||||
<div>
|
||||
<div className="font-display text-2xl font-semibold text-primary mb-1">{copy.hero.stat1Title}</div>
|
||||
<div className="text-xs font-semibold tracking-[0.1em] uppercase text-on-surface-variant">{copy.hero.stat1Label}</div>
|
||||
</div>
|
||||
<div>
|
||||
<div className="font-display text-2xl font-semibold text-primary mb-1">{copy.hero.stat2Title}</div>
|
||||
<div className="text-xs font-semibold tracking-[0.1em] uppercase text-on-surface-variant">{copy.hero.stat2Label}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="lg:col-span-6 flex justify-center items-center seo-fade seo-fade-2">
|
||||
<div className="relative w-full max-w-[320px] md:max-w-[380px] h-[550px] md:h-[650px] rounded-3xl overflow-hidden shadow-2xl border-[8px] border-surface-container">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img alt={copy.hero.imageAlt} className="w-full h-full object-cover" src="/hero.jpg" />
|
||||
<div className="absolute bottom-6 left-1/2 -translate-x-1/2 w-[90%] bg-surface/95 backdrop-blur p-4 rounded-xl border border-surface-container-highest flex items-center gap-3 shadow-xl">
|
||||
<div className="w-1.5 h-8 bg-primary rounded-full"></div>
|
||||
<div>
|
||||
<div className="font-display font-semibold text-sm text-primary mb-0.5">{copy.hero.floatTitle}</div>
|
||||
<div className="text-[10px] font-semibold tracking-[0.1em] uppercase text-on-surface-variant">{copy.hero.floatLabel}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoAdvantage({ profile, copy }: SectionProps) {
|
||||
return (
|
||||
<section className="max-w-[1200px] mx-auto px-6 py-16 grid grid-cols-1 lg:grid-cols-3 gap-12 border-t border-surface-container-high" id="advantage">
|
||||
<div className="lg:col-span-2">
|
||||
<div className="mb-8">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary">{copy.advantage.eyebrow}</span>
|
||||
</div>
|
||||
<h2 className="font-display font-semibold text-[32px] leading-[1.3] text-primary mb-6">{copy.advantage.heading}</h2>
|
||||
<p className="font-body text-lg text-on-surface-variant mb-6">{profile.definitionBlock}</p>
|
||||
<div className="text-xs font-semibold tracking-[0.1em] uppercase text-on-surface-variant">
|
||||
{copy.advantage.updated}: {profile.lastUpdated}
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-surface-container rounded-xl p-8 seo-card">
|
||||
<div className="flex items-center gap-3 mb-6">
|
||||
<SeoIcon name="psychology" className="w-8 h-8 text-primary" />
|
||||
<h3 className="font-display font-semibold text-2xl text-primary">{copy.didYouKnow.title}</h3>
|
||||
</div>
|
||||
<ul className="space-y-6">
|
||||
{copy.didYouKnow.items.map((item, index) => (
|
||||
<li key={item.title} className={index < copy.didYouKnow.items.length - 1 ? 'border-b border-outline-variant/30 pb-4' : ''}>
|
||||
<strong className="block font-body text-primary mb-1">{item.title}</strong>
|
||||
<span className="text-sm text-on-surface-variant">{item.body}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoMethodology({ copy }: { copy: SeoTemplateCopy }) {
|
||||
return (
|
||||
<section className="bg-surface-container-low py-16 md:py-[120px]" id="methodology">
|
||||
<div className="max-w-[1200px] mx-auto px-6">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary block mb-4">{copy.methodology.eyebrow}</span>
|
||||
<h2 className="font-display font-semibold text-[32px] md:text-[40px] leading-[1.2] text-primary">{copy.methodology.title}</h2>
|
||||
<p className="font-body text-on-surface-variant max-w-2xl mx-auto mt-4">{copy.methodology.lead}</p>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{copy.methodology.steps.map((step, index) => (
|
||||
<div key={step.title} className="bg-surface p-8 rounded-xl shadow-sm border border-surface-container-high seo-card">
|
||||
<div className="w-12 h-12 bg-primary-container text-on-primary-container rounded-full flex items-center justify-center font-display font-semibold text-xl mb-6">
|
||||
{index + 1}
|
||||
</div>
|
||||
<h3 className="font-display font-semibold text-lg text-primary mb-3">{step.title}</h3>
|
||||
<p className="font-body text-on-surface-variant text-sm">{step.body}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
const comparisonIcons: SeoIconName[] = ['check_circle', 'calendar', 'healing', 'sun']
|
||||
|
||||
export function SeoComparison({ profile, copy }: SectionProps) {
|
||||
const tipLink = profile.relatedLinks[0]
|
||||
|
||||
return (
|
||||
<section className="py-16 md:py-24" id="comparison">
|
||||
<div className="max-w-[1200px] mx-auto px-6 grid grid-cols-1 lg:grid-cols-12 gap-12">
|
||||
<div className="lg:col-span-4">
|
||||
<div className="lg:sticky lg:top-32">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary block mb-4">{copy.comparison.eyebrow}</span>
|
||||
<h2 className="font-display font-semibold text-[32px] leading-[1.3] text-primary mb-6">{profile.featureTable.title}</h2>
|
||||
<p className="font-body text-on-surface-variant mb-8">{copy.comparison.lead}</p>
|
||||
{tipLink && (
|
||||
<div className="bg-primary-container/20 p-6 rounded-lg border border-primary-container/30">
|
||||
<h4 className="font-display font-semibold text-base text-primary mb-2">{copy.comparison.tipTitle}</h4>
|
||||
<p className="text-sm text-on-surface-variant mb-3">{copy.comparison.tipBody}</p>
|
||||
<Link className="text-primary text-xs font-semibold tracking-[0.1em] uppercase hover:underline" href={tipLink.href}>
|
||||
{tipLink.label} →
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="lg:col-span-8 flex flex-col border-t border-surface-container-highest">
|
||||
{profile.featureTable.rows.map((row, index) => (
|
||||
<div key={row.feature} className="grid grid-cols-1 md:grid-cols-2 gap-8 py-8 border-b border-surface-container-highest items-start">
|
||||
<div>
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<SeoIcon name={comparisonIcons[index % comparisonIcons.length]} className="w-5 h-5 text-primary" />
|
||||
<h3 className="font-display font-semibold text-lg text-primary">{row.feature}</h3>
|
||||
</div>
|
||||
<div className="text-xs font-semibold tracking-[0.1em] uppercase text-primary mb-2">{copy.comparison.greenlens}</div>
|
||||
<p className="font-body text-on-surface-variant text-sm">{row.greenlens}</p>
|
||||
</div>
|
||||
<div className="md:pt-9">
|
||||
<div className="text-xs font-semibold tracking-[0.1em] uppercase text-on-surface-variant/60 mb-2">
|
||||
{profile.featureTable.alternativeLabel}
|
||||
</div>
|
||||
<p className="font-body text-on-surface-variant/80 text-sm">{row.alternative}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoContentSections({ profile }: { profile: SeoPageProfile }) {
|
||||
if (!profile.contentSections || profile.contentSections.length === 0) return null
|
||||
|
||||
return (
|
||||
<section className="bg-surface-container-low py-16">
|
||||
<div className="max-w-[1200px] mx-auto px-6 grid grid-cols-1 md:grid-cols-2 gap-8 items-start">
|
||||
{profile.contentSections.map((section) => (
|
||||
<article key={section.title} className="bg-surface p-8 rounded-xl shadow-sm border border-surface-container-high seo-card">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary block mb-4">{section.eyebrow}</span>
|
||||
<h2 className="font-display font-semibold text-2xl text-primary mb-4">{section.title}</h2>
|
||||
<p className="font-body text-on-surface-variant text-sm mb-4">{section.body}</p>
|
||||
{section.bullets && (
|
||||
<ul className="space-y-3">
|
||||
{section.bullets.map((item) => (
|
||||
<li key={item} className="flex items-start gap-2 text-sm text-on-surface-variant">
|
||||
<SeoIcon name="check_circle" className="w-4 h-4 mt-0.5 shrink-0 text-primary" />
|
||||
<span>{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoBestFit({ profile, copy }: SectionProps) {
|
||||
return (
|
||||
<section className="max-w-[1200px] mx-auto px-6 py-16 grid grid-cols-1 md:grid-cols-2 gap-8">
|
||||
<article className="bg-secondary-container/40 rounded-xl p-8 border border-secondary-container">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary block mb-3">{copy.bestFit.chooseTag}</span>
|
||||
<h2 className="font-display font-semibold text-2xl text-primary mb-6">{copy.bestFit.chooseTitle}</h2>
|
||||
<ul className="space-y-4">
|
||||
{profile.greenLensIf.map((item) => (
|
||||
<li key={item} className="flex items-start gap-3 text-sm text-on-surface-variant">
|
||||
<SeoIcon name="check_circle" className="w-5 h-5 mt-0.5 shrink-0 text-primary" />
|
||||
<span>{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
<article className="bg-surface-container rounded-xl p-8 border border-surface-container-high">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-on-surface-variant block mb-3">{copy.bestFit.notTag}</span>
|
||||
<h2 className="font-display font-semibold text-2xl text-primary mb-6">{copy.bestFit.notTitle}</h2>
|
||||
<ul className="space-y-4">
|
||||
{profile.notBestIf.map((item) => (
|
||||
<li key={item} className="flex items-start gap-3 text-sm text-on-surface-variant">
|
||||
<span className="w-5 h-5 mt-0.5 shrink-0 rounded-full border border-outline-variant flex items-center justify-center text-[10px] text-on-surface-variant">
|
||||
–
|
||||
</span>
|
||||
<span>{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoFaq({ profile, copy }: SectionProps) {
|
||||
return (
|
||||
<section className="bg-surface-container py-16 md:py-24" id="faq">
|
||||
<div className="max-w-[900px] mx-auto px-6">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="font-display font-semibold text-[32px] leading-[1.3] text-primary">{copy.faq.title}</h2>
|
||||
</div>
|
||||
<div className="space-y-6">
|
||||
{profile.faqs.map((item) => (
|
||||
<div key={item.question} className="bg-surface rounded-lg p-6 shadow-sm">
|
||||
<h3 className="font-display font-semibold text-base text-primary mb-2">{item.question}</h3>
|
||||
<p className="font-body text-on-surface-variant text-sm">{item.answer}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export function SeoRelated({ profile, copy }: SectionProps) {
|
||||
if (profile.relatedLinks.length === 0) return null
|
||||
|
||||
return (
|
||||
<section className="max-w-[1200px] mx-auto px-6 py-16">
|
||||
<div className="mb-10">
|
||||
<span className="text-xs font-semibold tracking-[0.1em] uppercase text-primary block mb-3">{copy.related.tag}</span>
|
||||
<h2 className="font-display font-semibold text-[32px] leading-[1.3] text-primary">{copy.related.title}</h2>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{profile.relatedLinks.map((link) => (
|
||||
<Link key={link.href} href={link.href} className="bg-surface p-6 rounded-xl border border-surface-container-high seo-card block">
|
||||
<h3 className="font-display font-semibold text-lg text-primary mb-2">{link.label}</h3>
|
||||
<p className="text-sm text-on-surface-variant">{link.description}</p>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
@@ -17,9 +17,11 @@ const LangContext = createContext<LangCtx>({
|
||||
|
||||
function getInitialLang(): Lang {
|
||||
if (typeof document === 'undefined') return 'de'
|
||||
if (window.location.pathname === '/') return 'de'
|
||||
if (window.location.pathname === '/de' || window.location.pathname.startsWith('/de/')) return 'de'
|
||||
if (window.location.pathname === '/es' || window.location.pathname.startsWith('/es/')) return 'es'
|
||||
const pathname = window.location.pathname
|
||||
if (pathname === '/') return 'de'
|
||||
if (pathname === '/en' || pathname.startsWith('/en/')) return 'en'
|
||||
if (pathname === '/de' || pathname.startsWith('/de/')) return 'de'
|
||||
if (pathname === '/es' || pathname.startsWith('/es/')) return 'es'
|
||||
const match = document.cookie.match(/(?:^|;\s*)lang=([^;]+)/)
|
||||
const val = match?.[1]
|
||||
return val === 'en' || val === 'es' || val === 'de' ? val : 'de'
|
||||
|
||||
96
greenlns-landing/lib/localeRoutes.ts
Normal file
96
greenlns-landing/lib/localeRoutes.ts
Normal file
@@ -0,0 +1,96 @@
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
/**
|
||||
* Zentrale Sprach-Architektur.
|
||||
*
|
||||
* `routeGroups`: echte Übersetzungspaare. Sie steuern den Sprachumschalter
|
||||
* UND erzeugen die hreflang-Alternates in der Metadata.
|
||||
*
|
||||
* `fuzzyTargets`: thematisch nächstliegende Seite, wenn es keine echte
|
||||
* Übersetzung gibt. Nur der Umschalter nutzt sie — hreflang ignoriert sie,
|
||||
* damit Google keine falschen Übersetzungspaare gemeldet bekommt.
|
||||
*
|
||||
* Neue Subpage? Echte Übersetzung in routeGroups eintragen, sonst
|
||||
* fuzzyTargets ergänzen (oder weglassen, dann geht's zur Locale-Startseite).
|
||||
*/
|
||||
const routeGroups: Partial<Record<Lang, string>>[] = [
|
||||
{ de: '/', en: '/en', es: '/es' },
|
||||
{ de: '/pflanzen-erkennen-app', en: '/plant-identifier-app', es: '/es/identificador-de-plantas' },
|
||||
{ de: '/blumen-scanner', en: '/flower-scanner' },
|
||||
{ de: '/pflanzen-bestimmen', en: '/identify-plant-photo' },
|
||||
{ de: '/zimmerpflanzen-bestimmen', en: '/houseplant-identifier' },
|
||||
{ de: '/pflanzen-pflege-app', en: '/plant-care-app', es: '/es/app-para-cuidar-plantas' },
|
||||
{ de: '/pflanzen-krankheiten-erkennen', en: '/plant-disease-identifier', es: '/es/diagnosticar-enfermedades-plantas' },
|
||||
{ de: '/pflanzen-erkennen-kostenlos', en: '/best-plant-identification-app' },
|
||||
{ en: '/plant-scanner', es: '/es/escaner-de-plantas' },
|
||||
{ de: '/vs/google-lens', es: '/es/comparar/google-lens' },
|
||||
]
|
||||
|
||||
const fuzzyTargets: Record<string, Partial<Record<Lang, string>>> = {
|
||||
'/blumen-scanner': { es: '/es/escaner-de-plantas' },
|
||||
'/flower-scanner': { es: '/es/escaner-de-plantas' },
|
||||
'/plant-scanner': { de: '/blumen-scanner' },
|
||||
'/pflanzen-bestimmen': { es: '/es/identificador-de-plantas' },
|
||||
'/identify-plant-photo': { es: '/es/identificador-de-plantas' },
|
||||
'/zimmerpflanzen-bestimmen': { es: '/es/identificador-de-plantas' },
|
||||
'/houseplant-identifier': { es: '/es/identificador-de-plantas' },
|
||||
'/pflanzen-erkennen-kostenlos': { es: '/es/identificador-de-plantas' },
|
||||
'/best-plant-identification-app': { es: '/es/identificador-de-plantas' },
|
||||
'/giess-erinnerung-app': { en: '/plant-care-app', es: '/es/app-para-cuidar-plantas' },
|
||||
'/plant-health-app': { de: '/pflanzen-krankheiten-erkennen', es: '/es/diagnosticar-enfermedades-plantas' },
|
||||
'/succulent-identifier': { de: '/zimmerpflanzen-bestimmen', es: '/es/identificador-de-plantas' },
|
||||
'/es/escaner-de-plantas': { de: '/blumen-scanner' },
|
||||
'/es/identificador-de-plantas': { de: '/pflanzen-erkennen-app' },
|
||||
'/vs/picturethis': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
'/vs/plantum': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
'/vs/inaturalist': { de: '/pflanzen-erkennen-app', es: '/es/identificador-de-plantas' },
|
||||
}
|
||||
|
||||
/** Seiten, die in allen Sprachen unter derselben URL leben (Client-Übersetzung). */
|
||||
const sharedPaths = new Set(['/support', '/imprint', '/privacy', '/terms'])
|
||||
|
||||
export const localeHome: Record<Lang, string> = { de: '/', en: '/en', es: '/es' }
|
||||
|
||||
const englishPaths = new Set([
|
||||
'/en',
|
||||
'/best-plant-identification-app',
|
||||
'/plant-identifier-app',
|
||||
'/plant-scanner',
|
||||
'/flower-scanner',
|
||||
'/houseplant-identifier',
|
||||
'/succulent-identifier',
|
||||
'/identify-plant-photo',
|
||||
'/plant-disease-identifier',
|
||||
'/plant-health-app',
|
||||
'/plant-care-app',
|
||||
])
|
||||
|
||||
export function getLocaleForPath(pathname: string): Lang {
|
||||
if (pathname === '/es' || pathname.startsWith('/es/')) return 'es'
|
||||
if (pathname === '/vs/google-lens') return 'de'
|
||||
if (englishPaths.has(pathname) || pathname.startsWith('/vs/')) return 'en'
|
||||
return 'de'
|
||||
}
|
||||
|
||||
function findGroup(pathname: string): Partial<Record<Lang, string>> | undefined {
|
||||
return routeGroups.find((group) => Object.values(group).includes(pathname))
|
||||
}
|
||||
|
||||
/** Ziel-URL beim Sprachwechsel: Übersetzung, thematischer Fallback oder Locale-Home. */
|
||||
export function getAlternatePath(pathname: string, target: Lang): string {
|
||||
if (sharedPaths.has(pathname)) return pathname
|
||||
if (getLocaleForPath(pathname) === target) return pathname
|
||||
return findGroup(pathname)?.[target] ?? fuzzyTargets[pathname]?.[target] ?? localeHome[target]
|
||||
}
|
||||
|
||||
/** hreflang-Alternates für die Metadata einer Seite (nur echte Übersetzungen). */
|
||||
export function getHreflangAlternates(pathname: string): Record<string, string> | undefined {
|
||||
const group = findGroup(pathname)
|
||||
if (!group || Object.keys(group).length < 2) return undefined
|
||||
return {
|
||||
...(group.de && { de: group.de }),
|
||||
...(group.en && { en: group.en }),
|
||||
...(group.es && { es: group.es }),
|
||||
'x-default': group.de ?? group.en ?? '/',
|
||||
}
|
||||
}
|
||||
61
greenlns-landing/lib/seoPageFactory.tsx
Normal file
61
greenlns-landing/lib/seoPageFactory.tsx
Normal file
@@ -0,0 +1,61 @@
|
||||
import type { Metadata } from 'next'
|
||||
import { notFound } from 'next/navigation'
|
||||
import SeoCategoryPage from '@/components/SeoCategoryPage'
|
||||
import { getHreflangAlternates } from '@/lib/localeRoutes'
|
||||
import { getSeoPageBySlug } from '@/lib/seoPages'
|
||||
import { siteConfig } from '@/lib/site'
|
||||
|
||||
/**
|
||||
* Template für SEO-Subpages. Neue Seite in 3 Schritten:
|
||||
*
|
||||
* 1. Profil in `lib/seoPages.ts` anlegen (SeoPageProfile) und den Slug
|
||||
* bei deutschen Seiten in `germanSeoPageSlugs` eintragen — damit landen
|
||||
* Sitemap-Eintrag und /de/<slug>-Redirect automatisch.
|
||||
* Englische Seiten zusätzlich in `app/sitemap.ts` ergänzen.
|
||||
* 2. `app/<slug>/page.tsx` anlegen:
|
||||
*
|
||||
* import { buildSeoPageMetadata, createSeoPage } from '@/lib/seoPageFactory'
|
||||
*
|
||||
* export const metadata = buildSeoPageMetadata('<slug>')
|
||||
* export default createSeoPage('<slug>')
|
||||
*
|
||||
* 3. Interne Links setzen: `relatedLinks` thematisch passender Profile
|
||||
* auf die neue Seite zeigen lassen.
|
||||
*/
|
||||
export function buildSeoPageMetadata(slug: string): Metadata {
|
||||
const profile = getSeoPageBySlug(slug)
|
||||
|
||||
if (!profile) {
|
||||
return {}
|
||||
}
|
||||
|
||||
const languages = getHreflangAlternates(profile.canonical)
|
||||
|
||||
return {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
alternates: { canonical: profile.canonical, ...(languages && { languages }) },
|
||||
openGraph: {
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
url: `${siteConfig.domain}${profile.canonical}`,
|
||||
type: 'website',
|
||||
images: [{ url: '/og-image.png', width: 1200, height: 630, alt: profile.metaTitle }],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: profile.metaTitle,
|
||||
description: profile.metaDescription,
|
||||
images: ['/og-image.png'],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export function createSeoPage(slug: string) {
|
||||
const profile = getSeoPageBySlug(slug)
|
||||
|
||||
return function SeoPage() {
|
||||
if (!profile) notFound()
|
||||
return <SeoCategoryPage profile={profile} />
|
||||
}
|
||||
}
|
||||
@@ -349,6 +349,7 @@ const seoPageProfiles: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-erkennen-app': {
|
||||
slug: 'pflanzen-erkennen-app',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen erkennen App kostenlos: Foto scannen | GreenLens',
|
||||
metaDescription:
|
||||
'Erkenne Pflanzen per Foto: Artname, Pflegeplan, Gießerinnerung und Diagnose in einer App. Kostenlos starten mit GreenLens für iPhone.',
|
||||
@@ -638,6 +639,7 @@ const additionalSeoPages: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-bestimmen': {
|
||||
slug: 'pflanzen-bestimmen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen bestimmen per Foto kostenlos | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanze fotografieren und kostenlos bestimmen: GreenLens liefert Artname, Pflegeplan, Gießerinnerung und Gesundheitscheck ohne Google-Umweg.',
|
||||
@@ -1023,6 +1025,7 @@ const englishSeoPages: Record<string, SeoPageProfile> = {
|
||||
const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
'pflanzen-krankheiten-erkennen': {
|
||||
slug: 'pflanzen-krankheiten-erkennen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzenkrankheiten erkennen & diagnostizieren per Foto | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanzenkrankheit erkennen: gelbe Blätter, braune Flecken, Schädlinge oder Wurzelfäule per Foto analysieren und sofort den nächsten richtigen Schritt erhalten.',
|
||||
@@ -1143,9 +1146,10 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-pflege-app': {
|
||||
slug: 'pflanzen-pflege-app',
|
||||
metaTitle: 'Pflanzen gießen Erinnerung App | GreenLens Pflege',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen Pflege App: Pflegeplan pro Pflanze | GreenLens',
|
||||
metaDescription:
|
||||
'Pflanzen gießen Erinnerung, Pflegeplan und Push-Hinweise pro Pflanze: GreenLens hilft bei Standort, Licht, Wasser und Diagnose.',
|
||||
'Pflegeplan, Gießerinnerung und Push-Hinweise pro Pflanze: Die GreenLens Pflanzen Pflege App hilft bei Standort, Licht, Wasser und Diagnose.',
|
||||
canonical: '/pflanzen-pflege-app',
|
||||
h1: 'Pflanzen Pflege App',
|
||||
tagline: 'Pflegepläne und Gießerinnerungen, die zu jeder Pflanze passen.',
|
||||
@@ -1272,6 +1276,11 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/giess-erinnerung-app',
|
||||
label: 'Gieß-Erinnerung App',
|
||||
description: 'Nie wieder Gießen vergessen — Push-Erinnerungen pro Pflanze.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
label: 'Pflanzen bestimmen',
|
||||
@@ -1295,8 +1304,170 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
],
|
||||
},
|
||||
|
||||
'giess-erinnerung-app': {
|
||||
slug: 'giess-erinnerung-app',
|
||||
locale: 'de',
|
||||
metaTitle: 'Gieß-Erinnerung App: Pflanzen gießen Erinnerung | GreenLens',
|
||||
metaDescription:
|
||||
'Nie wieder Gießen vergessen: GreenLens erinnert dich pro Pflanze ans Gießen — mit Gießplan nach Pflanzenart, Standort und Jahreszeit. Kostenlos starten.',
|
||||
canonical: '/giess-erinnerung-app',
|
||||
h1: 'Gieß-Erinnerung App',
|
||||
tagline: 'Nie wieder Gießen vergessen — Erinnerungen, die zu jeder Pflanze passen.',
|
||||
directAnswer:
|
||||
'GreenLens ist eine Gieß-Erinnerung App für iOS und Android. Pflanze scannen, und die App legt automatisch einen Gießplan mit Push-Erinnerung an — abgestimmt auf Art, Standort und Jahreszeit statt auf einen starren Timer.',
|
||||
definitionBlock:
|
||||
'Eine Gieß-Erinnerung App erinnert dich daran, deine Pflanzen zu gießen, bevor sie vertrocknen oder überwässert werden. GreenLens erstellt die Erinnerung nicht aus einem festen Intervall, sondern aus dem Scan-Ergebnis: Die erkannte Art bestimmt den Wasserbedarf, Standort und Jahreszeit passen den Rhythmus an, und der Gesundheitscheck greift ein, wenn die Pflanze Stresssignale zeigt.',
|
||||
lastUpdated: 'Juli 2026',
|
||||
includeAppSchema: true,
|
||||
featureTable: {
|
||||
title: 'GreenLens vs. Timer- und Kalender-Erinnerungen',
|
||||
alternativeLabel: 'Timer- und Kalender-Apps',
|
||||
rows: [
|
||||
{
|
||||
feature: 'Gießerinnerung einrichten',
|
||||
greenlens:
|
||||
'Pflanze scannen — der Gießplan mit Erinnerung wird automatisch aus der erkannten Art erstellt.',
|
||||
alternative:
|
||||
'Intervall selbst recherchieren und für jede Pflanze manuell eintragen.',
|
||||
},
|
||||
{
|
||||
feature: 'Gießintervall',
|
||||
greenlens:
|
||||
'Passt sich an Pflanzenart, Standort, Licht und Jahreszeit an — Sukkulente und Monstera bekommen unterschiedliche Rhythmen.',
|
||||
alternative:
|
||||
'Festes Intervall (z.B. alle 7 Tage), unabhängig davon, was die Pflanze braucht.',
|
||||
},
|
||||
{
|
||||
feature: 'Mehrere Pflanzen',
|
||||
greenlens:
|
||||
'Jede Pflanze hat ein eigenes Profil mit Foto, Notizen und eigener Erinnerung.',
|
||||
alternative:
|
||||
'Eine lange Erinnerungsliste ohne Pflanzenkontext — leicht zu verwechseln.',
|
||||
},
|
||||
{
|
||||
feature: 'Überwässerung',
|
||||
greenlens:
|
||||
'Gesundheitscheck erkennt Überwässerungssymptome und passt die Empfehlung an, statt stur weiter zu erinnern.',
|
||||
alternative:
|
||||
'Der Timer läuft weiter, auch wenn die Pflanze bereits zu nass steht.',
|
||||
},
|
||||
{
|
||||
feature: 'Mehr als Gießen',
|
||||
greenlens:
|
||||
'Erinnert auch an Düngen und Umtopfen — abgestimmt auf die erkannte Art.',
|
||||
alternative:
|
||||
'Jede weitere Erinnerung muss separat angelegt und gepflegt werden.',
|
||||
},
|
||||
],
|
||||
},
|
||||
greenLensIf: [
|
||||
'Du vergisst regelmäßig das Gießen und willst Push-Erinnerungen pro Pflanze statt eines Standard-Timers.',
|
||||
'Du hast Pflanzen mit unterschiedlichem Wasserbedarf — Sukkulenten, Zimmerpflanzen, Balkonkästen — und willst sie getrennt verwalten.',
|
||||
'Du willst, dass die Erinnerung sich anpasst, wenn eine Pflanze gestresst aussieht, statt blind weiterzulaufen.',
|
||||
],
|
||||
notBestIf: [
|
||||
'Du hast nur eine einzige robuste Pflanze und ein Wecker reicht dir völlig.',
|
||||
'Du suchst Bewässerungssteuerung für Sensoren oder automatische Bewässerungssysteme — GreenLens arbeitet mit Erinnerungen, nicht mit Hardware.',
|
||||
],
|
||||
contentSections: [
|
||||
{
|
||||
eyebrow: 'So funktioniert es',
|
||||
title: 'Vom Scan zur Gießerinnerung in unter einer Minute.',
|
||||
body:
|
||||
'Statt Gießintervalle zu googeln und manuell einzutragen, scannst du die Pflanze einmal. GreenLens erkennt die Art, legt ein Profil an und erstellt daraus den Gießplan mit Push-Erinnerung — für jede Pflanze einzeln.',
|
||||
bullets: [
|
||||
'Pflanze fotografieren — Art und Wasserbedarf werden automatisch erkannt.',
|
||||
'Gießplan pro Pflanze, angepasst an Standort, Licht und Jahreszeit.',
|
||||
'Push-Erinnerung, wenn eine Pflanze dran ist — mit Foto, damit nichts verwechselt wird.',
|
||||
],
|
||||
},
|
||||
{
|
||||
eyebrow: 'Zu viel oder zu wenig',
|
||||
title: 'Die Erinnerung, die auch vor Überwässerung schützt.',
|
||||
body:
|
||||
'Die meisten Zimmerpflanzen sterben nicht am Vergessen, sondern am zu häufigen Gießen. Zeigt eine Pflanze gelbe Blätter oder weiche Stiele, prüfst du sie mit dem Gesundheitscheck — GreenLens erkennt Überwässerung und passt die Empfehlung an, statt die nächste Erinnerung zu erzwingen.',
|
||||
},
|
||||
{
|
||||
eyebrow: 'Urlaub und Alltag',
|
||||
title: 'Gießerinnerungen, die deinen Rhythmus mitmachen.',
|
||||
body:
|
||||
'Ob Urlaubsvorbereitung, Umzug ans andere Fenster oder Winterruhe: Gießintervalle lassen sich pro Pflanze jederzeit anpassen. Die Pflegehistorie zeigt dir, wann zuletzt gegossen wurde — auch wenn mehrere Personen im Haushalt gießen.',
|
||||
},
|
||||
],
|
||||
faqs: [
|
||||
{
|
||||
question: 'Welche App erinnert mich ans Pflanzen gießen?',
|
||||
answer:
|
||||
'GreenLens erinnert dich per Push-Nachricht ans Gießen — für jede Pflanze einzeln. Nach dem Scan wird der Gießplan automatisch aus der erkannten Art erstellt und an Standort und Jahreszeit angepasst.',
|
||||
},
|
||||
{
|
||||
question: 'Ist die Gieß-Erinnerung in GreenLens kostenlos?',
|
||||
answer:
|
||||
'Ja. Pflanzensammlung, Gießpläne und Gieß-Erinnerungen sind in der kostenlosen Version enthalten. Kostenpflichtig sind nur erweiterte KI-Gesundheitschecks und unbegrenzte Scans.',
|
||||
},
|
||||
{
|
||||
question: 'Woher weiß die App, wie oft meine Pflanze Wasser braucht?',
|
||||
answer:
|
||||
'Beim Scan erkennt GreenLens die Pflanzenart und leitet daraus den Wasserbedarf ab. Der Gießplan berücksichtigt zusätzlich Standort, Licht und Jahreszeit — eine Sukkulente am Südfenster bekommt einen anderen Rhythmus als ein Farn im Bad.',
|
||||
},
|
||||
{
|
||||
question: 'Kann ich für jede Pflanze eine eigene Gießerinnerung einstellen?',
|
||||
answer:
|
||||
'Ja. Jede gespeicherte Pflanze hat ein eigenes Profil mit Foto, Notizen und eigenem Gießintervall. Du kannst jedes Intervall manuell anpassen, wenn du es anders willst als vorgeschlagen.',
|
||||
},
|
||||
{
|
||||
question: 'Erinnert die App auch an Düngen und Umtopfen?',
|
||||
answer:
|
||||
'Ja. GreenLens-Pflegepläne umfassen Gießen, Düngen und Umtopfen. Jeder Erinnerungstyp lässt sich pro Pflanze einzeln aktivieren und anpassen.',
|
||||
},
|
||||
{
|
||||
question: 'Was passiert, wenn ich eine Gießerinnerung verpasse?',
|
||||
answer:
|
||||
'Die Erinnerung bleibt offen, bis du das Gießen bestätigst — nichts verschiebt sich stillschweigend. Die Pflegehistorie zeigt dir jederzeit, wann jede Pflanze zuletzt gegossen wurde.',
|
||||
},
|
||||
{
|
||||
question: 'Hilft die App auch gegen Überwässerung?',
|
||||
answer:
|
||||
'Ja. Überwässerung ist die häufigste Todesursache bei Zimmerpflanzen. Zeigt eine Pflanze weiche Stiele oder gelbe Blätter, erkennt der GreenLens-Gesundheitscheck Überwässerung und empfiehlt eine Gießpause, statt weiter zu erinnern.',
|
||||
},
|
||||
{
|
||||
question: 'Funktioniert die Gieß-Erinnerung auch für Balkon- und Gartenpflanzen?',
|
||||
answer:
|
||||
'Ja. GreenLens unterstützt Innen- und Außenpflanzen. Balkonkästen und Gartenpflanzen bekommen eigene Profile mit Intervallen, die zur Saison passen.',
|
||||
},
|
||||
{
|
||||
question: 'Brauche ich für die Erinnerungen eine Internetverbindung?',
|
||||
answer:
|
||||
'Nein. Scannen erfordert eine Verbindung, aber deine Pflanzensammlung, Gießpläne und Erinnerungen funktionieren auch offline.',
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
label: 'Pflanzen Pflege App',
|
||||
description: 'Der komplette Pflegeplan: Gießen, Düngen, Standort und Gesundheitscheck in einer App.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-bestimmen',
|
||||
label: 'Pflanzen bestimmen',
|
||||
description: 'Pflanze per Foto bestimmen — die Grundlage für den automatischen Gießplan.',
|
||||
},
|
||||
{
|
||||
href: '/zimmerpflanzen-bestimmen',
|
||||
label: 'Zimmerpflanzen bestimmen',
|
||||
description: 'Zimmerpflanzen erkennen und direkt passende Gießerinnerungen einrichten.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-krankheiten-erkennen',
|
||||
label: 'Pflanzenkrankheiten erkennen',
|
||||
description: 'Gelbe Blätter trotz Gießplan? Symptome per Foto analysieren.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
'zimmerpflanzen-bestimmen': {
|
||||
slug: 'zimmerpflanzen-bestimmen',
|
||||
locale: 'de',
|
||||
metaTitle: 'Zimmerpflanzen bestimmen per Foto kostenlos | GreenLens',
|
||||
metaDescription:
|
||||
'Bestimme Zimmerpflanzen per Foto: Monstera, Efeutute, Ficus, Orchideen und Sukkulenten erkennen, Pflegeplan erhalten und richtig gießen.',
|
||||
@@ -1402,6 +1573,11 @@ const germanSeoPages2: Record<string, SeoPageProfile> = {
|
||||
},
|
||||
],
|
||||
relatedLinks: [
|
||||
{
|
||||
href: '/giess-erinnerung-app',
|
||||
label: 'Gieß-Erinnerung App',
|
||||
description: 'Gießerinnerungen pro Zimmerpflanze — automatisch aus dem Scan.',
|
||||
},
|
||||
{
|
||||
href: '/pflanzen-pflege-app',
|
||||
label: 'Pflanzen Pflege App',
|
||||
@@ -1961,6 +2137,7 @@ const highVolumeSeoPages: Record<string, SeoPageProfile> = {
|
||||
|
||||
'pflanzen-erkennen-kostenlos': {
|
||||
slug: 'pflanzen-erkennen-kostenlos',
|
||||
locale: 'de',
|
||||
metaTitle: 'Pflanzen erkennen kostenlos — App mit Pflegeplan | GreenLens',
|
||||
metaDescription:
|
||||
'GreenLens erkennt Pflanzen kostenlos per Foto und liefert direkt Artname, Pflegeplan und Gießerinnerungen — ohne Umweg und ohne Paywall bei der Erkennung.',
|
||||
@@ -2095,6 +2272,7 @@ export const germanSeoPageSlugs = [
|
||||
'zimmerpflanzen-bestimmen',
|
||||
'pflanzen-pflege-app',
|
||||
'pflanzen-krankheiten-erkennen',
|
||||
'giess-erinnerung-app',
|
||||
] as const
|
||||
|
||||
export function getSeoPageBySlug(slug: string): SeoPageProfile | undefined {
|
||||
|
||||
412
greenlns-landing/lib/seoTemplateCopy.ts
Normal file
412
greenlns-landing/lib/seoTemplateCopy.ts
Normal file
@@ -0,0 +1,412 @@
|
||||
import type { Lang } from '@/lib/i18n'
|
||||
|
||||
/** Statische, lokalisierte Texte des SEO-Subpage-Templates. */
|
||||
export interface SeoTemplateCopy {
|
||||
nav: {
|
||||
features: string
|
||||
tech: string
|
||||
faq: string
|
||||
how: string
|
||||
support: string
|
||||
download: string
|
||||
}
|
||||
hero: {
|
||||
eyebrow: string
|
||||
ctaPrimary: string
|
||||
ctaSecondary: string
|
||||
stat1Title: string
|
||||
stat1Label: string
|
||||
stat2Title: string
|
||||
stat2Label: string
|
||||
floatTitle: string
|
||||
floatLabel: string
|
||||
imageAlt: string
|
||||
}
|
||||
advantage: {
|
||||
eyebrow: string
|
||||
heading: string
|
||||
updated: string
|
||||
}
|
||||
didYouKnow: {
|
||||
title: string
|
||||
items: { title: string; body: string }[]
|
||||
}
|
||||
methodology: {
|
||||
eyebrow: string
|
||||
title: string
|
||||
lead: string
|
||||
steps: { title: string; body: string }[]
|
||||
}
|
||||
comparison: {
|
||||
eyebrow: string
|
||||
title: string
|
||||
lead: string
|
||||
greenlens: string
|
||||
alternative: string
|
||||
tipTitle: string
|
||||
tipBody: string
|
||||
}
|
||||
bestFit: {
|
||||
chooseTag: string
|
||||
chooseTitle: string
|
||||
notTag: string
|
||||
notTitle: string
|
||||
}
|
||||
faq: {
|
||||
title: string
|
||||
}
|
||||
related: {
|
||||
tag: string
|
||||
title: string
|
||||
}
|
||||
footer: {
|
||||
downloadTag: string
|
||||
ctaLine1: string
|
||||
ctaLine2: string
|
||||
ctaEm: string
|
||||
ctaBody: string
|
||||
storeNote: string
|
||||
supportLabel: string
|
||||
brandBody: string
|
||||
productTitle: string
|
||||
companyTitle: string
|
||||
legalTitle: string
|
||||
useCasesTitle: string
|
||||
germanTitle: string
|
||||
spanishTitle: string
|
||||
imprint: string
|
||||
privacy: string
|
||||
terms: string
|
||||
copy: string
|
||||
}
|
||||
}
|
||||
|
||||
export const seoTemplateCopy: Record<Lang, SeoTemplateCopy> = {
|
||||
de: {
|
||||
nav: {
|
||||
features: 'Funktionen',
|
||||
tech: 'Technologie',
|
||||
faq: 'FAQ',
|
||||
how: 'So funktioniert es',
|
||||
support: 'Support',
|
||||
download: 'App laden',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'KI-Pflanzenerkennung',
|
||||
ctaPrimary: 'App laden',
|
||||
ctaSecondary: 'So funktioniert es',
|
||||
stat1Title: 'KI-gestützt',
|
||||
stat1Label: 'Sofortige Analyse',
|
||||
stat2Title: 'Ganzheitlich',
|
||||
stat2Label: 'Erkennung & Pflegeplan',
|
||||
floatTitle: 'Indische Lotosblume',
|
||||
floatLabel: 'Erkannt in 0,8s',
|
||||
imageAlt: 'Smartphone scannt eine Lotusblüte',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— Der Vorteil',
|
||||
heading: 'Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für Pflanzenpflege.',
|
||||
updated: 'Algorithmen aktualisiert',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: 'Wusstest du schon?',
|
||||
items: [
|
||||
{
|
||||
title: 'Überwässerung ist Todesursache Nr. 1',
|
||||
body: 'Die meisten Zimmerpflanzen sterben an Wurzelfäule durch zu häufiges Gießen. GreenLens berechnet präzise Trocknungszeiten.',
|
||||
},
|
||||
{
|
||||
title: 'Lichtintensität fällt rasant ab',
|
||||
body: 'Schon 1 Meter vom Fenster entfernt sinkt die Lichtintensität um 50 %. Pflegehinweise berücksichtigen den Standort.',
|
||||
},
|
||||
{
|
||||
title: 'Pflanzen reinigen die Raumluft',
|
||||
body: 'Bestimmte Arten können einen Großteil der Schadstoffe aus der Luft filtern. GreenLens hebt luftreinigende Pflanzen hervor.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— Die Technologie',
|
||||
title: 'Unsere Methodik',
|
||||
lead: 'Wie GreenLens aus einem einfachen Handyfoto eine vollständige botanische Analyse macht.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Bildaufnahme',
|
||||
body: 'Die hochauflösende Aufnahme analysiert Blattmorphologie, Blattadern und Stängelstruktur. Unscharfe Bilder werden aussortiert.',
|
||||
},
|
||||
{
|
||||
title: 'Merkmals-Extraktion',
|
||||
body: 'Das neuronale Netz isoliert über 120 spezifische Merkmale und vergleicht sie mit einer umfangreichen botanischen Datenbank.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnose',
|
||||
body: 'Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welke — basierend auf typischen Krankheiten der jeweiligen Art.',
|
||||
},
|
||||
{
|
||||
title: 'Plan-Erstellung',
|
||||
body: 'Aus Erkennung und Gesundheitszustand entsteht ein individueller Pflegeplan, angepasst an Standort und Lichtverhältnisse.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Im Vergleich',
|
||||
title: 'GreenLens vs. einfache Apps',
|
||||
lead: 'Warum ernsthafte Pflanzenfans auf unsere Plattform statt auf Standard-Erkennungstools setzen: verwertbare Daten statt bloßer Namen.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Einfache Apps',
|
||||
tipTitle: 'Botanik-Tipp',
|
||||
tipBody: 'Regelmäßige Pflege ist besser als seltene Intensiv-Pflege. Nutze Erinnerungen für eine gute Routine.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Passt gut',
|
||||
chooseTitle: 'Wähle GreenLens, wenn:',
|
||||
notTag: 'Nicht ideal',
|
||||
notTitle: 'GreenLens ist nicht die richtige Wahl, wenn:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Häufige Fragen',
|
||||
},
|
||||
related: {
|
||||
tag: 'Verwandt',
|
||||
title: 'Weitere Guides',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: 'Bereit für',
|
||||
ctaLine2: 'bessere',
|
||||
ctaEm: 'Pflanzenpflege?',
|
||||
ctaBody: 'GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Bei Fragen erreichst du uns über die Support-Seite.',
|
||||
storeNote: 'Die App ist in den Stores verfügbar.',
|
||||
supportLabel: 'Support',
|
||||
brandBody: 'Die App für Pflanzenfans, die Analyse, Erkennung und Pflege an einem Ort vereint.',
|
||||
productTitle: 'Produkt',
|
||||
companyTitle: 'Unternehmen',
|
||||
legalTitle: 'Rechtliches',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Pflanzen erkennen',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Impressum',
|
||||
privacy: 'Datenschutz',
|
||||
terms: 'Nutzungsbedingungen',
|
||||
copy: '© 2026 GreenLens. Alle Rechte vorbehalten.',
|
||||
},
|
||||
},
|
||||
en: {
|
||||
nav: {
|
||||
features: 'Features',
|
||||
tech: 'Technology',
|
||||
faq: 'FAQ',
|
||||
how: 'How it works',
|
||||
support: 'Support',
|
||||
download: 'Get the App',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'AI plant identification',
|
||||
ctaPrimary: 'Get the App',
|
||||
ctaSecondary: 'How it works',
|
||||
stat1Title: 'AI-powered',
|
||||
stat1Label: 'Instant analysis',
|
||||
stat2Title: 'Holistic',
|
||||
stat2Label: 'Identification & care plans',
|
||||
floatTitle: 'Sacred lotus',
|
||||
floatLabel: 'Identified in 0.8s',
|
||||
imageAlt: 'Phone scanning a lotus flower',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— The Advantage',
|
||||
heading: 'More than identification. A holistic approach to plant care.',
|
||||
updated: 'Algorithms updated',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: 'Did you know?',
|
||||
items: [
|
||||
{
|
||||
title: 'Overwatering is the #1 cause of death',
|
||||
body: 'Most houseplants die from root rot caused by overwatering. GreenLens calculates precise drying times.',
|
||||
},
|
||||
{
|
||||
title: 'Light intensity drops fast',
|
||||
body: 'Light intensity drops by 50% just 1 meter from the window. Care guidance takes placement into account.',
|
||||
},
|
||||
{
|
||||
title: 'Plants purify indoor air',
|
||||
body: 'Certain species can filter a large share of airborne toxins. GreenLens highlights air-purifying plants.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— The Technology',
|
||||
title: 'Our Methodology',
|
||||
lead: 'How GreenLens turns a simple phone photo into a complete botanical analysis.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Image Capture',
|
||||
body: 'High-resolution capture analyzes leaf morphology, veins, and stem structure. Blurry images are discarded to ensure accuracy.',
|
||||
},
|
||||
{
|
||||
title: 'Feature Extraction',
|
||||
body: 'Our neural network isolates over 120 specific features and matches them against a vast botanical database.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnosis',
|
||||
body: 'A second pass looks specifically for discoloration, pest traces, and wilting — based on diseases typical for the species.',
|
||||
},
|
||||
{
|
||||
title: 'Plan Generation',
|
||||
body: 'Identification and health status combine into an individual care plan adapted to local light and placement.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Perspective',
|
||||
title: 'GreenLens vs. Basic Apps',
|
||||
lead: 'Why serious plant enthusiasts trust our platform over standard identification tools: actionable data, not just trivia.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Basic apps',
|
||||
tipTitle: 'Botanical Tip',
|
||||
tipBody: 'Regular care beats infrequent intensive care. Use reminders to build a good routine.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Best fit',
|
||||
chooseTitle: 'Choose GreenLens if:',
|
||||
notTag: 'Not the best fit',
|
||||
notTitle: 'GreenLens is not the right tool if:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Frequently Asked Questions',
|
||||
},
|
||||
related: {
|
||||
tag: 'Related',
|
||||
title: 'More guides',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: 'Ready for',
|
||||
ctaLine2: 'better',
|
||||
ctaEm: 'plant care?',
|
||||
ctaBody: 'GreenLens helps you identify, understand, and care for your plants. Questions? Reach us via the support page.',
|
||||
storeNote: 'The app is available in the stores.',
|
||||
supportLabel: 'Support',
|
||||
brandBody: 'The app for plant lovers that combines analysis, identification, and care in one place.',
|
||||
productTitle: 'Product',
|
||||
companyTitle: 'Company',
|
||||
legalTitle: 'Legal',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Auf Deutsch',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Imprint',
|
||||
privacy: 'Privacy Policy',
|
||||
terms: 'Terms of Service',
|
||||
copy: '© 2026 GreenLens. All rights reserved.',
|
||||
},
|
||||
},
|
||||
es: {
|
||||
nav: {
|
||||
features: 'Funciones',
|
||||
tech: 'Tecnología',
|
||||
faq: 'FAQ',
|
||||
how: 'Cómo funciona',
|
||||
support: 'Soporte',
|
||||
download: 'Descargar la App',
|
||||
},
|
||||
hero: {
|
||||
eyebrow: 'Identificación de plantas por IA',
|
||||
ctaPrimary: 'Descargar App',
|
||||
ctaSecondary: 'Cómo funciona',
|
||||
stat1Title: 'Impulsado por IA',
|
||||
stat1Label: 'Análisis instantáneo',
|
||||
stat2Title: 'Holístico',
|
||||
stat2Label: 'Identificación y planes',
|
||||
floatTitle: 'Loto sagrado',
|
||||
floatLabel: 'Identificada en 0,8s',
|
||||
imageAlt: 'Teléfono escaneando una flor de loto',
|
||||
},
|
||||
advantage: {
|
||||
eyebrow: '— La Ventaja',
|
||||
heading: 'Más que solo identificación. Un enfoque holístico para el cuidado de las plantas.',
|
||||
updated: 'Algoritmos actualizados',
|
||||
},
|
||||
didYouKnow: {
|
||||
title: '¿Sabías que?',
|
||||
items: [
|
||||
{
|
||||
title: 'El exceso de riego es la causa n.º 1 de muerte',
|
||||
body: 'La mayoría de las plantas de interior mueren por pudrición de la raíz debido al exceso de riego. GreenLens calcula tiempos de secado precisos.',
|
||||
},
|
||||
{
|
||||
title: 'La intensidad de la luz disminuye rápidamente',
|
||||
body: 'La intensidad de la luz disminuye un 50 % a solo 1 metro de la ventana. Los consejos de cuidado tienen en cuenta la ubicación.',
|
||||
},
|
||||
{
|
||||
title: 'Las plantas purifican el aire interior',
|
||||
body: 'Ciertas especies pueden filtrar gran parte de las toxinas del aire. GreenLens destaca las plantas purificadoras.',
|
||||
},
|
||||
],
|
||||
},
|
||||
methodology: {
|
||||
eyebrow: '— La Tecnología',
|
||||
title: 'Nuestra Metodología',
|
||||
lead: 'Cómo GreenLens convierte una simple foto de teléfono en un análisis botánico completo.',
|
||||
steps: [
|
||||
{
|
||||
title: 'Captura de Imagen',
|
||||
body: 'La captura de alta resolución analiza la morfología de las hojas, las venas y la estructura del tallo. Se descartan las imágenes borrosas.',
|
||||
},
|
||||
{
|
||||
title: 'Extracción de Características',
|
||||
body: 'Nuestra red neuronal aísla más de 120 características específicas y las compara con una enorme base de datos botánica.',
|
||||
},
|
||||
{
|
||||
title: 'Diagnóstico',
|
||||
body: 'Una segunda pasada busca decoloración, rastros de plagas y marchitamiento, según las enfermedades típicas de cada especie.',
|
||||
},
|
||||
{
|
||||
title: 'Generación de Plan',
|
||||
body: 'La identificación y el estado de salud se combinan en un plan de cuidado individual adaptado al clima y la luz locales.',
|
||||
},
|
||||
],
|
||||
},
|
||||
comparison: {
|
||||
eyebrow: '— Perspectiva',
|
||||
title: 'GreenLens vs. Apps Básicas',
|
||||
lead: 'Por qué los entusiastas serios de las plantas confían en nuestra plataforma más que en herramientas estándar: datos procesables, no solo curiosidades.',
|
||||
greenlens: 'GreenLens',
|
||||
alternative: 'Apps básicas',
|
||||
tipTitle: 'Consejo Botánico',
|
||||
tipBody: 'El cuidado regular es mejor que el cuidado intensivo y poco frecuente. Usa recordatorios para una buena rutina.',
|
||||
},
|
||||
bestFit: {
|
||||
chooseTag: 'Mejor opción',
|
||||
chooseTitle: 'Elige GreenLens si:',
|
||||
notTag: 'No es ideal',
|
||||
notTitle: 'GreenLens no es la herramienta adecuada si:',
|
||||
},
|
||||
faq: {
|
||||
title: 'Preguntas Frecuentes',
|
||||
},
|
||||
related: {
|
||||
tag: 'Relacionado',
|
||||
title: 'Más guías',
|
||||
},
|
||||
footer: {
|
||||
downloadTag: 'Download',
|
||||
ctaLine1: '¿Listo para',
|
||||
ctaLine2: 'un mejor',
|
||||
ctaEm: 'cuidado de plantas?',
|
||||
ctaBody: 'GreenLens te ayuda a identificar, comprender y cuidar tus plantas. ¿Preguntas? Contáctanos a través de la página de soporte.',
|
||||
storeNote: 'La aplicación ya está disponible en las tiendas.',
|
||||
supportLabel: 'Soporte',
|
||||
brandBody: 'La app para los amantes de las plantas que combina análisis, identificación y cuidado en un solo lugar.',
|
||||
productTitle: 'Producto',
|
||||
companyTitle: 'Empresa',
|
||||
legalTitle: 'Legal',
|
||||
useCasesTitle: 'Use Cases',
|
||||
germanTitle: 'Auf Deutsch',
|
||||
spanishTitle: 'En español',
|
||||
imprint: 'Aviso Legal',
|
||||
privacy: 'Privacidad',
|
||||
terms: 'Términos de uso',
|
||||
copy: '© 2026 GreenLens. Todos los derechos reservados.',
|
||||
},
|
||||
},
|
||||
}
|
||||
714
greenlns-landing/package-lock.json
generated
714
greenlns-landing/package-lock.json
generated
@@ -14,12 +14,28 @@
|
||||
"react-dom": "19.2.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.3.2",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"postcss": "^8.5.16",
|
||||
"tailwindcss": "^4.3.2",
|
||||
"typescript": "^5"
|
||||
}
|
||||
},
|
||||
"node_modules/@alloc/quick-lru": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
|
||||
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
|
||||
@@ -496,6 +512,56 @@
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/gen-mapping": {
|
||||
"version": "0.3.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
|
||||
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0",
|
||||
"@jridgewell/trace-mapping": "^0.3.24"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/remapping": {
|
||||
"version": "2.3.5",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
|
||||
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": "^0.3.5",
|
||||
"@jridgewell/trace-mapping": "^0.3.24"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/resolve-uri": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
||||
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@jridgewell/trace-mapping": {
|
||||
"version": "0.3.31",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
|
||||
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/resolve-uri": "^3.1.0",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@next/env": {
|
||||
"version": "16.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
|
||||
@@ -639,6 +705,277 @@
|
||||
"tslib": "^2.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/node": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
|
||||
"integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/remapping": "^2.3.5",
|
||||
"enhanced-resolve": "5.21.6",
|
||||
"jiti": "^2.7.0",
|
||||
"lightningcss": "1.32.0",
|
||||
"magic-string": "^0.30.21",
|
||||
"source-map-js": "^1.2.1",
|
||||
"tailwindcss": "4.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
|
||||
"integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tailwindcss/oxide-android-arm64": "4.3.2",
|
||||
"@tailwindcss/oxide-darwin-arm64": "4.3.2",
|
||||
"@tailwindcss/oxide-darwin-x64": "4.3.2",
|
||||
"@tailwindcss/oxide-freebsd-x64": "4.3.2",
|
||||
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
|
||||
"@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
|
||||
"@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
|
||||
"@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
|
||||
"@tailwindcss/oxide-linux-x64-musl": "4.3.2",
|
||||
"@tailwindcss/oxide-wasm32-wasi": "4.3.2",
|
||||
"@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
|
||||
"@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-android-arm64": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
|
||||
"integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-darwin-arm64": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
|
||||
"integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-darwin-x64": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
|
||||
"integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-freebsd-x64": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
|
||||
"integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
|
||||
"integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
|
||||
"integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
|
||||
"integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
|
||||
"integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
|
||||
"integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
|
||||
"integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
|
||||
"bundleDependencies": [
|
||||
"@napi-rs/wasm-runtime",
|
||||
"@emnapi/core",
|
||||
"@emnapi/runtime",
|
||||
"@tybys/wasm-util",
|
||||
"@emnapi/wasi-threads",
|
||||
"tslib"
|
||||
],
|
||||
"cpu": [
|
||||
"wasm32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/core": "^1.11.1",
|
||||
"@emnapi/runtime": "^1.11.1",
|
||||
"@emnapi/wasi-threads": "^1.2.2",
|
||||
"@napi-rs/wasm-runtime": "^1.1.4",
|
||||
"@tybys/wasm-util": "^0.10.2",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
|
||||
"integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
|
||||
"integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 20"
|
||||
}
|
||||
},
|
||||
"node_modules/@tailwindcss/postcss": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
|
||||
"integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@alloc/quick-lru": "^5.2.0",
|
||||
"@tailwindcss/node": "4.3.2",
|
||||
"@tailwindcss/oxide": "4.3.2",
|
||||
"postcss": "^8.5.15",
|
||||
"tailwindcss": "4.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "20.19.33",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
|
||||
@@ -655,6 +992,7 @@
|
||||
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"csstype": "^3.2.2"
|
||||
}
|
||||
@@ -718,12 +1056,26 @@
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/enhanced-resolve": {
|
||||
"version": "5.21.6",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
|
||||
"integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.3.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/framer-motion": {
|
||||
"version": "12.34.3",
|
||||
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.3.tgz",
|
||||
@@ -751,6 +1103,294 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/jiti": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
|
||||
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"jiti": "lib/jiti-cli.mjs"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
|
||||
"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"lightningcss-android-arm64": "1.32.0",
|
||||
"lightningcss-darwin-arm64": "1.32.0",
|
||||
"lightningcss-darwin-x64": "1.32.0",
|
||||
"lightningcss-freebsd-x64": "1.32.0",
|
||||
"lightningcss-linux-arm-gnueabihf": "1.32.0",
|
||||
"lightningcss-linux-arm64-gnu": "1.32.0",
|
||||
"lightningcss-linux-arm64-musl": "1.32.0",
|
||||
"lightningcss-linux-x64-gnu": "1.32.0",
|
||||
"lightningcss-linux-x64-musl": "1.32.0",
|
||||
"lightningcss-win32-arm64-msvc": "1.32.0",
|
||||
"lightningcss-win32-x64-msvc": "1.32.0"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-android-arm64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
|
||||
"integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-darwin-arm64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
|
||||
"integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-darwin-x64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
|
||||
"integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-freebsd-x64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
|
||||
"integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm-gnueabihf": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
|
||||
"integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm64-gnu": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
|
||||
"integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm64-musl": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
|
||||
"integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-x64-gnu": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
|
||||
"integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-x64-musl": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
|
||||
"integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-win32-arm64-msvc": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
|
||||
"integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-win32-x64-msvc": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
|
||||
"integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.21",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
|
||||
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||
}
|
||||
},
|
||||
"node_modules/motion-dom": {
|
||||
"version": "12.34.3",
|
||||
"resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz",
|
||||
@@ -767,9 +1407,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.11",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||
"version": "3.3.15",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
|
||||
"integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
@@ -837,13 +1477,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"node_modules/next/node_modules/postcss": {
|
||||
"version": "8.4.31",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
|
||||
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
|
||||
@@ -871,11 +1505,47 @@
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.16",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
|
||||
"integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.12",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/react": {
|
||||
"version": "19.2.3",
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
|
||||
"integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -885,6 +1555,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
|
||||
"integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"scheduler": "^0.27.0"
|
||||
},
|
||||
@@ -988,6 +1659,27 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/tailwindcss": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
|
||||
"integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tapable": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
|
||||
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/webpack"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
|
||||
@@ -14,9 +14,12 @@
|
||||
"react-dom": "19.2.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.3.2",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"postcss": "^8.5.16",
|
||||
"tailwindcss": "^4.3.2",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
|
||||
7
greenlns-landing/postcss.config.mjs
Normal file
7
greenlns-landing/postcss.config.mjs
Normal file
@@ -0,0 +1,7 @@
|
||||
const config = {
|
||||
plugins: {
|
||||
'@tailwindcss/postcss': {},
|
||||
},
|
||||
}
|
||||
|
||||
export default config
|
||||
@@ -1,33 +1,15 @@
|
||||
import type { NextRequest } from 'next/server'
|
||||
import { NextResponse } from 'next/server'
|
||||
import { getLocaleForPath } from '@/lib/localeRoutes'
|
||||
|
||||
const APEX_HOST = 'greenlenspro.com'
|
||||
const WWW_HOST = `www.${APEX_HOST}`
|
||||
const ENGLISH_PATHS = new Set([
|
||||
'/best-plant-identification-app',
|
||||
'/plant-identifier-app',
|
||||
'/plant-scanner',
|
||||
'/flower-scanner',
|
||||
'/houseplant-identifier',
|
||||
'/succulent-identifier',
|
||||
'/identify-plant-photo',
|
||||
'/plant-disease-identifier',
|
||||
'/plant-health-app',
|
||||
'/plant-care-app',
|
||||
])
|
||||
|
||||
function getLangForPath(pathname: string) {
|
||||
if (pathname === '/es' || pathname.startsWith('/es/')) return 'es'
|
||||
if (pathname === '/vs/google-lens') return 'de'
|
||||
if (ENGLISH_PATHS.has(pathname) || pathname.startsWith('/vs/')) return 'en'
|
||||
return 'de'
|
||||
}
|
||||
|
||||
export function proxy(request: NextRequest) {
|
||||
const host = request.headers.get('host')
|
||||
const forwardedProto = request.headers.get('x-forwarded-proto')
|
||||
const requestHeaders = new Headers(request.headers)
|
||||
requestHeaders.set('x-greenlens-lang', getLangForPath(request.nextUrl.pathname))
|
||||
requestHeaders.set('x-greenlens-lang', getLocaleForPath(request.nextUrl.pathname))
|
||||
|
||||
if (!host || (host !== APEX_HOST && host !== WWW_HOST)) {
|
||||
return NextResponse.next({ request: { headers: requestHeaders } })
|
||||
|
||||
BIN
greenlns-landing/public/app-store.png
Normal file
BIN
greenlns-landing/public/app-store.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
BIN
greenlns-landing/public/hero-image.png
Normal file
BIN
greenlns-landing/public/hero-image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 538 KiB |
BIN
greenlns-landing/public/hero.jpg
Normal file
BIN
greenlns-landing/public/hero.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 201 KiB |
BIN
greenlns-landing/public/play-store.png
Normal file
BIN
greenlns-landing/public/play-store.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
222
greenlns-landing/translate.py
Normal file
222
greenlns-landing/translate.py
Normal file
@@ -0,0 +1,222 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
|
||||
with open('app/pflanzen-erkennen-app/page.tsx', 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# English replacements
|
||||
en_content = content
|
||||
en_content = en_content.replace('PflanzenErkennenApp', 'PlantIdentifierApp')
|
||||
en_content = en_content.replace('pflanzen-erkennen-app', 'plant-identifier-app')
|
||||
en_content = en_content.replace('Features', 'Features')
|
||||
en_content = en_content.replace('>Technologie<', '>Technology<')
|
||||
en_content = en_content.replace('>So funktioniert es<', '>How it works<')
|
||||
en_content = en_content.replace('>App laden<', '>Get the App<')
|
||||
en_content = en_content.replace('App herunterladen', 'Download App')
|
||||
en_content = en_content.replace('KI-GESTÜTZTE PFLANZENERKENNUNG', 'AI-POWERED PLANT IDENTIFICATION')
|
||||
en_content = en_content.replace('Pflanzen erkennen.<br/>Schnell & Präzise.', 'Identify plants.<br/>Fast & Precise.')
|
||||
en_content = en_content.replace('GreenLens ist dein smarter Begleiter für die Hosentasche. Scanne jede beliebige Pflanze für eine sofortige Identifikation, erhalte maßgeschneiderte Pflegepläne und professionelle Diagnosen bei sichtbaren Symptomen. Wir bringen botanisches Fachwissen direkt auf dein Smartphone.', 'GreenLens is your smart pocket companion. Scan any plant for instant identification, get customized care plans and professional diagnostics for visible symptoms. We bring botanical expertise directly to your smartphone.')
|
||||
en_content = en_content.replace('KI-gestützt', 'AI-powered')
|
||||
en_content = en_content.replace('SEKUNDENSCHNELLE ANALYSE', 'INSTANT ANALYSIS')
|
||||
en_content = en_content.replace('Ganzheitlich', 'Holistic')
|
||||
en_content = en_content.replace('ERKENNUNG & PFLEGEPLÄNE', 'IDENTIFICATION & CARE PLANS')
|
||||
|
||||
en_content = en_content.replace('— Der Vorteil', '— The Advantage')
|
||||
en_content = en_content.replace('Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für die Pflanzenpflege.', 'More than just identification. A holistic approach to plant care.')
|
||||
en_content = en_content.replace('Eine einfache Pflanzenerkennungs-App identifiziert Pflanzen auf Fotos und liefert Artennamen sowie allgemeine Pflegehinweise. GreenLens geht deutlich weiter und nutzt modernste Bilderkennung und riesige botanische Datenbanken.', 'A basic plant identification app identifies plants in photos and provides species names along with general care tips. GreenLens goes much further, leveraging state-of-the-art image recognition and massive botanical databases.')
|
||||
en_content = en_content.replace('Jeder Scan generiert automatisch einen maßgeschneiderten Pflegeplan, abgestimmt auf deine spezifische Klimazone und die Umgebung im Haus. Die App erstellt präzise Gießerinnerungen basierend auf den Transpirationsraten der Arten und katalogisiert deine Sammlung. Ein separates Gesundheits-Diagnosetool analysiert sichtbare Symptome wie Chlorose (Vergilbung), Nekrose (Bräunung) oder strukturellen Verfall, um sofortige, umsetzbare Maßnahmen vorzuschlagen.', 'Each scan automatically generates a customized care plan tailored to your specific climate zone and indoor environment. The app creates precise watering reminders based on species transpiration rates and catalogs your collection. A separate health diagnostic tool analyzes visible symptoms like chlorosis (yellowing), necrosis (browning), or structural decay to suggest immediate, actionable measures.')
|
||||
en_content = en_content.replace('AKTUALISIERTE ALGORITHMEN: APRIL 2024', 'UPDATED ALGORITHMS: APRIL 2024')
|
||||
|
||||
en_content = en_content.replace('Wusstest du schon?', 'Did you know?')
|
||||
en_content = en_content.replace('Überwässerung ist die Todesursache Nr. 1', 'Overwatering is the #1 cause of death')
|
||||
en_content = en_content.replace('90% aller Zimmerpflanzen sterben an Wurzelfäule durch zu viel Wasser. GreenLens berechnet genaue Trocknungszeiten.', '90% of all houseplants die from root rot due to overwatering. GreenLens calculates precise drying times.')
|
||||
en_content = en_content.replace('Lichtintensität nimmt schnell ab', 'Light intensity drops quickly')
|
||||
en_content = en_content.replace('Die Lichtintensität sinkt bereits 1 Meter vom Fenster entfernt um 50%. Unser Lichtmesser sorgt für den optimalen Standort.', 'Light intensity drops by 50% just 1 meter away from the window. Our light meter ensures the optimal placement.')
|
||||
en_content = en_content.replace('Pflanzen reinigen die Raumluft', 'Plants purify indoor air')
|
||||
en_content = en_content.replace('Bestimmte Arten können bis zu 87% der Giftstoffe in der Luft filtern. GreenLens markiert luftreinigende Pflanzen.', 'Certain species can filter up to 87% of airborne toxins. GreenLens highlights air-purifying plants.')
|
||||
|
||||
en_content = en_content.replace('— Die Technologie', '— The Technology')
|
||||
en_content = en_content.replace('Unsere Methodik', 'Our Methodology')
|
||||
en_content = en_content.replace('Wie GreenLens ein einfaches Smartphone-Foto in eine umfassende botanische Analyse verwandelt.', 'How GreenLens turns a simple smartphone photo into a comprehensive botanical analysis.')
|
||||
en_content = en_content.replace('Bildaufnahme', 'Image Capture')
|
||||
en_content = en_content.replace('Hochauflösende Erfassung analysiert Blattmorphologie, Blattadern und Stängelstruktur. Verschwommene Bilder werden verworfen, um Genauigkeit zu garantieren.', 'High-resolution capture analyzes leaf morphology, venation, and stem structure. Blurry images are discarded to ensure accuracy.')
|
||||
en_content = en_content.replace('Merkmals-Extraktion', 'Feature Extraction')
|
||||
en_content = en_content.replace('Unser neuronales Netzwerk isoliert über 120 spezifische Merkmale und gleicht sie mit einer riesigen Datenbank ab.', 'Our neural network isolates over 120 specific features and matches them against a massive database.')
|
||||
en_content = en_content.replace('Diagnostik', 'Diagnostics')
|
||||
en_content = en_content.replace('Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welkeerscheinungen, basierend auf typischen Krankheiten der jeweiligen Art.', 'A second pass specifically looks for discoloration, pest traces, and wilting, based on typical diseases of the respective species.')
|
||||
en_content = en_content.replace('Plan-Generierung', 'Plan Generation')
|
||||
en_content = en_content.replace('Aus der Identifikation und dem Gesundheitszustand wird ein individueller Pflegeplan erstellt, der sich an lokales Wetter und Lichtverhältnisse anpasst.', 'From the identification and health status, an individual care plan is created that adapts to local weather and lighting conditions.')
|
||||
|
||||
en_content = en_content.replace('— Perspektive', '— Perspective')
|
||||
en_content = en_content.replace('GreenLens vs. Basis-Apps', 'GreenLens vs. Basic Apps')
|
||||
en_content = en_content.replace('Warum seriöse Pflanzenenthusiasten und Profis unserer Plattform mehr vertrauen als Standard-Erkennungs-Tools. Wir liefern handlungsrelevante Daten, nicht nur Trivia.', 'Why serious plant enthusiasts and professionals trust our platform more than standard identification tools. We deliver actionable data, not just trivia.')
|
||||
en_content = en_content.replace('Botanischer Tipp', 'Botanical Tip')
|
||||
en_content = en_content.replace('Regelmäßige Pflege ist besser als intensive, seltene Pflege. Nutze unsere Termin-Tools für eine gute Routine.', 'Regular care is better than intensive, infrequent care. Use our scheduling tools for a good routine.')
|
||||
en_content = en_content.replace('Pflege-Guides lesen →', 'Read Care Guides →')
|
||||
|
||||
en_content = en_content.replace('Pflanzenerkennung', 'Plant Identification')
|
||||
en_content = en_content.replace('Der KI-gestützte Scan liefert Artenname, Trivialname, botanischen Hintergrund, Herkunftsdaten und Giftigkeitswarnungen in unter einer Sekunde.', 'The AI-powered scan delivers species name, common name, botanical background, origin data, and toxicity warnings in under a second.')
|
||||
en_content = en_content.replace('BASIS-APPS', 'BASIC APPS')
|
||||
en_content = en_content.replace('Der Name der Art wird oft vage ausgegeben – ohne weiteren Kontext oder nächste Schritte.', 'The species name is often vaguely provided – without further context or next steps.')
|
||||
|
||||
en_content = en_content.replace('Pflegeplanung', 'Care Planning')
|
||||
en_content = en_content.replace('Gießen, Düngen und Umtopfen werden dynamisch geplant, basierend auf den Bedürfnissen der Art, dem lokalen Wetter und deinen Umgebungsdaten.', 'Watering, fertilizing, and repotting are dynamically scheduled based on species needs, local weather, and your environmental data.')
|
||||
en_content = en_content.replace('Generische, statische Texte wie "Gießen, wenn die Erde trocken ist". Die Pflege muss manuell recherchiert und verfolgt werden.', 'Generic, static texts like "Water when the soil is dry". Care must be manually researched and tracked.')
|
||||
|
||||
en_content = en_content.replace('Gesundheits-Diagnostik', 'Health Diagnostics')
|
||||
en_content = en_content.replace('Spezieller Scan für sichtbare Symptome. Identifiziert Schädlinge (Thripse, Milben), Pilzinfektionen und Nährstoffmangel mit konkreten Behandlungsprotokollen.', 'Specialized scan for visible symptoms. Identifies pests (thrips, mites), fungal infections, and nutrient deficiencies with concrete treatment protocols.')
|
||||
en_content = en_content.replace('Kaum vorhanden. Die meisten Erkennungs-Apps bieten keine Diagnose oder verwechseln Schäden mit einer anderen Pflanze.', 'Barely existent. Most identification apps offer no diagnosis or confuse damage with a different plant.')
|
||||
|
||||
en_content = en_content.replace('Umgebungs-Tools', 'Environment Tools')
|
||||
en_content = en_content.replace('Ein eingebauter Lux-Meter nutzt deine Kamera, um genaue Lichtverhältnisse zu messen und mit den Anforderungen der identifizierten Pflanze abzugleichen.', 'A built-in light meter uses your camera to measure exact lighting conditions and matches them with the identified plants requirements.')
|
||||
en_content = en_content.replace('Keine Tools zur Messung der Umgebung enthalten.', 'No tools included for measuring the environment.')
|
||||
|
||||
en_content = en_content.replace('Häufig gestellte Fragen', 'Frequently Asked Questions')
|
||||
en_content = en_content.replace('Wie genau ist die Pflanzenerkennung?', 'How accurate is the plant identification?')
|
||||
en_content = en_content.replace('Unser neuronales Netzwerk bietet eine extrem hohe Genauigkeit für gängige Zimmerpflanzen und seltene Züchtungen. Es wird ständig durch verifizierte Scans aus der Community verbessert.', 'Our neural network offers extremely high accuracy for common houseplants and rare cultivars. It is constantly improved through verified community scans.')
|
||||
en_content = en_content.replace('Werden auch Schädlinge und Krankheiten erkannt?', 'Are pests and diseases also recognized?')
|
||||
en_content = en_content.replace('Ja. Der spezielle Gesundheitscheck sucht nach sichtbaren Anzeichen von häufigen Schädlingen (Spinnmilben, Wollläuse) und Krankheiten (Mehltau, Wurzelfäule) und liefert sofortige Gegenmaßnahmen.', 'Yes. The specialized health check looks for visible signs of common pests (spider mites, mealybugs) and diseases (powdery mildew, root rot) and provides immediate countermeasures.')
|
||||
en_content = en_content.replace('Funktioniert der Lichtmesser wirklich?', 'Does the light meter really work?')
|
||||
en_content = en_content.replace('Der integrierte Lichtmesser nutzt den Umgebungslichtsensor und die Kamera deines Smartphones, um eine zuverlässige Schätzung in Lux zu berechnen, was für die Platzierung im Innenbereich völlig ausreicht.', 'The integrated light meter uses the ambient light sensor and your smartphones camera to calculate a reliable estimate in lux, which is perfectly sufficient for indoor placement.')
|
||||
en_content = en_content.replace('Gibt es ein Limit, wie viele Pflanzen ich speichern kann?', 'Is there a limit to how many plants I can save?')
|
||||
en_content = en_content.replace('In der kostenlosen Version kannst du bis zu 5 Pflanzen speichern. GreenLens Premium bietet unbegrenztes Tracking, individuelle Ordner und erweiterte Verlaufsdiagramme.', 'In the free version, you can save up to 5 plants. GreenLens Premium offers unlimited tracking, custom folders, and advanced history charts.')
|
||||
en_content = en_content.replace('Wie passt sich der Gießplan an?', 'How does the watering plan adapt?')
|
||||
en_content = en_content.replace('Die Pläne sind nicht statisch. Sie passen sich an Jahreszeiten, lokales Wetter (Temperatur und Luftfeuchtigkeit) und dein Feedback an (wenn die Erde noch nass ist, verschiebt sich der Plan).', 'The plans are not static. They adapt to seasons, local weather (temperature and humidity), and your feedback (if the soil is still wet, the plan shifts).')
|
||||
en_content = en_content.replace('Was, wenn die App falsch liegt?', 'What if the app is wrong?')
|
||||
en_content = en_content.replace('Bei geringer Zuverlässigkeit zeigt die App die 3 wahrscheinlichsten Treffer. Premium-Nutzer können bei kniffligen Scans eine Überprüfung durch echte Botaniker anfordern.', 'In cases of low confidence, the app shows the 3 most likely matches. Premium users can request a review by real botanists for tricky scans.')
|
||||
|
||||
en_content = en_content.replace('Bereit für<br />bessere<br />', 'Ready for<br />better<br />')
|
||||
en_content = en_content.replace('<span className="italic text-primary">Pflanzenpflege?</span>', '<span className="italic text-primary">plant care?</span>')
|
||||
en_content = en_content.replace('GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Nutze den Einen-Klick, noch nicht dort ist, erreichst du uns über die Support-Seite.', 'GreenLens helps you identify, understand, and care for your plants. Use the one-click feature, if you are not there yet, you can reach us via the support page.')
|
||||
en_content = en_content.replace('Die App ist bereits in den Stores verfügbar.', 'The app is already available in the stores.')
|
||||
|
||||
en_content = en_content.replace('PRODUKT', 'PRODUCT')
|
||||
en_content = en_content.replace('UNTERNEHMEN', 'COMPANY')
|
||||
en_content = en_content.replace('RECHTLICHES', 'LEGAL')
|
||||
en_content = en_content.replace('SPRACHEN', 'LANGUAGES')
|
||||
en_content = en_content.replace('Impressum', 'Imprint')
|
||||
en_content = en_content.replace('Datenschutz', 'Privacy')
|
||||
en_content = en_content.replace('Nutzungsbedingungen', 'Terms of Use')
|
||||
en_content = en_content.replace('Gesund oder Krank', 'Healthy or Sick')
|
||||
en_content = en_content.replace('Pflanzen erkennen kostenlos', 'Identify plants for free')
|
||||
en_content = en_content.replace('Pflanzen bestimmen', 'Determine plants')
|
||||
en_content = en_content.replace('Blumen per Foto erkennen', 'Recognize flowers by photo')
|
||||
en_content = en_content.replace('Zimmerpflanzen bestimmen', 'Identify houseplants')
|
||||
en_content = en_content.replace('Pflanzen Pflege App', 'Plant Care App')
|
||||
en_content = en_content.replace('Pflanzenkrankheiten erkennen', 'Identify plant diseases')
|
||||
en_content = en_content.replace('Alle Rechte vorbehalten.', 'All rights reserved.')
|
||||
en_content = en_content.replace('Die App für Pflanzenliebhaber, die Auswertung, Identifikation und Pflege an einem Ort vereint.', 'The app for plant lovers that combines analysis, identification, and care in one place.')
|
||||
|
||||
with open('app/plant-identifier-app/page.tsx', 'w', encoding='utf-8') as f:
|
||||
f.write(en_content)
|
||||
|
||||
print('English translation done')
|
||||
|
||||
# Spanish replacements
|
||||
es_content = content
|
||||
es_content = es_content.replace('PflanzenErkennenApp', 'IdentificadorDePlantas')
|
||||
es_content = es_content.replace('pflanzen-erkennen-app', 'es/identificador-de-plantas')
|
||||
es_content = es_content.replace('Features', 'Funciones')
|
||||
es_content = es_content.replace('>Technologie<', '>Tecnología<')
|
||||
es_content = es_content.replace('>So funktioniert es<', '>Cómo funciona<')
|
||||
es_content = es_content.replace('>App laden<', '>Descargar la App<')
|
||||
es_content = es_content.replace('App herunterladen', 'Descargar App')
|
||||
es_content = es_content.replace('KI-GESTÜTZTE PFLANZENERKENNUNG', 'IDENTIFICACIÓN DE PLANTAS POR IA')
|
||||
es_content = es_content.replace('Pflanzen erkennen.<br/>Schnell & Präzise.', 'Identifica plantas.<br/>Rápido y Preciso.')
|
||||
es_content = es_content.replace('GreenLens ist dein smarter Begleiter für die Hosentasche. Scanne jede beliebige Pflanze für eine sofortige Identifikation, erhalte maßgeschneiderte Pflegepläne und professionelle Diagnosen bei sichtbaren Symptomen. Wir bringen botanisches Fachwissen direkt auf dein Smartphone.', 'GreenLens es tu compañero de bolsillo inteligente. Escanea cualquier planta para una identificación instantánea, obtén planes de cuidado personalizados y diagnósticos profesionales para síntomas visibles. Llevamos la experiencia botánica directamente a tu smartphone.')
|
||||
es_content = es_content.replace('KI-gestützt', 'Impulsado por IA')
|
||||
es_content = es_content.replace('SEKUNDENSCHNELLE ANALYSE', 'ANÁLISIS INSTANTÁNEO')
|
||||
es_content = es_content.replace('Ganzheitlich', 'Holístico')
|
||||
es_content = es_content.replace('ERKENNUNG & PFLEGEPLÄNE', 'IDENTIFICACIÓN Y PLANES')
|
||||
|
||||
es_content = es_content.replace('— Der Vorteil', '— La Ventaja')
|
||||
es_content = es_content.replace('Mehr als nur Erkennung. Ein ganzheitlicher Ansatz für die Pflanzenpflege.', 'Más que solo identificación. Un enfoque holístico para el cuidado de las plantas.')
|
||||
es_content = es_content.replace('Eine einfache Pflanzenerkennungs-App identifiziert Pflanzen auf Fotos und liefert Artennamen sowie allgemeine Pflegehinweise. GreenLens geht deutlich weiter und nutzt modernste Bilderkennung und riesige botanische Datenbanken.', 'Una aplicación básica de identificación de plantas identifica plantas en fotos y proporciona nombres de especies junto con consejos generales de cuidado. GreenLens va mucho más allá, utilizando reconocimiento de imágenes de última generación y enormes bases de datos botánicas.')
|
||||
es_content = es_content.replace('Jeder Scan generiert automatisch einen maßgeschneiderten Pflegeplan, abgestimmt auf deine spezifische Klimazone und die Umgebung im Haus. Die App erstellt präzise Gießerinnerungen basierend auf den Transpirationsraten der Arten und katalogisiert deine Sammlung. Ein separates Gesundheits-Diagnosetool analysiert sichtbare Symptome wie Chlorose (Vergilbung), Nekrose (Bräunung) oder strukturellen Verfall, um sofortige, umsetzbare Maßnahmen vorzuschlagen.', 'Cada escaneo genera automáticamente un plan de cuidado personalizado adaptado a tu zona climática y entorno interior. La aplicación crea recordatorios de riego precisos basados en las tasas de transpiración de las especies y cataloga tu colección. Una herramienta de diagnóstico de salud separada analiza síntomas visibles como clorosis (amarillamiento), necrosis (oscurecimiento) o deterioro estructural para sugerir medidas inmediatas y prácticas.')
|
||||
es_content = es_content.replace('AKTUALISIERTE ALGORITHMEN: APRIL 2024', 'ALGORITMOS ACTUALIZADOS: ABRIL 2024')
|
||||
|
||||
es_content = es_content.replace('Wusstest du schon?', '¿Sabías que?')
|
||||
es_content = es_content.replace('Überwässerung ist die Todesursache Nr. 1', 'El exceso de riego es la causa n.º 1 de muerte')
|
||||
es_content = es_content.replace('90% aller Zimmerpflanzen sterben an Wurzelfäule durch zu viel Wasser. GreenLens berechnet genaue Trocknungszeiten.', 'El 90% de todas las plantas de interior mueren por pudrición de la raíz debido al exceso de riego. GreenLens calcula tiempos de secado precisos.')
|
||||
es_content = es_content.replace('Lichtintensität nimmt schnell ab', 'La intensidad de la luz disminuye rápidamente')
|
||||
es_content = es_content.replace('Die Lichtintensität sinkt bereits 1 Meter vom Fenster entfernt um 50%. Unser Lichtmesser sorgt für den optimalen Standort.', 'La intensidad de la luz disminuye un 50% a solo 1 metro de la ventana. Nuestro fotómetro asegura la ubicación óptima.')
|
||||
es_content = es_content.replace('Pflanzen reinigen die Raumluft', 'Las plantas purifican el aire interior')
|
||||
es_content = es_content.replace('Bestimmte Arten können bis zu 87% der Giftstoffe in der Luft filtern. GreenLens markiert luftreinigende Pflanzen.', 'Ciertas especies pueden filtrar hasta el 87% de las toxinas en el aire. GreenLens destaca las plantas purificadoras de aire.')
|
||||
|
||||
es_content = es_content.replace('— Die Technologie', '— La Tecnología')
|
||||
es_content = es_content.replace('Unsere Methodik', 'Nuestra Metodología')
|
||||
es_content = es_content.replace('Wie GreenLens ein einfaches Smartphone-Foto in eine umfassende botanische Analyse verwandelt.', 'Cómo GreenLens convierte una simple foto de teléfono en un análisis botánico completo.')
|
||||
es_content = es_content.replace('Bildaufnahme', 'Captura de Imagen')
|
||||
es_content = es_content.replace('Hochauflösende Erfassung analysiert Blattmorphologie, Blattadern und Stängelstruktur. Verschwommene Bilder werden verworfen, um Genauigkeit zu garantieren.', 'La captura de alta resolución analiza la morfología de las hojas, las venas y la estructura del tallo. Se descartan las imágenes borrosas para garantizar la precisión.')
|
||||
es_content = es_content.replace('Merkmals-Extraktion', 'Extracción de Características')
|
||||
es_content = es_content.replace('Unser neuronales Netzwerk isoliert über 120 spezifische Merkmale und gleicht sie mit einer riesigen Datenbank ab.', 'Nuestra red neuronal aísla más de 120 características específicas y las compara con una enorme base de datos.')
|
||||
es_content = es_content.replace('Diagnostik', 'Diagnóstico')
|
||||
es_content = es_content.replace('Ein zweiter Durchlauf sucht gezielt nach Verfärbungen, Schädlingsspuren und Welkeerscheinungen, basierend auf typischen Krankheiten der jeweiligen Art.', 'Una segunda pasada busca específicamente decoloración, rastros de plagas y marchitamiento, en base a enfermedades típicas de la especie respectiva.')
|
||||
es_content = es_content.replace('Plan-Generierung', 'Generación de Plan')
|
||||
es_content = es_content.replace('Aus der Identifikation und dem Gesundheitszustand wird ein individueller Pflegeplan erstellt, der sich an lokales Wetter und Lichtverhältnisse anpasst.', 'A partir de la identificación y el estado de salud, se crea un plan de cuidado individual que se adapta al clima local y a las condiciones de iluminación.')
|
||||
|
||||
es_content = es_content.replace('— Perspektive', '— Perspectiva')
|
||||
es_content = es_content.replace('GreenLens vs. Basis-Apps', 'GreenLens vs. Apps Básicas')
|
||||
es_content = es_content.replace('Warum seriöse Pflanzenenthusiasten und Profis unserer Plattform mehr vertrauen als Standard-Erkennungs-Tools. Wir liefern handlungsrelevante Daten, nicht nur Trivia.', 'Por qué los entusiastas y profesionales serios de las plantas confían en nuestra plataforma más que en herramientas de identificación estándar. Proporcionamos datos procesables, no solo curiosidades.')
|
||||
es_content = es_content.replace('Botanischer Tipp', 'Consejo Botánico')
|
||||
es_content = es_content.replace('Regelmäßige Pflege ist besser als intensive, seltene Pflege. Nutze unsere Termin-Tools für eine gute Routine.', 'El cuidado regular es mejor que el cuidado intensivo y poco frecuente. Utiliza nuestras herramientas de programación para una buena rutina.')
|
||||
es_content = es_content.replace('Pflege-Guides lesen →', 'Leer Guías de Cuidado →')
|
||||
|
||||
es_content = es_content.replace('Pflanzenerkennung', 'Identificación de Plantas')
|
||||
es_content = es_content.replace('Der KI-gestützte Scan liefert Artenname, Trivialname, botanischen Hintergrund, Herkunftsdaten und Giftigkeitswarnungen in unter einer Sekunde.', 'El escaneo impulsado por IA ofrece el nombre de la especie, el nombre común, el fondo botánico, datos de origen y advertencias de toxicidad en menos de un segundo.')
|
||||
es_content = es_content.replace('BASIS-APPS', 'APPS BÁSICAS')
|
||||
es_content = es_content.replace('Der Name der Art wird oft vage ausgegeben – ohne weiteren Kontext oder nächste Schritte.', 'El nombre de la especie a menudo se proporciona de forma imprecisa: sin contexto adicional o próximos pasos.')
|
||||
|
||||
es_content = es_content.replace('Pflegeplanung', 'Planificación de Cuidado')
|
||||
es_content = es_content.replace('Gießen, Düngen und Umtopfen werden dynamisch geplant, basierend auf den Bedürfnissen der Art, dem lokalen Wetter und deinen Umgebungsdaten.', 'El riego, la fertilización y el trasplante se programan de forma dinámica en función de las necesidades de la especie, el clima local y tus datos ambientales.')
|
||||
es_content = es_content.replace('Generische, statische Texte wie "Gießen, wenn die Erde trocken ist". Die Pflege muss manuell recherchiert und verfolgt werden.', 'Textos genéricos y estáticos como "Regar cuando la tierra esté seca". El cuidado debe investigarse y registrarse manualmente.')
|
||||
|
||||
es_content = es_content.replace('Gesundheits-Diagnostik', 'Diagnóstico de Salud')
|
||||
es_content = es_content.replace('Spezieller Scan für sichtbare Symptome. Identifiziert Schädlinge (Thripse, Milben), Pilzinfektionen und Nährstoffmangel mit konkreten Behandlungsprotokollen.', 'Escaneo especializado para síntomas visibles. Identifica plagas (trips, ácaros), infecciones por hongos y deficiencias de nutrientes con protocolos de tratamiento concretos.')
|
||||
es_content = es_content.replace('Kaum vorhanden. Die meisten Erkennungs-Apps bieten keine Diagnose oder verwechseln Schäden mit einer anderen Pflanze.', 'Apenas existente. La mayoría de las aplicaciones de identificación no ofrecen diagnóstico o confunden el daño con otra planta.')
|
||||
|
||||
es_content = es_content.replace('Umgebungs-Tools', 'Herramientas de Entorno')
|
||||
es_content = es_content.replace('Ein eingebauter Lux-Meter nutzt deine Kamera, um genaue Lichtverhältnisse zu messen und mit den Anforderungen der identifizierten Pflanze abzugleichen.', 'Un fotómetro integrado utiliza tu cámara para medir las condiciones exactas de iluminación y las compara con los requisitos de la planta identificada.')
|
||||
es_content = es_content.replace('Keine Tools zur Messung der Umgebung enthalten.', 'No se incluyen herramientas para medir el entorno.')
|
||||
|
||||
es_content = es_content.replace('Häufig gestellte Fragen', 'Preguntas Frecuentes')
|
||||
es_content = es_content.replace('Wie genau ist die Pflanzenerkennung?', '¿Qué tan precisa es la identificación de plantas?')
|
||||
es_content = es_content.replace('Unser neuronales Netzwerk bietet eine extrem hohe Genauigkeit für gängige Zimmerpflanzen und seltene Züchtungen. Es wird ständig durch verifizierte Scans aus der Community verbessert.', 'Nuestra red neuronal ofrece una precisión extremadamente alta para plantas de interior comunes y cultivares raros. Mejora constantemente gracias a los escaneos verificados de la comunidad.')
|
||||
es_content = es_content.replace('Werden auch Schädlinge und Krankheiten erkannt?', '¿Se reconocen también plagas y enfermedades?')
|
||||
es_content = es_content.replace('Ja. Der spezielle Gesundheitscheck sucht nach sichtbaren Anzeichen von häufigen Schädlingen (Spinnmilben, Wollläuse) und Krankheiten (Mehltau, Wurzelfäule) und liefert sofortige Gegenmaßnahmen.', 'Sí. El control de salud especializado busca signos visibles de plagas comunes (ácaros, cochinillas) y enfermedades (oídio, pudrición de la raíz) y proporciona medidas inmediatas.')
|
||||
es_content = es_content.replace('Funktioniert der Lichtmesser wirklich?', '¿Funciona realmente el fotómetro?')
|
||||
es_content = es_content.replace('Der integrierte Lichtmesser nutzt den Umgebungslichtsensor und die Kamera deines Smartphones, um eine zuverlässige Schätzung in Lux zu berechnen, was für die Platzierung im Innenbereich völlig ausreicht.', 'El fotómetro integrado utiliza el sensor de luz ambiental y la cámara de tu teléfono inteligente para calcular una estimación confiable en lux, lo cual es perfectamente suficiente para su colocación en interiores.')
|
||||
es_content = es_content.replace('Gibt es ein Limit, wie viele Pflanzen ich speichern kann?', '¿Hay un límite sobre cuántas plantas puedo guardar?')
|
||||
es_content = es_content.replace('In der kostenlosen Version kannst du bis zu 5 Pflanzen speichern. GreenLens Premium bietet unbegrenztes Tracking, individuelle Ordner und erweiterte Verlaufsdiagramme.', 'En la versión gratuita, puedes guardar hasta 5 plantas. GreenLens Premium ofrece seguimiento ilimitado, carpetas personalizadas y gráficos de historial avanzados.')
|
||||
es_content = es_content.replace('Wie passt sich der Gießplan an?', '¿Cómo se adapta el plan de riego?')
|
||||
es_content = es_content.replace('Die Pläne sind nicht statisch. Sie passen sich an Jahreszeiten, lokales Wetter (Temperatur und Luftfeuchtigkeit) und dein Feedback an (wenn die Erde noch nass ist, verschiebt sich der Plan).', 'Los planes no son estáticos. Se adaptan a las estaciones, el clima local (temperatura y humedad) y a tus comentarios (si la tierra aún está húmeda, el plan cambia).')
|
||||
es_content = es_content.replace('Was, wenn die App falsch liegt?', '¿Qué pasa si la aplicación se equivoca?')
|
||||
es_content = es_content.replace('Bei geringer Zuverlässigkeit zeigt die App die 3 wahrscheinlichsten Treffer. Premium-Nutzer können bei kniffligen Scans eine Überprüfung durch echte Botaniker anfordern.', 'En casos de baja confianza, la aplicación muestra las 3 coincidencias más probables. Los usuarios premium pueden solicitar una revisión por parte de botánicos reales para escaneos difíciles.')
|
||||
|
||||
es_content = es_content.replace('Bereit für<br />bessere<br />', 'Listo para<br />un mejor<br />')
|
||||
es_content = es_content.replace('<span className="italic text-primary">Pflanzenpflege?</span>', '<span className="italic text-primary">cuidado de plantas?</span>')
|
||||
es_content = es_content.replace('GreenLens hilft dir beim Erkennen, Verstehen und Pflegen deiner Pflanzen. Nutze den Einen-Klick, noch nicht dort ist, erreichst du uns über die Support-Seite.', 'GreenLens te ayuda a identificar, comprender y cuidar tus plantas. Usa la función de un clic; si aún no estás allí, contáctanos a través de la página de soporte.')
|
||||
es_content = es_content.replace('Die App ist bereits in den Stores verfügbar.', 'La aplicación ya está disponible en las tiendas.')
|
||||
|
||||
es_content = es_content.replace('PRODUKT', 'PRODUCTO')
|
||||
es_content = es_content.replace('UNTERNEHMEN', 'EMPRESA')
|
||||
es_content = es_content.replace('RECHTLICHES', 'LEGAL')
|
||||
es_content = es_content.replace('SPRACHEN', 'IDIOMAS')
|
||||
es_content = es_content.replace('Impressum', 'Aviso Legal')
|
||||
es_content = es_content.replace('Datenschutz', 'Privacidad')
|
||||
es_content = es_content.replace('Nutzungsbedingungen', 'Términos de uso')
|
||||
es_content = es_content.replace('Gesund oder Krank', 'Sano o Enfermo')
|
||||
es_content = es_content.replace('Pflanzen erkennen kostenlos', 'Identificar plantas gratis')
|
||||
es_content = es_content.replace('Pflanzen bestimmen', 'Determinar plantas')
|
||||
es_content = es_content.replace('Blumen per Foto erkennen', 'Reconocer flores por foto')
|
||||
es_content = es_content.replace('Zimmerpflanzen bestimmen', 'Identificar plantas de interior')
|
||||
es_content = es_content.replace('Pflanzen Pflege App', 'App cuidado de plantas')
|
||||
es_content = es_content.replace('Pflanzenkrankheiten erkennen', 'Identificar enfermedades plantas')
|
||||
es_content = es_content.replace('Alle Rechte vorbehalten.', 'Todos los derechos reservados.')
|
||||
es_content = es_content.replace('Die App für Pflanzenliebhaber, die Auswertung, Identifikation und Pflege an einem Ort vereint.', 'La app para los amantes de las plantas que combina análisis, identificación y cuidado en un solo lugar.')
|
||||
|
||||
os.makedirs('app/es/identificador-de-plantas', exist_ok=True)
|
||||
with open('app/es/identificador-de-plantas/page.tsx', 'w', encoding='utf-8') as f:
|
||||
f.write(es_content)
|
||||
|
||||
print('Spanish translation done')
|
||||
111
server/scripts/temp-carousel-upload.js
Normal file
111
server/scripts/temp-carousel-upload.js
Normal file
@@ -0,0 +1,111 @@
|
||||
const http = require('http');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const ADMIN_KEY = process.env.GREENLENS_ADMIN_KEY || 'greenlens-admin-2024';
|
||||
const PORT = 5173;
|
||||
const IMAGES = process.argv.slice(2);
|
||||
if (!IMAGES.length) {
|
||||
console.error('Provide image paths');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
(async () => {
|
||||
const upstream = await import('axios');
|
||||
const axios = upstream.default || upstream;
|
||||
|
||||
const server = http.createServer(async (req, res) => {
|
||||
if (req.url === '/api/tiktok/upload/photo' && req.method === 'POST') {
|
||||
const chunks = [];
|
||||
req.on('data', chunk => chunks.push(chunk));
|
||||
req.on('end', async () => {
|
||||
const raw = Buffer.concat(chunks).toString();
|
||||
const contentType = req.headers['content-type'] || '';
|
||||
let payload;
|
||||
if (contentType.includes('multipart/form-data')) {
|
||||
const busboy = (await import('@fastify/busboy')).default || (await import('busboy')).default;
|
||||
} else {
|
||||
try { payload = JSON.parse(raw); } catch {
|
||||
res.writeHead(400, {'content-type':'application/json'});
|
||||
return res.end(JSON.stringify({'code':'BAD_REQUEST','message':'Invalid JSON'}));
|
||||
}
|
||||
}
|
||||
|
||||
let files = [];
|
||||
if (Array.isArray(payload?.files)) {
|
||||
files = payload.files || [];
|
||||
} else if (Array.isArray(payload?.photos)) {
|
||||
files = payload.photos.map((photo) => {
|
||||
if (Buffer.isBuffer(photo?.buffer)) {
|
||||
return { buffer: photo.buffer, contentType: photo.mimeType || photo.contentType || 'image/jpeg' };
|
||||
}
|
||||
if (typeof photo?.url === 'string' && /^https?:\/\//i.test(photo.url)) {
|
||||
return { buffer: Buffer.from(photo.url), contentType: photo.mimeType || photo.contentType || 'image/jpeg', url: photo.url };
|
||||
}
|
||||
return null;
|
||||
}).filter(Boolean);
|
||||
}
|
||||
|
||||
try {
|
||||
const { uploadImage } = require('./lib/storage');
|
||||
const fileInfos = [];
|
||||
for (const file of files) {
|
||||
const buffer = file.buffer || file.data;
|
||||
const mimeType = file.contentType || file.mimeType || 'image/jpeg';
|
||||
if (!Buffer.isBuffer(buffer)) {
|
||||
res.writeHead(400, {'content-type':'application/json'});
|
||||
return res.end(JSON.stringify({'code':'BAD_REQUEST','message':'Each file must include a binary buffer.'}));
|
||||
}
|
||||
const uploadRes = await uploadImage(buffer.toString('base64'), mimeType);
|
||||
fileInfos.push({ url: uploadRes.url, mime_type: mimeType });
|
||||
}
|
||||
console.log('Uploaded URLs:', fileInfos.map(f => f.url));
|
||||
|
||||
const { getLiveTiktokAccessToken } = require('./lib/tiktok');
|
||||
async function tiktokApi(url, options = {}) {
|
||||
const tokens = await getLiveTiktokAccessToken();
|
||||
const r = await axios({ url, ...options, headers: { ...(options.headers || {}), Authorization: 'Bearer ' + tokens.access_token, 'Content-Type': 'application/json; charset=UTF-8' } });
|
||||
if (r.status >= 400) throw new Error('TikTok API error: ' + r.status + ' ' + JSON.stringify(r.data));
|
||||
return r.data;
|
||||
}
|
||||
|
||||
const initBody = {
|
||||
media_type: 'PHOTO',
|
||||
photo_cover_index: 0,
|
||||
file_paths: fileInfos.map(info => info.url),
|
||||
file_extensions: fileInfos.map(info => (info.mime_type || 'image/jpeg').split('/').pop()),
|
||||
post_mode: 'DRAFT',
|
||||
};
|
||||
|
||||
const initResult = await tiktokApi('https://open.tiktokapis.com/v2/post/publish/content/init/', { method: 'POST', data: initBody });
|
||||
console.log('TikTok init:', JSON.stringify(initResult));
|
||||
res.writeHead(200, {'content-type':'application/json'});
|
||||
res.end(JSON.stringify({ publish_id: initResult?.data?.publish_id, status: initResult?.data?.status || 'INITIATED' }));
|
||||
} catch (error) {
|
||||
console.error('Handler error:', error);
|
||||
res.writeHead(error.status || 500, {'content-type':'application/json'});
|
||||
res.end(JSON.stringify({ code: error.code || 'SERVER_ERROR', message: error.message }));
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
res.writeHead(404, {'content-type':'application/json'});
|
||||
res.end(JSON.stringify({ error: 'Not found' }));
|
||||
});
|
||||
|
||||
server.listen(PORT, '127.0.0.1', async () => {
|
||||
try {
|
||||
const form = new FormData();
|
||||
for (const file of IMAGES) {
|
||||
form.append('photos', fs.createReadStream(file), { filename: path.basename(file), contentType: 'image/png' });
|
||||
}
|
||||
const { default: axios } = await import('axios');
|
||||
const resp = await axios.post('http://127.0.0.1:' + PORT + '/api/tiktok/upload/photo', form, { headers: { ...form.getHeaders(), 'x-admin-key': ADMIN_KEY }, maxBodyLength: Infinity, maxContentLength: Infinity });
|
||||
console.log('UPLOAD_RESPONSE', JSON.stringify(resp.data));
|
||||
} finally {
|
||||
server.close();
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
})();
|
||||
@@ -1,17 +1,67 @@
|
||||
import PostHog from 'posthog-react-native';
|
||||
|
||||
type AnalyticsProperties = Record<string, unknown>;
|
||||
|
||||
type SafeAnalytics = {
|
||||
capture: (event: string, properties?: AnalyticsProperties) => void;
|
||||
identify: (userId: string, properties?: AnalyticsProperties) => void;
|
||||
screen: (name: string, properties?: AnalyticsProperties) => void;
|
||||
reset: () => void;
|
||||
};
|
||||
|
||||
const noop = () => {};
|
||||
const POSTHOG_API_KEY = (
|
||||
process.env.EXPO_PUBLIC_POSTHOG_API_KEY || 'phc_FX6HRgx9NSpS5moxjMF6xyc37yMwjoeu6TbWUqNNKlk'
|
||||
).trim();
|
||||
const POSTHOG_HOST = (process.env.EXPO_PUBLIC_POSTHOG_HOST || 'https://us.i.posthog.com').trim();
|
||||
|
||||
// Kein Provider im Layout — die Provider-Variante (Autocapture) hat frueher den
|
||||
// App-Start zerlegt (siehe Commit "App chrash + seo"). Die Instanz laeuft rein in JS,
|
||||
// scheitert die Initialisierung, bleibt client null und alle Aufrufe sind no-ops.
|
||||
let client: PostHog | null = null;
|
||||
|
||||
try {
|
||||
if (POSTHOG_API_KEY.startsWith('phc_')) {
|
||||
client = new PostHog(POSTHOG_API_KEY, {
|
||||
host: POSTHOG_HOST,
|
||||
captureAppLifecycleEvents: true, // Application Opened/Backgrounded → DAU/WAU-Dashboards
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('[Analytics] PostHog initialization failed — analytics disabled.', error);
|
||||
client = null;
|
||||
}
|
||||
|
||||
const safeAnalytics: SafeAnalytics = {
|
||||
capture: noop,
|
||||
identify: noop,
|
||||
reset: noop,
|
||||
capture: (event, properties) => {
|
||||
try {
|
||||
client?.capture(event, properties as Record<string, string>);
|
||||
} catch (error) {
|
||||
console.warn('[Analytics] capture failed', event, error);
|
||||
}
|
||||
},
|
||||
identify: (userId, properties) => {
|
||||
try {
|
||||
client?.identify(userId, properties as Record<string, string>);
|
||||
} catch (error) {
|
||||
console.warn('[Analytics] identify failed', error);
|
||||
}
|
||||
},
|
||||
screen: (name, properties) => {
|
||||
try {
|
||||
client?.screen(name, properties as Record<string, string>);
|
||||
} catch (error) {
|
||||
console.warn('[Analytics] screen failed', name, error);
|
||||
}
|
||||
},
|
||||
reset: () => {
|
||||
try {
|
||||
client?.reset();
|
||||
} catch (error) {
|
||||
console.warn('[Analytics] reset failed', error);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export const Analytics = safeAnalytics;
|
||||
|
||||
export const useSafeAnalytics = (): SafeAnalytics => safeAnalytics;
|
||||
|
||||
Reference in New Issue
Block a user