// landing_page.jsx — retraide.ch landing page const LP = { pink: '#E8286A', pinkSoft: '#FDE7EE', pink600: '#C01E57', blue: '#2E5DA1', blueDeep: '#1E3A5F', blueSoft: '#EAF1F8', peach: '#F6957F', peachSoft: '#FFE4D8', sage: '#7FA894', ink: '#121212', ink2: '#263238', ink3: '#455A64', muted: '#6B7680', cream: '#FAF7F2', line: '#E6ECF4', }; // ═══════════════════════ i18n ═══════════════════════ const LANG_KEY = 'retraide_lang'; const getInitialLang = () => { try { if (typeof localStorage !== 'undefined') { const stored = localStorage.getItem(LANG_KEY); if (stored === 'fr' || stored === 'de') return stored; } if (typeof navigator !== 'undefined' && navigator.language) { return navigator.language.toLowerCase().startsWith('de') ? 'de' : 'fr'; } } catch (e) { // localStorage may throw in private mode / SSR } return 'fr'; }; const DICT = { fr: { 'nav.app': "L'application", 'nav.articles': 'Articles', 'nav.project': 'Pour qui', 'nav.faq': 'FAQ', 'nav.signin': 'Se connecter', 'nav.signup': 'Rejoindre la beta', 'hero.eyebrow': 'BETA OUVERTE · SUISSE ROMANDE', 'hero.title.before': "L'app qui ", 'hero.title.highlight': 'épaule', 'hero.title.after': " les proches aidants.", 'hero.subtitle': "Coordonner les soins, partager les tâches avec votre cercle, retrouver les bonnes informations au bon moment. RetrAide vous aide à aider — sans vous épuiser.", 'hero.cta.signup': 'Ouvrir RetrAide', 'hero.cta.howItWorks': 'Voir comment ça marche', 'hero.trust.free.bold': 'Gratuit', 'hero.trust.free.rest': ' pendant la beta', 'hero.trust.data.bold': 'Données en europe', 'hero.trust.data.rest': ' · RGPD', 'hero.trust.time.bold': '3 min', 'hero.trust.time.rest': " pour s'inscrire", 'hero.card1.t1': 'Marc · ton frère', 'hero.card1.t2': '"Je m\'occupe des courses 👍"', 'hero.card2.t1': 'Rendez-vous confirmé', 'hero.card2.t2': 'Dr. Müller · Mardi 14:30', 'logobar.label': 'Soutenu par', 'problem.eyebrow': "Le quotidien d'un proche aidant", 'problem.title.before': 'Aider, c\'est ', 'problem.title.highlight': 'aussi', 'problem.title.after': ' jongler en silence.', 'problem.subtitle': "En Suisse, 1 personne sur 5 aide régulièrement un proche. La plupart le font seules, sans formation, et finissent par s'épuiser. RetrAide est là pour changer ça.", 'problem.card1.h': 'La charge mentale est invisible', 'problem.card1.p': "Médicaments, rendez-vous, papiers, repas — tout est dans votre tête, et personne autour ne mesure ce que ça représente.", 'problem.card2.h': "L'entourage veut aider, mais ne sait pas comment", 'problem.card2.p': "\"Dis-moi si je peux faire quelque chose\" — sans liste claire, l'aide reste théorique et la fatigue s'accumule sur une seule personne.", 'problem.card3.h': "L'information utile est éparpillée", 'problem.card3.p': "Aides cantonales, démarches juridiques, conseils médicaux : on cherche dans dix endroits différents, souvent dans l'urgence.", 'features.eyebrow': 'Comment ça marche', 'features.title.before': 'Trois piliers pour ', 'features.title.highlight': 'alléger', 'features.title.after': ' votre quotidien.', 'features.f1.tag': 'ORGANISER', 'features.f1.h.l1': "Toutes les tâches d'aide,", 'features.f1.h.l2': 'au même endroit.', 'features.f1.p': "Créez une tâche en 10 secondes, ajoutez le contexte, et voyez votre semaine à venir d'un seul coup d'œil.", 'features.f1.b1.bold': 'Récurrences intelligentes', 'features.f1.b1.rest': ' — médicaments du soir, courses du mardi, sans ressaisir.', 'features.f1.b2.bold': 'Calendrier partagé', 'features.f1.b2.rest': ' avec rappels avant chaque rendez-vous.', 'features.f1.b3.bold': 'Documents joints', 'features.f1.b3.rest': " — ordonnance, carte AVS, plan d'accès, toujours sous la main.", 'features.f2.tag': 'PARTAGER', 'features.f2.h.l1': "Un cercle d'aide,", 'features.f2.h.l2': 'pas un poids unique.', 'features.f2.p': "Invitez votre famille, vos voisins, le médecin, l'aide à domicile. Chacun voit son rôle, ses tâches, sans noyer les autres.", 'features.f2.b1.bold': 'Niveaux de partage', 'features.f2.b1.rest': " — la voisine ne voit pas l'ordonnance, le médecin si.", 'features.f2.b2.bold': 'Tâches "à prendre"', 'features.f2.b2.rest': " — l'entourage choisit, vous n'avez plus à demander.", 'features.f2.b3.bold': "Vue d'équilibre", 'features.f2.b3.rest': ' — qui fait quoi, sur la semaine, sans tableau Excel.', 'features.f3.tag': "S'INFORMER", 'features.f3.h.l1': 'Le bon savoir,', 'features.f3.h.l2': 'au bon moment.', 'features.f3.p': "Une bibliothèque d'articles courts, écrits par des soignants et juristes suisses. Suggérés selon votre situation — pas un Google qui vous noie.", 'features.f3.b1.bold': 'Articles ciblés', 'features.f3.b1.rest': ' par situation : début de la maladie, hospitalisation, retour à la maison.', 'features.f3.b2.bold': 'Aides cantonales', 'features.f3.b2.rest': ' — vaudoises, genevoises, fribourgeoises : ce à quoi vous avez droit.', 'features.f3.b3.bold': 'Format lisible', 'features.f3.b3.rest': ' — 3 à 6 minutes par article, sans jargon.', 'outcomes.n1.unit': '/5', 'outcomes.n1.l': 'Suisses aident régulièrement un proche.', 'outcomes.n2.unit': '%', 'outcomes.n2.l': 'se sentent seuls face à cette charge.', 'outcomes.n3.unit': '/jour', 'outcomes.n3.l': "en moyenne consacrées à l'aide.", 'outcomes.n4.unit': '%', 'outcomes.n4.l': "de charge ressentie après 3 mois d'usage.*", 'outcomes.footnote': '* Étude pilote HES-SO 2025, n=84 proches aidants — résultats préliminaires.', 'articles.eyebrow': 'La bibliothèque RetrAide', 'articles.title.l1': 'Des articles concrets,', 'articles.title.l2': 'pour traverser chaque étape.', 'articles.subtitle': 'Plus de 80 articles écrits avec des soignants, juristes et psychologues romands.', 'articles.featured.tag': 'À LA UNE', 'articles.featured.meta': 'DOSSIER · 12 MIN', 'articles.featured.h': 'Quand un parent ne peut plus rester seul à la maison : 5 questions à poser avant de décider.', 'articles.featured.p': "Du maintien à domicile à l'EMS, un guide pour clarifier vos options sans précipitation, avec les ressources cantonales adaptées.", 'articles.a2.tag': 'JURIDIQUE', 'articles.a2.meta': '5 MIN', 'articles.a2.h': 'La procuration : ce qu\'elle couvre vraiment.', 'articles.a3.tag': 'ÉMOTIONNEL', 'articles.a3.meta': '4 MIN', 'articles.a3.h': "Reconnaître les signes d'épuisement de l'aidant.", 'articles.a4.tag': 'FINANCIER', 'articles.a4.meta': '6 MIN', 'articles.a4.h': 'Les aides du canton de Vaud, expliquées simplement.', 'articles.a5.tag': 'SANTÉ', 'articles.a5.meta': '3 MIN', 'articles.a5.h': 'Bien préparer un rendez-vous médical pour un proche.', 'personas.eyebrow': 'Pour qui ?', 'personas.title.before': 'Pensé pour ', 'personas.title.highlight': 'tous', 'personas.title.after': ' ceux qui aident.', 'personas.p1.h': 'Vous aidez un parent', 'personas.p1.p': 'Vos parents vieillissent. Vous gérez les rendez-vous, les médicaments, parfois à distance. Vos frères et sœurs voudraient aider — sans savoir comment.', 'personas.p1.tag': "L'usage le plus fréquent", 'personas.p2.h': 'Vous accompagnez un conjoint', 'personas.p2.p': "La maladie change votre quotidien à deux. Vous voulez garder un cercle de soutien autour de vous, sans tout porter seul·e.", 'personas.p2.tag': 'Soutien rapproché', 'personas.p3.h': 'Vous êtes un aidant pro', 'personas.p3.p': 'Aide à domicile, infirmier·ère, assistant·e social·e — coordonnez-vous avec la famille sans appels téléphoniques en boucle.', 'personas.p3.tag': 'Mode professionnel', 'quote.text': "Pour la première fois en deux ans, j'ai eu l'impression que je n'étais pas seule à m'occuper de ma mère.", 'quote.author.name': 'Sophie C., 47 ans', 'quote.author.meta': 'Lausanne · beta-testeuse depuis 4 mois', 'faq.eyebrow': 'FAQ', 'faq.title.l1': 'Vous avez', 'faq.title.l2': 'des questions.', 'faq.contact.before': "Si la vôtre n'y est pas, écrivez-nous : ", 'faq.q1.q': "L'application est-elle gratuite ?", 'faq.q1.a': "Pendant la beta (jusqu'à fin 2026), RetrAide est entièrement gratuite. Nous travaillons avec des partenaires cantonaux pour garantir un accès large à l'avenir.", 'faq.q2.q': 'Mes données sont-elles en sécurité ?', 'faq.q2.a': 'Toutes les données sont hébergées en europe, chiffrées de bout en bout. Vous gardez le contrôle de qui voit quoi dans votre cercle, et vous pouvez tout exporter ou supprimer à tout moment.', 'faq.q3.q': "Est-ce que la personne aidée doit utiliser l'app aussi ?", 'faq.q3.a': "Non. RetrAide est pensée pour les proches aidants. La personne aidée n'a rien à installer — bien que nous proposions un mode \"vue simple\" si elle souhaite voir son agenda.", 'faq.q4.q': 'Comment inviter ma famille dans le cercle ?', 'faq.q4.a': "Un lien d'invitation suffit. Pas de création de compte compliquée — la personne reçoit un SMS ou email et accède directement à sa vue.", 'faq.q5.q': 'Disponible en plusieurs langues ?', 'faq.q5.a': "L'application est actuellement disponible en Francais, Allemand, Italien et Anglais", 'faq.q6.q': 'Qui est derrière RetrAide ?', 'faq.q6.a': "Une équipe romande, soutenue par Innosuisse, la HES-SO et plusieurs fondations cantonales. Nous avons co-conçu l'app avec plus de 200 proches aidants depuis 2023.", 'finalcta.title': "Aider, sans s'oublier.", 'finalcta.subtitle': "Rejoignez les 1'800 proches aidants romands qui utilisent déjà RetrAide en beta. Disponible sur tous vos appareils.", 'finalcta.cta': 'Ouvrir dans le navigateur', 'finalcta.note': 'iOS et Android arrivent bientôt', 'finalcta.footer': 'Vos données restent en europe · Synchronisation automatique entre web et mobile.', 'footer.tagline': "L'application qui épaule les proches aidants en Suisse romande. Un projet associatif soutenu par Innosuisse.", 'footer.col.product': 'Produit', 'footer.col.product.l1': 'Fonctionnalités', 'footer.col.product.l2': 'Articles', 'footer.col.product.l3': 'Télécharger', 'footer.col.project': 'Le projet', 'footer.col.project.l1': 'Notre mission', 'footer.col.project.l2': "L'équipe", 'footer.col.project.l3': 'Partenaires', 'footer.col.project.l4': 'Presse', 'footer.col.contact': 'Contact', 'footer.col.contact.l2': 'LinkedIn', 'footer.legal.copyright': '© 2026 Association RetrAide · Lausanne, Suisse', 'footer.legal.privacy': 'Confidentialité', 'footer.legal.tos': 'CGU', 'footer.legal.imprint': 'Mentions légales', }, de: { 'nav.app': 'Die App', 'nav.articles': 'Artikel', 'nav.project': 'Für wen', 'nav.faq': 'FAQ', 'nav.signin': 'Anmelden', 'nav.signup': 'An der Beta teilnehmen', 'hero.eyebrow': 'BETA OFFEN · SCHWEIZ', 'hero.title.before': 'Die App, die pflegende Angehörige ', 'hero.title.highlight': 'unterstützt', 'hero.title.after': '.', 'hero.subtitle': 'Pflege koordinieren, Aufgaben mit Ihrem Kreis teilen, die richtigen Informationen zur richtigen Zeit finden. RetrAide hilft Ihnen zu helfen — ohne sich zu erschöpfen.', 'hero.cta.signup': 'RetrAide öffnen', 'hero.cta.howItWorks': 'So funktioniert es', 'hero.trust.free.bold': 'Kostenlos', 'hero.trust.free.rest': ' während der Beta', 'hero.trust.data.bold': 'Daten in Europa', 'hero.trust.data.rest': ' · DSGVO', 'hero.trust.time.bold': '3 Min.', 'hero.trust.time.rest': ' für die Anmeldung', 'hero.card1.t1': 'Marc · dein Bruder', 'hero.card1.t2': '"Ich kümmere mich um die Einkäufe 👍"', 'hero.card2.t1': 'Termin bestätigt', 'hero.card2.t2': 'Dr. Müller · Dienstag 14:30', 'logobar.label': 'Unterstützt von', 'problem.eyebrow': 'Der Alltag pflegender Angehöriger', 'problem.title.before': 'Helfen heisst ', 'problem.title.highlight': 'auch', 'problem.title.after': ', im Stillen zu jonglieren.', 'problem.subtitle': 'In der Schweiz hilft jede fünfte Person regelmässig einem Angehörigen. Die meisten tun dies allein, ohne Ausbildung, und erschöpfen sich dabei. RetrAide will das ändern.', 'problem.card1.h': 'Die mentale Last ist unsichtbar', 'problem.card1.p': 'Medikamente, Termine, Papiere, Mahlzeiten — alles steckt in Ihrem Kopf, und niemand um Sie herum erfasst, was das bedeutet.', 'problem.card2.h': 'Das Umfeld will helfen, weiss aber nicht wie', 'problem.card2.p': '"Sag mir, wenn ich etwas tun kann" — ohne klare Liste bleibt die Hilfe theoretisch und die Erschöpfung sammelt sich bei einer einzigen Person.', 'problem.card3.h': 'Nützliche Informationen sind verstreut', 'problem.card3.p': 'Kantonale Hilfen, rechtliche Schritte, medizinischer Rat: Man sucht an zehn verschiedenen Orten, oft unter Zeitdruck.', 'features.eyebrow': 'So funktioniert es', 'features.title.before': 'Drei Säulen, um Ihren Alltag zu ', 'features.title.highlight': 'erleichtern', 'features.title.after': '.', 'features.f1.tag': 'ORGANISIEREN', 'features.f1.h.l1': 'Alle Pflegeaufgaben,', 'features.f1.h.l2': 'an einem Ort.', 'features.f1.p': 'Erstellen Sie eine Aufgabe in 10 Sekunden, fügen Sie den Kontext hinzu und sehen Sie Ihre kommende Woche auf einen Blick.', 'features.f1.b1.bold': 'Intelligente Wiederholungen', 'features.f1.b1.rest': ' — Medikamente am Abend, Einkäufe am Dienstag, ohne erneute Eingabe.', 'features.f1.b2.bold': 'Geteilter Kalender', 'features.f1.b2.rest': ' mit Erinnerungen vor jedem Termin.', 'features.f1.b3.bold': 'Angehängte Dokumente', 'features.f1.b3.rest': ' — Rezept, AHV-Karte, Wegbeschreibung, immer zur Hand.', 'features.f2.tag': 'TEILEN', 'features.f2.h.l1': 'Ein Hilfekreis,', 'features.f2.h.l2': 'keine alleinige Last.', 'features.f2.p': 'Laden Sie Ihre Familie, Ihre Nachbarn, den Arzt, die Spitex ein. Jede Person sieht ihre Rolle und ihre Aufgaben, ohne die anderen zu überfordern.', 'features.f2.b1.bold': 'Freigabe-Stufen', 'features.f2.b1.rest': ' — die Nachbarin sieht das Rezept nicht, der Arzt schon.', 'features.f2.b2.bold': 'Aufgaben "zum Übernehmen"', 'features.f2.b2.rest': ' — das Umfeld wählt selbst, Sie müssen nicht mehr fragen.', 'features.f2.b3.bold': 'Übersicht der Aufteilung', 'features.f2.b3.rest': ' — wer macht was in der Woche, ohne Excel-Tabelle.', 'features.f3.tag': 'INFORMIEREN', 'features.f3.h.l1': 'Das richtige Wissen,', 'features.f3.h.l2': 'zur richtigen Zeit.', 'features.f3.p': 'Eine Bibliothek mit kurzen Artikeln, geschrieben von Schweizer Pflegenden und Juristen. Auf Ihre Situation zugeschnitten — kein Google, das Sie überflutet.', 'features.f3.b1.bold': 'Zielgerichtete Artikel', 'features.f3.b1.rest': ' je nach Situation: Krankheitsbeginn, Spitalaufenthalt, Rückkehr nach Hause.', 'features.f3.b2.bold': 'Kantonale Hilfen', 'features.f3.b2.rest': ' — was Ihnen in Ihrem Kanton zusteht.', 'features.f3.b3.bold': 'Lesbares Format', 'features.f3.b3.rest': ' — 3 bis 6 Minuten pro Artikel, ohne Fachjargon.', 'outcomes.n1.unit': '/5', 'outcomes.n1.l': 'Personen in der Schweiz pflegen regelmässig Angehörige.', 'outcomes.n2.unit': '%', 'outcomes.n2.l': 'fühlen sich mit dieser Last allein.', 'outcomes.n3.unit': '/Tag', 'outcomes.n3.l': 'durchschnittlich für die Pflege aufgewendet.', 'outcomes.n4.unit': '%', 'outcomes.n4.l': 'weniger empfundene Belastung nach 3 Monaten Nutzung.*', 'outcomes.footnote': '* Pilotstudie HES-SO 2025, n=84 pflegende Angehörige — vorläufige Ergebnisse.', 'articles.eyebrow': 'Die RetrAide-Bibliothek', 'articles.title.l1': 'Konkrete Artikel,', 'articles.title.l2': 'um jede Etappe zu meistern.', 'articles.subtitle': 'Über 80 Artikel, verfasst gemeinsam mit Schweizer Pflegenden, Juristinnen und Psychologen.', 'articles.featured.tag': 'IM FOKUS', 'articles.featured.meta': 'DOSSIER · 12 MIN', 'articles.featured.h': 'Wenn ein Elternteil nicht mehr allein zu Hause bleiben kann: 5 Fragen, bevor Sie entscheiden.', 'articles.featured.p': 'Vom Verbleib zu Hause bis zum Pflegeheim — ein Leitfaden, um Ihre Optionen ohne Eile zu klären, mit den passenden kantonalen Ressourcen.', 'articles.a2.tag': 'RECHTLICH', 'articles.a2.meta': '5 MIN', 'articles.a2.h': 'Die Vollmacht: was sie wirklich abdeckt.', 'articles.a3.tag': 'EMOTIONAL', 'articles.a3.meta': '4 MIN', 'articles.a3.h': 'Anzeichen einer Erschöpfung der pflegenden Person erkennen.', 'articles.a4.tag': 'FINANZIELL', 'articles.a4.meta': '6 MIN', 'articles.a4.h': 'Die Hilfen des Kantons Waadt, einfach erklärt.', 'articles.a5.tag': 'GESUNDHEIT', 'articles.a5.meta': '3 MIN', 'articles.a5.h': 'Einen Arzttermin für eine angehörige Person gut vorbereiten.', 'personas.eyebrow': 'Für wen?', 'personas.title.before': 'Gedacht für ', 'personas.title.highlight': 'alle', 'personas.title.after': ', die helfen.', 'personas.p1.h': 'Sie helfen einem Elternteil', 'personas.p1.p': 'Ihre Eltern werden älter. Sie organisieren Termine, Medikamente, manchmal aus der Ferne. Ihre Geschwister möchten helfen — wissen aber nicht wie.', 'personas.p1.tag': 'Der häufigste Anwendungsfall', 'personas.p2.h': 'Sie begleiten Ihren Partner', 'personas.p2.p': 'Die Krankheit verändert Ihren Alltag zu zweit. Sie möchten einen Unterstützungskreis um sich behalten, ohne alles allein zu tragen.', 'personas.p2.tag': 'Enge Begleitung', 'personas.p3.h': 'Sie sind Pflegefachperson', 'personas.p3.p': 'Spitex, Pflegefachperson, Sozialarbeiterin — koordinieren Sie sich mit der Familie ohne endlose Telefonate.', 'personas.p3.tag': 'Profi-Modus', 'quote.text': 'Zum ersten Mal seit zwei Jahren hatte ich das Gefühl, mit der Pflege meiner Mutter nicht allein zu sein.', 'quote.author.name': 'Sophie C., 47 Jahre', 'quote.author.meta': 'Lausanne · Beta-Testerin seit 4 Monaten', 'faq.eyebrow': 'FAQ', 'faq.title.l1': 'Sie haben', 'faq.title.l2': 'Fragen.', 'faq.contact.before': 'Wenn Ihre Frage hier nicht steht, schreiben Sie uns: ', 'faq.q1.q': 'Ist die App kostenlos?', 'faq.q1.a': 'Während der Beta (bis Ende 2026) ist RetrAide vollständig kostenlos. Wir arbeiten mit kantonalen Partnern zusammen, um auch in Zukunft einen breiten Zugang zu gewährleisten.', 'faq.q2.q': 'Sind meine Daten sicher?', 'faq.q2.a': 'Alle Daten werden in der Schweiz gehostet und Ende-zu-Ende verschlüsselt. Sie behalten die Kontrolle darüber, wer in Ihrem Kreis was sieht, und können jederzeit alles exportieren oder löschen.', 'faq.q3.q': 'Muss die unterstützte Person die App auch nutzen?', 'faq.q3.a': 'Nein. RetrAide ist für pflegende Angehörige gedacht. Die unterstützte Person muss nichts installieren — wir bieten allerdings einen Modus "Einfache Ansicht" an, falls sie ihren Kalender sehen möchte.', 'faq.q4.q': 'Wie lade ich meine Familie in den Kreis ein?', 'faq.q4.a': 'Ein Einladungslink genügt. Keine umständliche Kontoerstellung — die Person erhält eine SMS oder eine E-Mail und gelangt direkt zu ihrer Ansicht.', 'faq.q5.q': 'In mehreren Sprachen verfügbar?', 'faq.q5.a': "Die App ist derzeit auf Deutsch, Französisch, Italienisch und Englisch verfügbar", 'faq.q6.q': 'Wer steht hinter RetrAide?', 'faq.q6.a': 'Ein Schweizer Team, unterstützt von Innosuisse, der HES-SO und mehreren kantonalen Stiftungen. Wir haben die App seit 2023 gemeinsam mit über 200 pflegenden Angehörigen entwickelt.', 'finalcta.title': 'Helfen, ohne sich selbst zu vergessen.', 'finalcta.subtitle': "Schliessen Sie sich den 1'800 pflegenden Angehörigen an, die RetrAide bereits in der Beta nutzen. Auf allen Ihren Geräten verfügbar.", 'finalcta.cta': 'Im Browser öffnen', 'finalcta.note': 'iOS und Android folgen bald', 'finalcta.footer': 'Ihre Daten bleiben in der Schweiz · Automatische Synchronisation zwischen Web und Mobile.', 'footer.tagline': 'Die App, die pflegende Angehörige in der Schweiz unterstützt. Ein gemeinnütziges Projekt, gefördert von Innosuisse.', 'footer.col.product': 'Produkt', 'footer.col.product.l1': 'Funktionen', 'footer.col.product.l2': 'Artikel', 'footer.col.product.l3': 'Herunterladen', 'footer.col.project': 'Das Projekt', 'footer.col.project.l1': 'Unsere Mission', 'footer.col.project.l2': 'Das Team', 'footer.col.project.l3': 'Partner', 'footer.col.project.l4': 'Presse', 'footer.col.contact': 'Kontakt', 'footer.col.contact.l2': 'LinkedIn', 'footer.legal.copyright': '© 2026 Verein RetrAide · Lausanne, Schweiz', 'footer.legal.privacy': 'Datenschutz', 'footer.legal.tos': 'AGB', 'footer.legal.imprint': 'Impressum', }, }; const LangContext = React.createContext({ lang: 'fr', setLang: () => {}, t: (k) => k }); const useT = () => React.useContext(LangContext); const LangProvider = ({ children }) => { const [lang, setLangState] = React.useState(getInitialLang); const setLang = React.useCallback((next) => { setLangState(next); try { if (typeof localStorage !== 'undefined') { localStorage.setItem(LANG_KEY, next); } } catch (e) { // ignore } }, []); React.useEffect(() => { if (typeof document !== 'undefined' && document.documentElement) { document.documentElement.lang = lang; } }, [lang]); const t = React.useCallback((key) => { const dict = DICT[lang] || DICT.fr; if (dict[key] !== undefined) return dict[key]; if (DICT.fr[key] !== undefined) return DICT.fr[key]; return key; }, [lang]); const value = React.useMemo(() => ({ lang, setLang, t }), [lang, setLang, t]); return {children}; }; // ─────────── C3 logo (têtes grandes — validé) ─────────── const Logo = ({ size = 40, id = 'logo' }) => { // Always paint the deep-blue background so the white silhouette stays // visible on light surfaces (Nav) as well as dark ones (Footer). The // previous onDark={false} path used #fff which made the white person // disappear into the nav. const bg = LP.blueDeep; const clipId = `clip-${id}-${size}`; return ( ); }; const Wordmark = ({ onDark = false, size = 28 }) => (
RetrAide
); // ─────────── Tiny phone-mockup (used as decorative product shots) ─────────── const PhoneMock = ({ children, w = 320, scale = 1 }) => (
{children}
); // Status bar mini const Status = () => (
9:41
); // Mock 1 — Dashboard (tâches du jour) const MockDashboard = () => (
Bonjour Claire
Aujourd'hui
CR
PROCHAINE TÂCHE · 14:30
Rendez-vous médecin
Mme Roos · Dr. Müller, Lausanne
Transport ✓
Carte AVS ✓
{[ { time: '16:00', t: 'Courses au Coop', who: '+ Marc' }, { time: '18:00', t: 'Préparer le repas', who: 'Toi' }, { time: 'Soir', t: 'Médicaments', who: 'Tournus' }, ].map((it, i) => (
{it.t}
{it.time} · {it.who}
))}
); // Mock 2 — Réseau / Cercle // Real screenshot of the production "Cercle" tab (iPhone 17 Pro, 1206×2622), // pulled from the Play Store capture set. Drops the previously-rendered // hand-drawn orbit mock so what visitors see matches what they'll install. const MockNetwork = () => ( Aperçu : la vue cercle de l'app Retr'aide ); // Mock 3 — Articles / Savoir const MockArticles = () => (
Savoir
SUGGÉRÉ POUR TOI
Comment parler de la perte d'autonomie ?
Un guide en 5 étapes pour aborder le sujet sans heurter.
5 min · Émotionnel
{[ { tag: 'JURIDIQUE', t: 'Procuration : par où commencer ?', m: '4 min' }, { tag: 'FINANCIER', t: 'Aides cantonales en Suisse romande', m: '6 min' }, { tag: 'SANTÉ', t: 'Reconnaître les signes d\'épuisement', m: '3 min' }, ].map((a, i) => (
{a.tag} · {a.m}
{a.t}
))}
); // ═══════════════════════ COMPONENTS ═══════════════════════ // Beta URLs — point at the live PWA. The auth gate in app/_layout.tsx // routes unauthenticated users into onboarding/phone, authed users into tabs. const APP_URL = 'https://app.retraide.ch'; const SIGNUP_URL = `${APP_URL}/onboarding/phone`; const LOGIN_URL = `${APP_URL}/`; const LangToggle = () => { const { lang, setLang } = useT(); const btnBase = { background: 'none', border: 'none', padding: '4px 6px', cursor: 'pointer', fontFamily: 'inherit', fontSize: 'inherit', lineHeight: 1, }; const activeStyle = { ...btnBase, color: LP.pink, fontWeight: 800 }; const inactiveStyle = { ...btnBase, color: LP.muted, fontWeight: 600 }; return (
·
); }; const Nav = () => { const { t } = useT(); return ( ); }; const Hero = () => { const { t } = useT(); return (
{t('hero.eyebrow')}

{t('hero.title.before')}{t('hero.title.highlight')}{t('hero.title.after')}

{t('hero.subtitle')}

{t('hero.trust.free.bold')}{t('hero.trust.free.rest')}
{t('hero.trust.data.bold')}{t('hero.trust.data.rest')}
{t('hero.trust.time.bold')}{t('hero.trust.time.rest')}
M
{t('hero.card1.t1')}
{t('hero.card1.t2')}
{t('hero.card2.t1')}
{t('hero.card2.t2')}
); }; const LogoBar = () => { const { t } = useT(); return (
{t('logobar.label')}
Innosuisse
HES-SO
UCreate
Unil. HEC Lausanne
); }; const Problem = () => { const { t } = useT(); return (
{t('problem.eyebrow')}

{t('problem.title.before')}{t('problem.title.highlight')}{t('problem.title.after')}

{t('problem.subtitle')}

01

{t('problem.card1.h')}

{t('problem.card1.p')}

02

{t('problem.card2.h')}

{t('problem.card2.p')}

03

{t('problem.card3.h')}

{t('problem.card3.p')}

); }; const Features = () => { const { t } = useT(); return (
{t('features.eyebrow')}

{t('features.title.before')}{t('features.title.highlight')}{t('features.title.after')}

{/* Feature 1 — Tâches partagées */}
01{t('features.f1.tag')}

{t('features.f1.h.l1')}
{t('features.f1.h.l2')}

{t('features.f1.p')}

  • {t('features.f1.b1.bold')}{t('features.f1.b1.rest')}
  • {t('features.f1.b2.bold')}{t('features.f1.b2.rest')}
  • {t('features.f1.b3.bold')}{t('features.f1.b3.rest')}
{/* Feature 2 — Cercle / Réseau */}
02{t('features.f2.tag')}

{t('features.f2.h.l1')}
{t('features.f2.h.l2')}

{t('features.f2.p')}

  • {t('features.f2.b1.bold')}{t('features.f2.b1.rest')}
  • {t('features.f2.b2.bold')}{t('features.f2.b2.rest')}
  • {t('features.f2.b3.bold')}{t('features.f2.b3.rest')}
{/* Feature 3 — Savoir */}
03{t('features.f3.tag')}

{t('features.f3.h.l1')}
{t('features.f3.h.l2')}

{t('features.f3.p')}

  • {t('features.f3.b1.bold')}{t('features.f3.b1.rest')}
  • {t('features.f3.b2.bold')}{t('features.f3.b2.rest')}
  • {t('features.f3.b3.bold')}{t('features.f3.b3.rest')}
); }; const Outcomes = () => { const { t } = useT(); return (
1{t('outcomes.n1.unit')}
{t('outcomes.n1.l')}
63{t('outcomes.n2.unit')}
{t('outcomes.n2.l')}
4h{t('outcomes.n3.unit')}
{t('outcomes.n3.l')}
−40{t('outcomes.n4.unit')}
{t('outcomes.n4.l')}
{t('outcomes.footnote')}
); }; const Articles = () => { const { t } = useT(); return (
{t('articles.eyebrow')}

{t('articles.title.l1')}
{t('articles.title.l2')}

{t('articles.subtitle')}

{t('articles.featured.tag')}
{t('articles.featured.meta')}

{t('articles.featured.h')}

{t('articles.featured.p')}

{t('articles.a2.tag')}
{t('articles.a2.meta')}

{t('articles.a2.h')}

{t('articles.a3.tag')}
{t('articles.a3.meta')}

{t('articles.a3.h')}

{t('articles.a4.tag')}
{t('articles.a4.meta')}

{t('articles.a4.h')}

{t('articles.a5.tag')}
{t('articles.a5.meta')}

{t('articles.a5.h')}

); }; const Personas = () => { const { t } = useT(); return (
{t('personas.eyebrow')}

{t('personas.title.before')}{t('personas.title.highlight')}{t('personas.title.after')}

{t('personas.p1.h')}

{t('personas.p1.p')}

{t('personas.p1.tag')}

{t('personas.p2.h')}

{t('personas.p2.p')}

{t('personas.p2.tag')}

{t('personas.p3.h')}

{t('personas.p3.p')}

{t('personas.p3.tag')}
); }; const Quote = () => { const { t } = useT(); return (
"
{t('quote.text')}
SC
{t('quote.author.name')} {t('quote.author.meta')}
); }; const FAQ = () => { const { t } = useT(); const items = [ { q: t('faq.q1.q'), a: t('faq.q1.a') }, { q: t('faq.q2.q'), a: t('faq.q2.a') }, { q: t('faq.q3.q'), a: t('faq.q3.a') }, { q: t('faq.q4.q'), a: t('faq.q4.a') }, { q: t('faq.q5.q'), a: t('faq.q5.a') }, { q: t('faq.q6.q'), a: t('faq.q6.a') }, ]; return (
{t('faq.eyebrow')}

{t('faq.title.l1')}
{t('faq.title.l2')}

{t('faq.contact.before')}contact@retraide.ch

{items.map((f, i) => (
{f.q}

{f.a}

))}
); }; const FinalCTA = () => { const { t } = useT(); return (

{t('finalcta.title')}

{t('finalcta.subtitle')}

{t('finalcta.cta')} {t('finalcta.note')}
{t('finalcta.footer')}
); }; const Footer = () => { const { t } = useT(); return ( ); }; const Page = () => (
); ReactDOM.createRoot(document.getElementById('root')).render( );