All checks were successful
Build & Deploy Landing / build-and-deploy (push) Successful in 1m1s
- Retire le système i18n EN (apps/landing/src/i18n/, pages /en/*) ajouté en 4f3417f. Source unique de copy dans src/copy.ts (FR uniquement). Switcher de langue retiré du header, sitemap nettoyé des hreflang. - Header : micro-baseline « Logiciel de relance de factures impayées » sous le wordmark pour lever l'ambiguïté du nom (§1). - CTA principal : « Lancer Rubis » → « Démarrer mon essai 14 jours » avec sous-texte sur Hero / FinalCTA / Pricing (§5). - Essai 30 j → 14 j sur landing + CGV §6.2 (§3). - Blog promu en nav primaire avec label « Ressources » (§6). Doc d'arbitrage : docs/tech/landing-optimisations.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
97 lines
3.4 KiB
Plaintext
97 lines
3.4 KiB
Plaintext
---
|
|
/**
|
|
* / — landing publique de rubis.pro.
|
|
* Statique au build (`prerender = true`).
|
|
*/
|
|
export const prerender = true;
|
|
|
|
import Layout from "../layouts/Layout.astro";
|
|
import { Hero } from "../components/sections/Hero";
|
|
import { Stats } from "../components/sections/Stats";
|
|
import { Promise as PromiseSection } from "../components/sections/Promise";
|
|
import { HowItWorks } from "../components/sections/HowItWorks";
|
|
import { Gamification } from "../components/sections/Gamification";
|
|
import { AutoBanking } from "../components/sections/AutoBanking";
|
|
import { Legal } from "../components/sections/Legal";
|
|
import { Pricing } from "../components/sections/Pricing";
|
|
import { FAQ } from "../components/sections/FAQ";
|
|
import { FinalCTA } from "../components/sections/FinalCTA";
|
|
import { Footnotes } from "../components/sections/Footnotes";
|
|
import { copy } from "../copy";
|
|
|
|
const jsonLd = {
|
|
"@context": "https://schema.org",
|
|
"@type": "SoftwareApplication",
|
|
name: "Rubis sur l'ongle",
|
|
description: copy.meta.home.description,
|
|
url: "https://rubis.pro",
|
|
applicationCategory: "BusinessApplication",
|
|
operatingSystem: "Web",
|
|
offers: [
|
|
{ "@type": "Offer", name: "Free", price: "0", priceCurrency: "EUR" },
|
|
{ "@type": "Offer", name: "Pro", price: "19", priceCurrency: "EUR" },
|
|
{ "@type": "Offer", name: "Business", price: "49", priceCurrency: "EUR" },
|
|
],
|
|
inLanguage: "fr-FR",
|
|
publisher: { "@type": "Organization", name: "Rubis sur l'ongle", url: "https://rubis.pro" },
|
|
};
|
|
---
|
|
|
|
<Layout title={copy.meta.home.title} description={copy.meta.home.description} jsonLd={jsonLd}>
|
|
<Hero />
|
|
<Stats />
|
|
<PromiseSection />
|
|
<HowItWorks />
|
|
<Gamification />
|
|
<AutoBanking />
|
|
<Legal />
|
|
<Pricing />
|
|
<FAQ />
|
|
<FinalCTA />
|
|
<Footnotes />
|
|
</Layout>
|
|
|
|
<script is:inline>
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
document.querySelectorAll('a[href^="https://app.rubis.pro"]').forEach(function (link) {
|
|
link.addEventListener('click', function () {
|
|
var section = link.closest('section');
|
|
var sectionId = section ? (section.id || 'unknown') : 'header';
|
|
if (section && section.id === 'pricing' && link.textContent.trim().match(/^(Commencer|Démarrer)/)) {
|
|
window.posthog?.capture('pricing_pro_cta_clicked', {
|
|
label: link.textContent.trim(),
|
|
});
|
|
} else if (section && section.id === 'pricing') {
|
|
var planName = link.querySelector('[class*="font-display"][class*="font-bold"]')?.textContent?.trim() || 'unknown';
|
|
window.posthog?.capture('pricing_plan_selected', {
|
|
plan: planName,
|
|
});
|
|
} else {
|
|
window.posthog?.capture('signup_cta_clicked', {
|
|
location: sectionId || 'header',
|
|
label: link.textContent.trim(),
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('header a[href^="https://app.rubis.pro"]').forEach(function (link) {
|
|
link.addEventListener('click', function () {
|
|
window.posthog?.capture('signup_cta_clicked', {
|
|
location: 'header',
|
|
label: link.textContent.trim(),
|
|
});
|
|
});
|
|
});
|
|
|
|
document.querySelectorAll('#faq details').forEach(function (details) {
|
|
details.addEventListener('toggle', function () {
|
|
if (details.open) {
|
|
var question = details.querySelector('summary')?.textContent?.trim() || '';
|
|
window.posthog?.capture('faq_item_opened', { question: question });
|
|
}
|
|
});
|
|
});
|
|
});
|
|
</script>
|